== Physical Plan ==
TakeOrderedAndProject (57)
+- * Project (56)
   +- * BroadcastHashJoin Inner BuildRight (55)
      :- * Project (39)
      :  +- * BroadcastHashJoin Inner BuildRight (38)
      :     :- * Filter (22)
      :     :  +- * HashAggregate (21)
      :     :     +- * CometColumnarToRow (20)
      :     :        +- CometColumnarExchange (19)
      :     :           +- * HashAggregate (18)
      :     :              +- * CometColumnarToRow (17)
      :     :                 +- CometProject (16)
      :     :                    +- CometBroadcastHashJoin (15)
      :     :                       :- CometProject (8)
      :     :                       :  +- CometBroadcastHashJoin (7)
      :     :                       :     :- CometFilter (2)
      :     :                       :     :  +- CometScan parquet spark_catalog.default.store_sales (1)
      :     :                       :     +- CometBroadcastExchange (6)
      :     :                       :        +- CometProject (5)
      :     :                       :           +- CometFilter (4)
      :     :                       :              +- CometScan parquet spark_catalog.default.item (3)
      :     :                       +- CometBroadcastExchange (14)
      :     :                          +- CometProject (13)
      :     :                             +- CometBroadcastHashJoin (12)
      :     :                                :- CometFilter (10)
      :     :                                :  +- CometScan parquet spark_catalog.default.date_dim (9)
      :     :                                +- ReusedExchange (11)
      :     +- BroadcastExchange (37)
      :        +- * Filter (36)
      :           +- * HashAggregate (35)
      :              +- * CometColumnarToRow (34)
      :                 +- CometColumnarExchange (33)
      :                    +- * HashAggregate (32)
      :                       +- * CometColumnarToRow (31)
      :                          +- CometProject (30)
      :                             +- CometBroadcastHashJoin (29)
      :                                :- CometProject (27)
      :                                :  +- CometBroadcastHashJoin (26)
      :                                :     :- CometFilter (24)
      :                                :     :  +- CometScan parquet spark_catalog.default.catalog_sales (23)
      :                                :     +- ReusedExchange (25)
      :                                +- ReusedExchange (28)
      +- BroadcastExchange (54)
         +- * Filter (53)
            +- * HashAggregate (52)
               +- * CometColumnarToRow (51)
                  +- CometColumnarExchange (50)
                     +- * HashAggregate (49)
                        +- * CometColumnarToRow (48)
                           +- CometProject (47)
                              +- CometBroadcastHashJoin (46)
                                 :- CometProject (44)
                                 :  +- CometBroadcastHashJoin (43)
                                 :     :- CometFilter (41)
                                 :     :  +- CometScan parquet spark_catalog.default.web_sales (40)
                                 :     +- ReusedExchange (42)
                                 +- ReusedExchange (45)


(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)]
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(staticinvoke(class org.apache.spark.sql.catalyst.util.CharVarcharCodegenUtils, StringType, readSidePadding, i_item_id#6, 16, true, false, true)))

(5) CometProject
Input [2]: [i_item_sk#5, i_item_id#6]
Arguments: [i_item_sk#5, i_item_id#7], [i_item_sk#5, staticinvoke(class org.apache.spark.sql.catalyst.util.CharVarcharCodegenUtils, StringType, readSidePadding, i_item_id#6, 16, true, false, true) AS i_item_id#7]

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

(7) 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#7]
Arguments: [ss_item_sk#1], [i_item_sk#5], Inner, BuildRight

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

(9) CometScan parquet spark_catalog.default.date_dim
Output [2]: [d_date_sk#8, d_date#9]
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>

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

(11) ReusedExchange [Reuses operator id: 63]
Output [1]: [d_date#10]

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

(13) CometProject
Input [2]: [d_date_sk#8, d_date#9]
Arguments: [d_date_sk#8], [d_date_sk#8]

(14) CometBroadcastExchange
Input [1]: [d_date_sk#8]
Arguments: [d_date_sk#8]

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

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

(17) CometColumnarToRow [codegen id : 1]
Input [2]: [ss_ext_sales_price#2, i_item_id#7]

(18) HashAggregate [codegen id : 1]
Input [2]: [ss_ext_sales_price#2, i_item_id#7]
Keys [1]: [i_item_id#7]
Functions [1]: [partial_sum(UnscaledValue(ss_ext_sales_price#2))]
Aggregate Attributes [1]: [sum#11]
Results [2]: [i_item_id#7, sum#12]

(19) CometColumnarExchange
Input [2]: [i_item_id#7, sum#12]
Arguments: hashpartitioning(i_item_id#7, 5), ENSURE_REQUIREMENTS, CometColumnarShuffle, [plan_id=1]

(20) CometColumnarToRow [codegen id : 6]
Input [2]: [i_item_id#7, sum#12]

(21) HashAggregate [codegen id : 6]
Input [2]: [i_item_id#7, sum#12]
Keys [1]: [i_item_id#7]
Functions [1]: [sum(UnscaledValue(ss_ext_sales_price#2))]
Aggregate Attributes [1]: [sum(UnscaledValue(ss_ext_sales_price#2))#13]
Results [2]: [i_item_id#7 AS item_id#14, MakeDecimal(sum(UnscaledValue(ss_ext_sales_price#2))#13,17,2) AS ss_item_rev#15]

(22) Filter [codegen id : 6]
Input [2]: [item_id#14, ss_item_rev#15]
Condition : isnotnull(ss_item_rev#15)

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

(24) CometFilter
Input [3]: [cs_item_sk#16, cs_ext_sales_price#17, cs_sold_date_sk#18]
Condition : isnotnull(cs_item_sk#16)

(25) ReusedExchange [Reuses operator id: 6]
Output [2]: [i_item_sk#20, i_item_id#21]

(26) CometBroadcastHashJoin
Left output [3]: [cs_item_sk#16, cs_ext_sales_price#17, cs_sold_date_sk#18]
Right output [2]: [i_item_sk#20, i_item_id#21]
Arguments: [cs_item_sk#16], [i_item_sk#20], Inner, BuildRight

(27) CometProject
Input [5]: [cs_item_sk#16, cs_ext_sales_price#17, cs_sold_date_sk#18, i_item_sk#20, i_item_id#21]
Arguments: [cs_ext_sales_price#17, cs_sold_date_sk#18, i_item_id#21], [cs_ext_sales_price#17, cs_sold_date_sk#18, i_item_id#21]

(28) ReusedExchange [Reuses operator id: 14]
Output [1]: [d_date_sk#22]

(29) CometBroadcastHashJoin
Left output [3]: [cs_ext_sales_price#17, cs_sold_date_sk#18, i_item_id#21]
Right output [1]: [d_date_sk#22]
Arguments: [cs_sold_date_sk#18], [d_date_sk#22], Inner, BuildRight

(30) CometProject
Input [4]: [cs_ext_sales_price#17, cs_sold_date_sk#18, i_item_id#21, d_date_sk#22]
Arguments: [cs_ext_sales_price#17, i_item_id#21], [cs_ext_sales_price#17, i_item_id#21]

(31) CometColumnarToRow [codegen id : 2]
Input [2]: [cs_ext_sales_price#17, i_item_id#21]

(32) HashAggregate [codegen id : 2]
Input [2]: [cs_ext_sales_price#17, i_item_id#21]
Keys [1]: [i_item_id#21]
Functions [1]: [partial_sum(UnscaledValue(cs_ext_sales_price#17))]
Aggregate Attributes [1]: [sum#23]
Results [2]: [i_item_id#21, sum#24]

(33) CometColumnarExchange
Input [2]: [i_item_id#21, sum#24]
Arguments: hashpartitioning(i_item_id#21, 5), ENSURE_REQUIREMENTS, CometColumnarShuffle, [plan_id=2]

(34) CometColumnarToRow [codegen id : 3]
Input [2]: [i_item_id#21, sum#24]

(35) HashAggregate [codegen id : 3]
Input [2]: [i_item_id#21, sum#24]
Keys [1]: [i_item_id#21]
Functions [1]: [sum(UnscaledValue(cs_ext_sales_price#17))]
Aggregate Attributes [1]: [sum(UnscaledValue(cs_ext_sales_price#17))#25]
Results [2]: [i_item_id#21 AS item_id#26, MakeDecimal(sum(UnscaledValue(cs_ext_sales_price#17))#25,17,2) AS cs_item_rev#27]

(36) Filter [codegen id : 3]
Input [2]: [item_id#26, cs_item_rev#27]
Condition : isnotnull(cs_item_rev#27)

(37) BroadcastExchange
Input [2]: [item_id#26, cs_item_rev#27]
Arguments: HashedRelationBroadcastMode(List(input[0, string, true]),false), [plan_id=3]

(38) BroadcastHashJoin [codegen id : 6]
Left keys [1]: [item_id#14]
Right keys [1]: [item_id#26]
Join type: Inner
Join condition: ((((cast(ss_item_rev#15 as decimal(19,3)) >= (0.9 * cs_item_rev#27)) AND (cast(ss_item_rev#15 as decimal(20,3)) <= (1.1 * cs_item_rev#27))) AND (cast(cs_item_rev#27 as decimal(19,3)) >= (0.9 * ss_item_rev#15))) AND (cast(cs_item_rev#27 as decimal(20,3)) <= (1.1 * ss_item_rev#15)))

(39) Project [codegen id : 6]
Output [3]: [item_id#14, ss_item_rev#15, cs_item_rev#27]
Input [4]: [item_id#14, ss_item_rev#15, item_id#26, cs_item_rev#27]

(40) CometScan parquet spark_catalog.default.web_sales
Output [3]: [ws_item_sk#28, ws_ext_sales_price#29, ws_sold_date_sk#30]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(ws_sold_date_sk#30), dynamicpruningexpression(ws_sold_date_sk#30 IN dynamicpruning#31)]
PushedFilters: [IsNotNull(ws_item_sk)]
ReadSchema: struct<ws_item_sk:int,ws_ext_sales_price:decimal(7,2)>

(41) CometFilter
Input [3]: [ws_item_sk#28, ws_ext_sales_price#29, ws_sold_date_sk#30]
Condition : isnotnull(ws_item_sk#28)

(42) ReusedExchange [Reuses operator id: 6]
Output [2]: [i_item_sk#32, i_item_id#33]

(43) CometBroadcastHashJoin
Left output [3]: [ws_item_sk#28, ws_ext_sales_price#29, ws_sold_date_sk#30]
Right output [2]: [i_item_sk#32, i_item_id#33]
Arguments: [ws_item_sk#28], [i_item_sk#32], Inner, BuildRight

(44) CometProject
Input [5]: [ws_item_sk#28, ws_ext_sales_price#29, ws_sold_date_sk#30, i_item_sk#32, i_item_id#33]
Arguments: [ws_ext_sales_price#29, ws_sold_date_sk#30, i_item_id#33], [ws_ext_sales_price#29, ws_sold_date_sk#30, i_item_id#33]

(45) ReusedExchange [Reuses operator id: 14]
Output [1]: [d_date_sk#34]

(46) CometBroadcastHashJoin
Left output [3]: [ws_ext_sales_price#29, ws_sold_date_sk#30, i_item_id#33]
Right output [1]: [d_date_sk#34]
Arguments: [ws_sold_date_sk#30], [d_date_sk#34], Inner, BuildRight

(47) CometProject
Input [4]: [ws_ext_sales_price#29, ws_sold_date_sk#30, i_item_id#33, d_date_sk#34]
Arguments: [ws_ext_sales_price#29, i_item_id#33], [ws_ext_sales_price#29, i_item_id#33]

(48) CometColumnarToRow [codegen id : 4]
Input [2]: [ws_ext_sales_price#29, i_item_id#33]

(49) HashAggregate [codegen id : 4]
Input [2]: [ws_ext_sales_price#29, i_item_id#33]
Keys [1]: [i_item_id#33]
Functions [1]: [partial_sum(UnscaledValue(ws_ext_sales_price#29))]
Aggregate Attributes [1]: [sum#35]
Results [2]: [i_item_id#33, sum#36]

(50) CometColumnarExchange
Input [2]: [i_item_id#33, sum#36]
Arguments: hashpartitioning(i_item_id#33, 5), ENSURE_REQUIREMENTS, CometColumnarShuffle, [plan_id=4]

(51) CometColumnarToRow [codegen id : 5]
Input [2]: [i_item_id#33, sum#36]

(52) HashAggregate [codegen id : 5]
Input [2]: [i_item_id#33, sum#36]
Keys [1]: [i_item_id#33]
Functions [1]: [sum(UnscaledValue(ws_ext_sales_price#29))]
Aggregate Attributes [1]: [sum(UnscaledValue(ws_ext_sales_price#29))#37]
Results [2]: [i_item_id#33 AS item_id#38, MakeDecimal(sum(UnscaledValue(ws_ext_sales_price#29))#37,17,2) AS ws_item_rev#39]

(53) Filter [codegen id : 5]
Input [2]: [item_id#38, ws_item_rev#39]
Condition : isnotnull(ws_item_rev#39)

(54) BroadcastExchange
Input [2]: [item_id#38, ws_item_rev#39]
Arguments: HashedRelationBroadcastMode(List(input[0, string, true]),false), [plan_id=5]

(55) BroadcastHashJoin [codegen id : 6]
Left keys [1]: [item_id#14]
Right keys [1]: [item_id#38]
Join type: Inner
Join condition: ((((((((cast(ss_item_rev#15 as decimal(19,3)) >= (0.9 * ws_item_rev#39)) AND (cast(ss_item_rev#15 as decimal(20,3)) <= (1.1 * ws_item_rev#39))) AND (cast(cs_item_rev#27 as decimal(19,3)) >= (0.9 * ws_item_rev#39))) AND (cast(cs_item_rev#27 as decimal(20,3)) <= (1.1 * ws_item_rev#39))) AND (cast(ws_item_rev#39 as decimal(19,3)) >= (0.9 * ss_item_rev#15))) AND (cast(ws_item_rev#39 as decimal(20,3)) <= (1.1 * ss_item_rev#15))) AND (cast(ws_item_rev#39 as decimal(19,3)) >= (0.9 * cs_item_rev#27))) AND (cast(ws_item_rev#39 as decimal(20,3)) <= (1.1 * cs_item_rev#27)))

(56) Project [codegen id : 6]
Output [8]: [item_id#14, ss_item_rev#15, (((ss_item_rev#15 / ((ss_item_rev#15 + cs_item_rev#27) + ws_item_rev#39)) / 3) * 100) AS ss_dev#40, cs_item_rev#27, (((cs_item_rev#27 / ((ss_item_rev#15 + cs_item_rev#27) + ws_item_rev#39)) / 3) * 100) AS cs_dev#41, ws_item_rev#39, (((ws_item_rev#39 / ((ss_item_rev#15 + cs_item_rev#27) + ws_item_rev#39)) / 3) * 100) AS ws_dev#42, (((ss_item_rev#15 + cs_item_rev#27) + ws_item_rev#39) / 3) AS average#43]
Input [5]: [item_id#14, ss_item_rev#15, cs_item_rev#27, item_id#38, ws_item_rev#39]

(57) TakeOrderedAndProject
Input [8]: [item_id#14, ss_item_rev#15, ss_dev#40, cs_item_rev#27, cs_dev#41, ws_item_rev#39, ws_dev#42, average#43]
Arguments: 100, [item_id#14 ASC NULLS FIRST, ss_item_rev#15 ASC NULLS FIRST], [item_id#14, ss_item_rev#15, ss_dev#40, cs_item_rev#27, cs_dev#41, ws_item_rev#39, ws_dev#42, average#43]

===== Subqueries =====

Subquery:1 Hosting operator id = 1 Hosting Expression = ss_sold_date_sk#3 IN dynamicpruning#4
BroadcastExchange (67)
+- * CometColumnarToRow (66)
   +- CometProject (65)
      +- CometBroadcastHashJoin (64)
         :- CometFilter (59)
         :  +- CometScan parquet spark_catalog.default.date_dim (58)
         +- CometBroadcastExchange (63)
            +- CometProject (62)
               +- CometFilter (61)
                  +- CometScan parquet spark_catalog.default.date_dim (60)


(58) CometScan parquet spark_catalog.default.date_dim
Output [2]: [d_date_sk#8, d_date#9]
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>

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

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

(61) CometFilter
Input [2]: [d_date#10, d_week_seq#44]
Condition : (isnotnull(d_week_seq#44) AND (d_week_seq#44 = ReusedSubquery Subquery scalar-subquery#45, [id=#46]))

(62) CometProject
Input [2]: [d_date#10, d_week_seq#44]
Arguments: [d_date#10], [d_date#10]

(63) CometBroadcastExchange
Input [1]: [d_date#10]
Arguments: [d_date#10]

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

(65) CometProject
Input [2]: [d_date_sk#8, d_date#9]
Arguments: [d_date_sk#8], [d_date_sk#8]

(66) CometColumnarToRow [codegen id : 1]
Input [1]: [d_date_sk#8]

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

Subquery:2 Hosting operator id = 61 Hosting Expression = ReusedSubquery Subquery scalar-subquery#45, [id=#46]

Subquery:3 Hosting operator id = 60 Hosting Expression = Subquery scalar-subquery#45, [id=#46]
* CometColumnarToRow (71)
+- CometProject (70)
   +- CometFilter (69)
      +- CometScan parquet spark_catalog.default.date_dim (68)


(68) CometScan parquet spark_catalog.default.date_dim
Output [2]: [d_date#47, d_week_seq#48]
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>

(69) CometFilter
Input [2]: [d_date#47, d_week_seq#48]
Condition : (isnotnull(d_date#47) AND (d_date#47 = 2000-01-03))

(70) CometProject
Input [2]: [d_date#47, d_week_seq#48]
Arguments: [d_week_seq#48], [d_week_seq#48]

(71) CometColumnarToRow [codegen id : 1]
Input [1]: [d_week_seq#48]

Subquery:4 Hosting operator id = 23 Hosting Expression = cs_sold_date_sk#18 IN dynamicpruning#4

Subquery:5 Hosting operator id = 40 Hosting Expression = ws_sold_date_sk#30 IN dynamicpruning#4


