== Physical Plan ==
VeloxColumnarToRow (75)
+- ^ ProjectExecTransformer (73)
   +- ^ RegularHashAggregateExecTransformer (72)
      +- ^ RegularHashAggregateExecTransformer (71)
         +- ^ RegularHashAggregateExecTransformer (70)
            +- ^ RegularHashAggregateExecTransformer (69)
               +- ^ ProjectExecTransformer (68)
                  +- ^ BroadcastHashJoinExecTransformer Inner BuildRight (67)
                     :- ^ ProjectExecTransformer (59)
                     :  +- ^ BroadcastHashJoinExecTransformer Inner BuildRight (58)
                     :     :- ^ ProjectExecTransformer (50)
                     :     :  +- ^ BroadcastHashJoinExecTransformer Inner BuildRight (49)
                     :     :     :- ^ ShuffledHashJoinExecTransformer LeftSemi BuildRight (41)
                     :     :     :  :- ^ ShuffledHashJoinExecTransformer LeftSemi BuildRight (22)
                     :     :     :  :  :- ^ InputIteratorTransformer (8)
                     :     :     :  :  :  +- ColumnarExchange (6)
                     :     :     :  :  :     +- VeloxResizeBatches (5)
                     :     :     :  :  :        +- ^ ProjectExecTransformer (3)
                     :     :     :  :  :           +- ^ FilterExecTransformer (2)
                     :     :     :  :  :              +- ^ FileSourceScanExecTransformer parquet spark_catalog.default.web_sales (1)
                     :     :     :  :  +- ^ ProjectExecTransformer (21)
                     :     :     :  :     +- ^ ShuffledHashJoinExecTransformer Inner BuildRight (20)
                     :     :     :  :        :- ^ InputIteratorTransformer (16)
                     :     :     :  :        :  +- ColumnarExchange (14)
                     :     :     :  :        :     +- VeloxResizeBatches (13)
                     :     :     :  :        :        +- ^ ProjectExecTransformer (11)
                     :     :     :  :        :           +- ^ FilterExecTransformer (10)
                     :     :     :  :        :              +- ^ FileSourceScanExecTransformer parquet spark_catalog.default.web_sales (9)
                     :     :     :  :        +- ^ InputIteratorTransformer (19)
                     :     :     :  :           +- ReusedExchange (17)
                     :     :     :  +- ^ ProjectExecTransformer (40)
                     :     :     :     +- ^ ShuffledHashJoinExecTransformer Inner BuildLeft (39)
                     :     :     :        :- ^ InputIteratorTransformer (30)
                     :     :     :        :  +- ColumnarExchange (28)
                     :     :     :        :     +- VeloxResizeBatches (27)
                     :     :     :        :        +- ^ ProjectExecTransformer (25)
                     :     :     :        :           +- ^ FilterExecTransformer (24)
                     :     :     :        :              +- ^ FileSourceScanExecTransformer parquet spark_catalog.default.web_returns (23)
                     :     :     :        +- ^ ProjectExecTransformer (38)
                     :     :     :           +- ^ ShuffledHashJoinExecTransformer Inner BuildRight (37)
                     :     :     :              :- ^ InputIteratorTransformer (33)
                     :     :     :              :  +- ReusedExchange (31)
                     :     :     :              +- ^ InputIteratorTransformer (36)
                     :     :     :                 +- ReusedExchange (34)
                     :     :     +- ^ InputIteratorTransformer (48)
                     :     :        +- ColumnarBroadcastExchange (46)
                     :     :           +- ^ ProjectExecTransformer (44)
                     :     :              +- ^ FilterExecTransformer (43)
                     :     :                 +- ^ FileSourceScanExecTransformer parquet spark_catalog.default.date_dim (42)
                     :     +- ^ InputIteratorTransformer (57)
                     :        +- ColumnarBroadcastExchange (55)
                     :           +- ^ ProjectExecTransformer (53)
                     :              +- ^ FilterExecTransformer (52)
                     :                 +- ^ FileSourceScanExecTransformer parquet spark_catalog.default.customer_address (51)
                     +- ^ InputIteratorTransformer (66)
                        +- ColumnarBroadcastExchange (64)
                           +- ^ ProjectExecTransformer (62)
                              +- ^ FilterExecTransformer (61)
                                 +- ^ FileSourceScanExecTransformer parquet spark_catalog.default.web_site (60)


(1) FileSourceScanExecTransformer parquet spark_catalog.default.web_sales
Output [7]: [ws_ship_date_sk#1, ws_ship_addr_sk#2, ws_web_site_sk#3, ws_order_number#4, ws_ext_ship_cost#5, ws_net_profit#6, ws_sold_date_sk#7]
Batched: true
Location: CatalogFileIndex [{warehouse_dir}/web_sales]
PushedFilters: [IsNotNull(ws_ship_date_sk), IsNotNull(ws_ship_addr_sk), IsNotNull(ws_web_site_sk)]
ReadSchema: struct<ws_ship_date_sk:int,ws_ship_addr_sk:int,ws_web_site_sk:int,ws_order_number:int,ws_ext_ship_cost:decimal(7,2),ws_net_profit:decimal(7,2)>

(2) FilterExecTransformer
Input [7]: [ws_ship_date_sk#1, ws_ship_addr_sk#2, ws_web_site_sk#3, ws_order_number#4, ws_ext_ship_cost#5, ws_net_profit#6, ws_sold_date_sk#7]
Arguments: ((isnotnull(ws_ship_date_sk#1) AND isnotnull(ws_ship_addr_sk#2)) AND isnotnull(ws_web_site_sk#3))

(3) ProjectExecTransformer
Output [7]: [hash(ws_order_number#4, 42) AS hash_partition_key#8, ws_ship_date_sk#1, ws_ship_addr_sk#2, ws_web_site_sk#3, ws_order_number#4, ws_ext_ship_cost#5, ws_net_profit#6]
Input [7]: [ws_ship_date_sk#1, ws_ship_addr_sk#2, ws_web_site_sk#3, ws_order_number#4, ws_ext_ship_cost#5, ws_net_profit#6, ws_sold_date_sk#7]

(4) WholeStageCodegenTransformer (1)
Input [7]: [hash_partition_key#8, ws_ship_date_sk#1, ws_ship_addr_sk#2, ws_web_site_sk#3, ws_order_number#4, ws_ext_ship_cost#5, ws_net_profit#6]
Arguments: false

(5) VeloxResizeBatches
Input [7]: [hash_partition_key#8, ws_ship_date_sk#1, ws_ship_addr_sk#2, ws_web_site_sk#3, ws_order_number#4, ws_ext_ship_cost#5, ws_net_profit#6]
Arguments: 1024, 2147483647, 10485760

(6) ColumnarExchange
Input [7]: [hash_partition_key#8, ws_ship_date_sk#1, ws_ship_addr_sk#2, ws_web_site_sk#3, ws_order_number#4, ws_ext_ship_cost#5, ws_net_profit#6]
Arguments: hashpartitioning(ws_order_number#4, 1), ENSURE_REQUIREMENTS, [ws_ship_date_sk#1, ws_ship_addr_sk#2, ws_web_site_sk#3, ws_order_number#4, ws_ext_ship_cost#5, ws_net_profit#6], [plan_id=1], [shuffle_writer_type=hash]

(7) InputAdapter
Input [6]: [ws_ship_date_sk#1, ws_ship_addr_sk#2, ws_web_site_sk#3, ws_order_number#4, ws_ext_ship_cost#5, ws_net_profit#6]

(8) InputIteratorTransformer
Input [6]: [ws_ship_date_sk#1, ws_ship_addr_sk#2, ws_web_site_sk#3, ws_order_number#4, ws_ext_ship_cost#5, ws_net_profit#6]

(9) FileSourceScanExecTransformer parquet spark_catalog.default.web_sales
Output [3]: [ws_warehouse_sk#9, ws_order_number#10, ws_sold_date_sk#11]
Batched: true
Location: CatalogFileIndex [{warehouse_dir}/web_sales]
PushedFilters: [IsNotNull(ws_order_number), IsNotNull(ws_warehouse_sk)]
ReadSchema: struct<ws_warehouse_sk:int,ws_order_number:int>

(10) FilterExecTransformer
Input [3]: [ws_warehouse_sk#9, ws_order_number#10, ws_sold_date_sk#11]
Arguments: (isnotnull(ws_order_number#10) AND isnotnull(ws_warehouse_sk#9))

(11) ProjectExecTransformer
Output [3]: [hash(ws_order_number#10, 42) AS hash_partition_key#12, ws_warehouse_sk#9, ws_order_number#10]
Input [3]: [ws_warehouse_sk#9, ws_order_number#10, ws_sold_date_sk#11]

(12) WholeStageCodegenTransformer (2)
Input [3]: [hash_partition_key#12, ws_warehouse_sk#9, ws_order_number#10]
Arguments: false

(13) VeloxResizeBatches
Input [3]: [hash_partition_key#12, ws_warehouse_sk#9, ws_order_number#10]
Arguments: 1024, 2147483647, 10485760

(14) ColumnarExchange
Input [3]: [hash_partition_key#12, ws_warehouse_sk#9, ws_order_number#10]
Arguments: hashpartitioning(ws_order_number#10, 1), ENSURE_REQUIREMENTS, [ws_warehouse_sk#9, ws_order_number#10], [plan_id=2], [shuffle_writer_type=hash]

(15) InputAdapter
Input [2]: [ws_warehouse_sk#9, ws_order_number#10]

(16) InputIteratorTransformer
Input [2]: [ws_warehouse_sk#9, ws_order_number#10]

(17) ReusedExchange [Reuses operator id: 14]
Output [2]: [ws_warehouse_sk#13, ws_order_number#14]

(18) InputAdapter
Input [2]: [ws_warehouse_sk#13, ws_order_number#14]

(19) InputIteratorTransformer
Input [2]: [ws_warehouse_sk#13, ws_order_number#14]

(20) ShuffledHashJoinExecTransformer
Left keys [1]: [ws_order_number#10]
Right keys [1]: [ws_order_number#14]
Join type: Inner
Join condition: NOT (ws_warehouse_sk#9 = ws_warehouse_sk#13)

(21) ProjectExecTransformer
Output [1]: [ws_order_number#10]
Input [4]: [ws_warehouse_sk#9, ws_order_number#10, ws_warehouse_sk#13, ws_order_number#14]

(22) ShuffledHashJoinExecTransformer
Left keys [1]: [ws_order_number#4]
Right keys [1]: [ws_order_number#10]
Join type: LeftSemi
Join condition: None

(23) FileSourceScanExecTransformer parquet spark_catalog.default.web_returns
Output [2]: [wr_order_number#15, wr_returned_date_sk#16]
Batched: true
Location: CatalogFileIndex [{warehouse_dir}/web_returns]
PushedFilters: [IsNotNull(wr_order_number)]
ReadSchema: struct<wr_order_number:int>

(24) FilterExecTransformer
Input [2]: [wr_order_number#15, wr_returned_date_sk#16]
Arguments: isnotnull(wr_order_number#15)

(25) ProjectExecTransformer
Output [2]: [hash(wr_order_number#15, 42) AS hash_partition_key#17, wr_order_number#15]
Input [2]: [wr_order_number#15, wr_returned_date_sk#16]

(26) WholeStageCodegenTransformer (4)
Input [2]: [hash_partition_key#17, wr_order_number#15]
Arguments: false

(27) VeloxResizeBatches
Input [2]: [hash_partition_key#17, wr_order_number#15]
Arguments: 1024, 2147483647, 10485760

(28) ColumnarExchange
Input [2]: [hash_partition_key#17, wr_order_number#15]
Arguments: hashpartitioning(wr_order_number#15, 1), ENSURE_REQUIREMENTS, [wr_order_number#15], [plan_id=3], [shuffle_writer_type=hash]

(29) InputAdapter
Input [1]: [wr_order_number#15]

(30) InputIteratorTransformer
Input [1]: [wr_order_number#15]

(31) ReusedExchange [Reuses operator id: 14]
Output [2]: [ws_warehouse_sk#18, ws_order_number#19]

(32) InputAdapter
Input [2]: [ws_warehouse_sk#18, ws_order_number#19]

(33) InputIteratorTransformer
Input [2]: [ws_warehouse_sk#18, ws_order_number#19]

(34) ReusedExchange [Reuses operator id: 14]
Output [2]: [ws_warehouse_sk#20, ws_order_number#21]

(35) InputAdapter
Input [2]: [ws_warehouse_sk#20, ws_order_number#21]

(36) InputIteratorTransformer
Input [2]: [ws_warehouse_sk#20, ws_order_number#21]

(37) ShuffledHashJoinExecTransformer
Left keys [1]: [ws_order_number#19]
Right keys [1]: [ws_order_number#21]
Join type: Inner
Join condition: NOT (ws_warehouse_sk#18 = ws_warehouse_sk#20)

(38) ProjectExecTransformer
Output [1]: [ws_order_number#19]
Input [4]: [ws_warehouse_sk#18, ws_order_number#19, ws_warehouse_sk#20, ws_order_number#21]

(39) ShuffledHashJoinExecTransformer
Left keys [1]: [wr_order_number#15]
Right keys [1]: [ws_order_number#19]
Join type: Inner
Join condition: None

(40) ProjectExecTransformer
Output [1]: [wr_order_number#15]
Input [2]: [wr_order_number#15, ws_order_number#19]

(41) ShuffledHashJoinExecTransformer
Left keys [1]: [ws_order_number#4]
Right keys [1]: [wr_order_number#15]
Join type: LeftSemi
Join condition: None

(42) FileSourceScanExecTransformer parquet spark_catalog.default.date_dim
Output [2]: [d_date_sk#22, d_date#23]
Batched: true
Location: InMemoryFileIndex [{warehouse_dir}/date_dim]
PushedFilters: [IsNotNull(d_date), GreaterThanOrEqual(d_date,1999-02-01), LessThanOrEqual(d_date,1999-04-02), IsNotNull(d_date_sk)]
ReadSchema: struct<d_date_sk:int,d_date:date>

(43) FilterExecTransformer
Input [2]: [d_date_sk#22, d_date#23]
Arguments: (((isnotnull(d_date#23) AND (d_date#23 >= 1999-02-01)) AND (d_date#23 <= 1999-04-02)) AND isnotnull(d_date_sk#22))

(44) ProjectExecTransformer
Output [1]: [d_date_sk#22]
Input [2]: [d_date_sk#22, d_date#23]

(45) WholeStageCodegenTransformer (7)
Input [1]: [d_date_sk#22]
Arguments: false

(46) ColumnarBroadcastExchange
Input [1]: [d_date_sk#22]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [plan_id=4]

(47) InputAdapter
Input [1]: [d_date_sk#22]

(48) InputIteratorTransformer
Input [1]: [d_date_sk#22]

(49) BroadcastHashJoinExecTransformer
Left keys [1]: [ws_ship_date_sk#1]
Right keys [1]: [d_date_sk#22]
Join type: Inner
Join condition: None

(50) ProjectExecTransformer
Output [5]: [ws_ship_addr_sk#2, ws_web_site_sk#3, ws_order_number#4, ws_ext_ship_cost#5, ws_net_profit#6]
Input [7]: [ws_ship_date_sk#1, ws_ship_addr_sk#2, ws_web_site_sk#3, ws_order_number#4, ws_ext_ship_cost#5, ws_net_profit#6, d_date_sk#22]

(51) FileSourceScanExecTransformer parquet spark_catalog.default.customer_address
Output [2]: [ca_address_sk#24, ca_state#25]
Batched: true
Location: InMemoryFileIndex [{warehouse_dir}/customer_address]
PushedFilters: [IsNotNull(ca_state), EqualTo(ca_state,IL), IsNotNull(ca_address_sk)]
ReadSchema: struct<ca_address_sk:int,ca_state:string>

(52) FilterExecTransformer
Input [2]: [ca_address_sk#24, ca_state#25]
Arguments: ((isnotnull(ca_state#25) AND (ca_state#25 = IL)) AND isnotnull(ca_address_sk#24))

(53) ProjectExecTransformer
Output [1]: [ca_address_sk#24]
Input [2]: [ca_address_sk#24, ca_state#25]

(54) WholeStageCodegenTransformer (8)
Input [1]: [ca_address_sk#24]
Arguments: false

(55) ColumnarBroadcastExchange
Input [1]: [ca_address_sk#24]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [plan_id=5]

(56) InputAdapter
Input [1]: [ca_address_sk#24]

(57) InputIteratorTransformer
Input [1]: [ca_address_sk#24]

(58) BroadcastHashJoinExecTransformer
Left keys [1]: [ws_ship_addr_sk#2]
Right keys [1]: [ca_address_sk#24]
Join type: Inner
Join condition: None

(59) ProjectExecTransformer
Output [4]: [ws_web_site_sk#3, ws_order_number#4, ws_ext_ship_cost#5, ws_net_profit#6]
Input [6]: [ws_ship_addr_sk#2, ws_web_site_sk#3, ws_order_number#4, ws_ext_ship_cost#5, ws_net_profit#6, ca_address_sk#24]

(60) FileSourceScanExecTransformer parquet spark_catalog.default.web_site
Output [2]: [web_site_sk#26, web_company_name#27]
Batched: true
Location: InMemoryFileIndex [{warehouse_dir}/web_site]
PushedFilters: [IsNotNull(web_company_name), EqualTo(web_company_name,pri                                               ), IsNotNull(web_site_sk)]
ReadSchema: struct<web_site_sk:int,web_company_name:string>

(61) FilterExecTransformer
Input [2]: [web_site_sk#26, web_company_name#27]
Arguments: ((isnotnull(web_company_name#27) AND (web_company_name#27 = pri                                               )) AND isnotnull(web_site_sk#26))

(62) ProjectExecTransformer
Output [1]: [web_site_sk#26]
Input [2]: [web_site_sk#26, web_company_name#27]

(63) WholeStageCodegenTransformer (9)
Input [1]: [web_site_sk#26]
Arguments: false

(64) ColumnarBroadcastExchange
Input [1]: [web_site_sk#26]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [plan_id=6]

(65) InputAdapter
Input [1]: [web_site_sk#26]

(66) InputIteratorTransformer
Input [1]: [web_site_sk#26]

(67) BroadcastHashJoinExecTransformer
Left keys [1]: [ws_web_site_sk#3]
Right keys [1]: [web_site_sk#26]
Join type: Inner
Join condition: None

(68) ProjectExecTransformer
Output [3]: [ws_order_number#4, UnscaledValue(ws_ext_ship_cost#5) AS _pre_1#28, UnscaledValue(ws_net_profit#6) AS _pre_2#29]
Input [5]: [ws_web_site_sk#3, ws_order_number#4, ws_ext_ship_cost#5, ws_net_profit#6, web_site_sk#26]

(69) RegularHashAggregateExecTransformer
Input [3]: [ws_order_number#4, _pre_1#28, _pre_2#29]
Keys [1]: [ws_order_number#4]
Functions [2]: [partial_sum(_pre_1#28), partial_sum(_pre_2#29)]
Aggregate Attributes [2]: [sum(UnscaledValue(ws_ext_ship_cost#5))#30, sum(UnscaledValue(ws_net_profit#6))#31]
Results [3]: [ws_order_number#4, sum#32, sum#33]

(70) RegularHashAggregateExecTransformer
Input [3]: [ws_order_number#4, sum#32, sum#33]
Keys [1]: [ws_order_number#4]
Functions [2]: [merge_sum(UnscaledValue(ws_ext_ship_cost#5)), merge_sum(UnscaledValue(ws_net_profit#6))]
Aggregate Attributes [2]: [sum(UnscaledValue(ws_ext_ship_cost#5))#30, sum(UnscaledValue(ws_net_profit#6))#31]
Results [3]: [ws_order_number#4, sum#32, sum#33]

(71) RegularHashAggregateExecTransformer
Input [3]: [ws_order_number#4, sum#32, sum#33]
Keys: []
Functions [3]: [merge_sum(UnscaledValue(ws_ext_ship_cost#5)), merge_sum(UnscaledValue(ws_net_profit#6)), partial_count(distinct ws_order_number#4)]
Aggregate Attributes [3]: [sum(UnscaledValue(ws_ext_ship_cost#5))#30, sum(UnscaledValue(ws_net_profit#6))#31, count(ws_order_number#4)#34]
Results [3]: [sum#32, sum#33, count#35]

(72) RegularHashAggregateExecTransformer
Input [3]: [sum#32, sum#33, count#35]
Keys: []
Functions [3]: [sum(UnscaledValue(ws_ext_ship_cost#5)), sum(UnscaledValue(ws_net_profit#6)), count(distinct ws_order_number#4)]
Aggregate Attributes [3]: [sum(UnscaledValue(ws_ext_ship_cost#5))#30, sum(UnscaledValue(ws_net_profit#6))#31, count(ws_order_number#4)#34]
Results [3]: [sum(UnscaledValue(ws_ext_ship_cost#5))#30, sum(UnscaledValue(ws_net_profit#6))#31, count(ws_order_number#4)#34]

(73) ProjectExecTransformer
Output [3]: [count(ws_order_number#4)#34 AS order count #36, MakeDecimal(sum(UnscaledValue(ws_ext_ship_cost#5))#30,17,2) AS total shipping cost #37, MakeDecimal(sum(UnscaledValue(ws_net_profit#6))#31,17,2) AS total net profit #38]
Input [3]: [sum(UnscaledValue(ws_ext_ship_cost#5))#30, sum(UnscaledValue(ws_net_profit#6))#31, count(ws_order_number#4)#34]

(74) WholeStageCodegenTransformer (10)
Input [3]: [order count #36, total shipping cost #37, total net profit #38]
Arguments: false

(75) VeloxColumnarToRow
Input [3]: [order count #36, total shipping cost #37, total net profit #38]

