44
55namespace Flow \ETL \Tests \Double ;
66
7- use function Flow \ETL \DSL \{array_to_rows , datetime_schema , float_schema , list_schema , schema , string_schema , structure_schema , uuid_schema };
7+ use function Flow \ETL \DSL \{array_to_rows ,
8+ datetime_schema ,
9+ float_schema ,
10+ list_schema ,
11+ schema ,
12+ string_schema ,
13+ structure_schema ,
14+ uuid_schema };
815use function Flow \Types \DSL \{type_float , type_integer , type_list , type_string , type_structure };
916use Faker \Factory ;
1017use Flow \ETL \{Extractor , FlowContext , Schema };
@@ -47,6 +54,16 @@ public static function schema() : Schema
4754 }
4855
4956 public function extract (FlowContext $ context ) : \Generator
57+ {
58+ foreach ($ this ->rawData () as $ row ) {
59+ yield array_to_rows ($ row , schema: self ::schema ());
60+ }
61+ }
62+
63+ /**
64+ * @return \Generator<array<string, mixed>>
65+ */
66+ public function rawData () : \Generator
5067 {
5168 $ faker = Factory::create ();
5269
@@ -69,45 +86,48 @@ public function extract(FlowContext $context) : \Generator
6986 for ($ i = 0 ; $ i < $ this ->count ; $ i ++) {
7087
7188 $ createdAt = \DateTimeImmutable::createFromMutable ($ faker ->dateTimeThisYear );
72- $ cancelledAt = \random_int (1 , 10 ) === 1 ? $ createdAt ->modify ('+ ' . $ faker ->numberBetween (1 , 5 ) . ' hours ' ) : null ;
89+ $ cancelledAt = \random_int (1 , 10 ) === 1 ? $ createdAt ->modify ('+ ' . $ faker ->numberBetween (
90+ 1 ,
91+ 5
92+ ) . ' hours ' ) : null ;
7393
7494 if ($ cancelledAt ) {
7595 $ updatedAt = $ cancelledAt ;
7696 } else {
77- $ updatedAt = \random_int (1 , 3 ) === 1 ? $ createdAt ->modify ('+ ' . $ faker ->numberBetween (1 , 3 ) . ' days ' ) : null ;
97+ $ updatedAt = \random_int (1 , 3 ) === 1 ? $ createdAt ->modify ('+ ' . $ faker ->numberBetween (
98+ 1 ,
99+ 3
100+ ) . ' days ' ) : null ;
78101 }
79102
80- yield array_to_rows (
81- [
82- 'order_id ' => $ faker ->uuid ,
83- 'seller_id ' => $ sellers [\random_int (0 , \count ($ sellers ) - 1 )],
84- 'created_at ' => $ createdAt ,
85- 'updated_at ' => $ updatedAt ,
86- 'cancelled_at ' => $ cancelledAt ,
87- 'discount ' => \random_int (0 , 1 ) === 1 ? $ faker ->randomFloat (2 , 0 , 50 ) : null ,
88- 'email ' => $ faker ->email ,
89- 'customer ' => $ faker ->firstName . ' ' . $ faker ->lastName ,
90- 'address ' => [
91- 'street ' => $ faker ->streetAddress ,
92- 'city ' => $ faker ->city ,
93- 'zip ' => $ faker ->postcode ,
94- 'country ' => $ faker ->country ,
95- ],
96- 'notes ' => \array_map (
97- static fn ($ i ) => $ faker ->sentence ,
98- \range (1 , $ faker ->numberBetween (1 , 5 ))
99- ),
100- 'items ' => \array_map (
101- static fn (int $ index ) => [
102- 'sku ' => $ skus [$ skuIndex = $ faker ->numberBetween (1 , 4 )]['sku ' ],
103- 'quantity ' => $ faker ->numberBetween (1 , 10 ),
104- 'price ' => $ skus [$ skuIndex ]['price ' ],
105- ],
106- \range (1 , $ faker ->numberBetween (1 , 4 ))
107- ),
103+ yield [
104+ 'order_id ' => $ faker ->uuid ,
105+ 'seller_id ' => $ sellers [\random_int (0 , \count ($ sellers ) - 1 )],
106+ 'created_at ' => $ createdAt ,
107+ 'updated_at ' => $ updatedAt ,
108+ 'cancelled_at ' => $ cancelledAt ,
109+ 'discount ' => \random_int (0 , 1 ) === 1 ? $ faker ->randomFloat (2 , 0 , 50 ) : null ,
110+ 'email ' => $ faker ->email ,
111+ 'customer ' => $ faker ->firstName . ' ' . $ faker ->lastName ,
112+ 'address ' => [
113+ 'street ' => $ faker ->streetAddress ,
114+ 'city ' => $ faker ->city ,
115+ 'zip ' => $ faker ->postcode ,
116+ 'country ' => $ faker ->country ,
108117 ],
109- schema: self ::schema ()
110- );
118+ 'notes ' => \array_map (
119+ static fn ($ i ) => $ faker ->sentence ,
120+ \range (1 , $ faker ->numberBetween (1 , 5 ))
121+ ),
122+ 'items ' => \array_map (
123+ static fn (int $ index ) => [
124+ 'sku ' => $ skus [$ skuIndex = $ faker ->numberBetween (1 , 4 )]['sku ' ],
125+ 'quantity ' => $ faker ->numberBetween (1 , 10 ),
126+ 'price ' => $ skus [$ skuIndex ]['price ' ],
127+ ],
128+ \range (1 , $ faker ->numberBetween (1 , 4 ))
129+ ),
130+ ];
111131 }
112132 }
113133}
0 commit comments