== Physical Plan ==
TakeOrderedAndProject (43)
+- * Filter (42)
   +- Window (41)
      +- * CometColumnarToRow (40)
         +- CometSort (39)
            +- CometExchange (38)
               +- CometProject (37)
                  +- CometSortMergeJoin (36)
                     :- CometSort (19)
                     :  +- CometColumnarExchange (18)
                     :     +- * Project (17)
                     :        +- Window (16)
                     :           +- * CometColumnarToRow (15)
                     :              +- CometSort (14)
                     :                 +- CometColumnarExchange (13)
                     :                    +- * HashAggregate (12)
                     :                       +- * CometColumnarToRow (11)
                     :                          +- CometExchange (10)
                     :                             +- CometHashAggregate (9)
                     :                                +- CometProject (8)
                     :                                   +- CometBroadcastHashJoin (7)
                     :                                      :- CometFilter (2)
                     :                                      :  +- CometScan [native_iceberg_compat] parquet spark_catalog.default.web_sales (1)
                     :                                      +- CometBroadcastExchange (6)
                     :                                         +- CometProject (5)
                     :                                            +- CometFilter (4)
                     :                                               +- CometScan [native_iceberg_compat] parquet spark_catalog.default.date_dim (3)
                     +- CometSort (35)
                        +- CometColumnarExchange (34)
                           +- * Project (33)
                              +- Window (32)
                                 +- * CometColumnarToRow (31)
                                    +- CometSort (30)
                                       +- CometColumnarExchange (29)
                                          +- * HashAggregate (28)
                                             +- * CometColumnarToRow (27)
                                                +- CometExchange (26)
                                                   +- CometHashAggregate (25)
                                                      +- CometProject (24)
                                                         +- CometBroadcastHashJoin (23)
                                                            :- CometFilter (21)
                                                            :  +- CometScan [native_iceberg_compat] parquet spark_catalog.default.store_sales (20)
                                                            +- ReusedExchange (22)


(1) CometScan [native_iceberg_compat] parquet spark_catalog.default.web_sales
Output [3]: [ws_item_sk#1, ws_sales_price#2, ws_sold_date_sk#3]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(ws_sold_date_sk#3), dynamicpruningexpression(ws_sold_date_sk#3 IN dynamicpruning#4)]
PushedFilters: [IsNotNull(ws_item_sk)]
ReadSchema: struct<ws_item_sk:int,ws_sales_price:decimal(7,2)>

(2) CometFilter
Input [3]: [ws_item_sk#1, ws_sales_price#2, ws_sold_date_sk#3]
Condition : isnotnull(ws_item_sk#1)

(3) CometScan [native_iceberg_compat] parquet spark_catalog.default.date_dim
Output [3]: [d_date_sk#5, d_date#6, d_month_seq#7]
Batched: true
Location [not included in comparison]/{warehouse_dir}/date_dim]
PushedFilters: [IsNotNull(d_month_seq), GreaterThanOrEqual(d_month_seq,1200), LessThanOrEqual(d_month_seq,1211), IsNotNull(d_date_sk)]
ReadSchema: struct<d_date_sk:int,d_date:date,d_month_seq:int>

(4) CometFilter
Input [3]: [d_date_sk#5, d_date#6, d_month_seq#7]
Condition : (((isnotnull(d_month_seq#7) AND (d_month_seq#7 >= 1200)) AND (d_month_seq#7 <= 1211)) AND isnotnull(d_date_sk#5))

(5) CometProject
Input [3]: [d_date_sk#5, d_date#6, d_month_seq#7]
Arguments: [d_date_sk#5, d_date#6], [d_date_sk#5, d_date#6]

(6) CometBroadcastExchange
Input [2]: [d_date_sk#5, d_date#6]
Arguments: [d_date_sk#5, d_date#6]

(7) CometBroadcastHashJoin
Left output [3]: [ws_item_sk#1, ws_sales_price#2, ws_sold_date_sk#3]
Right output [2]: [d_date_sk#5, d_date#6]
Arguments: [ws_sold_date_sk#3], [d_date_sk#5], Inner, BuildRight

(8) CometProject
Input [5]: [ws_item_sk#1, ws_sales_price#2, ws_sold_date_sk#3, d_date_sk#5, d_date#6]
Arguments: [ws_item_sk#1, ws_sales_price#2, d_date#6], [ws_item_sk#1, ws_sales_price#2, d_date#6]

(9) CometHashAggregate
Input [3]: [ws_item_sk#1, ws_sales_price#2, d_date#6]
Keys [2]: [ws_item_sk#1, d_date#6]
Functions [1]: [partial_sum(UnscaledValue(ws_sales_price#2))]

(10) CometExchange
Input [3]: [ws_item_sk#1, d_date#6, sum#8]
Arguments: hashpartitioning(ws_item_sk#1, d_date#6, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=1]

(11) CometColumnarToRow [codegen id : 1]
Input [3]: [ws_item_sk#1, d_date#6, sum#8]

(12) HashAggregate [codegen id : 1]
Input [3]: [ws_item_sk#1, d_date#6, sum#8]
Keys [2]: [ws_item_sk#1, d_date#6]
Functions [1]: [sum(UnscaledValue(ws_sales_price#2))]
Aggregate Attributes [1]: [sum(UnscaledValue(ws_sales_price#2))#9]
Results [4]: [ws_item_sk#1 AS item_sk#10, d_date#6, MakeDecimal(sum(UnscaledValue(ws_sales_price#2))#9,17,2) AS _w0#11, ws_item_sk#1]

(13) CometColumnarExchange
Input [4]: [item_sk#10, d_date#6, _w0#11, ws_item_sk#1]
Arguments: hashpartitioning(ws_item_sk#1, 5), ENSURE_REQUIREMENTS, CometColumnarShuffle, [plan_id=2]

(14) CometSort
Input [4]: [item_sk#10, d_date#6, _w0#11, ws_item_sk#1]
Arguments: [item_sk#10, d_date#6, _w0#11, ws_item_sk#1], [ws_item_sk#1 ASC NULLS FIRST, d_date#6 ASC NULLS FIRST]

(15) CometColumnarToRow [codegen id : 2]
Input [4]: [item_sk#10, d_date#6, _w0#11, ws_item_sk#1]

(16) Window
Input [4]: [item_sk#10, d_date#6, _w0#11, ws_item_sk#1]
Arguments: [sum(_w0#11) windowspecdefinition(ws_item_sk#1, d_date#6 ASC NULLS FIRST, specifiedwindowframe(RowFrame, unboundedpreceding$(), currentrow$())) AS cume_sales#12], [ws_item_sk#1], [d_date#6 ASC NULLS FIRST]

(17) Project [codegen id : 3]
Output [3]: [item_sk#10, d_date#6, cume_sales#12]
Input [5]: [item_sk#10, d_date#6, _w0#11, ws_item_sk#1, cume_sales#12]

(18) CometColumnarExchange
Input [3]: [item_sk#10, d_date#6, cume_sales#12]
Arguments: hashpartitioning(item_sk#10, d_date#6, 5), ENSURE_REQUIREMENTS, CometColumnarShuffle, [plan_id=3]

(19) CometSort
Input [3]: [item_sk#10, d_date#6, cume_sales#12]
Arguments: [item_sk#10, d_date#6, cume_sales#12], [item_sk#10 ASC NULLS FIRST, d_date#6 ASC NULLS FIRST]

(20) CometScan [native_iceberg_compat] parquet spark_catalog.default.store_sales
Output [3]: [ss_item_sk#13, ss_sales_price#14, ss_sold_date_sk#15]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(ss_sold_date_sk#15), dynamicpruningexpression(ss_sold_date_sk#15 IN dynamicpruning#16)]
PushedFilters: [IsNotNull(ss_item_sk)]
ReadSchema: struct<ss_item_sk:int,ss_sales_price:decimal(7,2)>

(21) CometFilter
Input [3]: [ss_item_sk#13, ss_sales_price#14, ss_sold_date_sk#15]
Condition : isnotnull(ss_item_sk#13)

(22) ReusedExchange [Reuses operator id: 6]
Output [2]: [d_date_sk#17, d_date#18]

(23) CometBroadcastHashJoin
Left output [3]: [ss_item_sk#13, ss_sales_price#14, ss_sold_date_sk#15]
Right output [2]: [d_date_sk#17, d_date#18]
Arguments: [ss_sold_date_sk#15], [d_date_sk#17], Inner, BuildRight

(24) CometProject
Input [5]: [ss_item_sk#13, ss_sales_price#14, ss_sold_date_sk#15, d_date_sk#17, d_date#18]
Arguments: [ss_item_sk#13, ss_sales_price#14, d_date#18], [ss_item_sk#13, ss_sales_price#14, d_date#18]

(25) CometHashAggregate
Input [3]: [ss_item_sk#13, ss_sales_price#14, d_date#18]
Keys [2]: [ss_item_sk#13, d_date#18]
Functions [1]: [partial_sum(UnscaledValue(ss_sales_price#14))]

(26) CometExchange
Input [3]: [ss_item_sk#13, d_date#18, sum#19]
Arguments: hashpartitioning(ss_item_sk#13, d_date#18, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=4]

(27) CometColumnarToRow [codegen id : 4]
Input [3]: [ss_item_sk#13, d_date#18, sum#19]

(28) HashAggregate [codegen id : 4]
Input [3]: [ss_item_sk#13, d_date#18, sum#19]
Keys [2]: [ss_item_sk#13, d_date#18]
Functions [1]: [sum(UnscaledValue(ss_sales_price#14))]
Aggregate Attributes [1]: [sum(UnscaledValue(ss_sales_price#14))#20]
Results [4]: [ss_item_sk#13 AS item_sk#21, d_date#18, MakeDecimal(sum(UnscaledValue(ss_sales_price#14))#20,17,2) AS _w0#22, ss_item_sk#13]

(29) CometColumnarExchange
Input [4]: [item_sk#21, d_date#18, _w0#22, ss_item_sk#13]
Arguments: hashpartitioning(ss_item_sk#13, 5), ENSURE_REQUIREMENTS, CometColumnarShuffle, [plan_id=5]

(30) CometSort
Input [4]: [item_sk#21, d_date#18, _w0#22, ss_item_sk#13]
Arguments: [item_sk#21, d_date#18, _w0#22, ss_item_sk#13], [ss_item_sk#13 ASC NULLS FIRST, d_date#18 ASC NULLS FIRST]

(31) CometColumnarToRow [codegen id : 5]
Input [4]: [item_sk#21, d_date#18, _w0#22, ss_item_sk#13]

(32) Window
Input [4]: [item_sk#21, d_date#18, _w0#22, ss_item_sk#13]
Arguments: [sum(_w0#22) windowspecdefinition(ss_item_sk#13, d_date#18 ASC NULLS FIRST, specifiedwindowframe(RowFrame, unboundedpreceding$(), currentrow$())) AS cume_sales#23], [ss_item_sk#13], [d_date#18 ASC NULLS FIRST]

(33) Project [codegen id : 6]
Output [3]: [item_sk#21, d_date#18, cume_sales#23]
Input [5]: [item_sk#21, d_date#18, _w0#22, ss_item_sk#13, cume_sales#23]

(34) CometColumnarExchange
Input [3]: [item_sk#21, d_date#18, cume_sales#23]
Arguments: hashpartitioning(item_sk#21, d_date#18, 5), ENSURE_REQUIREMENTS, CometColumnarShuffle, [plan_id=6]

(35) CometSort
Input [3]: [item_sk#21, d_date#18, cume_sales#23]
Arguments: [item_sk#21, d_date#18, cume_sales#23], [item_sk#21 ASC NULLS FIRST, d_date#18 ASC NULLS FIRST]

(36) CometSortMergeJoin
Left output [3]: [item_sk#10, d_date#6, cume_sales#12]
Right output [3]: [item_sk#21, d_date#18, cume_sales#23]
Arguments: [item_sk#10, d_date#6], [item_sk#21, d_date#18], FullOuter

(37) CometProject
Input [6]: [item_sk#10, d_date#6, cume_sales#12, item_sk#21, d_date#18, cume_sales#23]
Arguments: [item_sk#24, d_date#25, web_sales#26, store_sales#27], [CASE WHEN isnotnull(item_sk#10) THEN item_sk#10 ELSE item_sk#21 END AS item_sk#24, CASE WHEN isnotnull(d_date#6) THEN d_date#6 ELSE d_date#18 END AS d_date#25, cume_sales#12 AS web_sales#26, cume_sales#23 AS store_sales#27]

(38) CometExchange
Input [4]: [item_sk#24, d_date#25, web_sales#26, store_sales#27]
Arguments: hashpartitioning(item_sk#24, 5), ENSURE_REQUIREMENTS, CometNativeShuffle, [plan_id=7]

(39) CometSort
Input [4]: [item_sk#24, d_date#25, web_sales#26, store_sales#27]
Arguments: [item_sk#24, d_date#25, web_sales#26, store_sales#27], [item_sk#24 ASC NULLS FIRST, d_date#25 ASC NULLS FIRST]

(40) CometColumnarToRow [codegen id : 7]
Input [4]: [item_sk#24, d_date#25, web_sales#26, store_sales#27]

(41) Window
Input [4]: [item_sk#24, d_date#25, web_sales#26, store_sales#27]
Arguments: [max(web_sales#26) windowspecdefinition(item_sk#24, d_date#25 ASC NULLS FIRST, specifiedwindowframe(RowFrame, unboundedpreceding$(), currentrow$())) AS web_cumulative#28, max(store_sales#27) windowspecdefinition(item_sk#24, d_date#25 ASC NULLS FIRST, specifiedwindowframe(RowFrame, unboundedpreceding$(), currentrow$())) AS store_cumulative#29], [item_sk#24], [d_date#25 ASC NULLS FIRST]

(42) Filter [codegen id : 8]
Input [6]: [item_sk#24, d_date#25, web_sales#26, store_sales#27, web_cumulative#28, store_cumulative#29]
Condition : ((isnotnull(web_cumulative#28) AND isnotnull(store_cumulative#29)) AND (web_cumulative#28 > store_cumulative#29))

(43) TakeOrderedAndProject
Input [6]: [item_sk#24, d_date#25, web_sales#26, store_sales#27, web_cumulative#28, store_cumulative#29]
Arguments: 100, [item_sk#24 ASC NULLS FIRST, d_date#25 ASC NULLS FIRST], [item_sk#24, d_date#25, web_sales#26, store_sales#27, web_cumulative#28, store_cumulative#29]

===== Subqueries =====

Subquery:1 Hosting operator id = 1 Hosting Expression = ws_sold_date_sk#3 IN dynamicpruning#4
BroadcastExchange (48)
+- * CometColumnarToRow (47)
   +- CometProject (46)
      +- CometFilter (45)
         +- CometScan [native_iceberg_compat] parquet spark_catalog.default.date_dim (44)


(44) CometScan [native_iceberg_compat] parquet spark_catalog.default.date_dim
Output [3]: [d_date_sk#5, d_date#6, d_month_seq#7]
Batched: true
Location [not included in comparison]/{warehouse_dir}/date_dim]
PushedFilters: [IsNotNull(d_month_seq), GreaterThanOrEqual(d_month_seq,1200), LessThanOrEqual(d_month_seq,1211), IsNotNull(d_date_sk)]
ReadSchema: struct<d_date_sk:int,d_date:date,d_month_seq:int>

(45) CometFilter
Input [3]: [d_date_sk#5, d_date#6, d_month_seq#7]
Condition : (((isnotnull(d_month_seq#7) AND (d_month_seq#7 >= 1200)) AND (d_month_seq#7 <= 1211)) AND isnotnull(d_date_sk#5))

(46) CometProject
Input [3]: [d_date_sk#5, d_date#6, d_month_seq#7]
Arguments: [d_date_sk#5, d_date#6], [d_date_sk#5, d_date#6]

(47) CometColumnarToRow [codegen id : 1]
Input [2]: [d_date_sk#5, d_date#6]

(48) BroadcastExchange
Input [2]: [d_date_sk#5, d_date#6]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [plan_id=8]

Subquery:2 Hosting operator id = 20 Hosting Expression = ss_sold_date_sk#15 IN dynamicpruning#4


