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


(1) CometNativeScan: `spark_catalog`.`default`.`web_sales`
Output [6]: [ws_item_sk#1, ws_order_number#2, ws_quantity#3, ws_net_paid#4, ws_net_profit#5, ws_sold_date_sk#6]
Arguments: [ws_item_sk#1, ws_order_number#2, ws_quantity#3, ws_net_paid#4, ws_net_profit#5, ws_sold_date_sk#6]

(2) CometFilter
Input [6]: [ws_item_sk#1, ws_order_number#2, ws_quantity#3, ws_net_paid#4, ws_net_profit#5, ws_sold_date_sk#6]
Condition : (((((((isnotnull(ws_net_profit#5) AND isnotnull(ws_net_paid#4)) AND isnotnull(ws_quantity#3)) AND (ws_net_profit#5 > 1.00)) AND (ws_net_paid#4 > 0.00)) AND (ws_quantity#3 > 0)) AND isnotnull(ws_order_number#2)) AND isnotnull(ws_item_sk#1))

(3) CometProject
Input [6]: [ws_item_sk#1, ws_order_number#2, ws_quantity#3, ws_net_paid#4, ws_net_profit#5, ws_sold_date_sk#6]
Arguments: [ws_item_sk#1, ws_order_number#2, ws_quantity#3, ws_net_paid#4, ws_sold_date_sk#6], [ws_item_sk#1, ws_order_number#2, ws_quantity#3, ws_net_paid#4, ws_sold_date_sk#6]

(4) CometBroadcastExchange
Input [5]: [ws_item_sk#1, ws_order_number#2, ws_quantity#3, ws_net_paid#4, ws_sold_date_sk#6]
Arguments: [ws_item_sk#1, ws_order_number#2, ws_quantity#3, ws_net_paid#4, ws_sold_date_sk#6]

(5) CometNativeScan: `spark_catalog`.`default`.`web_returns`
Output [5]: [wr_item_sk#7, wr_order_number#8, wr_return_quantity#9, wr_return_amt#10, wr_returned_date_sk#11]
Arguments: [wr_item_sk#7, wr_order_number#8, wr_return_quantity#9, wr_return_amt#10, wr_returned_date_sk#11]

(6) CometFilter
Input [5]: [wr_item_sk#7, wr_order_number#8, wr_return_quantity#9, wr_return_amt#10, wr_returned_date_sk#11]
Condition : (((isnotnull(wr_return_amt#10) AND (wr_return_amt#10 > 10000.00)) AND isnotnull(wr_order_number#8)) AND isnotnull(wr_item_sk#7))

(7) CometProject
Input [5]: [wr_item_sk#7, wr_order_number#8, wr_return_quantity#9, wr_return_amt#10, wr_returned_date_sk#11]
Arguments: [wr_item_sk#7, wr_order_number#8, wr_return_quantity#9, wr_return_amt#10], [wr_item_sk#7, wr_order_number#8, wr_return_quantity#9, wr_return_amt#10]

(8) CometBroadcastHashJoin
Left output [5]: [ws_item_sk#1, ws_order_number#2, ws_quantity#3, ws_net_paid#4, ws_sold_date_sk#6]
Right output [4]: [wr_item_sk#7, wr_order_number#8, wr_return_quantity#9, wr_return_amt#10]
Arguments: [ws_order_number#2, ws_item_sk#1], [wr_order_number#8, wr_item_sk#7], Inner, BuildLeft

(9) CometProject
Input [9]: [ws_item_sk#1, ws_order_number#2, ws_quantity#3, ws_net_paid#4, ws_sold_date_sk#6, wr_item_sk#7, wr_order_number#8, wr_return_quantity#9, wr_return_amt#10]
Arguments: [ws_item_sk#1, ws_quantity#3, ws_net_paid#4, ws_sold_date_sk#6, wr_return_quantity#9, wr_return_amt#10], [ws_item_sk#1, ws_quantity#3, ws_net_paid#4, ws_sold_date_sk#6, wr_return_quantity#9, wr_return_amt#10]

(10) CometNativeScan: `spark_catalog`.`default`.`date_dim`
Output [3]: [d_date_sk#12, d_year#13, d_moy#14]
Arguments: [d_date_sk#12, d_year#13, d_moy#14]

(11) CometFilter
Input [3]: [d_date_sk#12, d_year#13, d_moy#14]
Condition : ((((isnotnull(d_year#13) AND isnotnull(d_moy#14)) AND (d_year#13 = 2001)) AND (d_moy#14 = 12)) AND isnotnull(d_date_sk#12))

(12) CometProject
Input [3]: [d_date_sk#12, d_year#13, d_moy#14]
Arguments: [d_date_sk#12], [d_date_sk#12]

(13) CometBroadcastExchange
Input [1]: [d_date_sk#12]
Arguments: [d_date_sk#12]

(14) CometBroadcastHashJoin
Left output [6]: [ws_item_sk#1, ws_quantity#3, ws_net_paid#4, ws_sold_date_sk#6, wr_return_quantity#9, wr_return_amt#10]
Right output [1]: [d_date_sk#12]
Arguments: [ws_sold_date_sk#6], [d_date_sk#12], Inner, BuildRight

(15) CometProject
Input [7]: [ws_item_sk#1, ws_quantity#3, ws_net_paid#4, ws_sold_date_sk#6, wr_return_quantity#9, wr_return_amt#10, d_date_sk#12]
Arguments: [ws_item_sk#1, ws_quantity#3, ws_net_paid#4, wr_return_quantity#9, wr_return_amt#10], [ws_item_sk#1, ws_quantity#3, ws_net_paid#4, wr_return_quantity#9, wr_return_amt#10]

(16) ColumnarToRow [codegen id : 1]
Input [5]: [ws_item_sk#1, ws_quantity#3, ws_net_paid#4, wr_return_quantity#9, wr_return_amt#10]

(17) HashAggregate [codegen id : 1]
Input [5]: [ws_item_sk#1, ws_quantity#3, ws_net_paid#4, wr_return_quantity#9, wr_return_amt#10]
Keys [1]: [ws_item_sk#1]
Functions [4]: [partial_sum(coalesce(wr_return_quantity#9, 0)), partial_sum(coalesce(ws_quantity#3, 0)), partial_sum(coalesce(cast(wr_return_amt#10 as decimal(12,2)), 0.00)), partial_sum(coalesce(cast(ws_net_paid#4 as decimal(12,2)), 0.00))]
Aggregate Attributes [6]: [sum#15, sum#16, sum#17, isEmpty#18, sum#19, isEmpty#20]
Results [7]: [ws_item_sk#1, sum#21, sum#22, sum#23, isEmpty#24, sum#25, isEmpty#26]

(18) Exchange
Input [7]: [ws_item_sk#1, sum#21, sum#22, sum#23, isEmpty#24, sum#25, isEmpty#26]
Arguments: hashpartitioning(ws_item_sk#1, 5), ENSURE_REQUIREMENTS, [plan_id=1]

(19) HashAggregate [codegen id : 2]
Input [7]: [ws_item_sk#1, sum#21, sum#22, sum#23, isEmpty#24, sum#25, isEmpty#26]
Keys [1]: [ws_item_sk#1]
Functions [4]: [sum(coalesce(wr_return_quantity#9, 0)), sum(coalesce(ws_quantity#3, 0)), sum(coalesce(cast(wr_return_amt#10 as decimal(12,2)), 0.00)), sum(coalesce(cast(ws_net_paid#4 as decimal(12,2)), 0.00))]
Aggregate Attributes [4]: [sum(coalesce(wr_return_quantity#9, 0))#27, sum(coalesce(ws_quantity#3, 0))#28, sum(coalesce(cast(wr_return_amt#10 as decimal(12,2)), 0.00))#29, sum(coalesce(cast(ws_net_paid#4 as decimal(12,2)), 0.00))#30]
Results [3]: [ws_item_sk#1 AS item#31, (cast(sum(coalesce(wr_return_quantity#9, 0))#27 as decimal(15,4)) / cast(sum(coalesce(ws_quantity#3, 0))#28 as decimal(15,4))) AS return_ratio#32, (cast(sum(coalesce(cast(wr_return_amt#10 as decimal(12,2)), 0.00))#29 as decimal(15,4)) / cast(sum(coalesce(cast(ws_net_paid#4 as decimal(12,2)), 0.00))#30 as decimal(15,4))) AS currency_ratio#33]

(20) Exchange
Input [3]: [item#31, return_ratio#32, currency_ratio#33]
Arguments: SinglePartition, ENSURE_REQUIREMENTS, [plan_id=2]

(21) Sort [codegen id : 3]
Input [3]: [item#31, return_ratio#32, currency_ratio#33]
Arguments: [return_ratio#32 ASC NULLS FIRST], false, 0

(22) Window
Input [3]: [item#31, return_ratio#32, currency_ratio#33]
Arguments: [rank(return_ratio#32) windowspecdefinition(return_ratio#32 ASC NULLS FIRST, specifiedwindowframe(RowFrame, unboundedpreceding$(), currentrow$())) AS return_rank#34], [return_ratio#32 ASC NULLS FIRST]

(23) Sort [codegen id : 4]
Input [4]: [item#31, return_ratio#32, currency_ratio#33, return_rank#34]
Arguments: [currency_ratio#33 ASC NULLS FIRST], false, 0

(24) Window
Input [4]: [item#31, return_ratio#32, currency_ratio#33, return_rank#34]
Arguments: [rank(currency_ratio#33) windowspecdefinition(currency_ratio#33 ASC NULLS FIRST, specifiedwindowframe(RowFrame, unboundedpreceding$(), currentrow$())) AS currency_rank#35], [currency_ratio#33 ASC NULLS FIRST]

(25) Filter [codegen id : 5]
Input [5]: [item#31, return_ratio#32, currency_ratio#33, return_rank#34, currency_rank#35]
Condition : ((return_rank#34 <= 10) OR (currency_rank#35 <= 10))

(26) Project [codegen id : 5]
Output [5]: [web AS channel#36, item#31, return_ratio#32, return_rank#34, currency_rank#35]
Input [5]: [item#31, return_ratio#32, currency_ratio#33, return_rank#34, currency_rank#35]

(27) ReusedExchange [Reuses operator id: 20]
Output [3]: [item#37, return_ratio#38, currency_ratio#39]

(28) Sort [codegen id : 8]
Input [3]: [item#37, return_ratio#38, currency_ratio#39]
Arguments: [return_ratio#38 ASC NULLS FIRST], false, 0

(29) Window
Input [3]: [item#37, return_ratio#38, currency_ratio#39]
Arguments: [rank(return_ratio#38) windowspecdefinition(return_ratio#38 ASC NULLS FIRST, specifiedwindowframe(RowFrame, unboundedpreceding$(), currentrow$())) AS return_rank#40], [return_ratio#38 ASC NULLS FIRST]

(30) Sort [codegen id : 9]
Input [4]: [item#37, return_ratio#38, currency_ratio#39, return_rank#40]
Arguments: [currency_ratio#39 ASC NULLS FIRST], false, 0

(31) Window
Input [4]: [item#37, return_ratio#38, currency_ratio#39, return_rank#40]
Arguments: [rank(currency_ratio#39) windowspecdefinition(currency_ratio#39 ASC NULLS FIRST, specifiedwindowframe(RowFrame, unboundedpreceding$(), currentrow$())) AS currency_rank#41], [currency_ratio#39 ASC NULLS FIRST]

(32) Filter [codegen id : 10]
Input [5]: [item#37, return_ratio#38, currency_ratio#39, return_rank#40, currency_rank#41]
Condition : ((return_rank#40 <= 10) OR (currency_rank#41 <= 10))

(33) Project [codegen id : 10]
Output [5]: [catalog AS channel#42, item#37, return_ratio#38, return_rank#40, currency_rank#41]
Input [5]: [item#37, return_ratio#38, currency_ratio#39, return_rank#40, currency_rank#41]

(34) ReusedExchange [Reuses operator id: 20]
Output [3]: [item#43, return_ratio#44, currency_ratio#45]

(35) Sort [codegen id : 13]
Input [3]: [item#43, return_ratio#44, currency_ratio#45]
Arguments: [return_ratio#44 ASC NULLS FIRST], false, 0

(36) Window
Input [3]: [item#43, return_ratio#44, currency_ratio#45]
Arguments: [rank(return_ratio#44) windowspecdefinition(return_ratio#44 ASC NULLS FIRST, specifiedwindowframe(RowFrame, unboundedpreceding$(), currentrow$())) AS return_rank#46], [return_ratio#44 ASC NULLS FIRST]

(37) Sort [codegen id : 14]
Input [4]: [item#43, return_ratio#44, currency_ratio#45, return_rank#46]
Arguments: [currency_ratio#45 ASC NULLS FIRST], false, 0

(38) Window
Input [4]: [item#43, return_ratio#44, currency_ratio#45, return_rank#46]
Arguments: [rank(currency_ratio#45) windowspecdefinition(currency_ratio#45 ASC NULLS FIRST, specifiedwindowframe(RowFrame, unboundedpreceding$(), currentrow$())) AS currency_rank#47], [currency_ratio#45 ASC NULLS FIRST]

(39) Filter [codegen id : 15]
Input [5]: [item#43, return_ratio#44, currency_ratio#45, return_rank#46, currency_rank#47]
Condition : ((return_rank#46 <= 10) OR (currency_rank#47 <= 10))

(40) Project [codegen id : 15]
Output [5]: [store AS channel#48, item#43, return_ratio#44, return_rank#46, currency_rank#47]
Input [5]: [item#43, return_ratio#44, currency_ratio#45, return_rank#46, currency_rank#47]

(41) Union

(42) HashAggregate [codegen id : 16]
Input [5]: [channel#36, item#31, return_ratio#32, return_rank#34, currency_rank#35]
Keys [5]: [channel#36, item#31, return_ratio#32, return_rank#34, currency_rank#35]
Functions: []
Aggregate Attributes: []
Results [5]: [channel#36, item#31, return_ratio#32, return_rank#34, currency_rank#35]

(43) Exchange
Input [5]: [channel#36, item#31, return_ratio#32, return_rank#34, currency_rank#35]
Arguments: hashpartitioning(channel#36, item#31, return_ratio#32, return_rank#34, currency_rank#35, 5), ENSURE_REQUIREMENTS, [plan_id=3]

(44) HashAggregate [codegen id : 17]
Input [5]: [channel#36, item#31, return_ratio#32, return_rank#34, currency_rank#35]
Keys [5]: [channel#36, item#31, return_ratio#32, return_rank#34, currency_rank#35]
Functions: []
Aggregate Attributes: []
Results [5]: [channel#36, item#31, return_ratio#32, return_rank#34, currency_rank#35]

(45) TakeOrderedAndProject
Input [5]: [channel#36, item#31, return_ratio#32, return_rank#34, currency_rank#35]
Arguments: 100, [channel#36 ASC NULLS FIRST, return_rank#34 ASC NULLS FIRST, currency_rank#35 ASC NULLS FIRST], [channel#36, item#31, return_ratio#32, return_rank#34, currency_rank#35]

