== Physical Plan ==
TakeOrderedAndProject (83)
+- * HashAggregate (82)
   +- Exchange (81)
      +- * HashAggregate (80)
         +- Union (79)
            :- * HashAggregate (68)
            :  +- Exchange (67)
            :     +- * HashAggregate (66)
            :        +- Union (65)
            :           :- * HashAggregate (22)
            :           :  +- * ColumnarToRow (21)
            :           :     +- CometExchange (20)
            :           :        +- CometHashAggregate (19)
            :           :           +- CometProject (18)
            :           :              +- CometBroadcastHashJoin (17)
            :           :                 :- CometProject (13)
            :           :                 :  +- CometBroadcastHashJoin (12)
            :           :                 :     :- CometUnion (7)
            :           :                 :     :  :- CometProject (3)
            :           :                 :     :  :  +- CometFilter (2)
            :           :                 :     :  :     +- CometScan parquet spark_catalog.default.store_sales (1)
            :           :                 :     :  +- CometProject (6)
            :           :                 :     :     +- CometFilter (5)
            :           :                 :     :        +- CometScan parquet spark_catalog.default.store_returns (4)
            :           :                 :     +- CometBroadcastExchange (11)
            :           :                 :        +- CometProject (10)
            :           :                 :           +- CometFilter (9)
            :           :                 :              +- CometScan parquet spark_catalog.default.date_dim (8)
            :           :                 +- CometBroadcastExchange (16)
            :           :                    +- CometFilter (15)
            :           :                       +- CometScan parquet spark_catalog.default.store (14)
            :           :- * HashAggregate (41)
            :           :  +- * ColumnarToRow (40)
            :           :     +- CometExchange (39)
            :           :        +- CometHashAggregate (38)
            :           :           +- CometProject (37)
            :           :              +- CometBroadcastHashJoin (36)
            :           :                 :- CometProject (32)
            :           :                 :  +- CometBroadcastHashJoin (31)
            :           :                 :     :- CometUnion (29)
            :           :                 :     :  :- CometProject (25)
            :           :                 :     :  :  +- CometFilter (24)
            :           :                 :     :  :     +- CometScan parquet spark_catalog.default.catalog_sales (23)
            :           :                 :     :  +- CometProject (28)
            :           :                 :     :     +- CometFilter (27)
            :           :                 :     :        +- CometScan parquet spark_catalog.default.catalog_returns (26)
            :           :                 :     +- ReusedExchange (30)
            :           :                 +- CometBroadcastExchange (35)
            :           :                    +- CometFilter (34)
            :           :                       +- CometScan parquet spark_catalog.default.catalog_page (33)
            :           +- * HashAggregate (64)
            :              +- * ColumnarToRow (63)
            :                 +- CometExchange (62)
            :                    +- CometHashAggregate (61)
            :                       +- CometProject (60)
            :                          +- CometBroadcastHashJoin (59)
            :                             :- CometProject (55)
            :                             :  +- CometBroadcastHashJoin (54)
            :                             :     :- CometUnion (52)
            :                             :     :  :- CometProject (44)
            :                             :     :  :  +- CometFilter (43)
            :                             :     :  :     +- CometScan parquet spark_catalog.default.web_sales (42)
            :                             :     :  +- CometProject (51)
            :                             :     :     +- CometBroadcastHashJoin (50)
            :                             :     :        :- CometBroadcastExchange (46)
            :                             :     :        :  +- CometScan parquet spark_catalog.default.web_returns (45)
            :                             :     :        +- CometProject (49)
            :                             :     :           +- CometFilter (48)
            :                             :     :              +- CometScan parquet spark_catalog.default.web_sales (47)
            :                             :     +- ReusedExchange (53)
            :                             +- CometBroadcastExchange (58)
            :                                +- CometFilter (57)
            :                                   +- CometScan parquet spark_catalog.default.web_site (56)
            :- * HashAggregate (73)
            :  +- Exchange (72)
            :     +- * HashAggregate (71)
            :        +- * HashAggregate (70)
            :           +- ReusedExchange (69)
            +- * HashAggregate (78)
               +- Exchange (77)
                  +- * HashAggregate (76)
                     +- * HashAggregate (75)
                        +- ReusedExchange (74)


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

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

(3) CometProject
Input [4]: [ss_store_sk#1, ss_ext_sales_price#2, ss_net_profit#3, ss_sold_date_sk#4]
Arguments: [store_sk#6, date_sk#7, sales_price#8, profit#9, return_amt#10, net_loss#11], [ss_store_sk#1 AS store_sk#6, ss_sold_date_sk#4 AS date_sk#7, ss_ext_sales_price#2 AS sales_price#8, ss_net_profit#3 AS profit#9, 0.00 AS return_amt#10, 0.00 AS net_loss#11]

(4) CometScan parquet spark_catalog.default.store_returns
Output [4]: [sr_store_sk#12, sr_return_amt#13, sr_net_loss#14, sr_returned_date_sk#15]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(sr_returned_date_sk#15), dynamicpruningexpression(sr_returned_date_sk#15 IN dynamicpruning#5)]
PushedFilters: [IsNotNull(sr_store_sk)]
ReadSchema: struct<sr_store_sk:int,sr_return_amt:decimal(7,2),sr_net_loss:decimal(7,2)>

(5) CometFilter
Input [4]: [sr_store_sk#12, sr_return_amt#13, sr_net_loss#14, sr_returned_date_sk#15]
Condition : isnotnull(sr_store_sk#12)

(6) CometProject
Input [4]: [sr_store_sk#12, sr_return_amt#13, sr_net_loss#14, sr_returned_date_sk#15]
Arguments: [store_sk#16, date_sk#17, sales_price#18, profit#19, return_amt#20, net_loss#21], [sr_store_sk#12 AS store_sk#16, sr_returned_date_sk#15 AS date_sk#17, 0.00 AS sales_price#18, 0.00 AS profit#19, sr_return_amt#13 AS return_amt#20, sr_net_loss#14 AS net_loss#21]

(7) CometUnion
Child 0 Input [6]: [store_sk#6, date_sk#7, sales_price#8, profit#9, return_amt#10, net_loss#11]
Child 1 Input [6]: [store_sk#16, date_sk#17, sales_price#18, profit#19, return_amt#20, net_loss#21]

(8) CometScan parquet spark_catalog.default.date_dim
Output [2]: [d_date_sk#22, d_date#23]
Batched: true
Location [not included in comparison]/{warehouse_dir}/date_dim]
PushedFilters: [IsNotNull(d_date), GreaterThanOrEqual(d_date,1998-08-04), LessThanOrEqual(d_date,1998-08-18), IsNotNull(d_date_sk)]
ReadSchema: struct<d_date_sk:int,d_date:date>

(9) CometFilter
Input [2]: [d_date_sk#22, d_date#23]
Condition : (((isnotnull(d_date#23) AND (d_date#23 >= 1998-08-04)) AND (d_date#23 <= 1998-08-18)) AND isnotnull(d_date_sk#22))

(10) CometProject
Input [2]: [d_date_sk#22, d_date#23]
Arguments: [d_date_sk#22], [d_date_sk#22]

(11) CometBroadcastExchange
Input [1]: [d_date_sk#22]
Arguments: [d_date_sk#22]

(12) CometBroadcastHashJoin
Left output [6]: [store_sk#6, date_sk#7, sales_price#8, profit#9, return_amt#10, net_loss#11]
Right output [1]: [d_date_sk#22]
Arguments: [date_sk#7], [d_date_sk#22], Inner, BuildRight

(13) CometProject
Input [7]: [store_sk#6, date_sk#7, sales_price#8, profit#9, return_amt#10, net_loss#11, d_date_sk#22]
Arguments: [store_sk#6, sales_price#8, profit#9, return_amt#10, net_loss#11], [store_sk#6, sales_price#8, profit#9, return_amt#10, net_loss#11]

(14) CometScan parquet spark_catalog.default.store
Output [2]: [s_store_sk#24, s_store_id#25]
Batched: true
Location [not included in comparison]/{warehouse_dir}/store]
PushedFilters: [IsNotNull(s_store_sk)]
ReadSchema: struct<s_store_sk:int,s_store_id:string>

(15) CometFilter
Input [2]: [s_store_sk#24, s_store_id#25]
Condition : isnotnull(s_store_sk#24)

(16) CometBroadcastExchange
Input [2]: [s_store_sk#24, s_store_id#25]
Arguments: [s_store_sk#24, s_store_id#25]

(17) CometBroadcastHashJoin
Left output [5]: [store_sk#6, sales_price#8, profit#9, return_amt#10, net_loss#11]
Right output [2]: [s_store_sk#24, s_store_id#25]
Arguments: [store_sk#6], [s_store_sk#24], Inner, BuildRight

(18) CometProject
Input [7]: [store_sk#6, sales_price#8, profit#9, return_amt#10, net_loss#11, s_store_sk#24, s_store_id#25]
Arguments: [sales_price#8, profit#9, return_amt#10, net_loss#11, s_store_id#25], [sales_price#8, profit#9, return_amt#10, net_loss#11, s_store_id#25]

(19) CometHashAggregate
Input [5]: [sales_price#8, profit#9, return_amt#10, net_loss#11, s_store_id#25]
Keys [1]: [s_store_id#25]
Functions [4]: [partial_sum(UnscaledValue(sales_price#8)), partial_sum(UnscaledValue(return_amt#10)), partial_sum(UnscaledValue(profit#9)), partial_sum(UnscaledValue(net_loss#11))]

(20) CometExchange
Input [5]: [s_store_id#25, sum#26, sum#27, sum#28, sum#29]
Arguments: hashpartitioning(s_store_id#25, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=1]

(21) ColumnarToRow [codegen id : 1]
Input [5]: [s_store_id#25, sum#26, sum#27, sum#28, sum#29]

(22) HashAggregate [codegen id : 1]
Input [5]: [s_store_id#25, sum#26, sum#27, sum#28, sum#29]
Keys [1]: [s_store_id#25]
Functions [4]: [sum(UnscaledValue(sales_price#8)), sum(UnscaledValue(return_amt#10)), sum(UnscaledValue(profit#9)), sum(UnscaledValue(net_loss#11))]
Aggregate Attributes [4]: [sum(UnscaledValue(sales_price#8))#30, sum(UnscaledValue(return_amt#10))#31, sum(UnscaledValue(profit#9))#32, sum(UnscaledValue(net_loss#11))#33]
Results [5]: [store channel AS channel#34, concat(store, s_store_id#25) AS id#35, MakeDecimal(sum(UnscaledValue(sales_price#8))#30,17,2) AS sales#36, MakeDecimal(sum(UnscaledValue(return_amt#10))#31,17,2) AS returns#37, (MakeDecimal(sum(UnscaledValue(profit#9))#32,17,2) - MakeDecimal(sum(UnscaledValue(net_loss#11))#33,17,2)) AS profit#38]

(23) CometScan parquet spark_catalog.default.catalog_sales
Output [4]: [cs_catalog_page_sk#39, cs_ext_sales_price#40, cs_net_profit#41, cs_sold_date_sk#42]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(cs_sold_date_sk#42), dynamicpruningexpression(cs_sold_date_sk#42 IN dynamicpruning#43)]
PushedFilters: [IsNotNull(cs_catalog_page_sk)]
ReadSchema: struct<cs_catalog_page_sk:int,cs_ext_sales_price:decimal(7,2),cs_net_profit:decimal(7,2)>

(24) CometFilter
Input [4]: [cs_catalog_page_sk#39, cs_ext_sales_price#40, cs_net_profit#41, cs_sold_date_sk#42]
Condition : isnotnull(cs_catalog_page_sk#39)

(25) CometProject
Input [4]: [cs_catalog_page_sk#39, cs_ext_sales_price#40, cs_net_profit#41, cs_sold_date_sk#42]
Arguments: [page_sk#44, date_sk#45, sales_price#46, profit#47, return_amt#48, net_loss#49], [cs_catalog_page_sk#39 AS page_sk#44, cs_sold_date_sk#42 AS date_sk#45, cs_ext_sales_price#40 AS sales_price#46, cs_net_profit#41 AS profit#47, 0.00 AS return_amt#48, 0.00 AS net_loss#49]

(26) CometScan parquet spark_catalog.default.catalog_returns
Output [4]: [cr_catalog_page_sk#50, cr_return_amount#51, cr_net_loss#52, cr_returned_date_sk#53]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(cr_returned_date_sk#53), dynamicpruningexpression(cr_returned_date_sk#53 IN dynamicpruning#43)]
PushedFilters: [IsNotNull(cr_catalog_page_sk)]
ReadSchema: struct<cr_catalog_page_sk:int,cr_return_amount:decimal(7,2),cr_net_loss:decimal(7,2)>

(27) CometFilter
Input [4]: [cr_catalog_page_sk#50, cr_return_amount#51, cr_net_loss#52, cr_returned_date_sk#53]
Condition : isnotnull(cr_catalog_page_sk#50)

(28) CometProject
Input [4]: [cr_catalog_page_sk#50, cr_return_amount#51, cr_net_loss#52, cr_returned_date_sk#53]
Arguments: [page_sk#54, date_sk#55, sales_price#56, profit#57, return_amt#58, net_loss#59], [cr_catalog_page_sk#50 AS page_sk#54, cr_returned_date_sk#53 AS date_sk#55, 0.00 AS sales_price#56, 0.00 AS profit#57, cr_return_amount#51 AS return_amt#58, cr_net_loss#52 AS net_loss#59]

(29) CometUnion
Child 0 Input [6]: [page_sk#44, date_sk#45, sales_price#46, profit#47, return_amt#48, net_loss#49]
Child 1 Input [6]: [page_sk#54, date_sk#55, sales_price#56, profit#57, return_amt#58, net_loss#59]

(30) ReusedExchange [Reuses operator id: 11]
Output [1]: [d_date_sk#60]

(31) CometBroadcastHashJoin
Left output [6]: [page_sk#44, date_sk#45, sales_price#46, profit#47, return_amt#48, net_loss#49]
Right output [1]: [d_date_sk#60]
Arguments: [date_sk#45], [d_date_sk#60], Inner, BuildRight

(32) CometProject
Input [7]: [page_sk#44, date_sk#45, sales_price#46, profit#47, return_amt#48, net_loss#49, d_date_sk#60]
Arguments: [page_sk#44, sales_price#46, profit#47, return_amt#48, net_loss#49], [page_sk#44, sales_price#46, profit#47, return_amt#48, net_loss#49]

(33) CometScan parquet spark_catalog.default.catalog_page
Output [2]: [cp_catalog_page_sk#61, cp_catalog_page_id#62]
Batched: true
Location [not included in comparison]/{warehouse_dir}/catalog_page]
PushedFilters: [IsNotNull(cp_catalog_page_sk)]
ReadSchema: struct<cp_catalog_page_sk:int,cp_catalog_page_id:string>

(34) CometFilter
Input [2]: [cp_catalog_page_sk#61, cp_catalog_page_id#62]
Condition : isnotnull(cp_catalog_page_sk#61)

(35) CometBroadcastExchange
Input [2]: [cp_catalog_page_sk#61, cp_catalog_page_id#62]
Arguments: [cp_catalog_page_sk#61, cp_catalog_page_id#62]

(36) CometBroadcastHashJoin
Left output [5]: [page_sk#44, sales_price#46, profit#47, return_amt#48, net_loss#49]
Right output [2]: [cp_catalog_page_sk#61, cp_catalog_page_id#62]
Arguments: [page_sk#44], [cp_catalog_page_sk#61], Inner, BuildRight

(37) CometProject
Input [7]: [page_sk#44, sales_price#46, profit#47, return_amt#48, net_loss#49, cp_catalog_page_sk#61, cp_catalog_page_id#62]
Arguments: [sales_price#46, profit#47, return_amt#48, net_loss#49, cp_catalog_page_id#62], [sales_price#46, profit#47, return_amt#48, net_loss#49, cp_catalog_page_id#62]

(38) CometHashAggregate
Input [5]: [sales_price#46, profit#47, return_amt#48, net_loss#49, cp_catalog_page_id#62]
Keys [1]: [cp_catalog_page_id#62]
Functions [4]: [partial_sum(UnscaledValue(sales_price#46)), partial_sum(UnscaledValue(return_amt#48)), partial_sum(UnscaledValue(profit#47)), partial_sum(UnscaledValue(net_loss#49))]

(39) CometExchange
Input [5]: [cp_catalog_page_id#62, sum#63, sum#64, sum#65, sum#66]
Arguments: hashpartitioning(cp_catalog_page_id#62, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=2]

(40) ColumnarToRow [codegen id : 2]
Input [5]: [cp_catalog_page_id#62, sum#63, sum#64, sum#65, sum#66]

(41) HashAggregate [codegen id : 2]
Input [5]: [cp_catalog_page_id#62, sum#63, sum#64, sum#65, sum#66]
Keys [1]: [cp_catalog_page_id#62]
Functions [4]: [sum(UnscaledValue(sales_price#46)), sum(UnscaledValue(return_amt#48)), sum(UnscaledValue(profit#47)), sum(UnscaledValue(net_loss#49))]
Aggregate Attributes [4]: [sum(UnscaledValue(sales_price#46))#67, sum(UnscaledValue(return_amt#48))#68, sum(UnscaledValue(profit#47))#69, sum(UnscaledValue(net_loss#49))#70]
Results [5]: [catalog channel AS channel#71, concat(catalog_page, cp_catalog_page_id#62) AS id#72, MakeDecimal(sum(UnscaledValue(sales_price#46))#67,17,2) AS sales#73, MakeDecimal(sum(UnscaledValue(return_amt#48))#68,17,2) AS returns#74, (MakeDecimal(sum(UnscaledValue(profit#47))#69,17,2) - MakeDecimal(sum(UnscaledValue(net_loss#49))#70,17,2)) AS profit#75]

(42) CometScan parquet spark_catalog.default.web_sales
Output [4]: [ws_web_site_sk#76, ws_ext_sales_price#77, ws_net_profit#78, ws_sold_date_sk#79]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(ws_sold_date_sk#79), dynamicpruningexpression(ws_sold_date_sk#79 IN dynamicpruning#80)]
PushedFilters: [IsNotNull(ws_web_site_sk)]
ReadSchema: struct<ws_web_site_sk:int,ws_ext_sales_price:decimal(7,2),ws_net_profit:decimal(7,2)>

(43) CometFilter
Input [4]: [ws_web_site_sk#76, ws_ext_sales_price#77, ws_net_profit#78, ws_sold_date_sk#79]
Condition : isnotnull(ws_web_site_sk#76)

(44) CometProject
Input [4]: [ws_web_site_sk#76, ws_ext_sales_price#77, ws_net_profit#78, ws_sold_date_sk#79]
Arguments: [wsr_web_site_sk#81, date_sk#82, sales_price#83, profit#84, return_amt#85, net_loss#86], [ws_web_site_sk#76 AS wsr_web_site_sk#81, ws_sold_date_sk#79 AS date_sk#82, ws_ext_sales_price#77 AS sales_price#83, ws_net_profit#78 AS profit#84, 0.00 AS return_amt#85, 0.00 AS net_loss#86]

(45) CometScan parquet spark_catalog.default.web_returns
Output [5]: [wr_item_sk#87, wr_order_number#88, wr_return_amt#89, wr_net_loss#90, wr_returned_date_sk#91]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(wr_returned_date_sk#91), dynamicpruningexpression(wr_returned_date_sk#91 IN dynamicpruning#80)]
ReadSchema: struct<wr_item_sk:int,wr_order_number:int,wr_return_amt:decimal(7,2),wr_net_loss:decimal(7,2)>

(46) CometBroadcastExchange
Input [5]: [wr_item_sk#87, wr_order_number#88, wr_return_amt#89, wr_net_loss#90, wr_returned_date_sk#91]
Arguments: [wr_item_sk#87, wr_order_number#88, wr_return_amt#89, wr_net_loss#90, wr_returned_date_sk#91]

(47) CometScan parquet spark_catalog.default.web_sales
Output [4]: [ws_item_sk#92, ws_web_site_sk#93, ws_order_number#94, ws_sold_date_sk#95]
Batched: true
Location [not included in comparison]/{warehouse_dir}/web_sales]
PushedFilters: [IsNotNull(ws_item_sk), IsNotNull(ws_order_number), IsNotNull(ws_web_site_sk)]
ReadSchema: struct<ws_item_sk:int,ws_web_site_sk:int,ws_order_number:int>

(48) CometFilter
Input [4]: [ws_item_sk#92, ws_web_site_sk#93, ws_order_number#94, ws_sold_date_sk#95]
Condition : ((isnotnull(ws_item_sk#92) AND isnotnull(ws_order_number#94)) AND isnotnull(ws_web_site_sk#93))

(49) CometProject
Input [4]: [ws_item_sk#92, ws_web_site_sk#93, ws_order_number#94, ws_sold_date_sk#95]
Arguments: [ws_item_sk#92, ws_web_site_sk#93, ws_order_number#94], [ws_item_sk#92, ws_web_site_sk#93, ws_order_number#94]

(50) CometBroadcastHashJoin
Left output [5]: [wr_item_sk#87, wr_order_number#88, wr_return_amt#89, wr_net_loss#90, wr_returned_date_sk#91]
Right output [3]: [ws_item_sk#92, ws_web_site_sk#93, ws_order_number#94]
Arguments: [wr_item_sk#87, wr_order_number#88], [ws_item_sk#92, ws_order_number#94], Inner, BuildLeft

(51) CometProject
Input [8]: [wr_item_sk#87, wr_order_number#88, wr_return_amt#89, wr_net_loss#90, wr_returned_date_sk#91, ws_item_sk#92, ws_web_site_sk#93, ws_order_number#94]
Arguments: [wsr_web_site_sk#96, date_sk#97, sales_price#98, profit#99, return_amt#100, net_loss#101], [ws_web_site_sk#93 AS wsr_web_site_sk#96, wr_returned_date_sk#91 AS date_sk#97, 0.00 AS sales_price#98, 0.00 AS profit#99, wr_return_amt#89 AS return_amt#100, wr_net_loss#90 AS net_loss#101]

(52) CometUnion
Child 0 Input [6]: [wsr_web_site_sk#81, date_sk#82, sales_price#83, profit#84, return_amt#85, net_loss#86]
Child 1 Input [6]: [wsr_web_site_sk#96, date_sk#97, sales_price#98, profit#99, return_amt#100, net_loss#101]

(53) ReusedExchange [Reuses operator id: 11]
Output [1]: [d_date_sk#102]

(54) CometBroadcastHashJoin
Left output [6]: [wsr_web_site_sk#81, date_sk#82, sales_price#83, profit#84, return_amt#85, net_loss#86]
Right output [1]: [d_date_sk#102]
Arguments: [date_sk#82], [d_date_sk#102], Inner, BuildRight

(55) CometProject
Input [7]: [wsr_web_site_sk#81, date_sk#82, sales_price#83, profit#84, return_amt#85, net_loss#86, d_date_sk#102]
Arguments: [wsr_web_site_sk#81, sales_price#83, profit#84, return_amt#85, net_loss#86], [wsr_web_site_sk#81, sales_price#83, profit#84, return_amt#85, net_loss#86]

(56) CometScan parquet spark_catalog.default.web_site
Output [2]: [web_site_sk#103, web_site_id#104]
Batched: true
Location [not included in comparison]/{warehouse_dir}/web_site]
PushedFilters: [IsNotNull(web_site_sk)]
ReadSchema: struct<web_site_sk:int,web_site_id:string>

(57) CometFilter
Input [2]: [web_site_sk#103, web_site_id#104]
Condition : isnotnull(web_site_sk#103)

(58) CometBroadcastExchange
Input [2]: [web_site_sk#103, web_site_id#104]
Arguments: [web_site_sk#103, web_site_id#104]

(59) CometBroadcastHashJoin
Left output [5]: [wsr_web_site_sk#81, sales_price#83, profit#84, return_amt#85, net_loss#86]
Right output [2]: [web_site_sk#103, web_site_id#104]
Arguments: [wsr_web_site_sk#81], [web_site_sk#103], Inner, BuildRight

(60) CometProject
Input [7]: [wsr_web_site_sk#81, sales_price#83, profit#84, return_amt#85, net_loss#86, web_site_sk#103, web_site_id#104]
Arguments: [sales_price#83, profit#84, return_amt#85, net_loss#86, web_site_id#104], [sales_price#83, profit#84, return_amt#85, net_loss#86, web_site_id#104]

(61) CometHashAggregate
Input [5]: [sales_price#83, profit#84, return_amt#85, net_loss#86, web_site_id#104]
Keys [1]: [web_site_id#104]
Functions [4]: [partial_sum(UnscaledValue(sales_price#83)), partial_sum(UnscaledValue(return_amt#85)), partial_sum(UnscaledValue(profit#84)), partial_sum(UnscaledValue(net_loss#86))]

(62) CometExchange
Input [5]: [web_site_id#104, sum#105, sum#106, sum#107, sum#108]
Arguments: hashpartitioning(web_site_id#104, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=3]

(63) ColumnarToRow [codegen id : 3]
Input [5]: [web_site_id#104, sum#105, sum#106, sum#107, sum#108]

(64) HashAggregate [codegen id : 3]
Input [5]: [web_site_id#104, sum#105, sum#106, sum#107, sum#108]
Keys [1]: [web_site_id#104]
Functions [4]: [sum(UnscaledValue(sales_price#83)), sum(UnscaledValue(return_amt#85)), sum(UnscaledValue(profit#84)), sum(UnscaledValue(net_loss#86))]
Aggregate Attributes [4]: [sum(UnscaledValue(sales_price#83))#109, sum(UnscaledValue(return_amt#85))#110, sum(UnscaledValue(profit#84))#111, sum(UnscaledValue(net_loss#86))#112]
Results [5]: [web channel AS channel#113, concat(web_site, web_site_id#104) AS id#114, MakeDecimal(sum(UnscaledValue(sales_price#83))#109,17,2) AS sales#115, MakeDecimal(sum(UnscaledValue(return_amt#85))#110,17,2) AS returns#116, (MakeDecimal(sum(UnscaledValue(profit#84))#111,17,2) - MakeDecimal(sum(UnscaledValue(net_loss#86))#112,17,2)) AS profit#117]

(65) Union

(66) HashAggregate [codegen id : 4]
Input [5]: [channel#34, id#35, sales#36, returns#37, profit#38]
Keys [2]: [channel#34, id#35]
Functions [3]: [partial_sum(sales#36), partial_sum(returns#37), partial_sum(profit#38)]
Aggregate Attributes [6]: [sum#118, isEmpty#119, sum#120, isEmpty#121, sum#122, isEmpty#123]
Results [8]: [channel#34, id#35, sum#124, isEmpty#125, sum#126, isEmpty#127, sum#128, isEmpty#129]

(67) Exchange
Input [8]: [channel#34, id#35, sum#124, isEmpty#125, sum#126, isEmpty#127, sum#128, isEmpty#129]
Arguments: hashpartitioning(channel#34, id#35, 5), ENSURE_REQUIREMENTS, [plan_id=4]

(68) HashAggregate [codegen id : 5]
Input [8]: [channel#34, id#35, sum#124, isEmpty#125, sum#126, isEmpty#127, sum#128, isEmpty#129]
Keys [2]: [channel#34, id#35]
Functions [3]: [sum(sales#36), sum(returns#37), sum(profit#38)]
Aggregate Attributes [3]: [sum(sales#36)#130, sum(returns#37)#131, sum(profit#38)#132]
Results [5]: [channel#34, id#35, cast(sum(sales#36)#130 as decimal(37,2)) AS sales#133, cast(sum(returns#37)#131 as decimal(37,2)) AS returns#134, cast(sum(profit#38)#132 as decimal(38,2)) AS profit#135]

(69) ReusedExchange [Reuses operator id: 67]
Output [8]: [channel#34, id#35, sum#124, isEmpty#125, sum#126, isEmpty#127, sum#128, isEmpty#129]

(70) HashAggregate [codegen id : 10]
Input [8]: [channel#34, id#35, sum#124, isEmpty#125, sum#126, isEmpty#127, sum#128, isEmpty#129]
Keys [2]: [channel#34, id#35]
Functions [3]: [sum(sales#36), sum(returns#37), sum(profit#38)]
Aggregate Attributes [3]: [sum(sales#36)#130, sum(returns#37)#131, sum(profit#38)#132]
Results [4]: [channel#34, sum(sales#36)#130 AS sales#136, sum(returns#37)#131 AS returns#137, sum(profit#38)#132 AS profit#138]

(71) HashAggregate [codegen id : 10]
Input [4]: [channel#34, sales#136, returns#137, profit#138]
Keys [1]: [channel#34]
Functions [3]: [partial_sum(sales#136), partial_sum(returns#137), partial_sum(profit#138)]
Aggregate Attributes [6]: [sum#139, isEmpty#140, sum#141, isEmpty#142, sum#143, isEmpty#144]
Results [7]: [channel#34, sum#145, isEmpty#146, sum#147, isEmpty#148, sum#149, isEmpty#150]

(72) Exchange
Input [7]: [channel#34, sum#145, isEmpty#146, sum#147, isEmpty#148, sum#149, isEmpty#150]
Arguments: hashpartitioning(channel#34, 5), ENSURE_REQUIREMENTS, [plan_id=5]

(73) HashAggregate [codegen id : 11]
Input [7]: [channel#34, sum#145, isEmpty#146, sum#147, isEmpty#148, sum#149, isEmpty#150]
Keys [1]: [channel#34]
Functions [3]: [sum(sales#136), sum(returns#137), sum(profit#138)]
Aggregate Attributes [3]: [sum(sales#136)#151, sum(returns#137)#152, sum(profit#138)#153]
Results [5]: [channel#34, null AS id#154, sum(sales#136)#151 AS sum(sales)#155, sum(returns#137)#152 AS sum(returns)#156, sum(profit#138)#153 AS sum(profit)#157]

(74) ReusedExchange [Reuses operator id: 67]
Output [8]: [channel#34, id#35, sum#124, isEmpty#125, sum#126, isEmpty#127, sum#128, isEmpty#129]

(75) HashAggregate [codegen id : 16]
Input [8]: [channel#34, id#35, sum#124, isEmpty#125, sum#126, isEmpty#127, sum#128, isEmpty#129]
Keys [2]: [channel#34, id#35]
Functions [3]: [sum(sales#36), sum(returns#37), sum(profit#38)]
Aggregate Attributes [3]: [sum(sales#36)#130, sum(returns#37)#131, sum(profit#38)#132]
Results [3]: [sum(sales#36)#130 AS sales#136, sum(returns#37)#131 AS returns#137, sum(profit#38)#132 AS profit#138]

(76) HashAggregate [codegen id : 16]
Input [3]: [sales#136, returns#137, profit#138]
Keys: []
Functions [3]: [partial_sum(sales#136), partial_sum(returns#137), partial_sum(profit#138)]
Aggregate Attributes [6]: [sum#158, isEmpty#159, sum#160, isEmpty#161, sum#162, isEmpty#163]
Results [6]: [sum#164, isEmpty#165, sum#166, isEmpty#167, sum#168, isEmpty#169]

(77) Exchange
Input [6]: [sum#164, isEmpty#165, sum#166, isEmpty#167, sum#168, isEmpty#169]
Arguments: SinglePartition, ENSURE_REQUIREMENTS, [plan_id=6]

(78) HashAggregate [codegen id : 17]
Input [6]: [sum#164, isEmpty#165, sum#166, isEmpty#167, sum#168, isEmpty#169]
Keys: []
Functions [3]: [sum(sales#136), sum(returns#137), sum(profit#138)]
Aggregate Attributes [3]: [sum(sales#136)#170, sum(returns#137)#171, sum(profit#138)#172]
Results [5]: [null AS channel#173, null AS id#174, sum(sales#136)#170 AS sum(sales)#175, sum(returns#137)#171 AS sum(returns)#176, sum(profit#138)#172 AS sum(profit)#177]

(79) Union

(80) HashAggregate [codegen id : 18]
Input [5]: [channel#34, id#35, sales#133, returns#134, profit#135]
Keys [5]: [channel#34, id#35, sales#133, returns#134, profit#135]
Functions: []
Aggregate Attributes: []
Results [5]: [channel#34, id#35, sales#133, returns#134, profit#135]

(81) Exchange
Input [5]: [channel#34, id#35, sales#133, returns#134, profit#135]
Arguments: hashpartitioning(channel#34, id#35, sales#133, returns#134, profit#135, 5), ENSURE_REQUIREMENTS, [plan_id=7]

(82) HashAggregate [codegen id : 19]
Input [5]: [channel#34, id#35, sales#133, returns#134, profit#135]
Keys [5]: [channel#34, id#35, sales#133, returns#134, profit#135]
Functions: []
Aggregate Attributes: []
Results [5]: [channel#34, id#35, sales#133, returns#134, profit#135]

(83) TakeOrderedAndProject
Input [5]: [channel#34, id#35, sales#133, returns#134, profit#135]
Arguments: 100, [channel#34 ASC NULLS FIRST, id#35 ASC NULLS FIRST], [channel#34, id#35, sales#133, returns#134, profit#135]

===== Subqueries =====

Subquery:1 Hosting operator id = 1 Hosting Expression = ss_sold_date_sk#4 IN dynamicpruning#5
BroadcastExchange (88)
+- * ColumnarToRow (87)
   +- CometProject (86)
      +- CometFilter (85)
         +- CometScan parquet spark_catalog.default.date_dim (84)


(84) CometScan parquet spark_catalog.default.date_dim
Output [2]: [d_date_sk#22, d_date#23]
Batched: true
Location [not included in comparison]/{warehouse_dir}/date_dim]
PushedFilters: [IsNotNull(d_date), GreaterThanOrEqual(d_date,1998-08-04), LessThanOrEqual(d_date,1998-08-18), IsNotNull(d_date_sk)]
ReadSchema: struct<d_date_sk:int,d_date:date>

(85) CometFilter
Input [2]: [d_date_sk#22, d_date#23]
Condition : (((isnotnull(d_date#23) AND (d_date#23 >= 1998-08-04)) AND (d_date#23 <= 1998-08-18)) AND isnotnull(d_date_sk#22))

(86) CometProject
Input [2]: [d_date_sk#22, d_date#23]
Arguments: [d_date_sk#22], [d_date_sk#22]

(87) ColumnarToRow [codegen id : 1]
Input [1]: [d_date_sk#22]

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

Subquery:2 Hosting operator id = 4 Hosting Expression = sr_returned_date_sk#15 IN dynamicpruning#5

Subquery:3 Hosting operator id = 23 Hosting Expression = cs_sold_date_sk#42 IN dynamicpruning#5

Subquery:4 Hosting operator id = 26 Hosting Expression = cr_returned_date_sk#53 IN dynamicpruning#5

Subquery:5 Hosting operator id = 42 Hosting Expression = ws_sold_date_sk#79 IN dynamicpruning#5

Subquery:6 Hosting operator id = 45 Hosting Expression = wr_returned_date_sk#91 IN dynamicpruning#5


