== Physical Plan ==
* Sort (95)
+- Exchange (94)
   +- * Project (93)
      +- * BroadcastHashJoin Inner BuildRight (92)
         :- * Project (78)
         :  +- * BroadcastHashJoin Inner BuildRight (77)
         :     :- * BroadcastHashJoin Inner BuildRight (63)
         :     :  :- * Project (49)
         :     :  :  +- * BroadcastHashJoin Inner BuildRight (48)
         :     :  :     :- * BroadcastHashJoin Inner BuildRight (32)
         :     :  :     :  :- * HashAggregate (16)
         :     :  :     :  :  +- Exchange (15)
         :     :  :     :  :     +- * HashAggregate (14)
         :     :  :     :  :        +- * ColumnarToRow (13)
         :     :  :     :  :           +- CometProject (12)
         :     :  :     :  :              +- CometBroadcastHashJoin (11)
         :     :  :     :  :                 :- CometProject (7)
         :     :  :     :  :                 :  +- CometBroadcastHashJoin (6)
         :     :  :     :  :                 :     :- CometFilter (2)
         :     :  :     :  :                 :     :  +- CometScan parquet spark_catalog.default.store_sales (1)
         :     :  :     :  :                 :     +- CometBroadcastExchange (5)
         :     :  :     :  :                 :        +- CometFilter (4)
         :     :  :     :  :                 :           +- CometScan parquet spark_catalog.default.date_dim (3)
         :     :  :     :  :                 +- CometBroadcastExchange (10)
         :     :  :     :  :                    +- CometFilter (9)
         :     :  :     :  :                       +- CometScan parquet spark_catalog.default.customer_address (8)
         :     :  :     :  +- BroadcastExchange (31)
         :     :  :     :     +- * HashAggregate (30)
         :     :  :     :        +- Exchange (29)
         :     :  :     :           +- * HashAggregate (28)
         :     :  :     :              +- * ColumnarToRow (27)
         :     :  :     :                 +- CometProject (26)
         :     :  :     :                    +- CometBroadcastHashJoin (25)
         :     :  :     :                       :- CometProject (23)
         :     :  :     :                       :  +- CometBroadcastHashJoin (22)
         :     :  :     :                       :     :- CometFilter (18)
         :     :  :     :                       :     :  +- CometScan parquet spark_catalog.default.store_sales (17)
         :     :  :     :                       :     +- CometBroadcastExchange (21)
         :     :  :     :                       :        +- CometFilter (20)
         :     :  :     :                       :           +- CometScan parquet spark_catalog.default.date_dim (19)
         :     :  :     :                       +- ReusedExchange (24)
         :     :  :     +- BroadcastExchange (47)
         :     :  :        +- * HashAggregate (46)
         :     :  :           +- Exchange (45)
         :     :  :              +- * HashAggregate (44)
         :     :  :                 +- * ColumnarToRow (43)
         :     :  :                    +- CometProject (42)
         :     :  :                       +- CometBroadcastHashJoin (41)
         :     :  :                          :- CometProject (39)
         :     :  :                          :  +- CometBroadcastHashJoin (38)
         :     :  :                          :     :- CometFilter (34)
         :     :  :                          :     :  +- CometScan parquet spark_catalog.default.store_sales (33)
         :     :  :                          :     +- CometBroadcastExchange (37)
         :     :  :                          :        +- CometFilter (36)
         :     :  :                          :           +- CometScan parquet spark_catalog.default.date_dim (35)
         :     :  :                          +- ReusedExchange (40)
         :     :  +- BroadcastExchange (62)
         :     :     +- * HashAggregate (61)
         :     :        +- Exchange (60)
         :     :           +- * HashAggregate (59)
         :     :              +- * ColumnarToRow (58)
         :     :                 +- CometProject (57)
         :     :                    +- CometBroadcastHashJoin (56)
         :     :                       :- CometProject (54)
         :     :                       :  +- CometBroadcastHashJoin (53)
         :     :                       :     :- CometFilter (51)
         :     :                       :     :  +- CometScan parquet spark_catalog.default.web_sales (50)
         :     :                       :     +- ReusedExchange (52)
         :     :                       +- ReusedExchange (55)
         :     +- BroadcastExchange (76)
         :        +- * HashAggregate (75)
         :           +- Exchange (74)
         :              +- * HashAggregate (73)
         :                 +- * ColumnarToRow (72)
         :                    +- CometProject (71)
         :                       +- CometBroadcastHashJoin (70)
         :                          :- CometProject (68)
         :                          :  +- CometBroadcastHashJoin (67)
         :                          :     :- CometFilter (65)
         :                          :     :  +- CometScan parquet spark_catalog.default.web_sales (64)
         :                          :     +- ReusedExchange (66)
         :                          +- ReusedExchange (69)
         +- BroadcastExchange (91)
            +- * HashAggregate (90)
               +- Exchange (89)
                  +- * HashAggregate (88)
                     +- * ColumnarToRow (87)
                        +- CometProject (86)
                           +- CometBroadcastHashJoin (85)
                              :- CometProject (83)
                              :  +- CometBroadcastHashJoin (82)
                              :     :- CometFilter (80)
                              :     :  +- CometScan parquet spark_catalog.default.web_sales (79)
                              :     +- ReusedExchange (81)
                              +- ReusedExchange (84)


(1) Scan parquet spark_catalog.default.store_sales
Output [3]: [ss_addr_sk#1, ss_ext_sales_price#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_addr_sk)]
ReadSchema: struct<ss_addr_sk:int,ss_ext_sales_price:decimal(7,2)>

(2) CometFilter
Input [3]: [ss_addr_sk#1, ss_ext_sales_price#2, ss_sold_date_sk#3]
Condition : isnotnull(ss_addr_sk#1)

(3) Scan parquet spark_catalog.default.date_dim
Output [3]: [d_date_sk#5, d_year#6, d_qoy#7]
Batched: true
Location [not included in comparison]/{warehouse_dir}/date_dim]
PushedFilters: [IsNotNull(d_qoy), IsNotNull(d_year), EqualTo(d_qoy,1), EqualTo(d_year,2000), IsNotNull(d_date_sk)]
ReadSchema: struct<d_date_sk:int,d_year:int,d_qoy:int>

(4) CometFilter
Input [3]: [d_date_sk#5, d_year#6, d_qoy#7]
Condition : ((((isnotnull(d_qoy#7) AND isnotnull(d_year#6)) AND (d_qoy#7 = 1)) AND (d_year#6 = 2000)) AND isnotnull(d_date_sk#5))

(5) CometBroadcastExchange
Input [3]: [d_date_sk#5, d_year#6, d_qoy#7]
Arguments: [d_date_sk#5, d_year#6, d_qoy#7]

(6) CometBroadcastHashJoin
Left output [3]: [ss_addr_sk#1, ss_ext_sales_price#2, ss_sold_date_sk#3]
Right output [3]: [d_date_sk#5, d_year#6, d_qoy#7]
Arguments: [ss_sold_date_sk#3], [d_date_sk#5], Inner, BuildRight

(7) CometProject
Input [6]: [ss_addr_sk#1, ss_ext_sales_price#2, ss_sold_date_sk#3, d_date_sk#5, d_year#6, d_qoy#7]
Arguments: [ss_addr_sk#1, ss_ext_sales_price#2, d_year#6, d_qoy#7], [ss_addr_sk#1, ss_ext_sales_price#2, d_year#6, d_qoy#7]

(8) Scan parquet spark_catalog.default.customer_address
Output [2]: [ca_address_sk#8, ca_county#9]
Batched: true
Location [not included in comparison]/{warehouse_dir}/customer_address]
PushedFilters: [IsNotNull(ca_address_sk), IsNotNull(ca_county)]
ReadSchema: struct<ca_address_sk:int,ca_county:string>

(9) CometFilter
Input [2]: [ca_address_sk#8, ca_county#9]
Condition : (isnotnull(ca_address_sk#8) AND isnotnull(ca_county#9))

(10) CometBroadcastExchange
Input [2]: [ca_address_sk#8, ca_county#9]
Arguments: [ca_address_sk#8, ca_county#9]

(11) CometBroadcastHashJoin
Left output [4]: [ss_addr_sk#1, ss_ext_sales_price#2, d_year#6, d_qoy#7]
Right output [2]: [ca_address_sk#8, ca_county#9]
Arguments: [ss_addr_sk#1], [ca_address_sk#8], Inner, BuildRight

(12) CometProject
Input [6]: [ss_addr_sk#1, ss_ext_sales_price#2, d_year#6, d_qoy#7, ca_address_sk#8, ca_county#9]
Arguments: [ss_ext_sales_price#2, d_year#6, d_qoy#7, ca_county#9], [ss_ext_sales_price#2, d_year#6, d_qoy#7, ca_county#9]

(13) ColumnarToRow [codegen id : 1]
Input [4]: [ss_ext_sales_price#2, d_year#6, d_qoy#7, ca_county#9]

(14) HashAggregate [codegen id : 1]
Input [4]: [ss_ext_sales_price#2, d_year#6, d_qoy#7, ca_county#9]
Keys [3]: [ca_county#9, d_qoy#7, d_year#6]
Functions [1]: [partial_sum(UnscaledValue(ss_ext_sales_price#2))]
Aggregate Attributes [1]: [sum#10]
Results [4]: [ca_county#9, d_qoy#7, d_year#6, sum#11]

(15) Exchange
Input [4]: [ca_county#9, d_qoy#7, d_year#6, sum#11]
Arguments: hashpartitioning(ca_county#9, d_qoy#7, d_year#6, 5), ENSURE_REQUIREMENTS, [plan_id=1]

(16) HashAggregate [codegen id : 12]
Input [4]: [ca_county#9, d_qoy#7, d_year#6, sum#11]
Keys [3]: [ca_county#9, d_qoy#7, d_year#6]
Functions [1]: [sum(UnscaledValue(ss_ext_sales_price#2))]
Aggregate Attributes [1]: [sum(UnscaledValue(ss_ext_sales_price#2))#12]
Results [3]: [ca_county#9, d_year#6, MakeDecimal(sum(UnscaledValue(ss_ext_sales_price#2))#12,17,2) AS store_sales#13]

(17) Scan parquet spark_catalog.default.store_sales
Output [3]: [ss_addr_sk#14, ss_ext_sales_price#15, ss_sold_date_sk#16]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(ss_sold_date_sk#16), dynamicpruningexpression(ss_sold_date_sk#16 IN dynamicpruning#17)]
PushedFilters: [IsNotNull(ss_addr_sk)]
ReadSchema: struct<ss_addr_sk:int,ss_ext_sales_price:decimal(7,2)>

(18) CometFilter
Input [3]: [ss_addr_sk#14, ss_ext_sales_price#15, ss_sold_date_sk#16]
Condition : isnotnull(ss_addr_sk#14)

(19) Scan parquet spark_catalog.default.date_dim
Output [3]: [d_date_sk#18, d_year#19, d_qoy#20]
Batched: true
Location [not included in comparison]/{warehouse_dir}/date_dim]
PushedFilters: [IsNotNull(d_qoy), IsNotNull(d_year), EqualTo(d_qoy,2), EqualTo(d_year,2000), IsNotNull(d_date_sk)]
ReadSchema: struct<d_date_sk:int,d_year:int,d_qoy:int>

(20) CometFilter
Input [3]: [d_date_sk#18, d_year#19, d_qoy#20]
Condition : ((((isnotnull(d_qoy#20) AND isnotnull(d_year#19)) AND (d_qoy#20 = 2)) AND (d_year#19 = 2000)) AND isnotnull(d_date_sk#18))

(21) CometBroadcastExchange
Input [3]: [d_date_sk#18, d_year#19, d_qoy#20]
Arguments: [d_date_sk#18, d_year#19, d_qoy#20]

(22) CometBroadcastHashJoin
Left output [3]: [ss_addr_sk#14, ss_ext_sales_price#15, ss_sold_date_sk#16]
Right output [3]: [d_date_sk#18, d_year#19, d_qoy#20]
Arguments: [ss_sold_date_sk#16], [d_date_sk#18], Inner, BuildRight

(23) CometProject
Input [6]: [ss_addr_sk#14, ss_ext_sales_price#15, ss_sold_date_sk#16, d_date_sk#18, d_year#19, d_qoy#20]
Arguments: [ss_addr_sk#14, ss_ext_sales_price#15, d_year#19, d_qoy#20], [ss_addr_sk#14, ss_ext_sales_price#15, d_year#19, d_qoy#20]

(24) ReusedExchange [Reuses operator id: 10]
Output [2]: [ca_address_sk#21, ca_county#22]

(25) CometBroadcastHashJoin
Left output [4]: [ss_addr_sk#14, ss_ext_sales_price#15, d_year#19, d_qoy#20]
Right output [2]: [ca_address_sk#21, ca_county#22]
Arguments: [ss_addr_sk#14], [ca_address_sk#21], Inner, BuildRight

(26) CometProject
Input [6]: [ss_addr_sk#14, ss_ext_sales_price#15, d_year#19, d_qoy#20, ca_address_sk#21, ca_county#22]
Arguments: [ss_ext_sales_price#15, d_year#19, d_qoy#20, ca_county#22], [ss_ext_sales_price#15, d_year#19, d_qoy#20, ca_county#22]

(27) ColumnarToRow [codegen id : 2]
Input [4]: [ss_ext_sales_price#15, d_year#19, d_qoy#20, ca_county#22]

(28) HashAggregate [codegen id : 2]
Input [4]: [ss_ext_sales_price#15, d_year#19, d_qoy#20, ca_county#22]
Keys [3]: [ca_county#22, d_qoy#20, d_year#19]
Functions [1]: [partial_sum(UnscaledValue(ss_ext_sales_price#15))]
Aggregate Attributes [1]: [sum#23]
Results [4]: [ca_county#22, d_qoy#20, d_year#19, sum#24]

(29) Exchange
Input [4]: [ca_county#22, d_qoy#20, d_year#19, sum#24]
Arguments: hashpartitioning(ca_county#22, d_qoy#20, d_year#19, 5), ENSURE_REQUIREMENTS, [plan_id=2]

(30) HashAggregate [codegen id : 3]
Input [4]: [ca_county#22, d_qoy#20, d_year#19, sum#24]
Keys [3]: [ca_county#22, d_qoy#20, d_year#19]
Functions [1]: [sum(UnscaledValue(ss_ext_sales_price#15))]
Aggregate Attributes [1]: [sum(UnscaledValue(ss_ext_sales_price#15))#12]
Results [2]: [ca_county#22, MakeDecimal(sum(UnscaledValue(ss_ext_sales_price#15))#12,17,2) AS store_sales#25]

(31) BroadcastExchange
Input [2]: [ca_county#22, store_sales#25]
Arguments: HashedRelationBroadcastMode(List(input[0, string, true]),false), [plan_id=3]

(32) BroadcastHashJoin [codegen id : 12]
Left keys [1]: [ca_county#9]
Right keys [1]: [ca_county#22]
Join type: Inner
Join condition: None

(33) Scan parquet spark_catalog.default.store_sales
Output [3]: [ss_addr_sk#26, ss_ext_sales_price#27, ss_sold_date_sk#28]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(ss_sold_date_sk#28), dynamicpruningexpression(ss_sold_date_sk#28 IN dynamicpruning#29)]
PushedFilters: [IsNotNull(ss_addr_sk)]
ReadSchema: struct<ss_addr_sk:int,ss_ext_sales_price:decimal(7,2)>

(34) CometFilter
Input [3]: [ss_addr_sk#26, ss_ext_sales_price#27, ss_sold_date_sk#28]
Condition : isnotnull(ss_addr_sk#26)

(35) Scan parquet spark_catalog.default.date_dim
Output [3]: [d_date_sk#30, d_year#31, d_qoy#32]
Batched: true
Location [not included in comparison]/{warehouse_dir}/date_dim]
PushedFilters: [IsNotNull(d_qoy), IsNotNull(d_year), EqualTo(d_qoy,3), EqualTo(d_year,2000), IsNotNull(d_date_sk)]
ReadSchema: struct<d_date_sk:int,d_year:int,d_qoy:int>

(36) CometFilter
Input [3]: [d_date_sk#30, d_year#31, d_qoy#32]
Condition : ((((isnotnull(d_qoy#32) AND isnotnull(d_year#31)) AND (d_qoy#32 = 3)) AND (d_year#31 = 2000)) AND isnotnull(d_date_sk#30))

(37) CometBroadcastExchange
Input [3]: [d_date_sk#30, d_year#31, d_qoy#32]
Arguments: [d_date_sk#30, d_year#31, d_qoy#32]

(38) CometBroadcastHashJoin
Left output [3]: [ss_addr_sk#26, ss_ext_sales_price#27, ss_sold_date_sk#28]
Right output [3]: [d_date_sk#30, d_year#31, d_qoy#32]
Arguments: [ss_sold_date_sk#28], [d_date_sk#30], Inner, BuildRight

(39) CometProject
Input [6]: [ss_addr_sk#26, ss_ext_sales_price#27, ss_sold_date_sk#28, d_date_sk#30, d_year#31, d_qoy#32]
Arguments: [ss_addr_sk#26, ss_ext_sales_price#27, d_year#31, d_qoy#32], [ss_addr_sk#26, ss_ext_sales_price#27, d_year#31, d_qoy#32]

(40) ReusedExchange [Reuses operator id: 10]
Output [2]: [ca_address_sk#33, ca_county#34]

(41) CometBroadcastHashJoin
Left output [4]: [ss_addr_sk#26, ss_ext_sales_price#27, d_year#31, d_qoy#32]
Right output [2]: [ca_address_sk#33, ca_county#34]
Arguments: [ss_addr_sk#26], [ca_address_sk#33], Inner, BuildRight

(42) CometProject
Input [6]: [ss_addr_sk#26, ss_ext_sales_price#27, d_year#31, d_qoy#32, ca_address_sk#33, ca_county#34]
Arguments: [ss_ext_sales_price#27, d_year#31, d_qoy#32, ca_county#34], [ss_ext_sales_price#27, d_year#31, d_qoy#32, ca_county#34]

(43) ColumnarToRow [codegen id : 4]
Input [4]: [ss_ext_sales_price#27, d_year#31, d_qoy#32, ca_county#34]

(44) HashAggregate [codegen id : 4]
Input [4]: [ss_ext_sales_price#27, d_year#31, d_qoy#32, ca_county#34]
Keys [3]: [ca_county#34, d_qoy#32, d_year#31]
Functions [1]: [partial_sum(UnscaledValue(ss_ext_sales_price#27))]
Aggregate Attributes [1]: [sum#35]
Results [4]: [ca_county#34, d_qoy#32, d_year#31, sum#36]

(45) Exchange
Input [4]: [ca_county#34, d_qoy#32, d_year#31, sum#36]
Arguments: hashpartitioning(ca_county#34, d_qoy#32, d_year#31, 5), ENSURE_REQUIREMENTS, [plan_id=4]

(46) HashAggregate [codegen id : 5]
Input [4]: [ca_county#34, d_qoy#32, d_year#31, sum#36]
Keys [3]: [ca_county#34, d_qoy#32, d_year#31]
Functions [1]: [sum(UnscaledValue(ss_ext_sales_price#27))]
Aggregate Attributes [1]: [sum(UnscaledValue(ss_ext_sales_price#27))#12]
Results [2]: [ca_county#34, MakeDecimal(sum(UnscaledValue(ss_ext_sales_price#27))#12,17,2) AS store_sales#37]

(47) BroadcastExchange
Input [2]: [ca_county#34, store_sales#37]
Arguments: HashedRelationBroadcastMode(List(input[0, string, true]),false), [plan_id=5]

(48) BroadcastHashJoin [codegen id : 12]
Left keys [1]: [ca_county#22]
Right keys [1]: [ca_county#34]
Join type: Inner
Join condition: None

(49) Project [codegen id : 12]
Output [5]: [ca_county#9, d_year#6, store_sales#13, store_sales#25, store_sales#37]
Input [7]: [ca_county#9, d_year#6, store_sales#13, ca_county#22, store_sales#25, ca_county#34, store_sales#37]

(50) Scan parquet spark_catalog.default.web_sales
Output [3]: [ws_bill_addr_sk#38, ws_ext_sales_price#39, ws_sold_date_sk#40]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(ws_sold_date_sk#40), dynamicpruningexpression(ws_sold_date_sk#40 IN dynamicpruning#41)]
PushedFilters: [IsNotNull(ws_bill_addr_sk)]
ReadSchema: struct<ws_bill_addr_sk:int,ws_ext_sales_price:decimal(7,2)>

(51) CometFilter
Input [3]: [ws_bill_addr_sk#38, ws_ext_sales_price#39, ws_sold_date_sk#40]
Condition : isnotnull(ws_bill_addr_sk#38)

(52) ReusedExchange [Reuses operator id: 5]
Output [3]: [d_date_sk#42, d_year#43, d_qoy#44]

(53) CometBroadcastHashJoin
Left output [3]: [ws_bill_addr_sk#38, ws_ext_sales_price#39, ws_sold_date_sk#40]
Right output [3]: [d_date_sk#42, d_year#43, d_qoy#44]
Arguments: [ws_sold_date_sk#40], [d_date_sk#42], Inner, BuildRight

(54) CometProject
Input [6]: [ws_bill_addr_sk#38, ws_ext_sales_price#39, ws_sold_date_sk#40, d_date_sk#42, d_year#43, d_qoy#44]
Arguments: [ws_bill_addr_sk#38, ws_ext_sales_price#39, d_year#43, d_qoy#44], [ws_bill_addr_sk#38, ws_ext_sales_price#39, d_year#43, d_qoy#44]

(55) ReusedExchange [Reuses operator id: 10]
Output [2]: [ca_address_sk#45, ca_county#46]

(56) CometBroadcastHashJoin
Left output [4]: [ws_bill_addr_sk#38, ws_ext_sales_price#39, d_year#43, d_qoy#44]
Right output [2]: [ca_address_sk#45, ca_county#46]
Arguments: [ws_bill_addr_sk#38], [ca_address_sk#45], Inner, BuildRight

(57) CometProject
Input [6]: [ws_bill_addr_sk#38, ws_ext_sales_price#39, d_year#43, d_qoy#44, ca_address_sk#45, ca_county#46]
Arguments: [ws_ext_sales_price#39, d_year#43, d_qoy#44, ca_county#46], [ws_ext_sales_price#39, d_year#43, d_qoy#44, ca_county#46]

(58) ColumnarToRow [codegen id : 6]
Input [4]: [ws_ext_sales_price#39, d_year#43, d_qoy#44, ca_county#46]

(59) HashAggregate [codegen id : 6]
Input [4]: [ws_ext_sales_price#39, d_year#43, d_qoy#44, ca_county#46]
Keys [3]: [ca_county#46, d_qoy#44, d_year#43]
Functions [1]: [partial_sum(UnscaledValue(ws_ext_sales_price#39))]
Aggregate Attributes [1]: [sum#47]
Results [4]: [ca_county#46, d_qoy#44, d_year#43, sum#48]

(60) Exchange
Input [4]: [ca_county#46, d_qoy#44, d_year#43, sum#48]
Arguments: hashpartitioning(ca_county#46, d_qoy#44, d_year#43, 5), ENSURE_REQUIREMENTS, [plan_id=6]

(61) HashAggregate [codegen id : 7]
Input [4]: [ca_county#46, d_qoy#44, d_year#43, sum#48]
Keys [3]: [ca_county#46, d_qoy#44, d_year#43]
Functions [1]: [sum(UnscaledValue(ws_ext_sales_price#39))]
Aggregate Attributes [1]: [sum(UnscaledValue(ws_ext_sales_price#39))#49]
Results [2]: [ca_county#46, MakeDecimal(sum(UnscaledValue(ws_ext_sales_price#39))#49,17,2) AS web_sales#50]

(62) BroadcastExchange
Input [2]: [ca_county#46, web_sales#50]
Arguments: HashedRelationBroadcastMode(List(input[0, string, true]),false), [plan_id=7]

(63) BroadcastHashJoin [codegen id : 12]
Left keys [1]: [ca_county#9]
Right keys [1]: [ca_county#46]
Join type: Inner
Join condition: None

(64) Scan parquet spark_catalog.default.web_sales
Output [3]: [ws_bill_addr_sk#51, ws_ext_sales_price#52, ws_sold_date_sk#53]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(ws_sold_date_sk#53), dynamicpruningexpression(ws_sold_date_sk#53 IN dynamicpruning#54)]
PushedFilters: [IsNotNull(ws_bill_addr_sk)]
ReadSchema: struct<ws_bill_addr_sk:int,ws_ext_sales_price:decimal(7,2)>

(65) CometFilter
Input [3]: [ws_bill_addr_sk#51, ws_ext_sales_price#52, ws_sold_date_sk#53]
Condition : isnotnull(ws_bill_addr_sk#51)

(66) ReusedExchange [Reuses operator id: 21]
Output [3]: [d_date_sk#55, d_year#56, d_qoy#57]

(67) CometBroadcastHashJoin
Left output [3]: [ws_bill_addr_sk#51, ws_ext_sales_price#52, ws_sold_date_sk#53]
Right output [3]: [d_date_sk#55, d_year#56, d_qoy#57]
Arguments: [ws_sold_date_sk#53], [d_date_sk#55], Inner, BuildRight

(68) CometProject
Input [6]: [ws_bill_addr_sk#51, ws_ext_sales_price#52, ws_sold_date_sk#53, d_date_sk#55, d_year#56, d_qoy#57]
Arguments: [ws_bill_addr_sk#51, ws_ext_sales_price#52, d_year#56, d_qoy#57], [ws_bill_addr_sk#51, ws_ext_sales_price#52, d_year#56, d_qoy#57]

(69) ReusedExchange [Reuses operator id: 10]
Output [2]: [ca_address_sk#58, ca_county#59]

(70) CometBroadcastHashJoin
Left output [4]: [ws_bill_addr_sk#51, ws_ext_sales_price#52, d_year#56, d_qoy#57]
Right output [2]: [ca_address_sk#58, ca_county#59]
Arguments: [ws_bill_addr_sk#51], [ca_address_sk#58], Inner, BuildRight

(71) CometProject
Input [6]: [ws_bill_addr_sk#51, ws_ext_sales_price#52, d_year#56, d_qoy#57, ca_address_sk#58, ca_county#59]
Arguments: [ws_ext_sales_price#52, d_year#56, d_qoy#57, ca_county#59], [ws_ext_sales_price#52, d_year#56, d_qoy#57, ca_county#59]

(72) ColumnarToRow [codegen id : 8]
Input [4]: [ws_ext_sales_price#52, d_year#56, d_qoy#57, ca_county#59]

(73) HashAggregate [codegen id : 8]
Input [4]: [ws_ext_sales_price#52, d_year#56, d_qoy#57, ca_county#59]
Keys [3]: [ca_county#59, d_qoy#57, d_year#56]
Functions [1]: [partial_sum(UnscaledValue(ws_ext_sales_price#52))]
Aggregate Attributes [1]: [sum#60]
Results [4]: [ca_county#59, d_qoy#57, d_year#56, sum#61]

(74) Exchange
Input [4]: [ca_county#59, d_qoy#57, d_year#56, sum#61]
Arguments: hashpartitioning(ca_county#59, d_qoy#57, d_year#56, 5), ENSURE_REQUIREMENTS, [plan_id=8]

(75) HashAggregate [codegen id : 9]
Input [4]: [ca_county#59, d_qoy#57, d_year#56, sum#61]
Keys [3]: [ca_county#59, d_qoy#57, d_year#56]
Functions [1]: [sum(UnscaledValue(ws_ext_sales_price#52))]
Aggregate Attributes [1]: [sum(UnscaledValue(ws_ext_sales_price#52))#49]
Results [2]: [ca_county#59, MakeDecimal(sum(UnscaledValue(ws_ext_sales_price#52))#49,17,2) AS web_sales#62]

(76) BroadcastExchange
Input [2]: [ca_county#59, web_sales#62]
Arguments: HashedRelationBroadcastMode(List(input[0, string, true]),false), [plan_id=9]

(77) BroadcastHashJoin [codegen id : 12]
Left keys [1]: [ca_county#46]
Right keys [1]: [ca_county#59]
Join type: Inner
Join condition: (CASE WHEN (web_sales#50 > 0.00) THEN (web_sales#62 / web_sales#50) END > CASE WHEN (store_sales#13 > 0.00) THEN (store_sales#25 / store_sales#13) END)

(78) Project [codegen id : 12]
Output [8]: [ca_county#9, d_year#6, store_sales#13, store_sales#25, store_sales#37, ca_county#46, web_sales#50, web_sales#62]
Input [9]: [ca_county#9, d_year#6, store_sales#13, store_sales#25, store_sales#37, ca_county#46, web_sales#50, ca_county#59, web_sales#62]

(79) Scan parquet spark_catalog.default.web_sales
Output [3]: [ws_bill_addr_sk#63, ws_ext_sales_price#64, ws_sold_date_sk#65]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(ws_sold_date_sk#65), dynamicpruningexpression(ws_sold_date_sk#65 IN dynamicpruning#66)]
PushedFilters: [IsNotNull(ws_bill_addr_sk)]
ReadSchema: struct<ws_bill_addr_sk:int,ws_ext_sales_price:decimal(7,2)>

(80) CometFilter
Input [3]: [ws_bill_addr_sk#63, ws_ext_sales_price#64, ws_sold_date_sk#65]
Condition : isnotnull(ws_bill_addr_sk#63)

(81) ReusedExchange [Reuses operator id: 37]
Output [3]: [d_date_sk#67, d_year#68, d_qoy#69]

(82) CometBroadcastHashJoin
Left output [3]: [ws_bill_addr_sk#63, ws_ext_sales_price#64, ws_sold_date_sk#65]
Right output [3]: [d_date_sk#67, d_year#68, d_qoy#69]
Arguments: [ws_sold_date_sk#65], [d_date_sk#67], Inner, BuildRight

(83) CometProject
Input [6]: [ws_bill_addr_sk#63, ws_ext_sales_price#64, ws_sold_date_sk#65, d_date_sk#67, d_year#68, d_qoy#69]
Arguments: [ws_bill_addr_sk#63, ws_ext_sales_price#64, d_year#68, d_qoy#69], [ws_bill_addr_sk#63, ws_ext_sales_price#64, d_year#68, d_qoy#69]

(84) ReusedExchange [Reuses operator id: 10]
Output [2]: [ca_address_sk#70, ca_county#71]

(85) CometBroadcastHashJoin
Left output [4]: [ws_bill_addr_sk#63, ws_ext_sales_price#64, d_year#68, d_qoy#69]
Right output [2]: [ca_address_sk#70, ca_county#71]
Arguments: [ws_bill_addr_sk#63], [ca_address_sk#70], Inner, BuildRight

(86) CometProject
Input [6]: [ws_bill_addr_sk#63, ws_ext_sales_price#64, d_year#68, d_qoy#69, ca_address_sk#70, ca_county#71]
Arguments: [ws_ext_sales_price#64, d_year#68, d_qoy#69, ca_county#71], [ws_ext_sales_price#64, d_year#68, d_qoy#69, ca_county#71]

(87) ColumnarToRow [codegen id : 10]
Input [4]: [ws_ext_sales_price#64, d_year#68, d_qoy#69, ca_county#71]

(88) HashAggregate [codegen id : 10]
Input [4]: [ws_ext_sales_price#64, d_year#68, d_qoy#69, ca_county#71]
Keys [3]: [ca_county#71, d_qoy#69, d_year#68]
Functions [1]: [partial_sum(UnscaledValue(ws_ext_sales_price#64))]
Aggregate Attributes [1]: [sum#72]
Results [4]: [ca_county#71, d_qoy#69, d_year#68, sum#73]

(89) Exchange
Input [4]: [ca_county#71, d_qoy#69, d_year#68, sum#73]
Arguments: hashpartitioning(ca_county#71, d_qoy#69, d_year#68, 5), ENSURE_REQUIREMENTS, [plan_id=10]

(90) HashAggregate [codegen id : 11]
Input [4]: [ca_county#71, d_qoy#69, d_year#68, sum#73]
Keys [3]: [ca_county#71, d_qoy#69, d_year#68]
Functions [1]: [sum(UnscaledValue(ws_ext_sales_price#64))]
Aggregate Attributes [1]: [sum(UnscaledValue(ws_ext_sales_price#64))#49]
Results [2]: [ca_county#71, MakeDecimal(sum(UnscaledValue(ws_ext_sales_price#64))#49,17,2) AS web_sales#74]

(91) BroadcastExchange
Input [2]: [ca_county#71, web_sales#74]
Arguments: HashedRelationBroadcastMode(List(input[0, string, true]),false), [plan_id=11]

(92) BroadcastHashJoin [codegen id : 12]
Left keys [1]: [ca_county#46]
Right keys [1]: [ca_county#71]
Join type: Inner
Join condition: (CASE WHEN (web_sales#62 > 0.00) THEN (web_sales#74 / web_sales#62) END > CASE WHEN (store_sales#25 > 0.00) THEN (store_sales#37 / store_sales#25) END)

(93) Project [codegen id : 12]
Output [6]: [ca_county#9, d_year#6, (web_sales#62 / web_sales#50) AS web_q1_q2_increase#75, (store_sales#25 / store_sales#13) AS store_q1_q2_increase#76, (web_sales#74 / web_sales#62) AS web_q2_q3_increase#77, (store_sales#37 / store_sales#25) AS store_q2_q3_increase#78]
Input [10]: [ca_county#9, d_year#6, store_sales#13, store_sales#25, store_sales#37, ca_county#46, web_sales#50, web_sales#62, ca_county#71, web_sales#74]

(94) Exchange
Input [6]: [ca_county#9, d_year#6, web_q1_q2_increase#75, store_q1_q2_increase#76, web_q2_q3_increase#77, store_q2_q3_increase#78]
Arguments: rangepartitioning(ca_county#9 ASC NULLS FIRST, 5), ENSURE_REQUIREMENTS, [plan_id=12]

(95) Sort [codegen id : 13]
Input [6]: [ca_county#9, d_year#6, web_q1_q2_increase#75, store_q1_q2_increase#76, web_q2_q3_increase#77, store_q2_q3_increase#78]
Arguments: [ca_county#9 ASC NULLS FIRST], true, 0

===== Subqueries =====

Subquery:1 Hosting operator id = 1 Hosting Expression = ss_sold_date_sk#3 IN dynamicpruning#4
BroadcastExchange (99)
+- * ColumnarToRow (98)
   +- CometFilter (97)
      +- CometScan parquet spark_catalog.default.date_dim (96)


(96) Scan parquet spark_catalog.default.date_dim
Output [3]: [d_date_sk#5, d_year#6, d_qoy#7]
Batched: true
Location [not included in comparison]/{warehouse_dir}/date_dim]
PushedFilters: [IsNotNull(d_qoy), IsNotNull(d_year), EqualTo(d_qoy,1), EqualTo(d_year,2000), IsNotNull(d_date_sk)]
ReadSchema: struct<d_date_sk:int,d_year:int,d_qoy:int>

(97) CometFilter
Input [3]: [d_date_sk#5, d_year#6, d_qoy#7]
Condition : ((((isnotnull(d_qoy#7) AND isnotnull(d_year#6)) AND (d_qoy#7 = 1)) AND (d_year#6 = 2000)) AND isnotnull(d_date_sk#5))

(98) ColumnarToRow [codegen id : 1]
Input [3]: [d_date_sk#5, d_year#6, d_qoy#7]

(99) BroadcastExchange
Input [3]: [d_date_sk#5, d_year#6, d_qoy#7]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=13]

Subquery:2 Hosting operator id = 17 Hosting Expression = ss_sold_date_sk#16 IN dynamicpruning#17
BroadcastExchange (103)
+- * ColumnarToRow (102)
   +- CometFilter (101)
      +- CometScan parquet spark_catalog.default.date_dim (100)


(100) Scan parquet spark_catalog.default.date_dim
Output [3]: [d_date_sk#18, d_year#19, d_qoy#20]
Batched: true
Location [not included in comparison]/{warehouse_dir}/date_dim]
PushedFilters: [IsNotNull(d_qoy), IsNotNull(d_year), EqualTo(d_qoy,2), EqualTo(d_year,2000), IsNotNull(d_date_sk)]
ReadSchema: struct<d_date_sk:int,d_year:int,d_qoy:int>

(101) CometFilter
Input [3]: [d_date_sk#18, d_year#19, d_qoy#20]
Condition : ((((isnotnull(d_qoy#20) AND isnotnull(d_year#19)) AND (d_qoy#20 = 2)) AND (d_year#19 = 2000)) AND isnotnull(d_date_sk#18))

(102) ColumnarToRow [codegen id : 1]
Input [3]: [d_date_sk#18, d_year#19, d_qoy#20]

(103) BroadcastExchange
Input [3]: [d_date_sk#18, d_year#19, d_qoy#20]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=14]

Subquery:3 Hosting operator id = 33 Hosting Expression = ss_sold_date_sk#28 IN dynamicpruning#29
BroadcastExchange (107)
+- * ColumnarToRow (106)
   +- CometFilter (105)
      +- CometScan parquet spark_catalog.default.date_dim (104)


(104) Scan parquet spark_catalog.default.date_dim
Output [3]: [d_date_sk#30, d_year#31, d_qoy#32]
Batched: true
Location [not included in comparison]/{warehouse_dir}/date_dim]
PushedFilters: [IsNotNull(d_qoy), IsNotNull(d_year), EqualTo(d_qoy,3), EqualTo(d_year,2000), IsNotNull(d_date_sk)]
ReadSchema: struct<d_date_sk:int,d_year:int,d_qoy:int>

(105) CometFilter
Input [3]: [d_date_sk#30, d_year#31, d_qoy#32]
Condition : ((((isnotnull(d_qoy#32) AND isnotnull(d_year#31)) AND (d_qoy#32 = 3)) AND (d_year#31 = 2000)) AND isnotnull(d_date_sk#30))

(106) ColumnarToRow [codegen id : 1]
Input [3]: [d_date_sk#30, d_year#31, d_qoy#32]

(107) BroadcastExchange
Input [3]: [d_date_sk#30, d_year#31, d_qoy#32]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=15]

Subquery:4 Hosting operator id = 50 Hosting Expression = ws_sold_date_sk#40 IN dynamicpruning#4

Subquery:5 Hosting operator id = 64 Hosting Expression = ws_sold_date_sk#53 IN dynamicpruning#17

Subquery:6 Hosting operator id = 79 Hosting Expression = ws_sold_date_sk#65 IN dynamicpruning#29


