== Physical Plan ==
* ColumnarToRow (51)
+- CometTakeOrderedAndProject (50)
   +- CometProject (49)
      +- CometBroadcastHashJoin (48)
         :- CometProject (34)
         :  +- CometBroadcastHashJoin (33)
         :     :- CometFilter (19)
         :     :  +- CometHashAggregate (18)
         :     :     +- CometExchange (17)
         :     :        +- CometHashAggregate (16)
         :     :           +- CometProject (15)
         :     :              +- CometBroadcastHashJoin (14)
         :     :                 :- CometProject (7)
         :     :                 :  +- CometBroadcastHashJoin (6)
         :     :                 :     :- CometFilter (2)
         :     :                 :     :  +- CometScan parquet spark_catalog.default.store_sales (1)
         :     :                 :     +- CometBroadcastExchange (5)
         :     :                 :        +- CometFilter (4)
         :     :                 :           +- CometScan parquet spark_catalog.default.item (3)
         :     :                 +- CometBroadcastExchange (13)
         :     :                    +- CometProject (12)
         :     :                       +- CometBroadcastHashJoin (11)
         :     :                          :- CometFilter (9)
         :     :                          :  +- CometScan parquet spark_catalog.default.date_dim (8)
         :     :                          +- ReusedExchange (10)
         :     +- CometBroadcastExchange (32)
         :        +- CometFilter (31)
         :           +- CometHashAggregate (30)
         :              +- CometExchange (29)
         :                 +- CometHashAggregate (28)
         :                    +- CometProject (27)
         :                       +- CometBroadcastHashJoin (26)
         :                          :- CometProject (24)
         :                          :  +- CometBroadcastHashJoin (23)
         :                          :     :- CometFilter (21)
         :                          :     :  +- CometScan parquet spark_catalog.default.catalog_sales (20)
         :                          :     +- ReusedExchange (22)
         :                          +- ReusedExchange (25)
         +- CometBroadcastExchange (47)
            +- CometFilter (46)
               +- CometHashAggregate (45)
                  +- CometExchange (44)
                     +- CometHashAggregate (43)
                        +- CometProject (42)
                           +- CometBroadcastHashJoin (41)
                              :- CometProject (39)
                              :  +- CometBroadcastHashJoin (38)
                              :     :- CometFilter (36)
                              :     :  +- CometScan parquet spark_catalog.default.web_sales (35)
                              :     +- ReusedExchange (37)
                              +- ReusedExchange (40)


(1) CometScan parquet spark_catalog.default.store_sales
Output [3]: [ss_item_sk#1, ss_ext_sales_price#2, ss_sold_date_sk#3]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(ss_sold_date_sk#3), dynamicpruningexpression(ss_sold_date_sk#3 IN dynamicpruning#4)]
PushedFilters: [IsNotNull(ss_item_sk)]
ReadSchema: struct<ss_item_sk:int,ss_ext_sales_price:decimal(7,2)>

(2) CometFilter
Input [3]: [ss_item_sk#1, ss_ext_sales_price#2, ss_sold_date_sk#3]
Condition : isnotnull(ss_item_sk#1)

(3) CometScan parquet spark_catalog.default.item
Output [2]: [i_item_sk#5, i_item_id#6]
Batched: true
Location [not included in comparison]/{warehouse_dir}/item]
PushedFilters: [IsNotNull(i_item_sk), IsNotNull(i_item_id)]
ReadSchema: struct<i_item_sk:int,i_item_id:string>

(4) CometFilter
Input [2]: [i_item_sk#5, i_item_id#6]
Condition : (isnotnull(i_item_sk#5) AND isnotnull(i_item_id#6))

(5) CometBroadcastExchange
Input [2]: [i_item_sk#5, i_item_id#6]
Arguments: [i_item_sk#5, i_item_id#6]

(6) CometBroadcastHashJoin
Left output [3]: [ss_item_sk#1, ss_ext_sales_price#2, ss_sold_date_sk#3]
Right output [2]: [i_item_sk#5, i_item_id#6]
Arguments: [ss_item_sk#1], [i_item_sk#5], Inner, BuildRight

(7) CometProject
Input [5]: [ss_item_sk#1, ss_ext_sales_price#2, ss_sold_date_sk#3, i_item_sk#5, i_item_id#6]
Arguments: [ss_ext_sales_price#2, ss_sold_date_sk#3, i_item_id#6], [ss_ext_sales_price#2, ss_sold_date_sk#3, i_item_id#6]

(8) CometScan parquet spark_catalog.default.date_dim
Output [2]: [d_date_sk#7, d_date#8]
Batched: true
Location [not included in comparison]/{warehouse_dir}/date_dim]
PushedFilters: [IsNotNull(d_date_sk)]
ReadSchema: struct<d_date_sk:int,d_date:date>

(9) CometFilter
Input [2]: [d_date_sk#7, d_date#8]
Condition : isnotnull(d_date_sk#7)

(10) ReusedExchange [Reuses operator id: 57]
Output [1]: [d_date#9]

(11) CometBroadcastHashJoin
Left output [2]: [d_date_sk#7, d_date#8]
Right output [1]: [d_date#9]
Arguments: [d_date#8], [d_date#9], LeftSemi, BuildRight

(12) CometProject
Input [2]: [d_date_sk#7, d_date#8]
Arguments: [d_date_sk#7], [d_date_sk#7]

(13) CometBroadcastExchange
Input [1]: [d_date_sk#7]
Arguments: [d_date_sk#7]

(14) CometBroadcastHashJoin
Left output [3]: [ss_ext_sales_price#2, ss_sold_date_sk#3, i_item_id#6]
Right output [1]: [d_date_sk#7]
Arguments: [ss_sold_date_sk#3], [d_date_sk#7], Inner, BuildRight

(15) CometProject
Input [4]: [ss_ext_sales_price#2, ss_sold_date_sk#3, i_item_id#6, d_date_sk#7]
Arguments: [ss_ext_sales_price#2, i_item_id#6], [ss_ext_sales_price#2, i_item_id#6]

(16) CometHashAggregate
Input [2]: [ss_ext_sales_price#2, i_item_id#6]
Keys [1]: [i_item_id#6]
Functions [1]: [partial_sum(UnscaledValue(ss_ext_sales_price#2))]

(17) CometExchange
Input [2]: [i_item_id#6, sum#10]
Arguments: hashpartitioning(i_item_id#6, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=1]

(18) CometHashAggregate
Input [2]: [i_item_id#6, sum#10]
Keys [1]: [i_item_id#6]
Functions [1]: [sum(UnscaledValue(ss_ext_sales_price#2))]

(19) CometFilter
Input [2]: [item_id#11, ss_item_rev#12]
Condition : isnotnull(ss_item_rev#12)

(20) CometScan parquet spark_catalog.default.catalog_sales
Output [3]: [cs_item_sk#13, cs_ext_sales_price#14, cs_sold_date_sk#15]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(cs_sold_date_sk#15), dynamicpruningexpression(cs_sold_date_sk#15 IN dynamicpruning#16)]
PushedFilters: [IsNotNull(cs_item_sk)]
ReadSchema: struct<cs_item_sk:int,cs_ext_sales_price:decimal(7,2)>

(21) CometFilter
Input [3]: [cs_item_sk#13, cs_ext_sales_price#14, cs_sold_date_sk#15]
Condition : isnotnull(cs_item_sk#13)

(22) ReusedExchange [Reuses operator id: 5]
Output [2]: [i_item_sk#17, i_item_id#18]

(23) CometBroadcastHashJoin
Left output [3]: [cs_item_sk#13, cs_ext_sales_price#14, cs_sold_date_sk#15]
Right output [2]: [i_item_sk#17, i_item_id#18]
Arguments: [cs_item_sk#13], [i_item_sk#17], Inner, BuildRight

(24) CometProject
Input [5]: [cs_item_sk#13, cs_ext_sales_price#14, cs_sold_date_sk#15, i_item_sk#17, i_item_id#18]
Arguments: [cs_ext_sales_price#14, cs_sold_date_sk#15, i_item_id#18], [cs_ext_sales_price#14, cs_sold_date_sk#15, i_item_id#18]

(25) ReusedExchange [Reuses operator id: 13]
Output [1]: [d_date_sk#19]

(26) CometBroadcastHashJoin
Left output [3]: [cs_ext_sales_price#14, cs_sold_date_sk#15, i_item_id#18]
Right output [1]: [d_date_sk#19]
Arguments: [cs_sold_date_sk#15], [d_date_sk#19], Inner, BuildRight

(27) CometProject
Input [4]: [cs_ext_sales_price#14, cs_sold_date_sk#15, i_item_id#18, d_date_sk#19]
Arguments: [cs_ext_sales_price#14, i_item_id#18], [cs_ext_sales_price#14, i_item_id#18]

(28) CometHashAggregate
Input [2]: [cs_ext_sales_price#14, i_item_id#18]
Keys [1]: [i_item_id#18]
Functions [1]: [partial_sum(UnscaledValue(cs_ext_sales_price#14))]

(29) CometExchange
Input [2]: [i_item_id#18, sum#20]
Arguments: hashpartitioning(i_item_id#18, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=2]

(30) CometHashAggregate
Input [2]: [i_item_id#18, sum#20]
Keys [1]: [i_item_id#18]
Functions [1]: [sum(UnscaledValue(cs_ext_sales_price#14))]

(31) CometFilter
Input [2]: [item_id#21, cs_item_rev#22]
Condition : isnotnull(cs_item_rev#22)

(32) CometBroadcastExchange
Input [2]: [item_id#21, cs_item_rev#22]
Arguments: [item_id#21, cs_item_rev#22]

(33) CometBroadcastHashJoin
Left output [2]: [item_id#11, ss_item_rev#12]
Right output [2]: [item_id#21, cs_item_rev#22]
Arguments: [item_id#11], [item_id#21], Inner, ((((cast(ss_item_rev#12 as decimal(19,3)) >= (0.9 * cs_item_rev#22)) AND (cast(ss_item_rev#12 as decimal(20,3)) <= (1.1 * cs_item_rev#22))) AND (cast(cs_item_rev#22 as decimal(19,3)) >= (0.9 * ss_item_rev#12))) AND (cast(cs_item_rev#22 as decimal(20,3)) <= (1.1 * ss_item_rev#12))), BuildRight

(34) CometProject
Input [4]: [item_id#11, ss_item_rev#12, item_id#21, cs_item_rev#22]
Arguments: [item_id#11, ss_item_rev#12, cs_item_rev#22], [item_id#11, ss_item_rev#12, cs_item_rev#22]

(35) CometScan parquet spark_catalog.default.web_sales
Output [3]: [ws_item_sk#23, ws_ext_sales_price#24, ws_sold_date_sk#25]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(ws_sold_date_sk#25), dynamicpruningexpression(ws_sold_date_sk#25 IN dynamicpruning#26)]
PushedFilters: [IsNotNull(ws_item_sk)]
ReadSchema: struct<ws_item_sk:int,ws_ext_sales_price:decimal(7,2)>

(36) CometFilter
Input [3]: [ws_item_sk#23, ws_ext_sales_price#24, ws_sold_date_sk#25]
Condition : isnotnull(ws_item_sk#23)

(37) ReusedExchange [Reuses operator id: 5]
Output [2]: [i_item_sk#27, i_item_id#28]

(38) CometBroadcastHashJoin
Left output [3]: [ws_item_sk#23, ws_ext_sales_price#24, ws_sold_date_sk#25]
Right output [2]: [i_item_sk#27, i_item_id#28]
Arguments: [ws_item_sk#23], [i_item_sk#27], Inner, BuildRight

(39) CometProject
Input [5]: [ws_item_sk#23, ws_ext_sales_price#24, ws_sold_date_sk#25, i_item_sk#27, i_item_id#28]
Arguments: [ws_ext_sales_price#24, ws_sold_date_sk#25, i_item_id#28], [ws_ext_sales_price#24, ws_sold_date_sk#25, i_item_id#28]

(40) ReusedExchange [Reuses operator id: 13]
Output [1]: [d_date_sk#29]

(41) CometBroadcastHashJoin
Left output [3]: [ws_ext_sales_price#24, ws_sold_date_sk#25, i_item_id#28]
Right output [1]: [d_date_sk#29]
Arguments: [ws_sold_date_sk#25], [d_date_sk#29], Inner, BuildRight

(42) CometProject
Input [4]: [ws_ext_sales_price#24, ws_sold_date_sk#25, i_item_id#28, d_date_sk#29]
Arguments: [ws_ext_sales_price#24, i_item_id#28], [ws_ext_sales_price#24, i_item_id#28]

(43) CometHashAggregate
Input [2]: [ws_ext_sales_price#24, i_item_id#28]
Keys [1]: [i_item_id#28]
Functions [1]: [partial_sum(UnscaledValue(ws_ext_sales_price#24))]

(44) CometExchange
Input [2]: [i_item_id#28, sum#30]
Arguments: hashpartitioning(i_item_id#28, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=3]

(45) CometHashAggregate
Input [2]: [i_item_id#28, sum#30]
Keys [1]: [i_item_id#28]
Functions [1]: [sum(UnscaledValue(ws_ext_sales_price#24))]

(46) CometFilter
Input [2]: [item_id#31, ws_item_rev#32]
Condition : isnotnull(ws_item_rev#32)

(47) CometBroadcastExchange
Input [2]: [item_id#31, ws_item_rev#32]
Arguments: [item_id#31, ws_item_rev#32]

(48) CometBroadcastHashJoin
Left output [3]: [item_id#11, ss_item_rev#12, cs_item_rev#22]
Right output [2]: [item_id#31, ws_item_rev#32]
Arguments: [item_id#11], [item_id#31], Inner, ((((((((cast(ss_item_rev#12 as decimal(19,3)) >= (0.9 * ws_item_rev#32)) AND (cast(ss_item_rev#12 as decimal(20,3)) <= (1.1 * ws_item_rev#32))) AND (cast(cs_item_rev#22 as decimal(19,3)) >= (0.9 * ws_item_rev#32))) AND (cast(cs_item_rev#22 as decimal(20,3)) <= (1.1 * ws_item_rev#32))) AND (cast(ws_item_rev#32 as decimal(19,3)) >= (0.9 * ss_item_rev#12))) AND (cast(ws_item_rev#32 as decimal(20,3)) <= (1.1 * ss_item_rev#12))) AND (cast(ws_item_rev#32 as decimal(19,3)) >= (0.9 * cs_item_rev#22))) AND (cast(ws_item_rev#32 as decimal(20,3)) <= (1.1 * cs_item_rev#22))), BuildRight

(49) CometProject
Input [5]: [item_id#11, ss_item_rev#12, cs_item_rev#22, item_id#31, ws_item_rev#32]
Arguments: [item_id#11, ss_item_rev#12, ss_dev#33, cs_item_rev#22, cs_dev#34, ws_item_rev#32, ws_dev#35, average#36], [item_id#11, ss_item_rev#12, (((ss_item_rev#12 / ((ss_item_rev#12 + cs_item_rev#22) + ws_item_rev#32)) / 3) * 100) AS ss_dev#33, cs_item_rev#22, (((cs_item_rev#22 / ((ss_item_rev#12 + cs_item_rev#22) + ws_item_rev#32)) / 3) * 100) AS cs_dev#34, ws_item_rev#32, (((ws_item_rev#32 / ((ss_item_rev#12 + cs_item_rev#22) + ws_item_rev#32)) / 3) * 100) AS ws_dev#35, (((ss_item_rev#12 + cs_item_rev#22) + ws_item_rev#32) / 3) AS average#36]

(50) CometTakeOrderedAndProject
Input [8]: [item_id#11, ss_item_rev#12, ss_dev#33, cs_item_rev#22, cs_dev#34, ws_item_rev#32, ws_dev#35, average#36]
Arguments: TakeOrderedAndProject(limit=100, orderBy=[item_id#11 ASC NULLS FIRST,ss_item_rev#12 ASC NULLS FIRST], output=[item_id#11,ss_item_rev#12,ss_dev#33,cs_item_rev#22,cs_dev#34,ws_item_rev#32,ws_dev#35,average#36]), [item_id#11, ss_item_rev#12, ss_dev#33, cs_item_rev#22, cs_dev#34, ws_item_rev#32, ws_dev#35, average#36], 100, [item_id#11 ASC NULLS FIRST, ss_item_rev#12 ASC NULLS FIRST], [item_id#11, ss_item_rev#12, ss_dev#33, cs_item_rev#22, cs_dev#34, ws_item_rev#32, ws_dev#35, average#36]

(51) ColumnarToRow [codegen id : 1]
Input [8]: [item_id#11, ss_item_rev#12, ss_dev#33, cs_item_rev#22, cs_dev#34, ws_item_rev#32, ws_dev#35, average#36]

===== Subqueries =====

Subquery:1 Hosting operator id = 1 Hosting Expression = ss_sold_date_sk#3 IN dynamicpruning#4
BroadcastExchange (61)
+- * ColumnarToRow (60)
   +- CometProject (59)
      +- CometBroadcastHashJoin (58)
         :- CometFilter (53)
         :  +- CometScan parquet spark_catalog.default.date_dim (52)
         +- CometBroadcastExchange (57)
            +- CometProject (56)
               +- CometFilter (55)
                  +- CometScan parquet spark_catalog.default.date_dim (54)


(52) CometScan parquet spark_catalog.default.date_dim
Output [2]: [d_date_sk#7, d_date#8]
Batched: true
Location [not included in comparison]/{warehouse_dir}/date_dim]
PushedFilters: [IsNotNull(d_date_sk)]
ReadSchema: struct<d_date_sk:int,d_date:date>

(53) CometFilter
Input [2]: [d_date_sk#7, d_date#8]
Condition : isnotnull(d_date_sk#7)

(54) CometScan parquet spark_catalog.default.date_dim
Output [2]: [d_date#9, d_week_seq#37]
Batched: true
Location [not included in comparison]/{warehouse_dir}/date_dim]
PushedFilters: [IsNotNull(d_week_seq)]
ReadSchema: struct<d_date:date,d_week_seq:int>

(55) CometFilter
Input [2]: [d_date#9, d_week_seq#37]
Condition : (isnotnull(d_week_seq#37) AND (d_week_seq#37 = Subquery scalar-subquery#38, [id=#39]))

(56) CometProject
Input [2]: [d_date#9, d_week_seq#37]
Arguments: [d_date#9], [d_date#9]

(57) CometBroadcastExchange
Input [1]: [d_date#9]
Arguments: [d_date#9]

(58) CometBroadcastHashJoin
Left output [2]: [d_date_sk#7, d_date#8]
Right output [1]: [d_date#9]
Arguments: [d_date#8], [d_date#9], LeftSemi, BuildRight

(59) CometProject
Input [2]: [d_date_sk#7, d_date#8]
Arguments: [d_date_sk#7], [d_date_sk#7]

(60) ColumnarToRow [codegen id : 1]
Input [1]: [d_date_sk#7]

(61) BroadcastExchange
Input [1]: [d_date_sk#7]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [plan_id=4]

Subquery:2 Hosting operator id = 55 Hosting Expression = Subquery scalar-subquery#38, [id=#39]
* ColumnarToRow (65)
+- CometProject (64)
   +- CometFilter (63)
      +- CometScan parquet spark_catalog.default.date_dim (62)


(62) CometScan parquet spark_catalog.default.date_dim
Output [2]: [d_date#40, d_week_seq#41]
Batched: true
Location [not included in comparison]/{warehouse_dir}/date_dim]
PushedFilters: [IsNotNull(d_date), EqualTo(d_date,2000-01-03)]
ReadSchema: struct<d_date:date,d_week_seq:int>

(63) CometFilter
Input [2]: [d_date#40, d_week_seq#41]
Condition : (isnotnull(d_date#40) AND (d_date#40 = 2000-01-03))

(64) CometProject
Input [2]: [d_date#40, d_week_seq#41]
Arguments: [d_week_seq#41], [d_week_seq#41]

(65) ColumnarToRow [codegen id : 1]
Input [1]: [d_week_seq#41]

Subquery:3 Hosting operator id = 20 Hosting Expression = cs_sold_date_sk#15 IN dynamicpruning#4

Subquery:4 Hosting operator id = 35 Hosting Expression = ws_sold_date_sk#25 IN dynamicpruning#4


