== Physical Plan ==
TakeOrderedAndProject (70)
+- * HashAggregate (69)
   +- Exchange (68)
      +- * HashAggregate (67)
         +- * Expand (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)


(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,2000-08-23), LessThanOrEqual(d_date,2000-09-06), 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 >= 2000-08-23)) AND (d_date#22 <= 2000-09-06)) 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]: [MakeDecimal(sum(UnscaledValue(sales_price#7))#29,17,2) AS sales#33, MakeDecimal(sum(UnscaledValue(return_amt#9))#30,17,2) AS returns#34, (MakeDecimal(sum(UnscaledValue(profit#8))#31,17,2) - MakeDecimal(sum(UnscaledValue(net_loss#10))#32,17,2)) AS profit#35, store channel AS channel#36, concat(store, s_store_id#24) AS id#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]: [MakeDecimal(sum(UnscaledValue(sales_price#44))#65,17,2) AS sales#69, MakeDecimal(sum(UnscaledValue(return_amt#46))#66,17,2) AS returns#70, (MakeDecimal(sum(UnscaledValue(profit#45))#67,17,2) - MakeDecimal(sum(UnscaledValue(net_loss#47))#68,17,2)) AS profit#71, catalog channel AS channel#72, concat(catalog_page, cp_catalog_page_id#60) AS id#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]: [MakeDecimal(sum(UnscaledValue(sales_price#80))#106,17,2) AS sales#110, MakeDecimal(sum(UnscaledValue(return_amt#82))#107,17,2) AS returns#111, (MakeDecimal(sum(UnscaledValue(profit#81))#108,17,2) - MakeDecimal(sum(UnscaledValue(net_loss#83))#109,17,2)) AS profit#112, web channel AS channel#113, concat(web_site, web_site_id#101) AS id#114]

(65) Union

(66) Expand [codegen id : 4]
Input [5]: [sales#33, returns#34, profit#35, channel#36, id#37]
Arguments: [[sales#33, returns#34, profit#35, channel#36, id#37, 0], [sales#33, returns#34, profit#35, channel#36, null, 1], [sales#33, returns#34, profit#35, null, null, 3]], [sales#33, returns#34, profit#35, channel#115, id#116, spark_grouping_id#117]

(67) HashAggregate [codegen id : 4]
Input [6]: [sales#33, returns#34, profit#35, channel#115, id#116, spark_grouping_id#117]
Keys [3]: [channel#115, id#116, spark_grouping_id#117]
Functions [3]: [partial_sum(sales#33), partial_sum(returns#34), partial_sum(profit#35)]
Aggregate Attributes [6]: [sum#118, isEmpty#119, sum#120, isEmpty#121, sum#122, isEmpty#123]
Results [9]: [channel#115, id#116, spark_grouping_id#117, sum#124, isEmpty#125, sum#126, isEmpty#127, sum#128, isEmpty#129]

(68) Exchange
Input [9]: [channel#115, id#116, spark_grouping_id#117, sum#124, isEmpty#125, sum#126, isEmpty#127, sum#128, isEmpty#129]
Arguments: hashpartitioning(channel#115, id#116, spark_grouping_id#117, 5), ENSURE_REQUIREMENTS, [plan_id=4]

(69) HashAggregate [codegen id : 5]
Input [9]: [channel#115, id#116, spark_grouping_id#117, sum#124, isEmpty#125, sum#126, isEmpty#127, sum#128, isEmpty#129]
Keys [3]: [channel#115, id#116, spark_grouping_id#117]
Functions [3]: [sum(sales#33), sum(returns#34), sum(profit#35)]
Aggregate Attributes [3]: [sum(sales#33)#130, sum(returns#34)#131, sum(profit#35)#132]
Results [5]: [channel#115, id#116, sum(sales#33)#130 AS sales#133, sum(returns#34)#131 AS returns#134, sum(profit#35)#132 AS profit#135]

(70) TakeOrderedAndProject
Input [5]: [channel#115, id#116, sales#133, returns#134, profit#135]
Arguments: 100, [channel#115 ASC NULLS FIRST, id#116 ASC NULLS FIRST], [channel#115, id#116, sales#133, returns#134, profit#135]

