== Physical Plan ==
* CometColumnarToRow (127)
+- CometTakeOrderedAndProject (126)
   +- CometProject (125)
      +- CometSortMergeJoin (124)
         :- CometSort (68)
         :  +- CometExchange (67)
         :     +- CometFilter (66)
         :        +- CometHashAggregate (65)
         :           +- CometExchange (64)
         :              +- CometHashAggregate (63)
         :                 +- CometHashAggregate (62)
         :                    +- CometExchange (61)
         :                       +- CometHashAggregate (60)
         :                          +- CometUnion (59)
         :                             :- CometProject (22)
         :                             :  +- CometSortMergeJoin (21)
         :                             :     :- CometSort (15)
         :                             :     :  +- CometColumnarExchange (14)
         :                             :     :     +- * Project (13)
         :                             :     :        +- * BroadcastHashJoin Inner BuildRight (12)
         :                             :     :           :- * Project (10)
         :                             :     :           :  +- * BroadcastHashJoin Inner BuildRight (9)
         :                             :     :           :     :- * Filter (3)
         :                             :     :           :     :  +- * ColumnarToRow (2)
         :                             :     :           :     :     +- Scan parquet spark_catalog.default.catalog_sales (1)
         :                             :     :           :     +- BroadcastExchange (8)
         :                             :     :           :        +- * CometColumnarToRow (7)
         :                             :     :           :           +- CometProject (6)
         :                             :     :           :              +- CometFilter (5)
         :                             :     :           :                 +- CometNativeScan parquet spark_catalog.default.item (4)
         :                             :     :           +- ReusedExchange (11)
         :                             :     +- CometSort (20)
         :                             :        +- CometExchange (19)
         :                             :           +- CometProject (18)
         :                             :              +- CometFilter (17)
         :                             :                 +- CometNativeScan parquet spark_catalog.default.catalog_returns (16)
         :                             :- CometProject (40)
         :                             :  +- CometSortMergeJoin (39)
         :                             :     :- CometSort (33)
         :                             :     :  +- CometColumnarExchange (32)
         :                             :     :     +- * Project (31)
         :                             :     :        +- * BroadcastHashJoin Inner BuildRight (30)
         :                             :     :           :- * Project (28)
         :                             :     :           :  +- * BroadcastHashJoin Inner BuildRight (27)
         :                             :     :           :     :- * Filter (25)
         :                             :     :           :     :  +- * ColumnarToRow (24)
         :                             :     :           :     :     +- Scan parquet spark_catalog.default.store_sales (23)
         :                             :     :           :     +- ReusedExchange (26)
         :                             :     :           +- ReusedExchange (29)
         :                             :     +- CometSort (38)
         :                             :        +- CometExchange (37)
         :                             :           +- CometProject (36)
         :                             :              +- CometFilter (35)
         :                             :                 +- CometNativeScan parquet spark_catalog.default.store_returns (34)
         :                             +- CometProject (58)
         :                                +- CometSortMergeJoin (57)
         :                                   :- CometSort (51)
         :                                   :  +- CometColumnarExchange (50)
         :                                   :     +- * Project (49)
         :                                   :        +- * BroadcastHashJoin Inner BuildRight (48)
         :                                   :           :- * Project (46)
         :                                   :           :  +- * BroadcastHashJoin Inner BuildRight (45)
         :                                   :           :     :- * Filter (43)
         :                                   :           :     :  +- * ColumnarToRow (42)
         :                                   :           :     :     +- Scan parquet spark_catalog.default.web_sales (41)
         :                                   :           :     +- ReusedExchange (44)
         :                                   :           +- ReusedExchange (47)
         :                                   +- CometSort (56)
         :                                      +- CometExchange (55)
         :                                         +- CometProject (54)
         :                                            +- CometFilter (53)
         :                                               +- CometNativeScan parquet spark_catalog.default.web_returns (52)
         +- CometSort (123)
            +- CometExchange (122)
               +- CometFilter (121)
                  +- CometHashAggregate (120)
                     +- CometExchange (119)
                        +- CometHashAggregate (118)
                           +- CometHashAggregate (117)
                              +- CometExchange (116)
                                 +- CometHashAggregate (115)
                                    +- CometUnion (114)
                                       :- CometProject (83)
                                       :  +- CometSortMergeJoin (82)
                                       :     :- CometSort (79)
                                       :     :  +- CometColumnarExchange (78)
                                       :     :     +- * Project (77)
                                       :     :        +- * BroadcastHashJoin Inner BuildRight (76)
                                       :     :           :- * Project (74)
                                       :     :           :  +- * BroadcastHashJoin Inner BuildRight (73)
                                       :     :           :     :- * Filter (71)
                                       :     :           :     :  +- * ColumnarToRow (70)
                                       :     :           :     :     +- Scan parquet spark_catalog.default.catalog_sales (69)
                                       :     :           :     +- ReusedExchange (72)
                                       :     :           +- ReusedExchange (75)
                                       :     +- CometSort (81)
                                       :        +- ReusedExchange (80)
                                       :- CometProject (98)
                                       :  +- CometSortMergeJoin (97)
                                       :     :- CometSort (94)
                                       :     :  +- CometColumnarExchange (93)
                                       :     :     +- * Project (92)
                                       :     :        +- * BroadcastHashJoin Inner BuildRight (91)
                                       :     :           :- * Project (89)
                                       :     :           :  +- * BroadcastHashJoin Inner BuildRight (88)
                                       :     :           :     :- * Filter (86)
                                       :     :           :     :  +- * ColumnarToRow (85)
                                       :     :           :     :     +- Scan parquet spark_catalog.default.store_sales (84)
                                       :     :           :     +- ReusedExchange (87)
                                       :     :           +- ReusedExchange (90)
                                       :     +- CometSort (96)
                                       :        +- ReusedExchange (95)
                                       +- CometProject (113)
                                          +- CometSortMergeJoin (112)
                                             :- CometSort (109)
                                             :  +- CometColumnarExchange (108)
                                             :     +- * Project (107)
                                             :        +- * BroadcastHashJoin Inner BuildRight (106)
                                             :           :- * Project (104)
                                             :           :  +- * BroadcastHashJoin Inner BuildRight (103)
                                             :           :     :- * Filter (101)
                                             :           :     :  +- * ColumnarToRow (100)
                                             :           :     :     +- Scan parquet spark_catalog.default.web_sales (99)
                                             :           :     +- ReusedExchange (102)
                                             :           +- ReusedExchange (105)
                                             +- CometSort (111)
                                                +- ReusedExchange (110)


(1) Scan parquet spark_catalog.default.catalog_sales
Output [5]: [cs_item_sk#1, cs_order_number#2, cs_quantity#3, cs_ext_sales_price#4, cs_sold_date_sk#5]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(cs_sold_date_sk#5), dynamicpruningexpression(cs_sold_date_sk#5 IN dynamicpruning#6)]
PushedFilters: [IsNotNull(cs_item_sk)]
ReadSchema: struct<cs_item_sk:int,cs_order_number:int,cs_quantity:int,cs_ext_sales_price:decimal(7,2)>

(2) ColumnarToRow [codegen id : 3]
Input [5]: [cs_item_sk#1, cs_order_number#2, cs_quantity#3, cs_ext_sales_price#4, cs_sold_date_sk#5]

(3) Filter [codegen id : 3]
Input [5]: [cs_item_sk#1, cs_order_number#2, cs_quantity#3, cs_ext_sales_price#4, cs_sold_date_sk#5]
Condition : isnotnull(cs_item_sk#1)

(4) CometNativeScan parquet spark_catalog.default.item
Output [6]: [i_item_sk#7, i_brand_id#8, i_class_id#9, i_category_id#10, i_category#11, i_manufact_id#12]
Batched: true
Location [not included in comparison]/{warehouse_dir}/item]
PushedFilters: [IsNotNull(i_category), IsNotNull(i_item_sk), IsNotNull(i_brand_id), IsNotNull(i_class_id), IsNotNull(i_category_id), IsNotNull(i_manufact_id)]
ReadSchema: struct<i_item_sk:int,i_brand_id:int,i_class_id:int,i_category_id:int,i_category:string,i_manufact_id:int>

(5) CometFilter
Input [6]: [i_item_sk#7, i_brand_id#8, i_class_id#9, i_category_id#10, i_category#11, i_manufact_id#12]
Condition : ((((((isnotnull(i_category#11) AND (static_invoke(CharVarcharCodegenUtils.readSidePadding(i_category#11, 50)) = Books                                             )) AND isnotnull(i_item_sk#7)) AND isnotnull(i_brand_id#8)) AND isnotnull(i_class_id#9)) AND isnotnull(i_category_id#10)) AND isnotnull(i_manufact_id#12))

(6) CometProject
Input [6]: [i_item_sk#7, i_brand_id#8, i_class_id#9, i_category_id#10, i_category#11, i_manufact_id#12]
Arguments: [i_item_sk#7, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12], [i_item_sk#7, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12]

(7) CometColumnarToRow [codegen id : 1]
Input [5]: [i_item_sk#7, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12]

(8) BroadcastExchange
Input [5]: [i_item_sk#7, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [plan_id=1]

(9) BroadcastHashJoin [codegen id : 3]
Left keys [1]: [cs_item_sk#1]
Right keys [1]: [i_item_sk#7]
Join type: Inner
Join condition: None

(10) Project [codegen id : 3]
Output [9]: [cs_item_sk#1, cs_order_number#2, cs_quantity#3, cs_ext_sales_price#4, cs_sold_date_sk#5, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12]
Input [10]: [cs_item_sk#1, cs_order_number#2, cs_quantity#3, cs_ext_sales_price#4, cs_sold_date_sk#5, i_item_sk#7, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12]

(11) ReusedExchange [Reuses operator id: 131]
Output [2]: [d_date_sk#13, d_year#14]

(12) BroadcastHashJoin [codegen id : 3]
Left keys [1]: [cs_sold_date_sk#5]
Right keys [1]: [d_date_sk#13]
Join type: Inner
Join condition: None

(13) Project [codegen id : 3]
Output [9]: [cs_item_sk#1, cs_order_number#2, cs_quantity#3, cs_ext_sales_price#4, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, d_year#14]
Input [11]: [cs_item_sk#1, cs_order_number#2, cs_quantity#3, cs_ext_sales_price#4, cs_sold_date_sk#5, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, d_date_sk#13, d_year#14]

(14) CometColumnarExchange
Input [9]: [cs_item_sk#1, cs_order_number#2, cs_quantity#3, cs_ext_sales_price#4, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, d_year#14]
Arguments: hashpartitioning(cs_order_number#2, cs_item_sk#1, 5), ENSURE_REQUIREMENTS, CometColumnarShuffle, [plan_id=2]

(15) CometSort
Input [9]: [cs_item_sk#1, cs_order_number#2, cs_quantity#3, cs_ext_sales_price#4, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, d_year#14]
Arguments: [cs_item_sk#1, cs_order_number#2, cs_quantity#3, cs_ext_sales_price#4, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, d_year#14], [cs_order_number#2 ASC NULLS FIRST, cs_item_sk#1 ASC NULLS FIRST]

(16) CometNativeScan parquet spark_catalog.default.catalog_returns
Output [5]: [cr_item_sk#15, cr_order_number#16, cr_return_quantity#17, cr_return_amount#18, cr_returned_date_sk#19]
Batched: true
Location [not included in comparison]/{warehouse_dir}/catalog_returns]
PushedFilters: [IsNotNull(cr_order_number), IsNotNull(cr_item_sk)]
ReadSchema: struct<cr_item_sk:int,cr_order_number:int,cr_return_quantity:int,cr_return_amount:decimal(7,2)>

(17) CometFilter
Input [5]: [cr_item_sk#15, cr_order_number#16, cr_return_quantity#17, cr_return_amount#18, cr_returned_date_sk#19]
Condition : (isnotnull(cr_order_number#16) AND isnotnull(cr_item_sk#15))

(18) CometProject
Input [5]: [cr_item_sk#15, cr_order_number#16, cr_return_quantity#17, cr_return_amount#18, cr_returned_date_sk#19]
Arguments: [cr_item_sk#15, cr_order_number#16, cr_return_quantity#17, cr_return_amount#18], [cr_item_sk#15, cr_order_number#16, cr_return_quantity#17, cr_return_amount#18]

(19) CometExchange
Input [4]: [cr_item_sk#15, cr_order_number#16, cr_return_quantity#17, cr_return_amount#18]
Arguments: hashpartitioning(cr_order_number#16, cr_item_sk#15, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=3]

(20) CometSort
Input [4]: [cr_item_sk#15, cr_order_number#16, cr_return_quantity#17, cr_return_amount#18]
Arguments: [cr_item_sk#15, cr_order_number#16, cr_return_quantity#17, cr_return_amount#18], [cr_order_number#16 ASC NULLS FIRST, cr_item_sk#15 ASC NULLS FIRST]

(21) CometSortMergeJoin
Left output [9]: [cs_item_sk#1, cs_order_number#2, cs_quantity#3, cs_ext_sales_price#4, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, d_year#14]
Right output [4]: [cr_item_sk#15, cr_order_number#16, cr_return_quantity#17, cr_return_amount#18]
Arguments: [cs_order_number#2, cs_item_sk#1], [cr_order_number#16, cr_item_sk#15], LeftOuter

(22) CometProject
Input [13]: [cs_item_sk#1, cs_order_number#2, cs_quantity#3, cs_ext_sales_price#4, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, d_year#14, cr_item_sk#15, cr_order_number#16, cr_return_quantity#17, cr_return_amount#18]
Arguments: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, sales_cnt#20, sales_amt#21], [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, (cs_quantity#3 - coalesce(cr_return_quantity#17, 0)) AS sales_cnt#20, (cs_ext_sales_price#4 - coalesce(cr_return_amount#18, 0.00)) AS sales_amt#21]

(23) Scan parquet spark_catalog.default.store_sales
Output [5]: [ss_item_sk#22, ss_ticket_number#23, ss_quantity#24, ss_ext_sales_price#25, ss_sold_date_sk#26]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(ss_sold_date_sk#26), dynamicpruningexpression(ss_sold_date_sk#26 IN dynamicpruning#6)]
PushedFilters: [IsNotNull(ss_item_sk)]
ReadSchema: struct<ss_item_sk:int,ss_ticket_number:int,ss_quantity:int,ss_ext_sales_price:decimal(7,2)>

(24) ColumnarToRow [codegen id : 6]
Input [5]: [ss_item_sk#22, ss_ticket_number#23, ss_quantity#24, ss_ext_sales_price#25, ss_sold_date_sk#26]

(25) Filter [codegen id : 6]
Input [5]: [ss_item_sk#22, ss_ticket_number#23, ss_quantity#24, ss_ext_sales_price#25, ss_sold_date_sk#26]
Condition : isnotnull(ss_item_sk#22)

(26) ReusedExchange [Reuses operator id: 8]
Output [5]: [i_item_sk#27, i_brand_id#28, i_class_id#29, i_category_id#30, i_manufact_id#31]

(27) BroadcastHashJoin [codegen id : 6]
Left keys [1]: [ss_item_sk#22]
Right keys [1]: [i_item_sk#27]
Join type: Inner
Join condition: None

(28) Project [codegen id : 6]
Output [9]: [ss_item_sk#22, ss_ticket_number#23, ss_quantity#24, ss_ext_sales_price#25, ss_sold_date_sk#26, i_brand_id#28, i_class_id#29, i_category_id#30, i_manufact_id#31]
Input [10]: [ss_item_sk#22, ss_ticket_number#23, ss_quantity#24, ss_ext_sales_price#25, ss_sold_date_sk#26, i_item_sk#27, i_brand_id#28, i_class_id#29, i_category_id#30, i_manufact_id#31]

(29) ReusedExchange [Reuses operator id: 131]
Output [2]: [d_date_sk#32, d_year#33]

(30) BroadcastHashJoin [codegen id : 6]
Left keys [1]: [ss_sold_date_sk#26]
Right keys [1]: [d_date_sk#32]
Join type: Inner
Join condition: None

(31) Project [codegen id : 6]
Output [9]: [ss_item_sk#22, ss_ticket_number#23, ss_quantity#24, ss_ext_sales_price#25, i_brand_id#28, i_class_id#29, i_category_id#30, i_manufact_id#31, d_year#33]
Input [11]: [ss_item_sk#22, ss_ticket_number#23, ss_quantity#24, ss_ext_sales_price#25, ss_sold_date_sk#26, i_brand_id#28, i_class_id#29, i_category_id#30, i_manufact_id#31, d_date_sk#32, d_year#33]

(32) CometColumnarExchange
Input [9]: [ss_item_sk#22, ss_ticket_number#23, ss_quantity#24, ss_ext_sales_price#25, i_brand_id#28, i_class_id#29, i_category_id#30, i_manufact_id#31, d_year#33]
Arguments: hashpartitioning(ss_ticket_number#23, ss_item_sk#22, 5), ENSURE_REQUIREMENTS, CometColumnarShuffle, [plan_id=4]

(33) CometSort
Input [9]: [ss_item_sk#22, ss_ticket_number#23, ss_quantity#24, ss_ext_sales_price#25, i_brand_id#28, i_class_id#29, i_category_id#30, i_manufact_id#31, d_year#33]
Arguments: [ss_item_sk#22, ss_ticket_number#23, ss_quantity#24, ss_ext_sales_price#25, i_brand_id#28, i_class_id#29, i_category_id#30, i_manufact_id#31, d_year#33], [ss_ticket_number#23 ASC NULLS FIRST, ss_item_sk#22 ASC NULLS FIRST]

(34) CometNativeScan parquet spark_catalog.default.store_returns
Output [5]: [sr_item_sk#34, sr_ticket_number#35, sr_return_quantity#36, sr_return_amt#37, sr_returned_date_sk#38]
Batched: true
Location [not included in comparison]/{warehouse_dir}/store_returns]
PushedFilters: [IsNotNull(sr_ticket_number), IsNotNull(sr_item_sk)]
ReadSchema: struct<sr_item_sk:int,sr_ticket_number:int,sr_return_quantity:int,sr_return_amt:decimal(7,2)>

(35) CometFilter
Input [5]: [sr_item_sk#34, sr_ticket_number#35, sr_return_quantity#36, sr_return_amt#37, sr_returned_date_sk#38]
Condition : (isnotnull(sr_ticket_number#35) AND isnotnull(sr_item_sk#34))

(36) CometProject
Input [5]: [sr_item_sk#34, sr_ticket_number#35, sr_return_quantity#36, sr_return_amt#37, sr_returned_date_sk#38]
Arguments: [sr_item_sk#34, sr_ticket_number#35, sr_return_quantity#36, sr_return_amt#37], [sr_item_sk#34, sr_ticket_number#35, sr_return_quantity#36, sr_return_amt#37]

(37) CometExchange
Input [4]: [sr_item_sk#34, sr_ticket_number#35, sr_return_quantity#36, sr_return_amt#37]
Arguments: hashpartitioning(sr_ticket_number#35, sr_item_sk#34, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=5]

(38) CometSort
Input [4]: [sr_item_sk#34, sr_ticket_number#35, sr_return_quantity#36, sr_return_amt#37]
Arguments: [sr_item_sk#34, sr_ticket_number#35, sr_return_quantity#36, sr_return_amt#37], [sr_ticket_number#35 ASC NULLS FIRST, sr_item_sk#34 ASC NULLS FIRST]

(39) CometSortMergeJoin
Left output [9]: [ss_item_sk#22, ss_ticket_number#23, ss_quantity#24, ss_ext_sales_price#25, i_brand_id#28, i_class_id#29, i_category_id#30, i_manufact_id#31, d_year#33]
Right output [4]: [sr_item_sk#34, sr_ticket_number#35, sr_return_quantity#36, sr_return_amt#37]
Arguments: [ss_ticket_number#23, ss_item_sk#22], [sr_ticket_number#35, sr_item_sk#34], LeftOuter

(40) CometProject
Input [13]: [ss_item_sk#22, ss_ticket_number#23, ss_quantity#24, ss_ext_sales_price#25, i_brand_id#28, i_class_id#29, i_category_id#30, i_manufact_id#31, d_year#33, sr_item_sk#34, sr_ticket_number#35, sr_return_quantity#36, sr_return_amt#37]
Arguments: [d_year#33, i_brand_id#28, i_class_id#29, i_category_id#30, i_manufact_id#31, sales_cnt#39, sales_amt#40], [d_year#33, i_brand_id#28, i_class_id#29, i_category_id#30, i_manufact_id#31, (ss_quantity#24 - coalesce(sr_return_quantity#36, 0)) AS sales_cnt#39, (ss_ext_sales_price#25 - coalesce(sr_return_amt#37, 0.00)) AS sales_amt#40]

(41) Scan parquet spark_catalog.default.web_sales
Output [5]: [ws_item_sk#41, ws_order_number#42, ws_quantity#43, ws_ext_sales_price#44, ws_sold_date_sk#45]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(ws_sold_date_sk#45), dynamicpruningexpression(ws_sold_date_sk#45 IN dynamicpruning#6)]
PushedFilters: [IsNotNull(ws_item_sk)]
ReadSchema: struct<ws_item_sk:int,ws_order_number:int,ws_quantity:int,ws_ext_sales_price:decimal(7,2)>

(42) ColumnarToRow [codegen id : 9]
Input [5]: [ws_item_sk#41, ws_order_number#42, ws_quantity#43, ws_ext_sales_price#44, ws_sold_date_sk#45]

(43) Filter [codegen id : 9]
Input [5]: [ws_item_sk#41, ws_order_number#42, ws_quantity#43, ws_ext_sales_price#44, ws_sold_date_sk#45]
Condition : isnotnull(ws_item_sk#41)

(44) ReusedExchange [Reuses operator id: 8]
Output [5]: [i_item_sk#46, i_brand_id#47, i_class_id#48, i_category_id#49, i_manufact_id#50]

(45) BroadcastHashJoin [codegen id : 9]
Left keys [1]: [ws_item_sk#41]
Right keys [1]: [i_item_sk#46]
Join type: Inner
Join condition: None

(46) Project [codegen id : 9]
Output [9]: [ws_item_sk#41, ws_order_number#42, ws_quantity#43, ws_ext_sales_price#44, ws_sold_date_sk#45, i_brand_id#47, i_class_id#48, i_category_id#49, i_manufact_id#50]
Input [10]: [ws_item_sk#41, ws_order_number#42, ws_quantity#43, ws_ext_sales_price#44, ws_sold_date_sk#45, i_item_sk#46, i_brand_id#47, i_class_id#48, i_category_id#49, i_manufact_id#50]

(47) ReusedExchange [Reuses operator id: 131]
Output [2]: [d_date_sk#51, d_year#52]

(48) BroadcastHashJoin [codegen id : 9]
Left keys [1]: [ws_sold_date_sk#45]
Right keys [1]: [d_date_sk#51]
Join type: Inner
Join condition: None

(49) Project [codegen id : 9]
Output [9]: [ws_item_sk#41, ws_order_number#42, ws_quantity#43, ws_ext_sales_price#44, i_brand_id#47, i_class_id#48, i_category_id#49, i_manufact_id#50, d_year#52]
Input [11]: [ws_item_sk#41, ws_order_number#42, ws_quantity#43, ws_ext_sales_price#44, ws_sold_date_sk#45, i_brand_id#47, i_class_id#48, i_category_id#49, i_manufact_id#50, d_date_sk#51, d_year#52]

(50) CometColumnarExchange
Input [9]: [ws_item_sk#41, ws_order_number#42, ws_quantity#43, ws_ext_sales_price#44, i_brand_id#47, i_class_id#48, i_category_id#49, i_manufact_id#50, d_year#52]
Arguments: hashpartitioning(ws_order_number#42, ws_item_sk#41, 5), ENSURE_REQUIREMENTS, CometColumnarShuffle, [plan_id=6]

(51) CometSort
Input [9]: [ws_item_sk#41, ws_order_number#42, ws_quantity#43, ws_ext_sales_price#44, i_brand_id#47, i_class_id#48, i_category_id#49, i_manufact_id#50, d_year#52]
Arguments: [ws_item_sk#41, ws_order_number#42, ws_quantity#43, ws_ext_sales_price#44, i_brand_id#47, i_class_id#48, i_category_id#49, i_manufact_id#50, d_year#52], [ws_order_number#42 ASC NULLS FIRST, ws_item_sk#41 ASC NULLS FIRST]

(52) CometNativeScan parquet spark_catalog.default.web_returns
Output [5]: [wr_item_sk#53, wr_order_number#54, wr_return_quantity#55, wr_return_amt#56, wr_returned_date_sk#57]
Batched: true
Location [not included in comparison]/{warehouse_dir}/web_returns]
PushedFilters: [IsNotNull(wr_order_number), IsNotNull(wr_item_sk)]
ReadSchema: struct<wr_item_sk:int,wr_order_number:int,wr_return_quantity:int,wr_return_amt:decimal(7,2)>

(53) CometFilter
Input [5]: [wr_item_sk#53, wr_order_number#54, wr_return_quantity#55, wr_return_amt#56, wr_returned_date_sk#57]
Condition : (isnotnull(wr_order_number#54) AND isnotnull(wr_item_sk#53))

(54) CometProject
Input [5]: [wr_item_sk#53, wr_order_number#54, wr_return_quantity#55, wr_return_amt#56, wr_returned_date_sk#57]
Arguments: [wr_item_sk#53, wr_order_number#54, wr_return_quantity#55, wr_return_amt#56], [wr_item_sk#53, wr_order_number#54, wr_return_quantity#55, wr_return_amt#56]

(55) CometExchange
Input [4]: [wr_item_sk#53, wr_order_number#54, wr_return_quantity#55, wr_return_amt#56]
Arguments: hashpartitioning(wr_order_number#54, wr_item_sk#53, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=7]

(56) CometSort
Input [4]: [wr_item_sk#53, wr_order_number#54, wr_return_quantity#55, wr_return_amt#56]
Arguments: [wr_item_sk#53, wr_order_number#54, wr_return_quantity#55, wr_return_amt#56], [wr_order_number#54 ASC NULLS FIRST, wr_item_sk#53 ASC NULLS FIRST]

(57) CometSortMergeJoin
Left output [9]: [ws_item_sk#41, ws_order_number#42, ws_quantity#43, ws_ext_sales_price#44, i_brand_id#47, i_class_id#48, i_category_id#49, i_manufact_id#50, d_year#52]
Right output [4]: [wr_item_sk#53, wr_order_number#54, wr_return_quantity#55, wr_return_amt#56]
Arguments: [ws_order_number#42, ws_item_sk#41], [wr_order_number#54, wr_item_sk#53], LeftOuter

(58) CometProject
Input [13]: [ws_item_sk#41, ws_order_number#42, ws_quantity#43, ws_ext_sales_price#44, i_brand_id#47, i_class_id#48, i_category_id#49, i_manufact_id#50, d_year#52, wr_item_sk#53, wr_order_number#54, wr_return_quantity#55, wr_return_amt#56]
Arguments: [d_year#52, i_brand_id#47, i_class_id#48, i_category_id#49, i_manufact_id#50, sales_cnt#58, sales_amt#59], [d_year#52, i_brand_id#47, i_class_id#48, i_category_id#49, i_manufact_id#50, (ws_quantity#43 - coalesce(wr_return_quantity#55, 0)) AS sales_cnt#58, (ws_ext_sales_price#44 - coalesce(wr_return_amt#56, 0.00)) AS sales_amt#59]

(59) CometUnion
Child 0 Input [7]: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, sales_cnt#20, sales_amt#21]
Child 1 Input [7]: [d_year#33, i_brand_id#28, i_class_id#29, i_category_id#30, i_manufact_id#31, sales_cnt#39, sales_amt#40]
Child 2 Input [7]: [d_year#52, i_brand_id#47, i_class_id#48, i_category_id#49, i_manufact_id#50, sales_cnt#58, sales_amt#59]

(60) CometHashAggregate
Input [7]: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, sales_cnt#20, sales_amt#21]
Keys [7]: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, sales_cnt#20, sales_amt#21]
Functions: []

(61) CometExchange
Input [7]: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, sales_cnt#20, sales_amt#21]
Arguments: hashpartitioning(d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, sales_cnt#20, sales_amt#21, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=8]

(62) CometHashAggregate
Input [7]: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, sales_cnt#20, sales_amt#21]
Keys [7]: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, sales_cnt#20, sales_amt#21]
Functions: []

(63) CometHashAggregate
Input [7]: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, sales_cnt#20, sales_amt#21]
Keys [5]: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12]
Functions [2]: [partial_sum(sales_cnt#20), partial_sum(UnscaledValue(sales_amt#21))]

(64) CometExchange
Input [7]: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, sum#60, sum#61]
Arguments: hashpartitioning(d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=9]

(65) CometHashAggregate
Input [7]: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, sum#60, sum#61]
Keys [5]: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12]
Functions [2]: [sum(sales_cnt#20), sum(UnscaledValue(sales_amt#21))]

(66) CometFilter
Input [7]: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, sales_cnt#62, sales_amt#63]
Condition : isnotnull(sales_cnt#62)

(67) CometExchange
Input [7]: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, sales_cnt#62, sales_amt#63]
Arguments: hashpartitioning(i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=10]

(68) CometSort
Input [7]: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, sales_cnt#62, sales_amt#63]
Arguments: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, sales_cnt#62, sales_amt#63], [i_brand_id#8 ASC NULLS FIRST, i_class_id#9 ASC NULLS FIRST, i_category_id#10 ASC NULLS FIRST, i_manufact_id#12 ASC NULLS FIRST]

(69) Scan parquet spark_catalog.default.catalog_sales
Output [5]: [cs_item_sk#64, cs_order_number#65, cs_quantity#66, cs_ext_sales_price#67, cs_sold_date_sk#68]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(cs_sold_date_sk#68), dynamicpruningexpression(cs_sold_date_sk#68 IN dynamicpruning#69)]
PushedFilters: [IsNotNull(cs_item_sk)]
ReadSchema: struct<cs_item_sk:int,cs_order_number:int,cs_quantity:int,cs_ext_sales_price:decimal(7,2)>

(70) ColumnarToRow [codegen id : 12]
Input [5]: [cs_item_sk#64, cs_order_number#65, cs_quantity#66, cs_ext_sales_price#67, cs_sold_date_sk#68]

(71) Filter [codegen id : 12]
Input [5]: [cs_item_sk#64, cs_order_number#65, cs_quantity#66, cs_ext_sales_price#67, cs_sold_date_sk#68]
Condition : isnotnull(cs_item_sk#64)

(72) ReusedExchange [Reuses operator id: 8]
Output [5]: [i_item_sk#70, i_brand_id#71, i_class_id#72, i_category_id#73, i_manufact_id#74]

(73) BroadcastHashJoin [codegen id : 12]
Left keys [1]: [cs_item_sk#64]
Right keys [1]: [i_item_sk#70]
Join type: Inner
Join condition: None

(74) Project [codegen id : 12]
Output [9]: [cs_item_sk#64, cs_order_number#65, cs_quantity#66, cs_ext_sales_price#67, cs_sold_date_sk#68, i_brand_id#71, i_class_id#72, i_category_id#73, i_manufact_id#74]
Input [10]: [cs_item_sk#64, cs_order_number#65, cs_quantity#66, cs_ext_sales_price#67, cs_sold_date_sk#68, i_item_sk#70, i_brand_id#71, i_class_id#72, i_category_id#73, i_manufact_id#74]

(75) ReusedExchange [Reuses operator id: 135]
Output [2]: [d_date_sk#75, d_year#76]

(76) BroadcastHashJoin [codegen id : 12]
Left keys [1]: [cs_sold_date_sk#68]
Right keys [1]: [d_date_sk#75]
Join type: Inner
Join condition: None

(77) Project [codegen id : 12]
Output [9]: [cs_item_sk#64, cs_order_number#65, cs_quantity#66, cs_ext_sales_price#67, i_brand_id#71, i_class_id#72, i_category_id#73, i_manufact_id#74, d_year#76]
Input [11]: [cs_item_sk#64, cs_order_number#65, cs_quantity#66, cs_ext_sales_price#67, cs_sold_date_sk#68, i_brand_id#71, i_class_id#72, i_category_id#73, i_manufact_id#74, d_date_sk#75, d_year#76]

(78) CometColumnarExchange
Input [9]: [cs_item_sk#64, cs_order_number#65, cs_quantity#66, cs_ext_sales_price#67, i_brand_id#71, i_class_id#72, i_category_id#73, i_manufact_id#74, d_year#76]
Arguments: hashpartitioning(cs_order_number#65, cs_item_sk#64, 5), ENSURE_REQUIREMENTS, CometColumnarShuffle, [plan_id=11]

(79) CometSort
Input [9]: [cs_item_sk#64, cs_order_number#65, cs_quantity#66, cs_ext_sales_price#67, i_brand_id#71, i_class_id#72, i_category_id#73, i_manufact_id#74, d_year#76]
Arguments: [cs_item_sk#64, cs_order_number#65, cs_quantity#66, cs_ext_sales_price#67, i_brand_id#71, i_class_id#72, i_category_id#73, i_manufact_id#74, d_year#76], [cs_order_number#65 ASC NULLS FIRST, cs_item_sk#64 ASC NULLS FIRST]

(80) ReusedExchange [Reuses operator id: 19]
Output [4]: [cr_item_sk#77, cr_order_number#78, cr_return_quantity#79, cr_return_amount#80]

(81) CometSort
Input [4]: [cr_item_sk#77, cr_order_number#78, cr_return_quantity#79, cr_return_amount#80]
Arguments: [cr_item_sk#77, cr_order_number#78, cr_return_quantity#79, cr_return_amount#80], [cr_order_number#78 ASC NULLS FIRST, cr_item_sk#77 ASC NULLS FIRST]

(82) CometSortMergeJoin
Left output [9]: [cs_item_sk#64, cs_order_number#65, cs_quantity#66, cs_ext_sales_price#67, i_brand_id#71, i_class_id#72, i_category_id#73, i_manufact_id#74, d_year#76]
Right output [4]: [cr_item_sk#77, cr_order_number#78, cr_return_quantity#79, cr_return_amount#80]
Arguments: [cs_order_number#65, cs_item_sk#64], [cr_order_number#78, cr_item_sk#77], LeftOuter

(83) CometProject
Input [13]: [cs_item_sk#64, cs_order_number#65, cs_quantity#66, cs_ext_sales_price#67, i_brand_id#71, i_class_id#72, i_category_id#73, i_manufact_id#74, d_year#76, cr_item_sk#77, cr_order_number#78, cr_return_quantity#79, cr_return_amount#80]
Arguments: [d_year#76, i_brand_id#71, i_class_id#72, i_category_id#73, i_manufact_id#74, sales_cnt#81, sales_amt#82], [d_year#76, i_brand_id#71, i_class_id#72, i_category_id#73, i_manufact_id#74, (cs_quantity#66 - coalesce(cr_return_quantity#79, 0)) AS sales_cnt#81, (cs_ext_sales_price#67 - coalesce(cr_return_amount#80, 0.00)) AS sales_amt#82]

(84) Scan parquet spark_catalog.default.store_sales
Output [5]: [ss_item_sk#83, ss_ticket_number#84, ss_quantity#85, ss_ext_sales_price#86, ss_sold_date_sk#87]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(ss_sold_date_sk#87), dynamicpruningexpression(ss_sold_date_sk#87 IN dynamicpruning#69)]
PushedFilters: [IsNotNull(ss_item_sk)]
ReadSchema: struct<ss_item_sk:int,ss_ticket_number:int,ss_quantity:int,ss_ext_sales_price:decimal(7,2)>

(85) ColumnarToRow [codegen id : 15]
Input [5]: [ss_item_sk#83, ss_ticket_number#84, ss_quantity#85, ss_ext_sales_price#86, ss_sold_date_sk#87]

(86) Filter [codegen id : 15]
Input [5]: [ss_item_sk#83, ss_ticket_number#84, ss_quantity#85, ss_ext_sales_price#86, ss_sold_date_sk#87]
Condition : isnotnull(ss_item_sk#83)

(87) ReusedExchange [Reuses operator id: 8]
Output [5]: [i_item_sk#88, i_brand_id#89, i_class_id#90, i_category_id#91, i_manufact_id#92]

(88) BroadcastHashJoin [codegen id : 15]
Left keys [1]: [ss_item_sk#83]
Right keys [1]: [i_item_sk#88]
Join type: Inner
Join condition: None

(89) Project [codegen id : 15]
Output [9]: [ss_item_sk#83, ss_ticket_number#84, ss_quantity#85, ss_ext_sales_price#86, ss_sold_date_sk#87, i_brand_id#89, i_class_id#90, i_category_id#91, i_manufact_id#92]
Input [10]: [ss_item_sk#83, ss_ticket_number#84, ss_quantity#85, ss_ext_sales_price#86, ss_sold_date_sk#87, i_item_sk#88, i_brand_id#89, i_class_id#90, i_category_id#91, i_manufact_id#92]

(90) ReusedExchange [Reuses operator id: 135]
Output [2]: [d_date_sk#93, d_year#94]

(91) BroadcastHashJoin [codegen id : 15]
Left keys [1]: [ss_sold_date_sk#87]
Right keys [1]: [d_date_sk#93]
Join type: Inner
Join condition: None

(92) Project [codegen id : 15]
Output [9]: [ss_item_sk#83, ss_ticket_number#84, ss_quantity#85, ss_ext_sales_price#86, i_brand_id#89, i_class_id#90, i_category_id#91, i_manufact_id#92, d_year#94]
Input [11]: [ss_item_sk#83, ss_ticket_number#84, ss_quantity#85, ss_ext_sales_price#86, ss_sold_date_sk#87, i_brand_id#89, i_class_id#90, i_category_id#91, i_manufact_id#92, d_date_sk#93, d_year#94]

(93) CometColumnarExchange
Input [9]: [ss_item_sk#83, ss_ticket_number#84, ss_quantity#85, ss_ext_sales_price#86, i_brand_id#89, i_class_id#90, i_category_id#91, i_manufact_id#92, d_year#94]
Arguments: hashpartitioning(ss_ticket_number#84, ss_item_sk#83, 5), ENSURE_REQUIREMENTS, CometColumnarShuffle, [plan_id=12]

(94) CometSort
Input [9]: [ss_item_sk#83, ss_ticket_number#84, ss_quantity#85, ss_ext_sales_price#86, i_brand_id#89, i_class_id#90, i_category_id#91, i_manufact_id#92, d_year#94]
Arguments: [ss_item_sk#83, ss_ticket_number#84, ss_quantity#85, ss_ext_sales_price#86, i_brand_id#89, i_class_id#90, i_category_id#91, i_manufact_id#92, d_year#94], [ss_ticket_number#84 ASC NULLS FIRST, ss_item_sk#83 ASC NULLS FIRST]

(95) ReusedExchange [Reuses operator id: 37]
Output [4]: [sr_item_sk#95, sr_ticket_number#96, sr_return_quantity#97, sr_return_amt#98]

(96) CometSort
Input [4]: [sr_item_sk#95, sr_ticket_number#96, sr_return_quantity#97, sr_return_amt#98]
Arguments: [sr_item_sk#95, sr_ticket_number#96, sr_return_quantity#97, sr_return_amt#98], [sr_ticket_number#96 ASC NULLS FIRST, sr_item_sk#95 ASC NULLS FIRST]

(97) CometSortMergeJoin
Left output [9]: [ss_item_sk#83, ss_ticket_number#84, ss_quantity#85, ss_ext_sales_price#86, i_brand_id#89, i_class_id#90, i_category_id#91, i_manufact_id#92, d_year#94]
Right output [4]: [sr_item_sk#95, sr_ticket_number#96, sr_return_quantity#97, sr_return_amt#98]
Arguments: [ss_ticket_number#84, ss_item_sk#83], [sr_ticket_number#96, sr_item_sk#95], LeftOuter

(98) CometProject
Input [13]: [ss_item_sk#83, ss_ticket_number#84, ss_quantity#85, ss_ext_sales_price#86, i_brand_id#89, i_class_id#90, i_category_id#91, i_manufact_id#92, d_year#94, sr_item_sk#95, sr_ticket_number#96, sr_return_quantity#97, sr_return_amt#98]
Arguments: [d_year#94, i_brand_id#89, i_class_id#90, i_category_id#91, i_manufact_id#92, sales_cnt#99, sales_amt#100], [d_year#94, i_brand_id#89, i_class_id#90, i_category_id#91, i_manufact_id#92, (ss_quantity#85 - coalesce(sr_return_quantity#97, 0)) AS sales_cnt#99, (ss_ext_sales_price#86 - coalesce(sr_return_amt#98, 0.00)) AS sales_amt#100]

(99) Scan parquet spark_catalog.default.web_sales
Output [5]: [ws_item_sk#101, ws_order_number#102, ws_quantity#103, ws_ext_sales_price#104, ws_sold_date_sk#105]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(ws_sold_date_sk#105), dynamicpruningexpression(ws_sold_date_sk#105 IN dynamicpruning#69)]
PushedFilters: [IsNotNull(ws_item_sk)]
ReadSchema: struct<ws_item_sk:int,ws_order_number:int,ws_quantity:int,ws_ext_sales_price:decimal(7,2)>

(100) ColumnarToRow [codegen id : 18]
Input [5]: [ws_item_sk#101, ws_order_number#102, ws_quantity#103, ws_ext_sales_price#104, ws_sold_date_sk#105]

(101) Filter [codegen id : 18]
Input [5]: [ws_item_sk#101, ws_order_number#102, ws_quantity#103, ws_ext_sales_price#104, ws_sold_date_sk#105]
Condition : isnotnull(ws_item_sk#101)

(102) ReusedExchange [Reuses operator id: 8]
Output [5]: [i_item_sk#106, i_brand_id#107, i_class_id#108, i_category_id#109, i_manufact_id#110]

(103) BroadcastHashJoin [codegen id : 18]
Left keys [1]: [ws_item_sk#101]
Right keys [1]: [i_item_sk#106]
Join type: Inner
Join condition: None

(104) Project [codegen id : 18]
Output [9]: [ws_item_sk#101, ws_order_number#102, ws_quantity#103, ws_ext_sales_price#104, ws_sold_date_sk#105, i_brand_id#107, i_class_id#108, i_category_id#109, i_manufact_id#110]
Input [10]: [ws_item_sk#101, ws_order_number#102, ws_quantity#103, ws_ext_sales_price#104, ws_sold_date_sk#105, i_item_sk#106, i_brand_id#107, i_class_id#108, i_category_id#109, i_manufact_id#110]

(105) ReusedExchange [Reuses operator id: 135]
Output [2]: [d_date_sk#111, d_year#112]

(106) BroadcastHashJoin [codegen id : 18]
Left keys [1]: [ws_sold_date_sk#105]
Right keys [1]: [d_date_sk#111]
Join type: Inner
Join condition: None

(107) Project [codegen id : 18]
Output [9]: [ws_item_sk#101, ws_order_number#102, ws_quantity#103, ws_ext_sales_price#104, i_brand_id#107, i_class_id#108, i_category_id#109, i_manufact_id#110, d_year#112]
Input [11]: [ws_item_sk#101, ws_order_number#102, ws_quantity#103, ws_ext_sales_price#104, ws_sold_date_sk#105, i_brand_id#107, i_class_id#108, i_category_id#109, i_manufact_id#110, d_date_sk#111, d_year#112]

(108) CometColumnarExchange
Input [9]: [ws_item_sk#101, ws_order_number#102, ws_quantity#103, ws_ext_sales_price#104, i_brand_id#107, i_class_id#108, i_category_id#109, i_manufact_id#110, d_year#112]
Arguments: hashpartitioning(ws_order_number#102, ws_item_sk#101, 5), ENSURE_REQUIREMENTS, CometColumnarShuffle, [plan_id=13]

(109) CometSort
Input [9]: [ws_item_sk#101, ws_order_number#102, ws_quantity#103, ws_ext_sales_price#104, i_brand_id#107, i_class_id#108, i_category_id#109, i_manufact_id#110, d_year#112]
Arguments: [ws_item_sk#101, ws_order_number#102, ws_quantity#103, ws_ext_sales_price#104, i_brand_id#107, i_class_id#108, i_category_id#109, i_manufact_id#110, d_year#112], [ws_order_number#102 ASC NULLS FIRST, ws_item_sk#101 ASC NULLS FIRST]

(110) ReusedExchange [Reuses operator id: 55]
Output [4]: [wr_item_sk#113, wr_order_number#114, wr_return_quantity#115, wr_return_amt#116]

(111) CometSort
Input [4]: [wr_item_sk#113, wr_order_number#114, wr_return_quantity#115, wr_return_amt#116]
Arguments: [wr_item_sk#113, wr_order_number#114, wr_return_quantity#115, wr_return_amt#116], [wr_order_number#114 ASC NULLS FIRST, wr_item_sk#113 ASC NULLS FIRST]

(112) CometSortMergeJoin
Left output [9]: [ws_item_sk#101, ws_order_number#102, ws_quantity#103, ws_ext_sales_price#104, i_brand_id#107, i_class_id#108, i_category_id#109, i_manufact_id#110, d_year#112]
Right output [4]: [wr_item_sk#113, wr_order_number#114, wr_return_quantity#115, wr_return_amt#116]
Arguments: [ws_order_number#102, ws_item_sk#101], [wr_order_number#114, wr_item_sk#113], LeftOuter

(113) CometProject
Input [13]: [ws_item_sk#101, ws_order_number#102, ws_quantity#103, ws_ext_sales_price#104, i_brand_id#107, i_class_id#108, i_category_id#109, i_manufact_id#110, d_year#112, wr_item_sk#113, wr_order_number#114, wr_return_quantity#115, wr_return_amt#116]
Arguments: [d_year#112, i_brand_id#107, i_class_id#108, i_category_id#109, i_manufact_id#110, sales_cnt#117, sales_amt#118], [d_year#112, i_brand_id#107, i_class_id#108, i_category_id#109, i_manufact_id#110, (ws_quantity#103 - coalesce(wr_return_quantity#115, 0)) AS sales_cnt#117, (ws_ext_sales_price#104 - coalesce(wr_return_amt#116, 0.00)) AS sales_amt#118]

(114) CometUnion
Child 0 Input [7]: [d_year#76, i_brand_id#71, i_class_id#72, i_category_id#73, i_manufact_id#74, sales_cnt#81, sales_amt#82]
Child 1 Input [7]: [d_year#94, i_brand_id#89, i_class_id#90, i_category_id#91, i_manufact_id#92, sales_cnt#99, sales_amt#100]
Child 2 Input [7]: [d_year#112, i_brand_id#107, i_class_id#108, i_category_id#109, i_manufact_id#110, sales_cnt#117, sales_amt#118]

(115) CometHashAggregate
Input [7]: [d_year#76, i_brand_id#71, i_class_id#72, i_category_id#73, i_manufact_id#74, sales_cnt#81, sales_amt#82]
Keys [7]: [d_year#76, i_brand_id#71, i_class_id#72, i_category_id#73, i_manufact_id#74, sales_cnt#81, sales_amt#82]
Functions: []

(116) CometExchange
Input [7]: [d_year#76, i_brand_id#71, i_class_id#72, i_category_id#73, i_manufact_id#74, sales_cnt#81, sales_amt#82]
Arguments: hashpartitioning(d_year#76, i_brand_id#71, i_class_id#72, i_category_id#73, i_manufact_id#74, sales_cnt#81, sales_amt#82, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=14]

(117) CometHashAggregate
Input [7]: [d_year#76, i_brand_id#71, i_class_id#72, i_category_id#73, i_manufact_id#74, sales_cnt#81, sales_amt#82]
Keys [7]: [d_year#76, i_brand_id#71, i_class_id#72, i_category_id#73, i_manufact_id#74, sales_cnt#81, sales_amt#82]
Functions: []

(118) CometHashAggregate
Input [7]: [d_year#76, i_brand_id#71, i_class_id#72, i_category_id#73, i_manufact_id#74, sales_cnt#81, sales_amt#82]
Keys [5]: [d_year#76, i_brand_id#71, i_class_id#72, i_category_id#73, i_manufact_id#74]
Functions [2]: [partial_sum(sales_cnt#81), partial_sum(UnscaledValue(sales_amt#82))]

(119) CometExchange
Input [7]: [d_year#76, i_brand_id#71, i_class_id#72, i_category_id#73, i_manufact_id#74, sum#119, sum#120]
Arguments: hashpartitioning(d_year#76, i_brand_id#71, i_class_id#72, i_category_id#73, i_manufact_id#74, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=15]

(120) CometHashAggregate
Input [7]: [d_year#76, i_brand_id#71, i_class_id#72, i_category_id#73, i_manufact_id#74, sum#119, sum#120]
Keys [5]: [d_year#76, i_brand_id#71, i_class_id#72, i_category_id#73, i_manufact_id#74]
Functions [2]: [sum(sales_cnt#81), sum(UnscaledValue(sales_amt#82))]

(121) CometFilter
Input [7]: [d_year#76, i_brand_id#71, i_class_id#72, i_category_id#73, i_manufact_id#74, sales_cnt#121, sales_amt#122]
Condition : isnotnull(sales_cnt#121)

(122) CometExchange
Input [7]: [d_year#76, i_brand_id#71, i_class_id#72, i_category_id#73, i_manufact_id#74, sales_cnt#121, sales_amt#122]
Arguments: hashpartitioning(i_brand_id#71, i_class_id#72, i_category_id#73, i_manufact_id#74, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=16]

(123) CometSort
Input [7]: [d_year#76, i_brand_id#71, i_class_id#72, i_category_id#73, i_manufact_id#74, sales_cnt#121, sales_amt#122]
Arguments: [d_year#76, i_brand_id#71, i_class_id#72, i_category_id#73, i_manufact_id#74, sales_cnt#121, sales_amt#122], [i_brand_id#71 ASC NULLS FIRST, i_class_id#72 ASC NULLS FIRST, i_category_id#73 ASC NULLS FIRST, i_manufact_id#74 ASC NULLS FIRST]

(124) CometSortMergeJoin
Left output [7]: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, sales_cnt#62, sales_amt#63]
Right output [7]: [d_year#76, i_brand_id#71, i_class_id#72, i_category_id#73, i_manufact_id#74, sales_cnt#121, sales_amt#122]
Arguments: [i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12], [i_brand_id#71, i_class_id#72, i_category_id#73, i_manufact_id#74], Inner, ((cast(sales_cnt#62 as decimal(17,2)) / cast(sales_cnt#121 as decimal(17,2))) < 0.90000000000000000000)

(125) CometProject
Input [14]: [d_year#14, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, sales_cnt#62, sales_amt#63, d_year#76, i_brand_id#71, i_class_id#72, i_category_id#73, i_manufact_id#74, sales_cnt#121, sales_amt#122]
Arguments: [prev_year#123, year#124, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, prev_yr_cnt#125, curr_yr_cnt#126, sales_cnt_diff#127, sales_amt_diff#128], [d_year#76 AS prev_year#123, d_year#14 AS year#124, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, sales_cnt#121 AS prev_yr_cnt#125, sales_cnt#62 AS curr_yr_cnt#126, (sales_cnt#62 - sales_cnt#121) AS sales_cnt_diff#127, (sales_amt#63 - sales_amt#122) AS sales_amt_diff#128]

(126) CometTakeOrderedAndProject
Input [10]: [prev_year#123, year#124, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, prev_yr_cnt#125, curr_yr_cnt#126, sales_cnt_diff#127, sales_amt_diff#128]
Arguments: TakeOrderedAndProject(limit=100, orderBy=[sales_cnt_diff#127 ASC NULLS FIRST,sales_amt_diff#128 ASC NULLS FIRST], output=[prev_year#123,year#124,i_brand_id#8,i_class_id#9,i_category_id#10,i_manufact_id#12,prev_yr_cnt#125,curr_yr_cnt#126,sales_cnt_diff#127,sales_amt_diff#128]), [prev_year#123, year#124, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, prev_yr_cnt#125, curr_yr_cnt#126, sales_cnt_diff#127, sales_amt_diff#128], 100, 0, [sales_cnt_diff#127 ASC NULLS FIRST, sales_amt_diff#128 ASC NULLS FIRST], [prev_year#123, year#124, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, prev_yr_cnt#125, curr_yr_cnt#126, sales_cnt_diff#127, sales_amt_diff#128]

(127) CometColumnarToRow [codegen id : 19]
Input [10]: [prev_year#123, year#124, i_brand_id#8, i_class_id#9, i_category_id#10, i_manufact_id#12, prev_yr_cnt#125, curr_yr_cnt#126, sales_cnt_diff#127, sales_amt_diff#128]

===== Subqueries =====

Subquery:1 Hosting operator id = 1 Hosting Expression = cs_sold_date_sk#5 IN dynamicpruning#6
BroadcastExchange (131)
+- * CometColumnarToRow (130)
   +- CometFilter (129)
      +- CometNativeScan parquet spark_catalog.default.date_dim (128)


(128) CometNativeScan parquet spark_catalog.default.date_dim
Output [2]: [d_date_sk#13, d_year#14]
Batched: true
Location [not included in comparison]/{warehouse_dir}/date_dim]
PushedFilters: [IsNotNull(d_year), EqualTo(d_year,2002), IsNotNull(d_date_sk)]
ReadSchema: struct<d_date_sk:int,d_year:int>

(129) CometFilter
Input [2]: [d_date_sk#13, d_year#14]
Condition : ((isnotnull(d_year#14) AND (d_year#14 = 2002)) AND isnotnull(d_date_sk#13))

(130) CometColumnarToRow [codegen id : 1]
Input [2]: [d_date_sk#13, d_year#14]

(131) BroadcastExchange
Input [2]: [d_date_sk#13, d_year#14]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=17]

Subquery:2 Hosting operator id = 23 Hosting Expression = ss_sold_date_sk#26 IN dynamicpruning#6

Subquery:3 Hosting operator id = 41 Hosting Expression = ws_sold_date_sk#45 IN dynamicpruning#6

Subquery:4 Hosting operator id = 69 Hosting Expression = cs_sold_date_sk#68 IN dynamicpruning#69
BroadcastExchange (135)
+- * CometColumnarToRow (134)
   +- CometFilter (133)
      +- CometNativeScan parquet spark_catalog.default.date_dim (132)


(132) CometNativeScan parquet spark_catalog.default.date_dim
Output [2]: [d_date_sk#75, d_year#76]
Batched: true
Location [not included in comparison]/{warehouse_dir}/date_dim]
PushedFilters: [IsNotNull(d_year), EqualTo(d_year,2001), IsNotNull(d_date_sk)]
ReadSchema: struct<d_date_sk:int,d_year:int>

(133) CometFilter
Input [2]: [d_date_sk#75, d_year#76]
Condition : ((isnotnull(d_year#76) AND (d_year#76 = 2001)) AND isnotnull(d_date_sk#75))

(134) CometColumnarToRow [codegen id : 1]
Input [2]: [d_date_sk#75, d_year#76]

(135) BroadcastExchange
Input [2]: [d_date_sk#75, d_year#76]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=18]

Subquery:5 Hosting operator id = 84 Hosting Expression = ss_sold_date_sk#87 IN dynamicpruning#69

Subquery:6 Hosting operator id = 99 Hosting Expression = ws_sold_date_sk#105 IN dynamicpruning#69


