== Physical Plan ==
TakeOrderedAndProject (51)
+- * HashAggregate (50)
   +- Exchange (49)
      +- * HashAggregate (48)
         +- * Expand (47)
            +- Union (46)
               :- * HashAggregate (22)
               :  +- Exchange (21)
               :     +- * HashAggregate (20)
               :        +- * ColumnarToRow (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 (24)
               :  +- ReusedExchange (23)
               +- * HashAggregate (45)
                  +- Exchange (44)
                     +- * HashAggregate (43)
                        +- * ColumnarToRow (42)
                           +- CometProject (41)
                              +- CometBroadcastHashJoin (40)
                                 :- CometProject (38)
                                 :  +- CometBroadcastHashJoin (37)
                                 :     :- CometUnion (35)
                                 :     :  :- CometProject (27)
                                 :     :  :  +- CometFilter (26)
                                 :     :  :     +- CometNativeScan: `spark_catalog`.`default`.`web_sales` (25)
                                 :     :  +- CometProject (34)
                                 :     :     +- CometBroadcastHashJoin (33)
                                 :     :        :- CometBroadcastExchange (29)
                                 :     :        :  +- CometNativeScan: `spark_catalog`.`default`.`web_returns` (28)
                                 :     :        +- CometProject (32)
                                 :     :           +- CometFilter (31)
                                 :     :              +- CometNativeScan: `spark_catalog`.`default`.`web_sales` (30)
                                 :     +- ReusedExchange (36)
                                 +- ReusedExchange (39)


(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) ColumnarToRow [codegen id : 1]
Input [5]: [sales_price#7, profit#8, return_amt#9, net_loss#10, s_store_id#24]

(20) HashAggregate [codegen id : 1]
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))]
Aggregate Attributes [4]: [sum#25, sum#26, sum#27, sum#28]
Results [5]: [s_store_id#24, sum#29, sum#30, sum#31, sum#32]

(21) Exchange
Input [5]: [s_store_id#24, sum#29, sum#30, sum#31, sum#32]
Arguments: hashpartitioning(s_store_id#24, 5), ENSURE_REQUIREMENTS, [plan_id=1]

(22) HashAggregate [codegen id : 2]
Input [5]: [s_store_id#24, sum#29, sum#30, sum#31, sum#32]
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))#33, sum(UnscaledValue(return_amt#9))#34, sum(UnscaledValue(profit#8))#35, sum(UnscaledValue(net_loss#10))#36]
Results [5]: [MakeDecimal(sum(UnscaledValue(sales_price#7))#33,17,2) AS sales#37, MakeDecimal(sum(UnscaledValue(return_amt#9))#34,17,2) AS returns#38, (MakeDecimal(sum(UnscaledValue(profit#8))#35,17,2) - MakeDecimal(sum(UnscaledValue(net_loss#10))#36,17,2)) AS profit#39, store channel AS channel#40, concat(store, s_store_id#24) AS id#41]

(23) ReusedExchange [Reuses operator id: 21]
Output [5]: [cp_catalog_page_id#42, sum#43, sum#44, sum#45, sum#46]

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

(25) CometNativeScan: `spark_catalog`.`default`.`web_sales`
Output [4]: [ws_web_site_sk#60, ws_ext_sales_price#61, ws_net_profit#62, ws_sold_date_sk#63]
Arguments: [ws_web_site_sk#60, ws_ext_sales_price#61, ws_net_profit#62, ws_sold_date_sk#63]

(26) CometFilter
Input [4]: [ws_web_site_sk#60, ws_ext_sales_price#61, ws_net_profit#62, ws_sold_date_sk#63]
Condition : isnotnull(ws_web_site_sk#60)

(27) CometProject
Input [4]: [ws_web_site_sk#60, ws_ext_sales_price#61, ws_net_profit#62, ws_sold_date_sk#63]
Arguments: [wsr_web_site_sk#64, date_sk#65, sales_price#66, profit#67, return_amt#68, net_loss#69], [ws_web_site_sk#60 AS wsr_web_site_sk#64, ws_sold_date_sk#63 AS date_sk#65, ws_ext_sales_price#61 AS sales_price#66, ws_net_profit#62 AS profit#67, 0.00 AS return_amt#68, 0.00 AS net_loss#69]

(28) CometNativeScan: `spark_catalog`.`default`.`web_returns`
Output [5]: [wr_item_sk#70, wr_order_number#71, wr_return_amt#72, wr_net_loss#73, wr_returned_date_sk#74]
Arguments: [wr_item_sk#70, wr_order_number#71, wr_return_amt#72, wr_net_loss#73, wr_returned_date_sk#74]

(29) CometBroadcastExchange
Input [5]: [wr_item_sk#70, wr_order_number#71, wr_return_amt#72, wr_net_loss#73, wr_returned_date_sk#74]
Arguments: [wr_item_sk#70, wr_order_number#71, wr_return_amt#72, wr_net_loss#73, wr_returned_date_sk#74]

(30) CometNativeScan: `spark_catalog`.`default`.`web_sales`
Output [4]: [ws_item_sk#75, ws_web_site_sk#76, ws_order_number#77, ws_sold_date_sk#78]
Arguments: [ws_item_sk#75, ws_web_site_sk#76, ws_order_number#77, ws_sold_date_sk#78]

(31) CometFilter
Input [4]: [ws_item_sk#75, ws_web_site_sk#76, ws_order_number#77, ws_sold_date_sk#78]
Condition : ((isnotnull(ws_item_sk#75) AND isnotnull(ws_order_number#77)) AND isnotnull(ws_web_site_sk#76))

(32) CometProject
Input [4]: [ws_item_sk#75, ws_web_site_sk#76, ws_order_number#77, ws_sold_date_sk#78]
Arguments: [ws_item_sk#75, ws_web_site_sk#76, ws_order_number#77], [ws_item_sk#75, ws_web_site_sk#76, ws_order_number#77]

(33) CometBroadcastHashJoin
Left output [5]: [wr_item_sk#70, wr_order_number#71, wr_return_amt#72, wr_net_loss#73, wr_returned_date_sk#74]
Right output [3]: [ws_item_sk#75, ws_web_site_sk#76, ws_order_number#77]
Arguments: [wr_item_sk#70, wr_order_number#71], [ws_item_sk#75, ws_order_number#77], Inner, BuildLeft

(34) CometProject
Input [8]: [wr_item_sk#70, wr_order_number#71, wr_return_amt#72, wr_net_loss#73, wr_returned_date_sk#74, ws_item_sk#75, ws_web_site_sk#76, ws_order_number#77]
Arguments: [wsr_web_site_sk#79, date_sk#80, sales_price#81, profit#82, return_amt#83, net_loss#84], [ws_web_site_sk#76 AS wsr_web_site_sk#79, wr_returned_date_sk#74 AS date_sk#80, 0.00 AS sales_price#81, 0.00 AS profit#82, wr_return_amt#72 AS return_amt#83, wr_net_loss#73 AS net_loss#84]

(35) CometUnion
Child 0 Input [6]: [wsr_web_site_sk#64, date_sk#65, sales_price#66, profit#67, return_amt#68, net_loss#69]
Child 1 Input [6]: [wsr_web_site_sk#79, date_sk#80, sales_price#81, profit#82, return_amt#83, net_loss#84]

(36) ReusedExchange [Reuses operator id: 11]
Output [1]: [d_date_sk#85]

(37) CometBroadcastHashJoin
Left output [6]: [wsr_web_site_sk#64, date_sk#65, sales_price#66, profit#67, return_amt#68, net_loss#69]
Right output [1]: [d_date_sk#85]
Arguments: [date_sk#65], [d_date_sk#85], Inner, BuildRight

(38) CometProject
Input [7]: [wsr_web_site_sk#64, date_sk#65, sales_price#66, profit#67, return_amt#68, net_loss#69, d_date_sk#85]
Arguments: [wsr_web_site_sk#64, sales_price#66, profit#67, return_amt#68, net_loss#69], [wsr_web_site_sk#64, sales_price#66, profit#67, return_amt#68, net_loss#69]

(39) ReusedExchange [Reuses operator id: 16]
Output [2]: [web_site_sk#86, web_site_id#87]

(40) CometBroadcastHashJoin
Left output [5]: [wsr_web_site_sk#64, sales_price#66, profit#67, return_amt#68, net_loss#69]
Right output [2]: [web_site_sk#86, web_site_id#87]
Arguments: [wsr_web_site_sk#64], [web_site_sk#86], Inner, BuildRight

(41) CometProject
Input [7]: [wsr_web_site_sk#64, sales_price#66, profit#67, return_amt#68, net_loss#69, web_site_sk#86, web_site_id#87]
Arguments: [sales_price#66, profit#67, return_amt#68, net_loss#69, web_site_id#87], [sales_price#66, profit#67, return_amt#68, net_loss#69, web_site_id#87]

(42) ColumnarToRow [codegen id : 5]
Input [5]: [sales_price#66, profit#67, return_amt#68, net_loss#69, web_site_id#87]

(43) HashAggregate [codegen id : 5]
Input [5]: [sales_price#66, profit#67, return_amt#68, net_loss#69, web_site_id#87]
Keys [1]: [web_site_id#87]
Functions [4]: [partial_sum(UnscaledValue(sales_price#66)), partial_sum(UnscaledValue(return_amt#68)), partial_sum(UnscaledValue(profit#67)), partial_sum(UnscaledValue(net_loss#69))]
Aggregate Attributes [4]: [sum#88, sum#89, sum#90, sum#91]
Results [5]: [web_site_id#87, sum#92, sum#93, sum#94, sum#95]

(44) Exchange
Input [5]: [web_site_id#87, sum#92, sum#93, sum#94, sum#95]
Arguments: hashpartitioning(web_site_id#87, 5), ENSURE_REQUIREMENTS, [plan_id=2]

(45) HashAggregate [codegen id : 6]
Input [5]: [web_site_id#87, sum#92, sum#93, sum#94, sum#95]
Keys [1]: [web_site_id#87]
Functions [4]: [sum(UnscaledValue(sales_price#66)), sum(UnscaledValue(return_amt#68)), sum(UnscaledValue(profit#67)), sum(UnscaledValue(net_loss#69))]
Aggregate Attributes [4]: [sum(UnscaledValue(sales_price#66))#96, sum(UnscaledValue(return_amt#68))#97, sum(UnscaledValue(profit#67))#98, sum(UnscaledValue(net_loss#69))#99]
Results [5]: [MakeDecimal(sum(UnscaledValue(sales_price#66))#96,17,2) AS sales#100, MakeDecimal(sum(UnscaledValue(return_amt#68))#97,17,2) AS returns#101, (MakeDecimal(sum(UnscaledValue(profit#67))#98,17,2) - MakeDecimal(sum(UnscaledValue(net_loss#69))#99,17,2)) AS profit#102, web channel AS channel#103, concat(web_site, web_site_id#87) AS id#104]

(46) Union

(47) Expand [codegen id : 7]
Input [5]: [sales#37, returns#38, profit#39, channel#40, id#41]
Arguments: [[sales#37, returns#38, profit#39, channel#40, id#41, 0], [sales#37, returns#38, profit#39, channel#40, null, 1], [sales#37, returns#38, profit#39, null, null, 3]], [sales#37, returns#38, profit#39, channel#105, id#106, spark_grouping_id#107]

(48) HashAggregate [codegen id : 7]
Input [6]: [sales#37, returns#38, profit#39, channel#105, id#106, spark_grouping_id#107]
Keys [3]: [channel#105, id#106, spark_grouping_id#107]
Functions [3]: [partial_sum(sales#37), partial_sum(returns#38), partial_sum(profit#39)]
Aggregate Attributes [6]: [sum#108, isEmpty#109, sum#110, isEmpty#111, sum#112, isEmpty#113]
Results [9]: [channel#105, id#106, spark_grouping_id#107, sum#114, isEmpty#115, sum#116, isEmpty#117, sum#118, isEmpty#119]

(49) Exchange
Input [9]: [channel#105, id#106, spark_grouping_id#107, sum#114, isEmpty#115, sum#116, isEmpty#117, sum#118, isEmpty#119]
Arguments: hashpartitioning(channel#105, id#106, spark_grouping_id#107, 5), ENSURE_REQUIREMENTS, [plan_id=3]

(50) HashAggregate [codegen id : 8]
Input [9]: [channel#105, id#106, spark_grouping_id#107, sum#114, isEmpty#115, sum#116, isEmpty#117, sum#118, isEmpty#119]
Keys [3]: [channel#105, id#106, spark_grouping_id#107]
Functions [3]: [sum(sales#37), sum(returns#38), sum(profit#39)]
Aggregate Attributes [3]: [sum(sales#37)#120, sum(returns#38)#121, sum(profit#39)#122]
Results [5]: [channel#105, id#106, sum(sales#37)#120 AS sales#123, sum(returns#38)#121 AS returns#124, sum(profit#39)#122 AS profit#125]

(51) TakeOrderedAndProject
Input [5]: [channel#105, id#106, sales#123, returns#124, profit#125]
Arguments: 100, [channel#105 ASC NULLS FIRST, id#106 ASC NULLS FIRST], [channel#105, id#106, sales#123, returns#124, profit#125]

