== Physical Plan ==
* Sort (56)
+- * HashAggregate (55)
   +- Exchange (54)
      +- * HashAggregate (53)
         +- * HashAggregate (52)
            +- Exchange (51)
               +- * HashAggregate (50)
                  +- * Project (49)
                     +- * BroadcastHashJoin Inner BuildRight (48)
                        :- * Project (42)
                        :  +- * BroadcastHashJoin Inner BuildRight (41)
                        :     :- * Project (35)
                        :     :  +- * BroadcastHashJoin Inner BuildRight (34)
                        :     :     :- * BroadcastHashJoin LeftSemi BuildRight (28)
                        :     :     :  :- * BroadcastHashJoin LeftSemi BuildRight (14)
                        :     :     :  :  :- * Filter (3)
                        :     :     :  :  :  +- * ColumnarToRow (2)
                        :     :     :  :  :     +- Scan parquet default.web_sales (1)
                        :     :     :  :  +- BroadcastExchange (13)
                        :     :     :  :     +- * Project (12)
                        :     :     :  :        +- * BroadcastHashJoin Inner BuildRight (11)
                        :     :     :  :           :- * Filter (6)
                        :     :     :  :           :  +- * ColumnarToRow (5)
                        :     :     :  :           :     +- Scan parquet default.web_sales (4)
                        :     :     :  :           +- BroadcastExchange (10)
                        :     :     :  :              +- * Filter (9)
                        :     :     :  :                 +- * ColumnarToRow (8)
                        :     :     :  :                    +- Scan parquet default.web_sales (7)
                        :     :     :  +- BroadcastExchange (27)
                        :     :     :     +- * Project (26)
                        :     :     :        +- * BroadcastHashJoin Inner BuildRight (25)
                        :     :     :           :- * Filter (17)
                        :     :     :           :  +- * ColumnarToRow (16)
                        :     :     :           :     +- Scan parquet default.web_returns (15)
                        :     :     :           +- BroadcastExchange (24)
                        :     :     :              +- * Project (23)
                        :     :     :                 +- * BroadcastHashJoin Inner BuildRight (22)
                        :     :     :                    :- * Filter (20)
                        :     :     :                    :  +- * ColumnarToRow (19)
                        :     :     :                    :     +- Scan parquet default.web_sales (18)
                        :     :     :                    +- ReusedExchange (21)
                        :     :     +- BroadcastExchange (33)
                        :     :        +- * Project (32)
                        :     :           +- * Filter (31)
                        :     :              +- * ColumnarToRow (30)
                        :     :                 +- Scan parquet default.date_dim (29)
                        :     +- BroadcastExchange (40)
                        :        +- * Project (39)
                        :           +- * Filter (38)
                        :              +- * ColumnarToRow (37)
                        :                 +- Scan parquet default.customer_address (36)
                        +- BroadcastExchange (47)
                           +- * Project (46)
                              +- * Filter (45)
                                 +- * ColumnarToRow (44)
                                    +- Scan parquet default.web_site (43)


(1) Scan parquet default.web_sales
Output [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]
Batched: true
Location [not included in comparison]/{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) ColumnarToRow [codegen id : 9]
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]

(3) Filter [codegen id : 9]
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]
Condition : ((isnotnull(ws_ship_date_sk#1) AND isnotnull(ws_ship_addr_sk#2)) AND isnotnull(ws_web_site_sk#3))

(4) Scan parquet default.web_sales
Output [2]: [ws_warehouse_sk#7, ws_order_number#4]
Batched: true
Location [not included in comparison]/{warehouse_dir}/web_sales]
PushedFilters: [IsNotNull(ws_order_number), IsNotNull(ws_warehouse_sk)]
ReadSchema: struct<ws_warehouse_sk:int,ws_order_number:int>

(5) ColumnarToRow [codegen id : 2]
Input [2]: [ws_warehouse_sk#7, ws_order_number#4]

(6) Filter [codegen id : 2]
Input [2]: [ws_warehouse_sk#7, ws_order_number#4]
Condition : (isnotnull(ws_order_number#4) AND isnotnull(ws_warehouse_sk#7))

(7) Scan parquet default.web_sales
Output [2]: [ws_warehouse_sk#8, ws_order_number#9]
Batched: true
Location [not included in comparison]/{warehouse_dir}/web_sales]
PushedFilters: [IsNotNull(ws_order_number), IsNotNull(ws_warehouse_sk)]
ReadSchema: struct<ws_warehouse_sk:int,ws_order_number:int>

(8) ColumnarToRow [codegen id : 1]
Input [2]: [ws_warehouse_sk#8, ws_order_number#9]

(9) Filter [codegen id : 1]
Input [2]: [ws_warehouse_sk#8, ws_order_number#9]
Condition : (isnotnull(ws_order_number#9) AND isnotnull(ws_warehouse_sk#8))

(10) BroadcastExchange
Input [2]: [ws_warehouse_sk#8, ws_order_number#9]
Arguments: HashedRelationBroadcastMode(List(cast(input[1, int, false] as bigint)),false), [id=#10]

(11) BroadcastHashJoin [codegen id : 2]
Left keys [1]: [ws_order_number#4]
Right keys [1]: [ws_order_number#9]
Join condition: NOT (ws_warehouse_sk#7 = ws_warehouse_sk#8)

(12) Project [codegen id : 2]
Output [1]: [ws_order_number#4 AS ws_order_number#4#11]
Input [4]: [ws_warehouse_sk#7, ws_order_number#4, ws_warehouse_sk#8, ws_order_number#9]

(13) BroadcastExchange
Input [1]: [ws_order_number#4#11]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#12]

(14) BroadcastHashJoin [codegen id : 9]
Left keys [1]: [ws_order_number#4]
Right keys [1]: [ws_order_number#4#11]
Join condition: None

(15) Scan parquet default.web_returns
Output [1]: [wr_order_number#13]
Batched: true
Location [not included in comparison]/{warehouse_dir}/web_returns]
PushedFilters: [IsNotNull(wr_order_number)]
ReadSchema: struct<wr_order_number:bigint>

(16) ColumnarToRow [codegen id : 5]
Input [1]: [wr_order_number#13]

(17) Filter [codegen id : 5]
Input [1]: [wr_order_number#13]
Condition : isnotnull(wr_order_number#13)

(18) Scan parquet default.web_sales
Output [2]: [ws_warehouse_sk#7, ws_order_number#4]
Batched: true
Location [not included in comparison]/{warehouse_dir}/web_sales]
PushedFilters: [IsNotNull(ws_order_number), IsNotNull(ws_warehouse_sk)]
ReadSchema: struct<ws_warehouse_sk:int,ws_order_number:int>

(19) ColumnarToRow [codegen id : 4]
Input [2]: [ws_warehouse_sk#7, ws_order_number#4]

(20) Filter [codegen id : 4]
Input [2]: [ws_warehouse_sk#7, ws_order_number#4]
Condition : (isnotnull(ws_order_number#4) AND isnotnull(ws_warehouse_sk#7))

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

(22) BroadcastHashJoin [codegen id : 4]
Left keys [1]: [ws_order_number#4]
Right keys [1]: [ws_order_number#15]
Join condition: NOT (ws_warehouse_sk#7 = ws_warehouse_sk#14)

(23) Project [codegen id : 4]
Output [1]: [ws_order_number#4]
Input [4]: [ws_warehouse_sk#7, ws_order_number#4, ws_warehouse_sk#14, ws_order_number#15]

(24) BroadcastExchange
Input [1]: [ws_order_number#4]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#16]

(25) BroadcastHashJoin [codegen id : 5]
Left keys [1]: [wr_order_number#13]
Right keys [1]: [cast(ws_order_number#4 as bigint)]
Join condition: None

(26) Project [codegen id : 5]
Output [1]: [wr_order_number#13]
Input [2]: [wr_order_number#13, ws_order_number#4]

(27) BroadcastExchange
Input [1]: [wr_order_number#13]
Arguments: HashedRelationBroadcastMode(List(input[0, bigint, true]),false), [id=#17]

(28) BroadcastHashJoin [codegen id : 9]
Left keys [1]: [cast(ws_order_number#4 as bigint)]
Right keys [1]: [wr_order_number#13]
Join condition: None

(29) Scan parquet default.date_dim
Output [2]: [d_date_sk#18, d_date#19]
Batched: true
Location [not included in comparison]/{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>

(30) ColumnarToRow [codegen id : 6]
Input [2]: [d_date_sk#18, d_date#19]

(31) Filter [codegen id : 6]
Input [2]: [d_date_sk#18, d_date#19]
Condition : (((isnotnull(d_date#19) AND (d_date#19 >= 10623)) AND (d_date#19 <= 10683)) AND isnotnull(d_date_sk#18))

(32) Project [codegen id : 6]
Output [1]: [d_date_sk#18]
Input [2]: [d_date_sk#18, d_date#19]

(33) BroadcastExchange
Input [1]: [d_date_sk#18]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#20]

(34) BroadcastHashJoin [codegen id : 9]
Left keys [1]: [ws_ship_date_sk#1]
Right keys [1]: [d_date_sk#18]
Join condition: None

(35) Project [codegen id : 9]
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#18]

(36) Scan parquet default.customer_address
Output [2]: [ca_address_sk#21, ca_state#22]
Batched: true
Location [not included in comparison]/{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>

(37) ColumnarToRow [codegen id : 7]
Input [2]: [ca_address_sk#21, ca_state#22]

(38) Filter [codegen id : 7]
Input [2]: [ca_address_sk#21, ca_state#22]
Condition : ((isnotnull(ca_state#22) AND (ca_state#22 = IL)) AND isnotnull(ca_address_sk#21))

(39) Project [codegen id : 7]
Output [1]: [ca_address_sk#21]
Input [2]: [ca_address_sk#21, ca_state#22]

(40) BroadcastExchange
Input [1]: [ca_address_sk#21]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#23]

(41) BroadcastHashJoin [codegen id : 9]
Left keys [1]: [ws_ship_addr_sk#2]
Right keys [1]: [ca_address_sk#21]
Join condition: None

(42) Project [codegen id : 9]
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#21]

(43) Scan parquet default.web_site
Output [2]: [web_site_sk#24, web_company_name#25]
Batched: true
Location [not included in comparison]/{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>

(44) ColumnarToRow [codegen id : 8]
Input [2]: [web_site_sk#24, web_company_name#25]

(45) Filter [codegen id : 8]
Input [2]: [web_site_sk#24, web_company_name#25]
Condition : ((isnotnull(web_company_name#25) AND (web_company_name#25 = pri)) AND isnotnull(web_site_sk#24))

(46) Project [codegen id : 8]
Output [1]: [web_site_sk#24]
Input [2]: [web_site_sk#24, web_company_name#25]

(47) BroadcastExchange
Input [1]: [web_site_sk#24]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#26]

(48) BroadcastHashJoin [codegen id : 9]
Left keys [1]: [ws_web_site_sk#3]
Right keys [1]: [web_site_sk#24]
Join condition: None

(49) Project [codegen id : 9]
Output [3]: [ws_order_number#4, ws_ext_ship_cost#5, ws_net_profit#6]
Input [5]: [ws_web_site_sk#3, ws_order_number#4, ws_ext_ship_cost#5, ws_net_profit#6, web_site_sk#24]

(50) HashAggregate [codegen id : 9]
Input [3]: [ws_order_number#4, ws_ext_ship_cost#5, ws_net_profit#6]
Keys [1]: [ws_order_number#4]
Functions [2]: [partial_sum(UnscaledValue(ws_ext_ship_cost#5)), partial_sum(UnscaledValue(ws_net_profit#6))]
Aggregate Attributes [2]: [sum(UnscaledValue(ws_ext_ship_cost#5))#27, sum(UnscaledValue(ws_net_profit#6))#28]
Results [3]: [ws_order_number#4, sum#29, sum#30]

(51) Exchange
Input [3]: [ws_order_number#4, sum#29, sum#30]
Arguments: hashpartitioning(ws_order_number#4, 5), true, [id=#31]

(52) HashAggregate [codegen id : 10]
Input [3]: [ws_order_number#4, sum#29, sum#30]
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))#27, sum(UnscaledValue(ws_net_profit#6))#28]
Results [3]: [ws_order_number#4, sum#29, sum#30]

(53) HashAggregate [codegen id : 10]
Input [3]: [ws_order_number#4, sum#29, sum#30]
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))#27, sum(UnscaledValue(ws_net_profit#6))#28, count(ws_order_number#4)#32]
Results [3]: [sum#29, sum#30, count#33]

(54) Exchange
Input [3]: [sum#29, sum#30, count#33]
Arguments: SinglePartition, true, [id=#34]

(55) HashAggregate [codegen id : 11]
Input [3]: [sum#29, sum#30, count#33]
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))#27, sum(UnscaledValue(ws_net_profit#6))#28, count(ws_order_number#4)#32]
Results [3]: [count(ws_order_number#4)#32 AS order count #35, MakeDecimal(sum(UnscaledValue(ws_ext_ship_cost#5))#27,17,2) AS total shipping cost #36, MakeDecimal(sum(UnscaledValue(ws_net_profit#6))#28,17,2) AS total net profit #37]

(56) Sort [codegen id : 11]
Input [3]: [order count #35, total shipping cost #36, total net profit #37]
Arguments: [order count #35 ASC NULLS FIRST], true, 0

