== Physical Plan ==
VeloxColumnarToRow (141)
+- TakeOrderedAndProjectExecTransformer (140)
   +- ^ ProjectExecTransformer (138)
      +- ^ ShuffledHashJoinExecTransformer Inner BuildRight (137)
         :- ^ ProjectExecTransformer (105)
         :  +- ^ ShuffledHashJoinExecTransformer Inner BuildRight (104)
         :     :- ^ ShuffledHashJoinExecTransformer Inner BuildLeft (70)
         :     :  :- ^ InputIteratorTransformer (38)
         :     :  :  +- ColumnarExchange (36)
         :     :  :     +- VeloxResizeBatches (35)
         :     :  :        +- ^ ProjectExecTransformer (33)
         :     :  :           +- ^ FilterExecTransformer (32)
         :     :  :              +- ^ ProjectExecTransformer (31)
         :     :  :                 +- ^ RegularHashAggregateExecTransformer (30)
         :     :  :                    +- ^ InputIteratorTransformer (29)
         :     :  :                       +- ColumnarExchange (27)
         :     :  :                          +- VeloxResizeBatches (26)
         :     :  :                             +- ^ ProjectExecTransformer (24)
         :     :  :                                +- ^ FlushableHashAggregateExecTransformer (23)
         :     :  :                                   +- ^ ProjectExecTransformer (22)
         :     :  :                                      +- ^ ShuffledHashJoinExecTransformer Inner BuildRight (21)
         :     :  :                                         :- ^ InputIteratorTransformer (12)
         :     :  :                                         :  +- ColumnarExchange (10)
         :     :  :                                         :     +- VeloxResizeBatches (9)
         :     :  :                                         :        +- ^ ProjectExecTransformer (7)
         :     :  :                                         :           +- ^ BroadcastHashJoinExecTransformer Inner BuildRight (6)
         :     :  :                                         :              :- ^ FilterExecTransformer (2)
         :     :  :                                         :              :  +- ^ FileSourceScanExecTransformer parquet spark_catalog.default.store_sales (1)
         :     :  :                                         :              +- ^ InputIteratorTransformer (5)
         :     :  :                                         :                 +- ReusedExchange (3)
         :     :  :                                         +- ^ InputIteratorTransformer (20)
         :     :  :                                            +- ColumnarExchange (18)
         :     :  :                                               +- VeloxResizeBatches (17)
         :     :  :                                                  +- ^ ProjectExecTransformer (15)
         :     :  :                                                     +- ^ FilterExecTransformer (14)
         :     :  :                                                        +- ^ FileSourceScanExecTransformer parquet spark_catalog.default.customer (13)
         :     :  +- ^ InputIteratorTransformer (69)
         :     :     +- ColumnarExchange (67)
         :     :        +- VeloxResizeBatches (66)
         :     :           +- ^ ProjectExecTransformer (64)
         :     :              +- ^ RegularHashAggregateExecTransformer (63)
         :     :                 +- ^ InputIteratorTransformer (62)
         :     :                    +- ColumnarExchange (60)
         :     :                       +- VeloxResizeBatches (59)
         :     :                          +- ^ ProjectExecTransformer (57)
         :     :                             +- ^ FlushableHashAggregateExecTransformer (56)
         :     :                                +- ^ ProjectExecTransformer (55)
         :     :                                   +- ^ ShuffledHashJoinExecTransformer Inner BuildRight (54)
         :     :                                      :- ^ InputIteratorTransformer (50)
         :     :                                      :  +- ColumnarExchange (48)
         :     :                                      :     +- VeloxResizeBatches (47)
         :     :                                      :        +- ^ ProjectExecTransformer (45)
         :     :                                      :           +- ^ BroadcastHashJoinExecTransformer Inner BuildRight (44)
         :     :                                      :              :- ^ FilterExecTransformer (40)
         :     :                                      :              :  +- ^ FileSourceScanExecTransformer parquet spark_catalog.default.store_sales (39)
         :     :                                      :              +- ^ InputIteratorTransformer (43)
         :     :                                      :                 +- ReusedExchange (41)
         :     :                                      +- ^ InputIteratorTransformer (53)
         :     :                                         +- ReusedExchange (51)
         :     +- ^ InputIteratorTransformer (103)
         :        +- ColumnarExchange (101)
         :           +- VeloxResizeBatches (100)
         :              +- ^ ProjectExecTransformer (98)
         :                 +- ^ FilterExecTransformer (97)
         :                    +- ^ ProjectExecTransformer (96)
         :                       +- ^ RegularHashAggregateExecTransformer (95)
         :                          +- ^ InputIteratorTransformer (94)
         :                             +- ColumnarExchange (92)
         :                                +- VeloxResizeBatches (91)
         :                                   +- ^ ProjectExecTransformer (89)
         :                                      +- ^ FlushableHashAggregateExecTransformer (88)
         :                                         +- ^ ProjectExecTransformer (87)
         :                                            +- ^ ShuffledHashJoinExecTransformer Inner BuildRight (86)
         :                                               :- ^ InputIteratorTransformer (82)
         :                                               :  +- ColumnarExchange (80)
         :                                               :     +- VeloxResizeBatches (79)
         :                                               :        +- ^ ProjectExecTransformer (77)
         :                                               :           +- ^ BroadcastHashJoinExecTransformer Inner BuildRight (76)
         :                                               :              :- ^ FilterExecTransformer (72)
         :                                               :              :  +- ^ FileSourceScanExecTransformer parquet spark_catalog.default.web_sales (71)
         :                                               :              +- ^ InputIteratorTransformer (75)
         :                                               :                 +- ReusedExchange (73)
         :                                               +- ^ InputIteratorTransformer (85)
         :                                                  +- ReusedExchange (83)
         +- ^ InputIteratorTransformer (136)
            +- ColumnarExchange (134)
               +- VeloxResizeBatches (133)
                  +- ^ ProjectExecTransformer (131)
                     +- ^ RegularHashAggregateExecTransformer (130)
                        +- ^ InputIteratorTransformer (129)
                           +- ColumnarExchange (127)
                              +- VeloxResizeBatches (126)
                                 +- ^ ProjectExecTransformer (124)
                                    +- ^ FlushableHashAggregateExecTransformer (123)
                                       +- ^ ProjectExecTransformer (122)
                                          +- ^ ShuffledHashJoinExecTransformer Inner BuildRight (121)
                                             :- ^ InputIteratorTransformer (117)
                                             :  +- ColumnarExchange (115)
                                             :     +- VeloxResizeBatches (114)
                                             :        +- ^ ProjectExecTransformer (112)
                                             :           +- ^ BroadcastHashJoinExecTransformer Inner BuildRight (111)
                                             :              :- ^ FilterExecTransformer (107)
                                             :              :  +- ^ FileSourceScanExecTransformer parquet spark_catalog.default.web_sales (106)
                                             :              +- ^ InputIteratorTransformer (110)
                                             :                 +- ReusedExchange (108)
                                             +- ^ InputIteratorTransformer (120)
                                                +- ReusedExchange (118)


(1) FileSourceScanExecTransformer parquet spark_catalog.default.store_sales
Output [3]: [ss_customer_sk#1, ss_net_paid#2, ss_sold_date_sk#3]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(ss_sold_date_sk#3), dynamicpruningexpression(ss_sold_date_sk#3 IN dynamicpruning#4)]
PushedFilters: [IsNotNull(ss_customer_sk)]
ReadSchema: struct<ss_customer_sk:int,ss_net_paid:decimal(7,2)>

(2) FilterExecTransformer
Input [3]: [ss_customer_sk#1, ss_net_paid#2, ss_sold_date_sk#3]
Arguments: isnotnull(ss_customer_sk#1)

(3) ReusedExchange [Reuses operator id: 145]
Output [2]: [d_date_sk#5, d_year#6]

(4) InputAdapter
Input [2]: [d_date_sk#5, d_year#6]

(5) InputIteratorTransformer
Input [2]: [d_date_sk#5, d_year#6]

(6) BroadcastHashJoinExecTransformer
Left keys [1]: [ss_sold_date_sk#3]
Right keys [1]: [d_date_sk#5]
Join type: Inner
Join condition: None

(7) ProjectExecTransformer
Output [4]: [hash(ss_customer_sk#1, 42) AS hash_partition_key#7, ss_customer_sk#1, ss_net_paid#2, d_year#6]
Input [5]: [ss_customer_sk#1, ss_net_paid#2, ss_sold_date_sk#3, d_date_sk#5, d_year#6]

(8) WholeStageCodegenTransformer (3)
Input [4]: [hash_partition_key#7, ss_customer_sk#1, ss_net_paid#2, d_year#6]
Arguments: false

(9) VeloxResizeBatches
Input [4]: [hash_partition_key#7, ss_customer_sk#1, ss_net_paid#2, d_year#6]
Arguments: 1024, 2147483647, 10485760

(10) ColumnarExchange
Input [4]: [hash_partition_key#7, ss_customer_sk#1, ss_net_paid#2, d_year#6]
Arguments: hashpartitioning(ss_customer_sk#1, 1), ENSURE_REQUIREMENTS, [ss_customer_sk#1, ss_net_paid#2, d_year#6], [plan_id=1], [shuffle_writer_type=hash]

(11) InputAdapter
Input [3]: [ss_customer_sk#1, ss_net_paid#2, d_year#6]

(12) InputIteratorTransformer
Input [3]: [ss_customer_sk#1, ss_net_paid#2, d_year#6]

(13) FileSourceScanExecTransformer parquet spark_catalog.default.customer
Output [4]: [c_customer_sk#8, c_customer_id#9, c_first_name#10, c_last_name#11]
Batched: true
Location: InMemoryFileIndex [{warehouse_dir}/customer]
PushedFilters: [IsNotNull(c_customer_sk), IsNotNull(c_customer_id)]
ReadSchema: struct<c_customer_sk:int,c_customer_id:string,c_first_name:string,c_last_name:string>

(14) FilterExecTransformer
Input [4]: [c_customer_sk#8, c_customer_id#9, c_first_name#10, c_last_name#11]
Arguments: (isnotnull(c_customer_sk#8) AND isnotnull(c_customer_id#9))

(15) ProjectExecTransformer
Output [5]: [hash(c_customer_sk#8, 42) AS hash_partition_key#12, c_customer_sk#8, c_customer_id#9, c_first_name#10, c_last_name#11]
Input [4]: [c_customer_sk#8, c_customer_id#9, c_first_name#10, c_last_name#11]

(16) WholeStageCodegenTransformer (4)
Input [5]: [hash_partition_key#12, c_customer_sk#8, c_customer_id#9, c_first_name#10, c_last_name#11]
Arguments: false

(17) VeloxResizeBatches
Input [5]: [hash_partition_key#12, c_customer_sk#8, c_customer_id#9, c_first_name#10, c_last_name#11]
Arguments: 1024, 2147483647, 10485760

(18) ColumnarExchange
Input [5]: [hash_partition_key#12, c_customer_sk#8, c_customer_id#9, c_first_name#10, c_last_name#11]
Arguments: hashpartitioning(c_customer_sk#8, 1), ENSURE_REQUIREMENTS, [c_customer_sk#8, c_customer_id#9, c_first_name#10, c_last_name#11], [plan_id=2], [shuffle_writer_type=hash]

(19) InputAdapter
Input [4]: [c_customer_sk#8, c_customer_id#9, c_first_name#10, c_last_name#11]

(20) InputIteratorTransformer
Input [4]: [c_customer_sk#8, c_customer_id#9, c_first_name#10, c_last_name#11]

(21) ShuffledHashJoinExecTransformer
Left keys [1]: [ss_customer_sk#1]
Right keys [1]: [c_customer_sk#8]
Join type: Inner
Join condition: None

(22) ProjectExecTransformer
Output [5]: [c_customer_id#9, c_first_name#10, c_last_name#11, d_year#6, UnscaledValue(ss_net_paid#2) AS _pre_1#13]
Input [7]: [ss_customer_sk#1, ss_net_paid#2, d_year#6, c_customer_sk#8, c_customer_id#9, c_first_name#10, c_last_name#11]

(23) FlushableHashAggregateExecTransformer
Input [5]: [c_customer_id#9, c_first_name#10, c_last_name#11, d_year#6, _pre_1#13]
Keys [4]: [c_customer_id#9, c_first_name#10, c_last_name#11, d_year#6]
Functions [1]: [partial_sum(_pre_1#13)]
Aggregate Attributes [1]: [sum#14]
Results [5]: [c_customer_id#9, c_first_name#10, c_last_name#11, d_year#6, sum#15]

(24) ProjectExecTransformer
Output [6]: [hash(c_customer_id#9, c_first_name#10, c_last_name#11, d_year#6, 42) AS hash_partition_key#16, c_customer_id#9, c_first_name#10, c_last_name#11, d_year#6, sum#15]
Input [5]: [c_customer_id#9, c_first_name#10, c_last_name#11, d_year#6, sum#15]

(25) WholeStageCodegenTransformer (5)
Input [6]: [hash_partition_key#16, c_customer_id#9, c_first_name#10, c_last_name#11, d_year#6, sum#15]
Arguments: false

(26) VeloxResizeBatches
Input [6]: [hash_partition_key#16, c_customer_id#9, c_first_name#10, c_last_name#11, d_year#6, sum#15]
Arguments: 1024, 2147483647, 10485760

(27) ColumnarExchange
Input [6]: [hash_partition_key#16, c_customer_id#9, c_first_name#10, c_last_name#11, d_year#6, sum#15]
Arguments: hashpartitioning(c_customer_id#9, c_first_name#10, c_last_name#11, d_year#6, 1), ENSURE_REQUIREMENTS, [c_customer_id#9, c_first_name#10, c_last_name#11, d_year#6, sum#15], [plan_id=3], [shuffle_writer_type=hash]

(28) InputAdapter
Input [5]: [c_customer_id#9, c_first_name#10, c_last_name#11, d_year#6, sum#15]

(29) InputIteratorTransformer
Input [5]: [c_customer_id#9, c_first_name#10, c_last_name#11, d_year#6, sum#15]

(30) RegularHashAggregateExecTransformer
Input [5]: [c_customer_id#9, c_first_name#10, c_last_name#11, d_year#6, sum#15]
Keys [4]: [c_customer_id#9, c_first_name#10, c_last_name#11, d_year#6]
Functions [1]: [sum(UnscaledValue(ss_net_paid#2))]
Aggregate Attributes [1]: [sum(UnscaledValue(ss_net_paid#2))#17]
Results [5]: [c_customer_id#9, c_first_name#10, c_last_name#11, d_year#6, sum(UnscaledValue(ss_net_paid#2))#17]

(31) ProjectExecTransformer
Output [2]: [c_customer_id#9 AS customer_id#18, MakeDecimal(sum(UnscaledValue(ss_net_paid#2))#17,17,2) AS year_total#19]
Input [5]: [c_customer_id#9, c_first_name#10, c_last_name#11, d_year#6, sum(UnscaledValue(ss_net_paid#2))#17]

(32) FilterExecTransformer
Input [2]: [customer_id#18, year_total#19]
Arguments: (isnotnull(year_total#19) AND (year_total#19 > 0.00))

(33) ProjectExecTransformer
Output [3]: [hash(customer_id#18, 42) AS hash_partition_key#20, customer_id#18, year_total#19]
Input [2]: [customer_id#18, year_total#19]

(34) WholeStageCodegenTransformer (6)
Input [3]: [hash_partition_key#20, customer_id#18, year_total#19]
Arguments: false

(35) VeloxResizeBatches
Input [3]: [hash_partition_key#20, customer_id#18, year_total#19]
Arguments: 1024, 2147483647, 10485760

(36) ColumnarExchange
Input [3]: [hash_partition_key#20, customer_id#18, year_total#19]
Arguments: hashpartitioning(customer_id#18, 1), ENSURE_REQUIREMENTS, [customer_id#18, year_total#19], [plan_id=4], [shuffle_writer_type=hash]

(37) InputAdapter
Input [2]: [customer_id#18, year_total#19]

(38) InputIteratorTransformer
Input [2]: [customer_id#18, year_total#19]

(39) FileSourceScanExecTransformer parquet spark_catalog.default.store_sales
Output [3]: [ss_customer_sk#21, ss_net_paid#22, ss_sold_date_sk#23]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(ss_sold_date_sk#23), dynamicpruningexpression(ss_sold_date_sk#23 IN dynamicpruning#24)]
PushedFilters: [IsNotNull(ss_customer_sk)]
ReadSchema: struct<ss_customer_sk:int,ss_net_paid:decimal(7,2)>

(40) FilterExecTransformer
Input [3]: [ss_customer_sk#21, ss_net_paid#22, ss_sold_date_sk#23]
Arguments: isnotnull(ss_customer_sk#21)

(41) ReusedExchange [Reuses operator id: 149]
Output [2]: [d_date_sk#25, d_year#26]

(42) InputAdapter
Input [2]: [d_date_sk#25, d_year#26]

(43) InputIteratorTransformer
Input [2]: [d_date_sk#25, d_year#26]

(44) BroadcastHashJoinExecTransformer
Left keys [1]: [ss_sold_date_sk#23]
Right keys [1]: [d_date_sk#25]
Join type: Inner
Join condition: None

(45) ProjectExecTransformer
Output [4]: [hash(ss_customer_sk#21, 42) AS hash_partition_key#27, ss_customer_sk#21, ss_net_paid#22, d_year#26]
Input [5]: [ss_customer_sk#21, ss_net_paid#22, ss_sold_date_sk#23, d_date_sk#25, d_year#26]

(46) WholeStageCodegenTransformer (9)
Input [4]: [hash_partition_key#27, ss_customer_sk#21, ss_net_paid#22, d_year#26]
Arguments: false

(47) VeloxResizeBatches
Input [4]: [hash_partition_key#27, ss_customer_sk#21, ss_net_paid#22, d_year#26]
Arguments: 1024, 2147483647, 10485760

(48) ColumnarExchange
Input [4]: [hash_partition_key#27, ss_customer_sk#21, ss_net_paid#22, d_year#26]
Arguments: hashpartitioning(ss_customer_sk#21, 1), ENSURE_REQUIREMENTS, [ss_customer_sk#21, ss_net_paid#22, d_year#26], [plan_id=5], [shuffle_writer_type=hash]

(49) InputAdapter
Input [3]: [ss_customer_sk#21, ss_net_paid#22, d_year#26]

(50) InputIteratorTransformer
Input [3]: [ss_customer_sk#21, ss_net_paid#22, d_year#26]

(51) ReusedExchange [Reuses operator id: 18]
Output [4]: [c_customer_sk#28, c_customer_id#29, c_first_name#30, c_last_name#31]

(52) InputAdapter
Input [4]: [c_customer_sk#28, c_customer_id#29, c_first_name#30, c_last_name#31]

(53) InputIteratorTransformer
Input [4]: [c_customer_sk#28, c_customer_id#29, c_first_name#30, c_last_name#31]

(54) ShuffledHashJoinExecTransformer
Left keys [1]: [ss_customer_sk#21]
Right keys [1]: [c_customer_sk#28]
Join type: Inner
Join condition: None

(55) ProjectExecTransformer
Output [5]: [c_customer_id#29, c_first_name#30, c_last_name#31, d_year#26, UnscaledValue(ss_net_paid#22) AS _pre_2#32]
Input [7]: [ss_customer_sk#21, ss_net_paid#22, d_year#26, c_customer_sk#28, c_customer_id#29, c_first_name#30, c_last_name#31]

(56) FlushableHashAggregateExecTransformer
Input [5]: [c_customer_id#29, c_first_name#30, c_last_name#31, d_year#26, _pre_2#32]
Keys [4]: [c_customer_id#29, c_first_name#30, c_last_name#31, d_year#26]
Functions [1]: [partial_sum(_pre_2#32)]
Aggregate Attributes [1]: [sum#33]
Results [5]: [c_customer_id#29, c_first_name#30, c_last_name#31, d_year#26, sum#34]

(57) ProjectExecTransformer
Output [6]: [hash(c_customer_id#29, c_first_name#30, c_last_name#31, d_year#26, 42) AS hash_partition_key#35, c_customer_id#29, c_first_name#30, c_last_name#31, d_year#26, sum#34]
Input [5]: [c_customer_id#29, c_first_name#30, c_last_name#31, d_year#26, sum#34]

(58) WholeStageCodegenTransformer (11)
Input [6]: [hash_partition_key#35, c_customer_id#29, c_first_name#30, c_last_name#31, d_year#26, sum#34]
Arguments: false

(59) VeloxResizeBatches
Input [6]: [hash_partition_key#35, c_customer_id#29, c_first_name#30, c_last_name#31, d_year#26, sum#34]
Arguments: 1024, 2147483647, 10485760

(60) ColumnarExchange
Input [6]: [hash_partition_key#35, c_customer_id#29, c_first_name#30, c_last_name#31, d_year#26, sum#34]
Arguments: hashpartitioning(c_customer_id#29, c_first_name#30, c_last_name#31, d_year#26, 1), ENSURE_REQUIREMENTS, [c_customer_id#29, c_first_name#30, c_last_name#31, d_year#26, sum#34], [plan_id=6], [shuffle_writer_type=hash]

(61) InputAdapter
Input [5]: [c_customer_id#29, c_first_name#30, c_last_name#31, d_year#26, sum#34]

(62) InputIteratorTransformer
Input [5]: [c_customer_id#29, c_first_name#30, c_last_name#31, d_year#26, sum#34]

(63) RegularHashAggregateExecTransformer
Input [5]: [c_customer_id#29, c_first_name#30, c_last_name#31, d_year#26, sum#34]
Keys [4]: [c_customer_id#29, c_first_name#30, c_last_name#31, d_year#26]
Functions [1]: [sum(UnscaledValue(ss_net_paid#22))]
Aggregate Attributes [1]: [sum(UnscaledValue(ss_net_paid#22))#17]
Results [5]: [c_customer_id#29, c_first_name#30, c_last_name#31, d_year#26, sum(UnscaledValue(ss_net_paid#22))#17]

(64) ProjectExecTransformer
Output [5]: [hash(c_customer_id#29, 42) AS hash_partition_key#36, c_customer_id#29 AS customer_id#37, c_first_name#30 AS customer_first_name#38, c_last_name#31 AS customer_last_name#39, MakeDecimal(sum(UnscaledValue(ss_net_paid#22))#17,17,2) AS year_total#40]
Input [5]: [c_customer_id#29, c_first_name#30, c_last_name#31, d_year#26, sum(UnscaledValue(ss_net_paid#22))#17]

(65) WholeStageCodegenTransformer (12)
Input [5]: [hash_partition_key#36, customer_id#37, customer_first_name#38, customer_last_name#39, year_total#40]
Arguments: false

(66) VeloxResizeBatches
Input [5]: [hash_partition_key#36, customer_id#37, customer_first_name#38, customer_last_name#39, year_total#40]
Arguments: 1024, 2147483647, 10485760

(67) ColumnarExchange
Input [5]: [hash_partition_key#36, customer_id#37, customer_first_name#38, customer_last_name#39, year_total#40]
Arguments: hashpartitioning(customer_id#37, 1), ENSURE_REQUIREMENTS, [customer_id#37, customer_first_name#38, customer_last_name#39, year_total#40], [plan_id=7], [shuffle_writer_type=hash]

(68) InputAdapter
Input [4]: [customer_id#37, customer_first_name#38, customer_last_name#39, year_total#40]

(69) InputIteratorTransformer
Input [4]: [customer_id#37, customer_first_name#38, customer_last_name#39, year_total#40]

(70) ShuffledHashJoinExecTransformer
Left keys [1]: [customer_id#18]
Right keys [1]: [customer_id#37]
Join type: Inner
Join condition: None

(71) FileSourceScanExecTransformer parquet spark_catalog.default.web_sales
Output [3]: [ws_bill_customer_sk#41, ws_net_paid#42, ws_sold_date_sk#43]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(ws_sold_date_sk#43), dynamicpruningexpression(ws_sold_date_sk#43 IN dynamicpruning#4)]
PushedFilters: [IsNotNull(ws_bill_customer_sk)]
ReadSchema: struct<ws_bill_customer_sk:int,ws_net_paid:decimal(7,2)>

(72) FilterExecTransformer
Input [3]: [ws_bill_customer_sk#41, ws_net_paid#42, ws_sold_date_sk#43]
Arguments: isnotnull(ws_bill_customer_sk#41)

(73) ReusedExchange [Reuses operator id: 145]
Output [2]: [d_date_sk#44, d_year#45]

(74) InputAdapter
Input [2]: [d_date_sk#44, d_year#45]

(75) InputIteratorTransformer
Input [2]: [d_date_sk#44, d_year#45]

(76) BroadcastHashJoinExecTransformer
Left keys [1]: [ws_sold_date_sk#43]
Right keys [1]: [d_date_sk#44]
Join type: Inner
Join condition: None

(77) ProjectExecTransformer
Output [4]: [hash(ws_bill_customer_sk#41, 42) AS hash_partition_key#46, ws_bill_customer_sk#41, ws_net_paid#42, d_year#45]
Input [5]: [ws_bill_customer_sk#41, ws_net_paid#42, ws_sold_date_sk#43, d_date_sk#44, d_year#45]

(78) WholeStageCodegenTransformer (15)
Input [4]: [hash_partition_key#46, ws_bill_customer_sk#41, ws_net_paid#42, d_year#45]
Arguments: false

(79) VeloxResizeBatches
Input [4]: [hash_partition_key#46, ws_bill_customer_sk#41, ws_net_paid#42, d_year#45]
Arguments: 1024, 2147483647, 10485760

(80) ColumnarExchange
Input [4]: [hash_partition_key#46, ws_bill_customer_sk#41, ws_net_paid#42, d_year#45]
Arguments: hashpartitioning(ws_bill_customer_sk#41, 1), ENSURE_REQUIREMENTS, [ws_bill_customer_sk#41, ws_net_paid#42, d_year#45], [plan_id=8], [shuffle_writer_type=hash]

(81) InputAdapter
Input [3]: [ws_bill_customer_sk#41, ws_net_paid#42, d_year#45]

(82) InputIteratorTransformer
Input [3]: [ws_bill_customer_sk#41, ws_net_paid#42, d_year#45]

(83) ReusedExchange [Reuses operator id: 18]
Output [4]: [c_customer_sk#47, c_customer_id#48, c_first_name#49, c_last_name#50]

(84) InputAdapter
Input [4]: [c_customer_sk#47, c_customer_id#48, c_first_name#49, c_last_name#50]

(85) InputIteratorTransformer
Input [4]: [c_customer_sk#47, c_customer_id#48, c_first_name#49, c_last_name#50]

(86) ShuffledHashJoinExecTransformer
Left keys [1]: [ws_bill_customer_sk#41]
Right keys [1]: [c_customer_sk#47]
Join type: Inner
Join condition: None

(87) ProjectExecTransformer
Output [5]: [c_customer_id#48, c_first_name#49, c_last_name#50, d_year#45, UnscaledValue(ws_net_paid#42) AS _pre_3#51]
Input [7]: [ws_bill_customer_sk#41, ws_net_paid#42, d_year#45, c_customer_sk#47, c_customer_id#48, c_first_name#49, c_last_name#50]

(88) FlushableHashAggregateExecTransformer
Input [5]: [c_customer_id#48, c_first_name#49, c_last_name#50, d_year#45, _pre_3#51]
Keys [4]: [c_customer_id#48, c_first_name#49, c_last_name#50, d_year#45]
Functions [1]: [partial_sum(_pre_3#51)]
Aggregate Attributes [1]: [sum#52]
Results [5]: [c_customer_id#48, c_first_name#49, c_last_name#50, d_year#45, sum#53]

(89) ProjectExecTransformer
Output [6]: [hash(c_customer_id#48, c_first_name#49, c_last_name#50, d_year#45, 42) AS hash_partition_key#54, c_customer_id#48, c_first_name#49, c_last_name#50, d_year#45, sum#53]
Input [5]: [c_customer_id#48, c_first_name#49, c_last_name#50, d_year#45, sum#53]

(90) WholeStageCodegenTransformer (17)
Input [6]: [hash_partition_key#54, c_customer_id#48, c_first_name#49, c_last_name#50, d_year#45, sum#53]
Arguments: false

(91) VeloxResizeBatches
Input [6]: [hash_partition_key#54, c_customer_id#48, c_first_name#49, c_last_name#50, d_year#45, sum#53]
Arguments: 1024, 2147483647, 10485760

(92) ColumnarExchange
Input [6]: [hash_partition_key#54, c_customer_id#48, c_first_name#49, c_last_name#50, d_year#45, sum#53]
Arguments: hashpartitioning(c_customer_id#48, c_first_name#49, c_last_name#50, d_year#45, 1), ENSURE_REQUIREMENTS, [c_customer_id#48, c_first_name#49, c_last_name#50, d_year#45, sum#53], [plan_id=9], [shuffle_writer_type=hash]

(93) InputAdapter
Input [5]: [c_customer_id#48, c_first_name#49, c_last_name#50, d_year#45, sum#53]

(94) InputIteratorTransformer
Input [5]: [c_customer_id#48, c_first_name#49, c_last_name#50, d_year#45, sum#53]

(95) RegularHashAggregateExecTransformer
Input [5]: [c_customer_id#48, c_first_name#49, c_last_name#50, d_year#45, sum#53]
Keys [4]: [c_customer_id#48, c_first_name#49, c_last_name#50, d_year#45]
Functions [1]: [sum(UnscaledValue(ws_net_paid#42))]
Aggregate Attributes [1]: [sum(UnscaledValue(ws_net_paid#42))#55]
Results [5]: [c_customer_id#48, c_first_name#49, c_last_name#50, d_year#45, sum(UnscaledValue(ws_net_paid#42))#55]

(96) ProjectExecTransformer
Output [2]: [c_customer_id#48 AS customer_id#56, MakeDecimal(sum(UnscaledValue(ws_net_paid#42))#55,17,2) AS year_total#57]
Input [5]: [c_customer_id#48, c_first_name#49, c_last_name#50, d_year#45, sum(UnscaledValue(ws_net_paid#42))#55]

(97) FilterExecTransformer
Input [2]: [customer_id#56, year_total#57]
Arguments: (isnotnull(year_total#57) AND (year_total#57 > 0.00))

(98) ProjectExecTransformer
Output [3]: [hash(customer_id#56, 42) AS hash_partition_key#58, customer_id#56, year_total#57]
Input [2]: [customer_id#56, year_total#57]

(99) WholeStageCodegenTransformer (18)
Input [3]: [hash_partition_key#58, customer_id#56, year_total#57]
Arguments: false

(100) VeloxResizeBatches
Input [3]: [hash_partition_key#58, customer_id#56, year_total#57]
Arguments: 1024, 2147483647, 10485760

(101) ColumnarExchange
Input [3]: [hash_partition_key#58, customer_id#56, year_total#57]
Arguments: hashpartitioning(customer_id#56, 1), ENSURE_REQUIREMENTS, [customer_id#56, year_total#57], [plan_id=10], [shuffle_writer_type=hash]

(102) InputAdapter
Input [2]: [customer_id#56, year_total#57]

(103) InputIteratorTransformer
Input [2]: [customer_id#56, year_total#57]

(104) ShuffledHashJoinExecTransformer
Left keys [1]: [customer_id#18]
Right keys [1]: [customer_id#56]
Join type: Inner
Join condition: None

(105) ProjectExecTransformer
Output [7]: [customer_id#18, year_total#19, customer_id#37, customer_first_name#38, customer_last_name#39, year_total#40, year_total#57]
Input [8]: [customer_id#18, year_total#19, customer_id#37, customer_first_name#38, customer_last_name#39, year_total#40, customer_id#56, year_total#57]

(106) FileSourceScanExecTransformer parquet spark_catalog.default.web_sales
Output [3]: [ws_bill_customer_sk#59, ws_net_paid#60, ws_sold_date_sk#61]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(ws_sold_date_sk#61), dynamicpruningexpression(ws_sold_date_sk#61 IN dynamicpruning#24)]
PushedFilters: [IsNotNull(ws_bill_customer_sk)]
ReadSchema: struct<ws_bill_customer_sk:int,ws_net_paid:decimal(7,2)>

(107) FilterExecTransformer
Input [3]: [ws_bill_customer_sk#59, ws_net_paid#60, ws_sold_date_sk#61]
Arguments: isnotnull(ws_bill_customer_sk#59)

(108) ReusedExchange [Reuses operator id: 149]
Output [2]: [d_date_sk#62, d_year#63]

(109) InputAdapter
Input [2]: [d_date_sk#62, d_year#63]

(110) InputIteratorTransformer
Input [2]: [d_date_sk#62, d_year#63]

(111) BroadcastHashJoinExecTransformer
Left keys [1]: [ws_sold_date_sk#61]
Right keys [1]: [d_date_sk#62]
Join type: Inner
Join condition: None

(112) ProjectExecTransformer
Output [4]: [hash(ws_bill_customer_sk#59, 42) AS hash_partition_key#64, ws_bill_customer_sk#59, ws_net_paid#60, d_year#63]
Input [5]: [ws_bill_customer_sk#59, ws_net_paid#60, ws_sold_date_sk#61, d_date_sk#62, d_year#63]

(113) WholeStageCodegenTransformer (21)
Input [4]: [hash_partition_key#64, ws_bill_customer_sk#59, ws_net_paid#60, d_year#63]
Arguments: false

(114) VeloxResizeBatches
Input [4]: [hash_partition_key#64, ws_bill_customer_sk#59, ws_net_paid#60, d_year#63]
Arguments: 1024, 2147483647, 10485760

(115) ColumnarExchange
Input [4]: [hash_partition_key#64, ws_bill_customer_sk#59, ws_net_paid#60, d_year#63]
Arguments: hashpartitioning(ws_bill_customer_sk#59, 1), ENSURE_REQUIREMENTS, [ws_bill_customer_sk#59, ws_net_paid#60, d_year#63], [plan_id=11], [shuffle_writer_type=hash]

(116) InputAdapter
Input [3]: [ws_bill_customer_sk#59, ws_net_paid#60, d_year#63]

(117) InputIteratorTransformer
Input [3]: [ws_bill_customer_sk#59, ws_net_paid#60, d_year#63]

(118) ReusedExchange [Reuses operator id: 18]
Output [4]: [c_customer_sk#65, c_customer_id#66, c_first_name#67, c_last_name#68]

(119) InputAdapter
Input [4]: [c_customer_sk#65, c_customer_id#66, c_first_name#67, c_last_name#68]

(120) InputIteratorTransformer
Input [4]: [c_customer_sk#65, c_customer_id#66, c_first_name#67, c_last_name#68]

(121) ShuffledHashJoinExecTransformer
Left keys [1]: [ws_bill_customer_sk#59]
Right keys [1]: [c_customer_sk#65]
Join type: Inner
Join condition: None

(122) ProjectExecTransformer
Output [5]: [c_customer_id#66, c_first_name#67, c_last_name#68, d_year#63, UnscaledValue(ws_net_paid#60) AS _pre_4#69]
Input [7]: [ws_bill_customer_sk#59, ws_net_paid#60, d_year#63, c_customer_sk#65, c_customer_id#66, c_first_name#67, c_last_name#68]

(123) FlushableHashAggregateExecTransformer
Input [5]: [c_customer_id#66, c_first_name#67, c_last_name#68, d_year#63, _pre_4#69]
Keys [4]: [c_customer_id#66, c_first_name#67, c_last_name#68, d_year#63]
Functions [1]: [partial_sum(_pre_4#69)]
Aggregate Attributes [1]: [sum#70]
Results [5]: [c_customer_id#66, c_first_name#67, c_last_name#68, d_year#63, sum#71]

(124) ProjectExecTransformer
Output [6]: [hash(c_customer_id#66, c_first_name#67, c_last_name#68, d_year#63, 42) AS hash_partition_key#72, c_customer_id#66, c_first_name#67, c_last_name#68, d_year#63, sum#71]
Input [5]: [c_customer_id#66, c_first_name#67, c_last_name#68, d_year#63, sum#71]

(125) WholeStageCodegenTransformer (23)
Input [6]: [hash_partition_key#72, c_customer_id#66, c_first_name#67, c_last_name#68, d_year#63, sum#71]
Arguments: false

(126) VeloxResizeBatches
Input [6]: [hash_partition_key#72, c_customer_id#66, c_first_name#67, c_last_name#68, d_year#63, sum#71]
Arguments: 1024, 2147483647, 10485760

(127) ColumnarExchange
Input [6]: [hash_partition_key#72, c_customer_id#66, c_first_name#67, c_last_name#68, d_year#63, sum#71]
Arguments: hashpartitioning(c_customer_id#66, c_first_name#67, c_last_name#68, d_year#63, 1), ENSURE_REQUIREMENTS, [c_customer_id#66, c_first_name#67, c_last_name#68, d_year#63, sum#71], [plan_id=12], [shuffle_writer_type=hash]

(128) InputAdapter
Input [5]: [c_customer_id#66, c_first_name#67, c_last_name#68, d_year#63, sum#71]

(129) InputIteratorTransformer
Input [5]: [c_customer_id#66, c_first_name#67, c_last_name#68, d_year#63, sum#71]

(130) RegularHashAggregateExecTransformer
Input [5]: [c_customer_id#66, c_first_name#67, c_last_name#68, d_year#63, sum#71]
Keys [4]: [c_customer_id#66, c_first_name#67, c_last_name#68, d_year#63]
Functions [1]: [sum(UnscaledValue(ws_net_paid#60))]
Aggregate Attributes [1]: [sum(UnscaledValue(ws_net_paid#60))#55]
Results [5]: [c_customer_id#66, c_first_name#67, c_last_name#68, d_year#63, sum(UnscaledValue(ws_net_paid#60))#55]

(131) ProjectExecTransformer
Output [3]: [hash(c_customer_id#66, 42) AS hash_partition_key#73, c_customer_id#66 AS customer_id#74, MakeDecimal(sum(UnscaledValue(ws_net_paid#60))#55,17,2) AS year_total#75]
Input [5]: [c_customer_id#66, c_first_name#67, c_last_name#68, d_year#63, sum(UnscaledValue(ws_net_paid#60))#55]

(132) WholeStageCodegenTransformer (24)
Input [3]: [hash_partition_key#73, customer_id#74, year_total#75]
Arguments: false

(133) VeloxResizeBatches
Input [3]: [hash_partition_key#73, customer_id#74, year_total#75]
Arguments: 1024, 2147483647, 10485760

(134) ColumnarExchange
Input [3]: [hash_partition_key#73, customer_id#74, year_total#75]
Arguments: hashpartitioning(customer_id#74, 1), ENSURE_REQUIREMENTS, [customer_id#74, year_total#75], [plan_id=13], [shuffle_writer_type=hash]

(135) InputAdapter
Input [2]: [customer_id#74, year_total#75]

(136) InputIteratorTransformer
Input [2]: [customer_id#74, year_total#75]

(137) ShuffledHashJoinExecTransformer
Left keys [1]: [customer_id#18]
Right keys [1]: [customer_id#74]
Join type: Inner
Join condition: (CASE WHEN (year_total#57 > 0.00) THEN (year_total#75 / year_total#57) END > CASE WHEN (year_total#19 > 0.00) THEN (year_total#40 / year_total#19) END)

(138) ProjectExecTransformer
Output [3]: [customer_id#37, customer_first_name#38, customer_last_name#39]
Input [9]: [customer_id#18, year_total#19, customer_id#37, customer_first_name#38, customer_last_name#39, year_total#40, year_total#57, customer_id#74, year_total#75]

(139) WholeStageCodegenTransformer (25)
Input [3]: [customer_id#37, customer_first_name#38, customer_last_name#39]
Arguments: false

(140) TakeOrderedAndProjectExecTransformer
Input [3]: [customer_id#37, customer_first_name#38, customer_last_name#39]
Arguments: 100, [customer_first_name#38 ASC NULLS FIRST, customer_id#37 ASC NULLS FIRST, customer_last_name#39 ASC NULLS FIRST], [customer_id#37, customer_first_name#38, customer_last_name#39], 0

(141) VeloxColumnarToRow
Input [3]: [customer_id#37, customer_first_name#38, customer_last_name#39]

===== Subqueries =====

Subquery:1 Hosting operator id = 1 Hosting Expression = ss_sold_date_sk#3 IN dynamicpruning#4
ColumnarBroadcastExchange (145)
+- ^ FilterExecTransformer (143)
   +- ^ FileSourceScanExecTransformer parquet spark_catalog.default.date_dim (142)


(142) FileSourceScanExecTransformer parquet spark_catalog.default.date_dim
Output [2]: [d_date_sk#5, d_year#6]
Batched: true
Location: InMemoryFileIndex [{warehouse_dir}/date_dim]
PushedFilters: [IsNotNull(d_year), EqualTo(d_year,2001), In(d_year, [2001,2002]), IsNotNull(d_date_sk)]
ReadSchema: struct<d_date_sk:int,d_year:int>

(143) FilterExecTransformer
Input [2]: [d_date_sk#5, d_year#6]
Arguments: (((isnotnull(d_year#6) AND (d_year#6 = 2001)) AND d_year#6 IN (2001,2002)) AND isnotnull(d_date_sk#5))

(144) WholeStageCodegenTransformer (1)
Input [2]: [d_date_sk#5, d_year#6]
Arguments: false

(145) ColumnarBroadcastExchange
Input [2]: [d_date_sk#5, d_year#6]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=14]

Subquery:2 Hosting operator id = 39 Hosting Expression = ss_sold_date_sk#23 IN dynamicpruning#24
ColumnarBroadcastExchange (149)
+- ^ FilterExecTransformer (147)
   +- ^ FileSourceScanExecTransformer parquet spark_catalog.default.date_dim (146)


(146) FileSourceScanExecTransformer parquet spark_catalog.default.date_dim
Output [2]: [d_date_sk#25, d_year#26]
Batched: true
Location: InMemoryFileIndex [{warehouse_dir}/date_dim]
PushedFilters: [IsNotNull(d_year), EqualTo(d_year,2002), In(d_year, [2001,2002]), IsNotNull(d_date_sk)]
ReadSchema: struct<d_date_sk:int,d_year:int>

(147) FilterExecTransformer
Input [2]: [d_date_sk#25, d_year#26]
Arguments: (((isnotnull(d_year#26) AND (d_year#26 = 2002)) AND d_year#26 IN (2001,2002)) AND isnotnull(d_date_sk#25))

(148) WholeStageCodegenTransformer (7)
Input [2]: [d_date_sk#25, d_year#26]
Arguments: false

(149) ColumnarBroadcastExchange
Input [2]: [d_date_sk#25, d_year#26]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=15]

Subquery:3 Hosting operator id = 71 Hosting Expression = ws_sold_date_sk#43 IN dynamicpruning#4

Subquery:4 Hosting operator id = 106 Hosting Expression = ws_sold_date_sk#61 IN dynamicpruning#24


