@@ -185,3 +185,65 @@ def test_snowflake_materialization_consistency_internal_with_lists(
185185 finally :
186186 fs .teardown ()
187187 snowflake_environment .data_source_creator .teardown ()
188+
189+
190+ @pytest .mark .integration
191+ def test_snowflake_materialization_entityless_fv ():
192+ snowflake_config = IntegrationTestRepoConfig (
193+ online_store = SNOWFLAKE_ONLINE_CONFIG ,
194+ offline_store_creator = SnowflakeDataSourceCreator ,
195+ batch_engine = SNOWFLAKE_ENGINE_CONFIG ,
196+ )
197+ snowflake_environment = construct_test_environment (snowflake_config , None )
198+
199+ df = create_basic_driver_dataset ()
200+ entityless_df = df .drop ("driver_id" , axis = 1 )
201+ ds = snowflake_environment .data_source_creator .create_data_source (
202+ entityless_df ,
203+ snowflake_environment .feature_store .project ,
204+ field_mapping = {"ts_1" : "ts" },
205+ )
206+
207+ fs = snowflake_environment .feature_store
208+
209+ # We include the driver entity so we can provide an entity ID when fetching features
210+ driver = Entity (
211+ name = "driver_id" ,
212+ join_keys = ["driver_id" ],
213+ )
214+
215+ overall_stats_fv = FeatureView (
216+ name = "overall_hourly_stats" ,
217+ entities = [],
218+ ttl = timedelta (weeks = 52 ),
219+ source = ds ,
220+ )
221+
222+ try :
223+ fs .apply ([overall_stats_fv , driver ])
224+
225+ # materialization is run in two steps and
226+ # we use timestamp from generated dataframe as a split point
227+ split_dt = df ["ts_1" ][4 ].to_pydatetime () - timedelta (seconds = 1 )
228+
229+ print (f"Split datetime: { split_dt } " )
230+
231+ now = datetime .utcnow ()
232+
233+ start_date = (now - timedelta (hours = 5 )).replace (tzinfo = utc )
234+ end_date = split_dt
235+ fs .materialize (
236+ feature_views = [overall_stats_fv .name ],
237+ start_date = start_date ,
238+ end_date = end_date ,
239+ )
240+
241+ response_dict = fs .get_online_features (
242+ [f"{ overall_stats_fv .name } :value" ],
243+ [{"driver_id" : 1 }], # Included because we need an entity
244+ ).to_dict ()
245+ assert response_dict ["value" ] == [0.3 ]
246+
247+ finally :
248+ fs .teardown ()
249+ snowflake_environment .data_source_creator .teardown ()
0 commit comments