== 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)]
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#5, date_sk#6, sales_price#7, profit#8, return_amt#9, net_loss#10], [ss_store_sk#1 AS store_sk#5, ss_sold_date_sk#4 AS date_sk#6, ss_ext_sales_price#2 AS sales_price#7, ss_net_profit#3 AS profit#8, 0.00 AS return_amt#9, 0.00 AS net_loss#10]

(4) CometScan parquet spark_catalog.default.store_returns
Output [4]: [sr_store_sk#11, sr_return_amt#12, sr_net_loss#13, sr_returned_date_sk#14]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(sr_returned_date_sk#14)]
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#11, sr_return_amt#12, sr_net_loss#13, sr_returned_date_sk#14]
Condition : isnotnull(sr_store_sk#11)

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

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

(8) CometScan parquet spark_catalog.default.date_dim
Output [2]: [d_date_sk#21, d_date#22]
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#21, d_date#22]
Condition : (((isnotnull(d_date#22) AND (d_date#22 >= 1998-08-04)) AND (d_date#22 <= 1998-08-18)) AND isnotnull(d_date_sk#21))

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

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

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

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

(14) CometScan parquet spark_catalog.default.store
Output [2]: [s_store_sk#23, s_store_id#24]
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#23, s_store_id#24]
Condition : isnotnull(s_store_sk#23)

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

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

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

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

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

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

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

(23) CometScan parquet spark_catalog.default.catalog_sales
Output [4]: [cs_catalog_page_sk#38, cs_ext_sales_price#39, cs_net_profit#40, cs_sold_date_sk#41]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(cs_sold_date_sk#41)]
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#38, cs_ext_sales_price#39, cs_net_profit#40, cs_sold_date_sk#41]
Condition : isnotnull(cs_catalog_page_sk#38)

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

(26) CometScan parquet spark_catalog.default.catalog_returns
Output [4]: [cr_catalog_page_sk#48, cr_return_amount#49, cr_net_loss#50, cr_returned_date_sk#51]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(cr_returned_date_sk#51)]
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#48, cr_return_amount#49, cr_net_loss#50, cr_returned_date_sk#51]
Condition : isnotnull(cr_catalog_page_sk#48)

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

(29) CometUnion
Child 0 Input [6]: [page_sk#42, date_sk#43, sales_price#44, profit#45, return_amt#46, net_loss#47]
Child 1 Input [6]: [page_sk#52, date_sk#53, sales_price#54, profit#55, return_amt#56, net_loss#57]

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

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

(32) CometProject
Input [7]: [page_sk#42, date_sk#43, sales_price#44, profit#45, return_amt#46, net_loss#47, d_date_sk#58]
Arguments: [page_sk#42, sales_price#44, profit#45, return_amt#46, net_loss#47], [page_sk#42, sales_price#44, profit#45, return_amt#46, net_loss#47]

(33) CometScan parquet spark_catalog.default.catalog_page
Output [2]: [cp_catalog_page_sk#59, cp_catalog_page_id#60]
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#59, cp_catalog_page_id#60]
Condition : isnotnull(cp_catalog_page_sk#59)

(35) CometBroadcastExchange
Input [2]: [cp_catalog_page_sk#59, cp_catalog_page_id#60]
Arguments: [cp_catalog_page_sk#59, cp_catalog_page_id#60]

(36) CometBroadcastHashJoin
Left output [5]: [page_sk#42, sales_price#44, profit#45, return_amt#46, net_loss#47]
Right output [2]: [cp_catalog_page_sk#59, cp_catalog_page_id#60]
Arguments: [page_sk#42], [cp_catalog_page_sk#59], Inner, BuildRight

(37) CometProject
Input [7]: [page_sk#42, sales_price#44, profit#45, return_amt#46, net_loss#47, cp_catalog_page_sk#59, cp_catalog_page_id#60]
Arguments: [sales_price#44, profit#45, return_amt#46, net_loss#47, cp_catalog_page_id#60], [sales_price#44, profit#45, return_amt#46, net_loss#47, cp_catalog_page_id#60]

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

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

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

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

(42) CometScan parquet spark_catalog.default.web_sales
Output [4]: [ws_web_site_sk#74, ws_ext_sales_price#75, ws_net_profit#76, ws_sold_date_sk#77]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(ws_sold_date_sk#77)]
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#74, ws_ext_sales_price#75, ws_net_profit#76, ws_sold_date_sk#77]
Condition : isnotnull(ws_web_site_sk#74)

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

(45) CometScan parquet spark_catalog.default.web_returns
Output [5]: [wr_item_sk#84, wr_order_number#85, wr_return_amt#86, wr_net_loss#87, wr_returned_date_sk#88]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(wr_returned_date_sk#88)]
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#84, wr_order_number#85, wr_return_amt#86, wr_net_loss#87, wr_returned_date_sk#88]
Arguments: [wr_item_sk#84, wr_order_number#85, wr_return_amt#86, wr_net_loss#87, wr_returned_date_sk#88]

(47) CometScan parquet spark_catalog.default.web_sales
Output [4]: [ws_item_sk#89, ws_web_site_sk#90, ws_order_number#91, ws_sold_date_sk#92]
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#89, ws_web_site_sk#90, ws_order_number#91, ws_sold_date_sk#92]
Condition : ((isnotnull(ws_item_sk#89) AND isnotnull(ws_order_number#91)) AND isnotnull(ws_web_site_sk#90))

(49) CometProject
Input [4]: [ws_item_sk#89, ws_web_site_sk#90, ws_order_number#91, ws_sold_date_sk#92]
Arguments: [ws_item_sk#89, ws_web_site_sk#90, ws_order_number#91], [ws_item_sk#89, ws_web_site_sk#90, ws_order_number#91]

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

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

(52) CometUnion
Child 0 Input [6]: [wsr_web_site_sk#78, date_sk#79, sales_price#80, profit#81, return_amt#82, net_loss#83]
Child 1 Input [6]: [wsr_web_site_sk#93, date_sk#94, sales_price#95, profit#96, return_amt#97, net_loss#98]

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

(54) CometBroadcastHashJoin
Left output [6]: [wsr_web_site_sk#78, date_sk#79, sales_price#80, profit#81, return_amt#82, net_loss#83]
Right output [1]: [d_date_sk#99]
Arguments: [date_sk#79], [d_date_sk#99], Inner, BuildRight

(55) CometProject
Input [7]: [wsr_web_site_sk#78, date_sk#79, sales_price#80, profit#81, return_amt#82, net_loss#83, d_date_sk#99]
Arguments: [wsr_web_site_sk#78, sales_price#80, profit#81, return_amt#82, net_loss#83], [wsr_web_site_sk#78, sales_price#80, profit#81, return_amt#82, net_loss#83]

(56) CometScan parquet spark_catalog.default.web_site
Output [2]: [web_site_sk#100, web_site_id#101]
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#100, web_site_id#101]
Condition : isnotnull(web_site_sk#100)

(58) CometBroadcastExchange
Input [2]: [web_site_sk#100, web_site_id#101]
Arguments: [web_site_sk#100, web_site_id#101]

(59) CometBroadcastHashJoin
Left output [5]: [wsr_web_site_sk#78, sales_price#80, profit#81, return_amt#82, net_loss#83]
Right output [2]: [web_site_sk#100, web_site_id#101]
Arguments: [wsr_web_site_sk#78], [web_site_sk#100], Inner, BuildRight

(60) CometProject
Input [7]: [wsr_web_site_sk#78, sales_price#80, profit#81, return_amt#82, net_loss#83, web_site_sk#100, web_site_id#101]
Arguments: [sales_price#80, profit#81, return_amt#82, net_loss#83, web_site_id#101], [sales_price#80, profit#81, return_amt#82, net_loss#83, web_site_id#101]

(61) CometHashAggregate
Input [5]: [sales_price#80, profit#81, return_amt#82, net_loss#83, web_site_id#101]
Keys [1]: [web_site_id#101]
Functions [4]: [partial_sum(UnscaledValue(sales_price#80)), partial_sum(UnscaledValue(return_amt#82)), partial_sum(UnscaledValue(profit#81)), partial_sum(UnscaledValue(net_loss#83))]

(62) CometExchange
Input [5]: [web_site_id#101, sum#102, sum#103, sum#104, sum#105]
Arguments: hashpartitioning(web_site_id#101, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=3]

(63) ColumnarToRow [codegen id : 3]
Input [5]: [web_site_id#101, sum#102, sum#103, sum#104, sum#105]

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

(65) Union

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

(67) Exchange
Input [8]: [channel#33, id#34, sum#121, isEmpty#122, sum#123, isEmpty#124, sum#125, isEmpty#126]
Arguments: hashpartitioning(channel#33, id#34, 5), ENSURE_REQUIREMENTS, [plan_id=4]

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

(69) ReusedExchange [Reuses operator id: 67]
Output [8]: [channel#33, id#34, sum#121, isEmpty#122, sum#123, isEmpty#124, sum#125, isEmpty#126]

(70) HashAggregate [codegen id : 10]
Input [8]: [channel#33, id#34, sum#121, isEmpty#122, sum#123, isEmpty#124, sum#125, isEmpty#126]
Keys [2]: [channel#33, id#34]
Functions [3]: [sum(sales#35), sum(returns#36), sum(profit#37)]
Aggregate Attributes [3]: [sum(sales#35)#127, sum(returns#36)#128, sum(profit#37)#129]
Results [4]: [channel#33, sum(sales#35)#127 AS sales#133, sum(returns#36)#128 AS returns#134, sum(profit#37)#129 AS profit#135]

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

(72) Exchange
Input [7]: [channel#33, sum#142, isEmpty#143, sum#144, isEmpty#145, sum#146, isEmpty#147]
Arguments: hashpartitioning(channel#33, 5), ENSURE_REQUIREMENTS, [plan_id=5]

(73) HashAggregate [codegen id : 11]
Input [7]: [channel#33, sum#142, isEmpty#143, sum#144, isEmpty#145, sum#146, isEmpty#147]
Keys [1]: [channel#33]
Functions [3]: [sum(sales#133), sum(returns#134), sum(profit#135)]
Aggregate Attributes [3]: [sum(sales#133)#148, sum(returns#134)#149, sum(profit#135)#150]
Results [5]: [channel#33, null AS id#151, sum(sales#133)#148 AS sum(sales)#152, sum(returns#134)#149 AS sum(returns)#153, sum(profit#135)#150 AS sum(profit)#154]

(74) ReusedExchange [Reuses operator id: 67]
Output [8]: [channel#33, id#34, sum#121, isEmpty#122, sum#123, isEmpty#124, sum#125, isEmpty#126]

(75) HashAggregate [codegen id : 16]
Input [8]: [channel#33, id#34, sum#121, isEmpty#122, sum#123, isEmpty#124, sum#125, isEmpty#126]
Keys [2]: [channel#33, id#34]
Functions [3]: [sum(sales#35), sum(returns#36), sum(profit#37)]
Aggregate Attributes [3]: [sum(sales#35)#127, sum(returns#36)#128, sum(profit#37)#129]
Results [3]: [sum(sales#35)#127 AS sales#155, sum(returns#36)#128 AS returns#156, sum(profit#37)#129 AS profit#157]

(76) HashAggregate [codegen id : 16]
Input [3]: [sales#155, returns#156, profit#157]
Keys: []
Functions [3]: [partial_sum(sales#155), partial_sum(returns#156), partial_sum(profit#157)]
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#155), sum(returns#156), sum(profit#157)]
Aggregate Attributes [3]: [sum(sales#155)#170, sum(returns#156)#171, sum(profit#157)#172]
Results [5]: [null AS channel#173, null AS id#174, sum(sales#155)#170 AS sum(sales)#175, sum(returns#156)#171 AS sum(returns)#176, sum(profit#157)#172 AS sum(profit)#177]

(79) Union

(80) HashAggregate [codegen id : 18]
Input [5]: [channel#33, id#34, sales#130, returns#131, profit#132]
Keys [5]: [channel#33, id#34, sales#130, returns#131, profit#132]
Functions: []
Aggregate Attributes: []
Results [5]: [channel#33, id#34, sales#130, returns#131, profit#132]

(81) Exchange
Input [5]: [channel#33, id#34, sales#130, returns#131, profit#132]
Arguments: hashpartitioning(channel#33, id#34, sales#130, returns#131, profit#132, 5), ENSURE_REQUIREMENTS, [plan_id=7]

(82) HashAggregate [codegen id : 19]
Input [5]: [channel#33, id#34, sales#130, returns#131, profit#132]
Keys [5]: [channel#33, id#34, sales#130, returns#131, profit#132]
Functions: []
Aggregate Attributes: []
Results [5]: [channel#33, id#34, sales#130, returns#131, profit#132]

(83) TakeOrderedAndProject
Input [5]: [channel#33, id#34, sales#130, returns#131, profit#132]
Arguments: 100, [channel#33 ASC NULLS FIRST, id#34 ASC NULLS FIRST], [channel#33, id#34, sales#130, returns#131, profit#132]

