== Physical Plan ==
VeloxColumnarToRow (43)
+- TakeOrderedAndProjectExecTransformer (42)
   +- ^ RegularHashAggregateExecTransformer (40)
      +- ^ InputIteratorTransformer (39)
         +- ColumnarExchange (37)
            +- VeloxResizeBatches (36)
               +- ^ ProjectExecTransformer (34)
                  +- ^ FlushableHashAggregateExecTransformer (33)
                     +- ^ ProjectExecTransformer (32)
                        +- ^ ShuffledHashJoinExecTransformer Inner BuildLeft (31)
                           :- ^ InputIteratorTransformer (22)
                           :  +- ColumnarExchange (20)
                           :     +- VeloxResizeBatches (19)
                           :        +- ^ ProjectExecTransformer (17)
                           :           +- ^ BroadcastHashJoinExecTransformer Inner BuildRight (16)
                           :              :- ^ ProjectExecTransformer (12)
                           :              :  +- ^ BroadcastHashJoinExecTransformer Inner BuildLeft (11)
                           :              :     :- ^ InputIteratorTransformer (7)
                           :              :     :  +- ColumnarBroadcastExchange (5)
                           :              :     :     +- ^ ProjectExecTransformer (3)
                           :              :     :        +- ^ FilterExecTransformer (2)
                           :              :     :           +- ^ FileSourceScanExecTransformer parquet spark_catalog.default.item (1)
                           :              :     +- ^ ProjectExecTransformer (10)
                           :              :        +- ^ FilterExecTransformer (9)
                           :              :           +- ^ FileSourceScanExecTransformer parquet spark_catalog.default.inventory (8)
                           :              +- ^ InputIteratorTransformer (15)
                           :                 +- ReusedExchange (13)
                           +- ^ InputIteratorTransformer (30)
                              +- ColumnarExchange (28)
                                 +- VeloxResizeBatches (27)
                                    +- ^ ProjectExecTransformer (25)
                                       +- ^ FilterExecTransformer (24)
                                          +- ^ FileSourceScanExecTransformer parquet spark_catalog.default.catalog_sales (23)


(1) FileSourceScanExecTransformer parquet spark_catalog.default.item
Output [5]: [i_item_sk#1, i_item_id#2, i_item_desc#3, i_current_price#4, i_manufact_id#5]
Batched: true
Location: InMemoryFileIndex [{warehouse_dir}/item]
PushedFilters: [IsNotNull(i_current_price), GreaterThanOrEqual(i_current_price,68.00), LessThanOrEqual(i_current_price,98.00), In(i_manufact_id, [677,694,808,940]), IsNotNull(i_item_sk)]
ReadSchema: struct<i_item_sk:int,i_item_id:string,i_item_desc:string,i_current_price:decimal(7,2),i_manufact_id:int>

(2) FilterExecTransformer
Input [5]: [i_item_sk#1, i_item_id#2, i_item_desc#3, i_current_price#4, i_manufact_id#5]
Arguments: ((((isnotnull(i_current_price#4) AND (i_current_price#4 >= 68.00)) AND (i_current_price#4 <= 98.00)) AND i_manufact_id#5 IN (677,940,694,808)) AND isnotnull(i_item_sk#1))

(3) ProjectExecTransformer
Output [4]: [i_item_sk#1, i_item_id#2, i_item_desc#3, i_current_price#4]
Input [5]: [i_item_sk#1, i_item_id#2, i_item_desc#3, i_current_price#4, i_manufact_id#5]

(4) WholeStageCodegenTransformer (1)
Input [4]: [i_item_sk#1, i_item_id#2, i_item_desc#3, i_current_price#4]
Arguments: false

(5) ColumnarBroadcastExchange
Input [4]: [i_item_sk#1, i_item_id#2, i_item_desc#3, i_current_price#4]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [plan_id=1]

(6) InputAdapter
Input [4]: [i_item_sk#1, i_item_id#2, i_item_desc#3, i_current_price#4]

(7) InputIteratorTransformer
Input [4]: [i_item_sk#1, i_item_id#2, i_item_desc#3, i_current_price#4]

(8) FileSourceScanExecTransformer parquet spark_catalog.default.inventory
Output [3]: [inv_item_sk#6, inv_quantity_on_hand#7, inv_date_sk#8]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(inv_date_sk#8), dynamicpruningexpression(inv_date_sk#8 IN dynamicpruning#9)]
PushedFilters: [IsNotNull(inv_quantity_on_hand), GreaterThanOrEqual(inv_quantity_on_hand,100), LessThanOrEqual(inv_quantity_on_hand,500), IsNotNull(inv_item_sk)]
ReadSchema: struct<inv_item_sk:int,inv_quantity_on_hand:int>

(9) FilterExecTransformer
Input [3]: [inv_item_sk#6, inv_quantity_on_hand#7, inv_date_sk#8]
Arguments: (((isnotnull(inv_quantity_on_hand#7) AND (inv_quantity_on_hand#7 >= 100)) AND (inv_quantity_on_hand#7 <= 500)) AND isnotnull(inv_item_sk#6))

(10) ProjectExecTransformer
Output [2]: [inv_item_sk#6, inv_date_sk#8]
Input [3]: [inv_item_sk#6, inv_quantity_on_hand#7, inv_date_sk#8]

(11) BroadcastHashJoinExecTransformer
Left keys [1]: [i_item_sk#1]
Right keys [1]: [inv_item_sk#6]
Join type: Inner
Join condition: None

(12) ProjectExecTransformer
Output [5]: [i_item_sk#1, i_item_id#2, i_item_desc#3, i_current_price#4, inv_date_sk#8]
Input [6]: [i_item_sk#1, i_item_id#2, i_item_desc#3, i_current_price#4, inv_item_sk#6, inv_date_sk#8]

(13) ReusedExchange [Reuses operator id: 48]
Output [1]: [d_date_sk#10]

(14) InputAdapter
Input [1]: [d_date_sk#10]

(15) InputIteratorTransformer
Input [1]: [d_date_sk#10]

(16) BroadcastHashJoinExecTransformer
Left keys [1]: [inv_date_sk#8]
Right keys [1]: [d_date_sk#10]
Join type: Inner
Join condition: None

(17) ProjectExecTransformer
Output [5]: [hash(i_item_sk#1, 42) AS hash_partition_key#11, i_item_sk#1, i_item_id#2, i_item_desc#3, i_current_price#4]
Input [6]: [i_item_sk#1, i_item_id#2, i_item_desc#3, i_current_price#4, inv_date_sk#8, d_date_sk#10]

(18) WholeStageCodegenTransformer (4)
Input [5]: [hash_partition_key#11, i_item_sk#1, i_item_id#2, i_item_desc#3, i_current_price#4]
Arguments: false

(19) VeloxResizeBatches
Input [5]: [hash_partition_key#11, i_item_sk#1, i_item_id#2, i_item_desc#3, i_current_price#4]
Arguments: 1024, 2147483647, 10485760

(20) ColumnarExchange
Input [5]: [hash_partition_key#11, i_item_sk#1, i_item_id#2, i_item_desc#3, i_current_price#4]
Arguments: hashpartitioning(i_item_sk#1, 1), ENSURE_REQUIREMENTS, [i_item_sk#1, i_item_id#2, i_item_desc#3, i_current_price#4], [plan_id=2], [shuffle_writer_type=hash]

(21) InputAdapter
Input [4]: [i_item_sk#1, i_item_id#2, i_item_desc#3, i_current_price#4]

(22) InputIteratorTransformer
Input [4]: [i_item_sk#1, i_item_id#2, i_item_desc#3, i_current_price#4]

(23) FileSourceScanExecTransformer parquet spark_catalog.default.catalog_sales
Output [2]: [cs_item_sk#12, cs_sold_date_sk#13]
Batched: true
Location: CatalogFileIndex [{warehouse_dir}/catalog_sales]
PushedFilters: [IsNotNull(cs_item_sk)]
ReadSchema: struct<cs_item_sk:int>

(24) FilterExecTransformer
Input [2]: [cs_item_sk#12, cs_sold_date_sk#13]
Arguments: (isnotnull(cs_item_sk#12) AND velox_might_contain(Subquery scalar-subquery#14, [id=#3], xxhash64(cs_item_sk#12, 42)))

(25) ProjectExecTransformer
Output [2]: [hash(cs_item_sk#12, 42) AS hash_partition_key#15, cs_item_sk#12]
Input [2]: [cs_item_sk#12, cs_sold_date_sk#13]

(26) WholeStageCodegenTransformer (7)
Input [2]: [hash_partition_key#15, cs_item_sk#12]
Arguments: false

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

(28) ColumnarExchange
Input [2]: [hash_partition_key#15, cs_item_sk#12]
Arguments: hashpartitioning(cs_item_sk#12, 1), ENSURE_REQUIREMENTS, [cs_item_sk#12], [plan_id=4], [shuffle_writer_type=hash]

(29) InputAdapter
Input [1]: [cs_item_sk#12]

(30) InputIteratorTransformer
Input [1]: [cs_item_sk#12]

(31) ShuffledHashJoinExecTransformer
Left keys [1]: [i_item_sk#1]
Right keys [1]: [cs_item_sk#12]
Join type: Inner
Join condition: None

(32) ProjectExecTransformer
Output [3]: [i_item_id#2, i_item_desc#3, i_current_price#4]
Input [5]: [i_item_sk#1, i_item_id#2, i_item_desc#3, i_current_price#4, cs_item_sk#12]

(33) FlushableHashAggregateExecTransformer
Input [3]: [i_item_id#2, i_item_desc#3, i_current_price#4]
Keys [3]: [i_item_id#2, i_item_desc#3, i_current_price#4]
Functions: []
Aggregate Attributes: []
Results [3]: [i_item_id#2, i_item_desc#3, i_current_price#4]

(34) ProjectExecTransformer
Output [4]: [hash(i_item_id#2, i_item_desc#3, i_current_price#4, 42) AS hash_partition_key#16, i_item_id#2, i_item_desc#3, i_current_price#4]
Input [3]: [i_item_id#2, i_item_desc#3, i_current_price#4]

(35) WholeStageCodegenTransformer (8)
Input [4]: [hash_partition_key#16, i_item_id#2, i_item_desc#3, i_current_price#4]
Arguments: false

(36) VeloxResizeBatches
Input [4]: [hash_partition_key#16, i_item_id#2, i_item_desc#3, i_current_price#4]
Arguments: 1024, 2147483647, 10485760

(37) ColumnarExchange
Input [4]: [hash_partition_key#16, i_item_id#2, i_item_desc#3, i_current_price#4]
Arguments: hashpartitioning(i_item_id#2, i_item_desc#3, i_current_price#4, 1), ENSURE_REQUIREMENTS, [i_item_id#2, i_item_desc#3, i_current_price#4], [plan_id=5], [shuffle_writer_type=hash]

(38) InputAdapter
Input [3]: [i_item_id#2, i_item_desc#3, i_current_price#4]

(39) InputIteratorTransformer
Input [3]: [i_item_id#2, i_item_desc#3, i_current_price#4]

(40) RegularHashAggregateExecTransformer
Input [3]: [i_item_id#2, i_item_desc#3, i_current_price#4]
Keys [3]: [i_item_id#2, i_item_desc#3, i_current_price#4]
Functions: []
Aggregate Attributes: []
Results [3]: [i_item_id#2, i_item_desc#3, i_current_price#4]

(41) WholeStageCodegenTransformer (9)
Input [3]: [i_item_id#2, i_item_desc#3, i_current_price#4]
Arguments: false

(42) TakeOrderedAndProjectExecTransformer
Input [3]: [i_item_id#2, i_item_desc#3, i_current_price#4]
Arguments: 100, [i_item_id#2 ASC NULLS FIRST], [i_item_id#2, i_item_desc#3, i_current_price#4], 0

(43) VeloxColumnarToRow
Input [3]: [i_item_id#2, i_item_desc#3, i_current_price#4]

===== Subqueries =====

Subquery:1 Hosting operator id = 8 Hosting Expression = inv_date_sk#8 IN dynamicpruning#9
ColumnarBroadcastExchange (48)
+- ^ ProjectExecTransformer (46)
   +- ^ FilterExecTransformer (45)
      +- ^ FileSourceScanExecTransformer parquet spark_catalog.default.date_dim (44)


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

(45) FilterExecTransformer
Input [2]: [d_date_sk#10, d_date#17]
Arguments: (((isnotnull(d_date#17) AND (d_date#17 >= 2000-02-01)) AND (d_date#17 <= 2000-04-01)) AND isnotnull(d_date_sk#10))

(46) ProjectExecTransformer
Output [1]: [d_date_sk#10]
Input [2]: [d_date_sk#10, d_date#17]

(47) WholeStageCodegenTransformer (2)
Input [1]: [d_date_sk#10]
Arguments: false

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

Subquery:2 Hosting operator id = 24 Hosting Expression = Subquery scalar-subquery#14, [id=#3]
VeloxColumnarToRow (60)
+- ^ RegularHashAggregateExecTransformer (58)
   +- ^ InputIteratorTransformer (57)
      +- ColumnarExchange (55)
         +- VeloxResizeBatches (54)
            +- ^ FlushableHashAggregateExecTransformer (52)
               +- ^ ProjectExecTransformer (51)
                  +- ^ FilterExecTransformer (50)
                     +- ^ FileSourceScanExecTransformer parquet spark_catalog.default.item (49)


(49) FileSourceScanExecTransformer parquet spark_catalog.default.item
Output [3]: [i_item_sk#1, i_current_price#4, i_manufact_id#5]
Batched: true
Location: InMemoryFileIndex [{warehouse_dir}/item]
PushedFilters: [IsNotNull(i_current_price), GreaterThanOrEqual(i_current_price,68.00), LessThanOrEqual(i_current_price,98.00), In(i_manufact_id, [677,694,808,940]), IsNotNull(i_item_sk)]
ReadSchema: struct<i_item_sk:int,i_current_price:decimal(7,2),i_manufact_id:int>

(50) FilterExecTransformer
Input [3]: [i_item_sk#1, i_current_price#4, i_manufact_id#5]
Arguments: ((((isnotnull(i_current_price#4) AND (i_current_price#4 >= 68.00)) AND (i_current_price#4 <= 98.00)) AND i_manufact_id#5 IN (677,940,694,808)) AND isnotnull(i_item_sk#1))

(51) ProjectExecTransformer
Output [1]: [xxhash64(i_item_sk#1, 42) AS _pre_1#18]
Input [3]: [i_item_sk#1, i_current_price#4, i_manufact_id#5]

(52) FlushableHashAggregateExecTransformer
Input [1]: [_pre_1#18]
Keys: []
Functions [1]: [partial_velox_bloom_filter_agg(_pre_1#18, 239, 6582, 0, 0)]
Aggregate Attributes [1]: [buf#19]
Results [1]: [buf#20]

(53) WholeStageCodegenTransformer (5)
Input [1]: [buf#20]
Arguments: false

(54) VeloxResizeBatches
Input [1]: [buf#20]
Arguments: 1024, 2147483647, 10485760

(55) ColumnarExchange
Input [1]: [buf#20]
Arguments: SinglePartition, ENSURE_REQUIREMENTS, [plan_id=7], [shuffle_writer_type=hash]

(56) InputAdapter
Input [1]: [buf#20]

(57) InputIteratorTransformer
Input [1]: [buf#20]

(58) RegularHashAggregateExecTransformer
Input [1]: [buf#20]
Keys: []
Functions [1]: [velox_bloom_filter_agg(xxhash64(i_item_sk#1, 42), 239, 6582, 0, 0)]
Aggregate Attributes [1]: [bloom_filter_agg(xxhash64(i_item_sk#1, 42), 239, 6582, 0, 0)#21]
Results [1]: [bloom_filter_agg(xxhash64(i_item_sk#1, 42), 239, 6582, 0, 0)#21 AS bloomFilter#22]

(59) WholeStageCodegenTransformer (6)
Input [1]: [bloomFilter#22]
Arguments: false

(60) VeloxColumnarToRow
Input [1]: [bloomFilter#22]

Subquery:3 Hosting operator id = 23 Hosting Expression = Subquery scalar-subquery#14, [id=#3]
VeloxColumnarToRow (60)
+- ^ RegularHashAggregateExecTransformer (58)
   +- ^ InputIteratorTransformer (57)
      +- ColumnarExchange (55)
         +- VeloxResizeBatches (54)
            +- ^ FlushableHashAggregateExecTransformer (52)
               +- ^ ProjectExecTransformer (51)
                  +- ^ FilterExecTransformer (50)
                     +- ^ FileSourceScanExecTransformer parquet spark_catalog.default.item (49)



