|
24 | 24 | from feast.inference import (
|
25 | 25 | update_data_sources_with_inferred_event_timestamp_col,
|
26 | 26 | update_entities_with_inferred_types_from_feature_views,
|
| 27 | + update_feature_views_with_inferred_features, |
27 | 28 | )
|
28 | 29 | from feast.infra.offline_stores.contrib.spark_offline_store.spark_source import (
|
29 | 30 | SparkSource,
|
30 | 31 | )
|
31 | 32 | from feast.on_demand_feature_view import on_demand_feature_view
|
32 |
| -from feast.types import PrimitiveFeastType, String, UnixTimestamp |
| 33 | +from feast.types import Float32, PrimitiveFeastType, String, UnixTimestamp |
33 | 34 | from tests.utils.data_source_utils import (
|
34 | 35 | prep_file_source,
|
35 | 36 | simple_bq_source_using_query_arg,
|
@@ -168,15 +169,14 @@ def test_update_data_sources_with_inferred_event_timestamp_col(universal_data_so
|
168 | 169 | def test_on_demand_features_type_inference():
|
169 | 170 | # Create Feature Views
|
170 | 171 | date_request = RequestSource(
|
171 |
| - name="date_request", |
172 |
| - schema=[Field(name="some_date", dtype=PrimitiveFeastType.UNIX_TIMESTAMP)], |
| 172 | + name="date_request", schema=[Field(name="some_date", dtype=UnixTimestamp)], |
173 | 173 | )
|
174 | 174 |
|
175 | 175 | @on_demand_feature_view(
|
176 | 176 | sources={"date_request": date_request},
|
177 |
| - features=[ |
178 |
| - Feature(name="output", dtype=ValueType.UNIX_TIMESTAMP), |
179 |
| - Feature(name="string_output", dtype=ValueType.STRING), |
| 177 | + schema=[ |
| 178 | + Field(name="output", dtype=UnixTimestamp), |
| 179 | + Field(name="string_output", dtype=String), |
180 | 180 | ],
|
181 | 181 | )
|
182 | 182 | def test_view(features_df: pd.DataFrame) -> pd.DataFrame:
|
@@ -285,3 +285,50 @@ def test_view_with_missing_feature(features_df: pd.DataFrame) -> pd.DataFrame:
|
285 | 285 |
|
286 | 286 | with pytest.raises(SpecifiedFeaturesNotPresentError):
|
287 | 287 | test_view_with_missing_feature.infer_features()
|
| 288 | + |
| 289 | + |
| 290 | +def test_update_feature_views_with_inferred_features(): |
| 291 | + file_source = FileSource(name="test", path="test path") |
| 292 | + entity1 = Entity(name="test1", join_key="test_column_1") |
| 293 | + entity2 = Entity(name="test2", join_key="test_column_2") |
| 294 | + feature_view_1 = FeatureView( |
| 295 | + name="test1", |
| 296 | + entities=[entity1], |
| 297 | + schema=[ |
| 298 | + Field(name="feature", dtype=Float32), |
| 299 | + Field(name="test_column_1", dtype=String), |
| 300 | + ], |
| 301 | + source=file_source, |
| 302 | + ) |
| 303 | + feature_view_2 = FeatureView( |
| 304 | + name="test2", |
| 305 | + entities=[entity1, entity2], |
| 306 | + schema=[ |
| 307 | + Field(name="feature", dtype=Float32), |
| 308 | + Field(name="test_column_1", dtype=String), |
| 309 | + Field(name="test_column_2", dtype=String), |
| 310 | + ], |
| 311 | + source=file_source, |
| 312 | + ) |
| 313 | + |
| 314 | + assert len(feature_view_1.schema) == 2 |
| 315 | + assert len(feature_view_1.features) == 2 |
| 316 | + |
| 317 | + # The entity field should be deleted from the schema and features of the feature view. |
| 318 | + update_feature_views_with_inferred_features( |
| 319 | + [feature_view_1], [entity1], RepoConfig(provider="local", project="test") |
| 320 | + ) |
| 321 | + assert len(feature_view_1.schema) == 1 |
| 322 | + assert len(feature_view_1.features) == 1 |
| 323 | + |
| 324 | + assert len(feature_view_2.schema) == 3 |
| 325 | + assert len(feature_view_2.features) == 3 |
| 326 | + |
| 327 | + # The entity fields should be deleted from the schema and features of the feature view. |
| 328 | + update_feature_views_with_inferred_features( |
| 329 | + [feature_view_2], |
| 330 | + [entity1, entity2], |
| 331 | + RepoConfig(provider="local", project="test"), |
| 332 | + ) |
| 333 | + assert len(feature_view_2.schema) == 1 |
| 334 | + assert len(feature_view_2.features) == 1 |
0 commit comments