== Physical Plan ==
TakeOrderedAndProject (52)
+- * HashAggregate (51)
   +- Exchange (50)
      +- * HashAggregate (49)
         +- * Expand (48)
            +- Union (47)
               :- * HashAggregate (22)
               :  +- * ColumnarToRow (21)
               :     +- CometExchange (20)
               :        +- CometHashAggregate (19)
               :           +- CometProject (18)
               :              +- CometBroadcastHashJoin (17)
               :                 :- CometProject (13)
               :                 :  +- CometBroadcastHashJoin (12)
               :                 :     :- CometUnion (7)
               :                 :     :  :- CometProject (3)
               :                 :     :  :  +- CometFilter (2)
               :                 :     :  :     +- CometNativeScan: `spark_catalog`.`default`.`store_sales` (1)
               :                 :     :  +- CometProject (6)
               :                 :     :     +- CometFilter (5)
               :                 :     :        +- CometNativeScan: `spark_catalog`.`default`.`store_returns` (4)
               :                 :     +- CometBroadcastExchange (11)
               :                 :        +- CometProject (10)
               :                 :           +- CometFilter (9)
               :                 :              +- CometNativeScan: `spark_catalog`.`default`.`date_dim` (8)
               :                 +- CometBroadcastExchange (16)
               :                    +- CometFilter (15)
               :                       +- CometNativeScan: `spark_catalog`.`default`.`store` (14)
               :- * HashAggregate (25)
               :  +- * ColumnarToRow (24)
               :     +- ReusedExchange (23)
               +- * HashAggregate (46)
                  +- * ColumnarToRow (45)
                     +- CometExchange (44)
                        +- CometHashAggregate (43)
                           +- CometProject (42)
                              +- CometBroadcastHashJoin (41)
                                 :- CometProject (39)
                                 :  +- CometBroadcastHashJoin (38)
                                 :     :- CometUnion (36)
                                 :     :  :- CometProject (28)
                                 :     :  :  +- CometFilter (27)
                                 :     :  :     +- CometNativeScan: `spark_catalog`.`default`.`web_sales` (26)
                                 :     :  +- CometProject (35)
                                 :     :     +- CometBroadcastHashJoin (34)
                                 :     :        :- CometBroadcastExchange (30)
                                 :     :        :  +- CometNativeScan: `spark_catalog`.`default`.`web_returns` (29)
                                 :     :        +- CometProject (33)
                                 :     :           +- CometFilter (32)
                                 :     :              +- CometNativeScan: `spark_catalog`.`default`.`web_sales` (31)
                                 :     +- ReusedExchange (37)
                                 +- ReusedExchange (40)


(1) CometNativeScan: `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]
Arguments: [ss_store_sk#1, ss_ext_sales_price#2, ss_net_profit#3, ss_sold_date_sk#4]

(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) CometNativeScan: `spark_catalog`.`default`.`store_returns`
Output [4]: [sr_store_sk#11, sr_return_amt#12, sr_net_loss#13, sr_returned_date_sk#14]
Arguments: [sr_store_sk#11, sr_return_amt#12, sr_net_loss#13, sr_returned_date_sk#14]

(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) CometNativeScan: `spark_catalog`.`default`.`date_dim`
Output [2]: [d_date_sk#21, d_date#22]
Arguments: [d_date_sk#21, d_date#22]

(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) CometNativeScan: `spark_catalog`.`default`.`store`
Output [2]: [s_store_sk#23, s_store_id#24]
Arguments: [s_store_sk#23, s_store_id#24]

(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) ReusedExchange [Reuses operator id: 20]
Output [5]: [cp_catalog_page_id#38, sum#39, sum#40, sum#41, sum#42]

(24) ColumnarToRow [codegen id : 2]
Input [5]: [cp_catalog_page_id#38, sum#39, sum#40, sum#41, sum#42]

(25) HashAggregate [codegen id : 2]
Input [5]: [cp_catalog_page_id#38, sum#39, sum#40, sum#41, sum#42]
Keys [1]: [cp_catalog_page_id#38]
Functions [4]: [sum(UnscaledValue(sales_price#43)), sum(UnscaledValue(return_amt#44)), sum(UnscaledValue(profit#45)), sum(UnscaledValue(net_loss#46))]
Aggregate Attributes [4]: [sum(UnscaledValue(sales_price#43))#47, sum(UnscaledValue(return_amt#44))#48, sum(UnscaledValue(profit#45))#49, sum(UnscaledValue(net_loss#46))#50]
Results [5]: [MakeDecimal(sum(UnscaledValue(sales_price#43))#47,17,2) AS sales#51, MakeDecimal(sum(UnscaledValue(return_amt#44))#48,17,2) AS returns#52, (MakeDecimal(sum(UnscaledValue(profit#45))#49,17,2) - MakeDecimal(sum(UnscaledValue(net_loss#46))#50,17,2)) AS profit#53, catalog channel AS channel#54, concat(catalog_page, cp_catalog_page_id#38) AS id#55]

(26) CometNativeScan: `spark_catalog`.`default`.`web_sales`
Output [4]: [ws_web_site_sk#56, ws_ext_sales_price#57, ws_net_profit#58, ws_sold_date_sk#59]
Arguments: [ws_web_site_sk#56, ws_ext_sales_price#57, ws_net_profit#58, ws_sold_date_sk#59]

(27) CometFilter
Input [4]: [ws_web_site_sk#56, ws_ext_sales_price#57, ws_net_profit#58, ws_sold_date_sk#59]
Condition : isnotnull(ws_web_site_sk#56)

(28) CometProject
Input [4]: [ws_web_site_sk#56, ws_ext_sales_price#57, ws_net_profit#58, ws_sold_date_sk#59]
Arguments: [wsr_web_site_sk#60, date_sk#61, sales_price#62, profit#63, return_amt#64, net_loss#65], [ws_web_site_sk#56 AS wsr_web_site_sk#60, ws_sold_date_sk#59 AS date_sk#61, ws_ext_sales_price#57 AS sales_price#62, ws_net_profit#58 AS profit#63, 0.00 AS return_amt#64, 0.00 AS net_loss#65]

(29) CometNativeScan: `spark_catalog`.`default`.`web_returns`
Output [5]: [wr_item_sk#66, wr_order_number#67, wr_return_amt#68, wr_net_loss#69, wr_returned_date_sk#70]
Arguments: [wr_item_sk#66, wr_order_number#67, wr_return_amt#68, wr_net_loss#69, wr_returned_date_sk#70]

(30) CometBroadcastExchange
Input [5]: [wr_item_sk#66, wr_order_number#67, wr_return_amt#68, wr_net_loss#69, wr_returned_date_sk#70]
Arguments: [wr_item_sk#66, wr_order_number#67, wr_return_amt#68, wr_net_loss#69, wr_returned_date_sk#70]

(31) CometNativeScan: `spark_catalog`.`default`.`web_sales`
Output [4]: [ws_item_sk#71, ws_web_site_sk#72, ws_order_number#73, ws_sold_date_sk#74]
Arguments: [ws_item_sk#71, ws_web_site_sk#72, ws_order_number#73, ws_sold_date_sk#74]

(32) CometFilter
Input [4]: [ws_item_sk#71, ws_web_site_sk#72, ws_order_number#73, ws_sold_date_sk#74]
Condition : ((isnotnull(ws_item_sk#71) AND isnotnull(ws_order_number#73)) AND isnotnull(ws_web_site_sk#72))

(33) CometProject
Input [4]: [ws_item_sk#71, ws_web_site_sk#72, ws_order_number#73, ws_sold_date_sk#74]
Arguments: [ws_item_sk#71, ws_web_site_sk#72, ws_order_number#73], [ws_item_sk#71, ws_web_site_sk#72, ws_order_number#73]

(34) CometBroadcastHashJoin
Left output [5]: [wr_item_sk#66, wr_order_number#67, wr_return_amt#68, wr_net_loss#69, wr_returned_date_sk#70]
Right output [3]: [ws_item_sk#71, ws_web_site_sk#72, ws_order_number#73]
Arguments: [wr_item_sk#66, wr_order_number#67], [ws_item_sk#71, ws_order_number#73], Inner, BuildLeft

(35) CometProject
Input [8]: [wr_item_sk#66, wr_order_number#67, wr_return_amt#68, wr_net_loss#69, wr_returned_date_sk#70, ws_item_sk#71, ws_web_site_sk#72, ws_order_number#73]
Arguments: [wsr_web_site_sk#75, date_sk#76, sales_price#77, profit#78, return_amt#79, net_loss#80], [ws_web_site_sk#72 AS wsr_web_site_sk#75, wr_returned_date_sk#70 AS date_sk#76, 0.00 AS sales_price#77, 0.00 AS profit#78, wr_return_amt#68 AS return_amt#79, wr_net_loss#69 AS net_loss#80]

(36) CometUnion
Child 0 Input [6]: [wsr_web_site_sk#60, date_sk#61, sales_price#62, profit#63, return_amt#64, net_loss#65]
Child 1 Input [6]: [wsr_web_site_sk#75, date_sk#76, sales_price#77, profit#78, return_amt#79, net_loss#80]

(37) ReusedExchange [Reuses operator id: 11]
Output [1]: [d_date_sk#81]

(38) CometBroadcastHashJoin
Left output [6]: [wsr_web_site_sk#60, date_sk#61, sales_price#62, profit#63, return_amt#64, net_loss#65]
Right output [1]: [d_date_sk#81]
Arguments: [date_sk#61], [d_date_sk#81], Inner, BuildRight

(39) CometProject
Input [7]: [wsr_web_site_sk#60, date_sk#61, sales_price#62, profit#63, return_amt#64, net_loss#65, d_date_sk#81]
Arguments: [wsr_web_site_sk#60, sales_price#62, profit#63, return_amt#64, net_loss#65], [wsr_web_site_sk#60, sales_price#62, profit#63, return_amt#64, net_loss#65]

(40) ReusedExchange [Reuses operator id: 16]
Output [2]: [web_site_sk#82, web_site_id#83]

(41) CometBroadcastHashJoin
Left output [5]: [wsr_web_site_sk#60, sales_price#62, profit#63, return_amt#64, net_loss#65]
Right output [2]: [web_site_sk#82, web_site_id#83]
Arguments: [wsr_web_site_sk#60], [web_site_sk#82], Inner, BuildRight

(42) CometProject
Input [7]: [wsr_web_site_sk#60, sales_price#62, profit#63, return_amt#64, net_loss#65, web_site_sk#82, web_site_id#83]
Arguments: [sales_price#62, profit#63, return_amt#64, net_loss#65, web_site_id#83], [sales_price#62, profit#63, return_amt#64, net_loss#65, web_site_id#83]

(43) CometHashAggregate
Input [5]: [sales_price#62, profit#63, return_amt#64, net_loss#65, web_site_id#83]
Keys [1]: [web_site_id#83]
Functions [4]: [partial_sum(UnscaledValue(sales_price#62)), partial_sum(UnscaledValue(return_amt#64)), partial_sum(UnscaledValue(profit#63)), partial_sum(UnscaledValue(net_loss#65))]

(44) CometExchange
Input [5]: [web_site_id#83, sum#84, sum#85, sum#86, sum#87]
Arguments: hashpartitioning(web_site_id#83, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=2]

(45) ColumnarToRow [codegen id : 3]
Input [5]: [web_site_id#83, sum#84, sum#85, sum#86, sum#87]

(46) HashAggregate [codegen id : 3]
Input [5]: [web_site_id#83, sum#84, sum#85, sum#86, sum#87]
Keys [1]: [web_site_id#83]
Functions [4]: [sum(UnscaledValue(sales_price#62)), sum(UnscaledValue(return_amt#64)), sum(UnscaledValue(profit#63)), sum(UnscaledValue(net_loss#65))]
Aggregate Attributes [4]: [sum(UnscaledValue(sales_price#62))#88, sum(UnscaledValue(return_amt#64))#89, sum(UnscaledValue(profit#63))#90, sum(UnscaledValue(net_loss#65))#91]
Results [5]: [MakeDecimal(sum(UnscaledValue(sales_price#62))#88,17,2) AS sales#92, MakeDecimal(sum(UnscaledValue(return_amt#64))#89,17,2) AS returns#93, (MakeDecimal(sum(UnscaledValue(profit#63))#90,17,2) - MakeDecimal(sum(UnscaledValue(net_loss#65))#91,17,2)) AS profit#94, web channel AS channel#95, concat(web_site, web_site_id#83) AS id#96]

(47) Union

(48) 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#97, id#98, spark_grouping_id#99]

(49) HashAggregate [codegen id : 4]
Input [6]: [sales#33, returns#34, profit#35, channel#97, id#98, spark_grouping_id#99]
Keys [3]: [channel#97, id#98, spark_grouping_id#99]
Functions [3]: [partial_sum(sales#33), partial_sum(returns#34), partial_sum(profit#35)]
Aggregate Attributes [6]: [sum#100, isEmpty#101, sum#102, isEmpty#103, sum#104, isEmpty#105]
Results [9]: [channel#97, id#98, spark_grouping_id#99, sum#106, isEmpty#107, sum#108, isEmpty#109, sum#110, isEmpty#111]

(50) Exchange
Input [9]: [channel#97, id#98, spark_grouping_id#99, sum#106, isEmpty#107, sum#108, isEmpty#109, sum#110, isEmpty#111]
Arguments: hashpartitioning(channel#97, id#98, spark_grouping_id#99, 5), ENSURE_REQUIREMENTS, [plan_id=3]

(51) HashAggregate [codegen id : 5]
Input [9]: [channel#97, id#98, spark_grouping_id#99, sum#106, isEmpty#107, sum#108, isEmpty#109, sum#110, isEmpty#111]
Keys [3]: [channel#97, id#98, spark_grouping_id#99]
Functions [3]: [sum(sales#33), sum(returns#34), sum(profit#35)]
Aggregate Attributes [3]: [sum(sales#33)#112, sum(returns#34)#113, sum(profit#35)#114]
Results [5]: [channel#97, id#98, sum(sales#33)#112 AS sales#115, sum(returns#34)#113 AS returns#116, sum(profit#35)#114 AS profit#117]

(52) TakeOrderedAndProject
Input [5]: [channel#97, id#98, sales#115, returns#116, profit#117]
Arguments: 100, [channel#97 ASC NULLS FIRST, id#98 ASC NULLS FIRST], [channel#97, id#98, sales#115, returns#116, profit#117]

