== Physical Plan ==
VeloxColumnarToRow (48)
+- TakeOrderedAndProjectExecTransformer (47)
   +- ^ ProjectExecTransformer (45)
      +- ^ BroadcastHashJoinExecTransformer Inner BuildLeft (44)
         :- ^ InputIteratorTransformer (40)
         :  +- ColumnarBroadcastExchange (38)
         :     +- ^ ProjectExecTransformer (36)
         :        +- ^ BroadcastHashJoinExecTransformer Inner BuildRight (35)
         :           :- ^ ProjectExecTransformer (27)
         :           :  +- ^ BroadcastHashJoinExecTransformer Inner BuildRight (26)
         :           :     :- ^ ProjectExecTransformer (19)
         :           :     :  +- ^ BroadcastHashJoinExecTransformer Inner BuildRight (18)
         :           :     :     :- ^ ProjectExecTransformer (11)
         :           :     :     :  +- ^ BroadcastHashJoinExecTransformer Inner BuildRight (10)
         :           :     :     :     :- ^ FilterExecTransformer (2)
         :           :     :     :     :  +- ^ FileSourceScanExecTransformer parquet spark_catalog.default.customer (1)
         :           :     :     :     +- ^ InputIteratorTransformer (9)
         :           :     :     :        +- ColumnarBroadcastExchange (7)
         :           :     :     :           +- ^ ProjectExecTransformer (5)
         :           :     :     :              +- ^ FilterExecTransformer (4)
         :           :     :     :                 +- ^ FileSourceScanExecTransformer parquet spark_catalog.default.customer_address (3)
         :           :     :     +- ^ InputIteratorTransformer (17)
         :           :     :        +- ColumnarBroadcastExchange (15)
         :           :     :           +- ^ FilterExecTransformer (13)
         :           :     :              +- ^ FileSourceScanExecTransformer parquet spark_catalog.default.customer_demographics (12)
         :           :     +- ^ InputIteratorTransformer (25)
         :           :        +- ColumnarBroadcastExchange (23)
         :           :           +- ^ FilterExecTransformer (21)
         :           :              +- ^ FileSourceScanExecTransformer parquet spark_catalog.default.household_demographics (20)
         :           +- ^ InputIteratorTransformer (34)
         :              +- ColumnarBroadcastExchange (32)
         :                 +- ^ ProjectExecTransformer (30)
         :                    +- ^ FilterExecTransformer (29)
         :                       +- ^ FileSourceScanExecTransformer parquet spark_catalog.default.income_band (28)
         +- ^ ProjectExecTransformer (43)
            +- ^ FilterExecTransformer (42)
               +- ^ FileSourceScanExecTransformer parquet spark_catalog.default.store_returns (41)


(1) FileSourceScanExecTransformer parquet spark_catalog.default.customer
Output [6]: [c_customer_id#1, c_current_cdemo_sk#2, c_current_hdemo_sk#3, c_current_addr_sk#4, c_first_name#5, c_last_name#6]
Batched: true
Location: InMemoryFileIndex [{warehouse_dir}/customer]
PushedFilters: [IsNotNull(c_current_addr_sk), IsNotNull(c_current_cdemo_sk), IsNotNull(c_current_hdemo_sk)]
ReadSchema: struct<c_customer_id:string,c_current_cdemo_sk:int,c_current_hdemo_sk:int,c_current_addr_sk:int,c_first_name:string,c_last_name:string>

(2) FilterExecTransformer
Input [6]: [c_customer_id#1, c_current_cdemo_sk#2, c_current_hdemo_sk#3, c_current_addr_sk#4, c_first_name#5, c_last_name#6]
Arguments: ((isnotnull(c_current_addr_sk#4) AND isnotnull(c_current_cdemo_sk#2)) AND isnotnull(c_current_hdemo_sk#3))

(3) FileSourceScanExecTransformer parquet spark_catalog.default.customer_address
Output [2]: [ca_address_sk#7, ca_city#8]
Batched: true
Location: InMemoryFileIndex [{warehouse_dir}/customer_address]
PushedFilters: [IsNotNull(ca_city), EqualTo(ca_city,Edgewood), IsNotNull(ca_address_sk)]
ReadSchema: struct<ca_address_sk:int,ca_city:string>

(4) FilterExecTransformer
Input [2]: [ca_address_sk#7, ca_city#8]
Arguments: ((isnotnull(ca_city#8) AND (ca_city#8 = Edgewood)) AND isnotnull(ca_address_sk#7))

(5) ProjectExecTransformer
Output [1]: [ca_address_sk#7]
Input [2]: [ca_address_sk#7, ca_city#8]

(6) WholeStageCodegenTransformer (1)
Input [1]: [ca_address_sk#7]
Arguments: false

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

(8) InputAdapter
Input [1]: [ca_address_sk#7]

(9) InputIteratorTransformer
Input [1]: [ca_address_sk#7]

(10) BroadcastHashJoinExecTransformer
Left keys [1]: [c_current_addr_sk#4]
Right keys [1]: [ca_address_sk#7]
Join type: Inner
Join condition: None

(11) ProjectExecTransformer
Output [5]: [c_customer_id#1, c_current_cdemo_sk#2, c_current_hdemo_sk#3, c_first_name#5, c_last_name#6]
Input [7]: [c_customer_id#1, c_current_cdemo_sk#2, c_current_hdemo_sk#3, c_current_addr_sk#4, c_first_name#5, c_last_name#6, ca_address_sk#7]

(12) FileSourceScanExecTransformer parquet spark_catalog.default.customer_demographics
Output [1]: [cd_demo_sk#9]
Batched: true
Location: InMemoryFileIndex [{warehouse_dir}/customer_demographics]
PushedFilters: [IsNotNull(cd_demo_sk)]
ReadSchema: struct<cd_demo_sk:int>

(13) FilterExecTransformer
Input [1]: [cd_demo_sk#9]
Arguments: isnotnull(cd_demo_sk#9)

(14) WholeStageCodegenTransformer (2)
Input [1]: [cd_demo_sk#9]
Arguments: false

(15) ColumnarBroadcastExchange
Input [1]: [cd_demo_sk#9]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=2]

(16) InputAdapter
Input [1]: [cd_demo_sk#9]

(17) InputIteratorTransformer
Input [1]: [cd_demo_sk#9]

(18) BroadcastHashJoinExecTransformer
Left keys [1]: [c_current_cdemo_sk#2]
Right keys [1]: [cd_demo_sk#9]
Join type: Inner
Join condition: None

(19) ProjectExecTransformer
Output [5]: [c_customer_id#1, c_current_hdemo_sk#3, c_first_name#5, c_last_name#6, cd_demo_sk#9]
Input [6]: [c_customer_id#1, c_current_cdemo_sk#2, c_current_hdemo_sk#3, c_first_name#5, c_last_name#6, cd_demo_sk#9]

(20) FileSourceScanExecTransformer parquet spark_catalog.default.household_demographics
Output [2]: [hd_demo_sk#10, hd_income_band_sk#11]
Batched: true
Location: InMemoryFileIndex [{warehouse_dir}/household_demographics]
PushedFilters: [IsNotNull(hd_demo_sk), IsNotNull(hd_income_band_sk)]
ReadSchema: struct<hd_demo_sk:int,hd_income_band_sk:int>

(21) FilterExecTransformer
Input [2]: [hd_demo_sk#10, hd_income_band_sk#11]
Arguments: (isnotnull(hd_demo_sk#10) AND isnotnull(hd_income_band_sk#11))

(22) WholeStageCodegenTransformer (3)
Input [2]: [hd_demo_sk#10, hd_income_band_sk#11]
Arguments: false

(23) ColumnarBroadcastExchange
Input [2]: [hd_demo_sk#10, hd_income_band_sk#11]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=3]

(24) InputAdapter
Input [2]: [hd_demo_sk#10, hd_income_band_sk#11]

(25) InputIteratorTransformer
Input [2]: [hd_demo_sk#10, hd_income_band_sk#11]

(26) BroadcastHashJoinExecTransformer
Left keys [1]: [c_current_hdemo_sk#3]
Right keys [1]: [hd_demo_sk#10]
Join type: Inner
Join condition: None

(27) ProjectExecTransformer
Output [5]: [c_customer_id#1, c_first_name#5, c_last_name#6, cd_demo_sk#9, hd_income_band_sk#11]
Input [7]: [c_customer_id#1, c_current_hdemo_sk#3, c_first_name#5, c_last_name#6, cd_demo_sk#9, hd_demo_sk#10, hd_income_band_sk#11]

(28) FileSourceScanExecTransformer parquet spark_catalog.default.income_band
Output [3]: [ib_income_band_sk#12, ib_lower_bound#13, ib_upper_bound#14]
Batched: true
Location: InMemoryFileIndex [{warehouse_dir}/income_band]
PushedFilters: [IsNotNull(ib_lower_bound), IsNotNull(ib_upper_bound), GreaterThanOrEqual(ib_lower_bound,38128), LessThanOrEqual(ib_upper_bound,88128), IsNotNull(ib_income_band_sk)]
ReadSchema: struct<ib_income_band_sk:int,ib_lower_bound:int,ib_upper_bound:int>

(29) FilterExecTransformer
Input [3]: [ib_income_band_sk#12, ib_lower_bound#13, ib_upper_bound#14]
Arguments: ((((isnotnull(ib_lower_bound#13) AND isnotnull(ib_upper_bound#14)) AND (ib_lower_bound#13 >= 38128)) AND (ib_upper_bound#14 <= 88128)) AND isnotnull(ib_income_band_sk#12))

(30) ProjectExecTransformer
Output [1]: [ib_income_band_sk#12]
Input [3]: [ib_income_band_sk#12, ib_lower_bound#13, ib_upper_bound#14]

(31) WholeStageCodegenTransformer (4)
Input [1]: [ib_income_band_sk#12]
Arguments: false

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

(33) InputAdapter
Input [1]: [ib_income_band_sk#12]

(34) InputIteratorTransformer
Input [1]: [ib_income_band_sk#12]

(35) BroadcastHashJoinExecTransformer
Left keys [1]: [hd_income_band_sk#11]
Right keys [1]: [ib_income_band_sk#12]
Join type: Inner
Join condition: None

(36) ProjectExecTransformer
Output [4]: [c_customer_id#1, c_first_name#5, c_last_name#6, cd_demo_sk#9]
Input [6]: [c_customer_id#1, c_first_name#5, c_last_name#6, cd_demo_sk#9, hd_income_band_sk#11, ib_income_band_sk#12]

(37) WholeStageCodegenTransformer (5)
Input [4]: [c_customer_id#1, c_first_name#5, c_last_name#6, cd_demo_sk#9]
Arguments: false

(38) ColumnarBroadcastExchange
Input [4]: [c_customer_id#1, c_first_name#5, c_last_name#6, cd_demo_sk#9]
Arguments: HashedRelationBroadcastMode(List(cast(input[3, int, true] as bigint)),false), [plan_id=5]

(39) InputAdapter
Input [4]: [c_customer_id#1, c_first_name#5, c_last_name#6, cd_demo_sk#9]

(40) InputIteratorTransformer
Input [4]: [c_customer_id#1, c_first_name#5, c_last_name#6, cd_demo_sk#9]

(41) FileSourceScanExecTransformer parquet spark_catalog.default.store_returns
Output [2]: [sr_cdemo_sk#15, sr_returned_date_sk#16]
Batched: true
Location: CatalogFileIndex [{warehouse_dir}/store_returns]
PushedFilters: [IsNotNull(sr_cdemo_sk)]
ReadSchema: struct<sr_cdemo_sk:int>

(42) FilterExecTransformer
Input [2]: [sr_cdemo_sk#15, sr_returned_date_sk#16]
Arguments: isnotnull(sr_cdemo_sk#15)

(43) ProjectExecTransformer
Output [1]: [sr_cdemo_sk#15]
Input [2]: [sr_cdemo_sk#15, sr_returned_date_sk#16]

(44) BroadcastHashJoinExecTransformer
Left keys [1]: [cd_demo_sk#9]
Right keys [1]: [sr_cdemo_sk#15]
Join type: Inner
Join condition: None

(45) ProjectExecTransformer
Output [3]: [c_customer_id#1 AS customer_id#17, concat(c_last_name#6, , , c_first_name#5) AS customername#18, c_customer_id#1]
Input [5]: [c_customer_id#1, c_first_name#5, c_last_name#6, cd_demo_sk#9, sr_cdemo_sk#15]

(46) WholeStageCodegenTransformer (6)
Input [3]: [customer_id#17, customername#18, c_customer_id#1]
Arguments: false

(47) TakeOrderedAndProjectExecTransformer
Input [3]: [customer_id#17, customername#18, c_customer_id#1]
Arguments: 100, [c_customer_id#1 ASC NULLS FIRST], [customer_id#17, customername#18], 0

(48) VeloxColumnarToRow
Input [2]: [customer_id#17, customername#18]

