Skip to content

Commit d66c931

Browse files
fix: Switch from join_key to join_keys in tests and docs (#2580)
* Switch from `join_key` to `join_keys` in tests and docs Signed-off-by: Felix Wang <wangfelix98@gmail.com> * Convert iterator to list so it can be used repeatedly Signed-off-by: Felix Wang <wangfelix98@gmail.com> * Format Signed-off-by: Felix Wang <wangfelix98@gmail.com>
1 parent f372981 commit d66c931

16 files changed

+35
-31
lines changed

docs/getting-started/concepts/entity.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
An entity is a collection of semantically related features. Users define entities to map to the domain of their use case. For example, a ride-hailing service could have customers and drivers as their entities, which group related features that correspond to these customers and drivers.
44

55
```python
6-
driver = Entity(name='driver', value_type=ValueType.STRING, join_key='driver_id')
6+
driver = Entity(name='driver', value_type=ValueType.STRING, join_keys=['driver_id'])
77
```
88

99
Entities are typically defined as part of feature views. Entity name is used to reference the entity from a feature view definition and join key is used to identify the physical primary key on which feature values should be stored and retrieved. These keys are used during the lookup of feature values from the online store and the join process in point-in-time joins. It is possible to define composite entities \(more than one entity object\) in a feature view. It is also possible for feature views to have zero entities. See [feature view](feature-view.md) for more details.

docs/getting-started/concepts/feature-view.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ It is suggested that you dynamically specify the new FeatureView name using `.wi
7979
from feast import BigQuerySource, Entity, FeatureView, Field, ValueType
8080
from feast.types import Int32
8181

82-
location = Entity(name="location", join_key="location_id", value_type=ValueType.INT64)
82+
location = Entity(name="location", join_keys=["location_id"], value_type=ValueType.INT64)
8383

8484
location_stats_fv= FeatureView(
8585
name="location_stats",

docs/getting-started/quickstart.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ driver_hourly_stats = FileSource(
9898
# fetch features.
9999
# Entity has a name used for later reference (in a feature view, eg)
100100
# and join_key to identify physical field name used in storages
101-
driver = Entity(name="driver", value_type=ValueType.INT64, join_key="driver_id", description="driver id",)
101+
driver = Entity(name="driver", value_type=ValueType.INT64, join_keys=["driver_id"], description="driver id",)
102102

103103
# Our parquet files contain sample data that includes a driver_id column, timestamps and
104104
# three feature column. Here we define a Feature View that will allow us to serve this
@@ -168,7 +168,7 @@ driver_hourly_stats = FileSource(
168168
# fetch features.
169169
# Entity has a name used for later reference (in a feature view, eg)
170170
# and join_key to identify physical field name used in storages
171-
driver = Entity(name="driver", value_type=ValueType.INT64, join_key="driver_id", description="driver id",)
171+
driver = Entity(name="driver", value_type=ValueType.INT64, join_keys=["driver_id"], description="driver id",)
172172

173173
# Our parquet files contain sample data that includes a driver_id column, timestamps and
174174
# three feature column. Here we define a Feature View that will allow us to serve this

docs/tutorials/validating-historical-features.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ batch_source = FileSource(
129129

130130

131131
```python
132-
taxi_entity = Entity(name='taxi', join_key='taxi_id')
132+
taxi_entity = Entity(name='taxi', join_keys=['taxi_id'])
133133
```
134134

135135

sdk/python/feast/feature_view.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
DUMMY_ENTITY_NAME = "__dummy"
4646
DUMMY_ENTITY_VAL = ""
4747
DUMMY_ENTITY = Entity(
48-
name=DUMMY_ENTITY_NAME, join_key=DUMMY_ENTITY_ID, value_type=ValueType.STRING,
48+
name=DUMMY_ENTITY_NAME, join_keys=[DUMMY_ENTITY_ID], value_type=ValueType.STRING,
4949
)
5050

5151

sdk/python/feast/inference.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ def update_entities_with_inferred_types_from_feature_views(
3232
if not (incomplete_entities_keys & set(view.entities)):
3333
continue # skip if view doesn't contain any entities that need inference
3434

35-
col_names_and_types = view.batch_source.get_table_column_names_and_types(config)
35+
col_names_and_types = list(
36+
view.batch_source.get_table_column_names_and_types(config)
37+
)
3638
for entity_name in view.entities:
3739
if entity_name in incomplete_entities:
3840
entity = incomplete_entities[entity_name]

sdk/python/feast/templates/aws/driver_repo.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@
99
driver = Entity(
1010
# Name of the entity. Must be unique within a project
1111
name="driver",
12-
# The join key of an entity describes the storage level field/column on which
13-
# features can be looked up. The join key is also used to join feature
12+
# The join keys of an entity describe the storage level field/column on which
13+
# features can be looked up. The join keys are also used to join feature
1414
# tables/views when building feature vectors
15-
join_key="driver_id",
15+
join_keys=["driver_id"],
1616
# The storage level type for an entity
1717
value_type=ValueType.INT64,
1818
)

sdk/python/feast/templates/gcp/driver_repo.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@
99
driver = Entity(
1010
# Name of the entity. Must be unique within a project
1111
name="driver",
12-
# The join key of an entity describes the storage level field/column on which
13-
# features can be looked up. The join key is also used to join feature
12+
# The join keys of an entity describe the storage level field/column on which
13+
# features can be looked up. The join keys are also used to join feature
1414
# tables/views when building feature vectors
15-
join_key="driver_id",
15+
join_keys=["driver_id"],
1616
# The storage level type for an entity
1717
value_type=ValueType.INT64,
1818
)

sdk/python/feast/templates/local/example.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
# Define an entity for the driver. You can think of entity as a primary key used to
1818
# fetch features.
19-
driver = Entity(name="driver", join_key="driver_id", value_type=ValueType.INT64,)
19+
driver = Entity(name="driver", join_keys=["driver_id"], value_type=ValueType.INT64,)
2020

2121
# Our parquet files contain sample data that includes a driver_id column, timestamps and
2222
# three feature column. Here we define a Feature View that will allow us to serve this

sdk/python/feast/templates/snowflake/driver_repo.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@
1111
driver = Entity(
1212
# Name of the entity. Must be unique within a project
1313
name="driver",
14-
# The join key of an entity describes the storage level field/column on which
15-
# features can be looked up. The join key is also used to join feature
14+
# The join keys of an entity describe the storage level field/column on which
15+
# features can be looked up. The join keys are also used to join feature
1616
# tables/views when building feature vectors
17-
join_key="driver_id",
17+
join_keys=["driver_id"],
1818
)
1919

2020
# Indicates a data source from which feature values can be retrieved. Sources are queried when building training

sdk/python/tests/example_repos/example_feature_repo_1.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,14 @@
4545

4646
driver = Entity(
4747
name="driver", # The name is derived from this argument, not object name.
48-
join_key="driver_id",
48+
join_keys=["driver_id"],
4949
value_type=ValueType.INT64,
5050
description="driver id",
5151
)
5252

5353
customer = Entity(
5454
name="customer", # The name is derived from this argument, not object name.
55-
join_key="customer_id",
55+
join_keys=["customer_id"],
5656
value_type=ValueType.STRING,
5757
)
5858

sdk/python/tests/example_repos/example_feature_repo_with_entity_join_key.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
name="driver_id",
1616
value_type=ValueType.INT64,
1717
description="driver id",
18-
join_key="driver",
18+
join_keys=["driver"],
1919
)
2020

2121

sdk/python/tests/integration/feature_repos/universal/entities.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ def driver(value_type: ValueType = ValueType.INT64):
66
name="driver", # The name is derived from this argument, not object name.
77
value_type=value_type,
88
description="driver id",
9-
join_key="driver_id",
9+
join_keys=["driver_id"],
1010
)
1111

1212

sdk/python/tests/integration/offline_store/test_universal_historical_retrieval.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -689,7 +689,7 @@ def test_historical_features_from_bigquery_sources_containing_backfills(environm
689689
created_timestamp_column="created",
690690
)
691691

692-
driver = Entity(name="driver", join_key="driver_id", value_type=ValueType.INT64)
692+
driver = Entity(name="driver", join_keys=["driver_id"], value_type=ValueType.INT64)
693693
driver_fv = FeatureView(
694694
name="driver_stats",
695695
entities=["driver"],

sdk/python/tests/integration/registration/test_feature_store.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,9 @@ def test_feature_view_inference_success(test_feature_store, dataframe_source):
219219
with prep_file_source(
220220
df=dataframe_source, event_timestamp_column="ts_1"
221221
) as file_source:
222-
entity = Entity(name="id", join_key="id_join_key", value_type=ValueType.INT64)
222+
entity = Entity(
223+
name="id", join_keys=["id_join_key"], value_type=ValueType.INT64
224+
)
223225

224226
fv1 = FeatureView(
225227
name="fv1",
@@ -436,7 +438,7 @@ def test_reapply_feature_view_success(test_feature_store, dataframe_source):
436438
df=dataframe_source, event_timestamp_column="ts_1"
437439
) as file_source:
438440

439-
e = Entity(name="id", join_key="id_join_key", value_type=ValueType.STRING)
441+
e = Entity(name="id", join_keys=["id_join_key"], value_type=ValueType.STRING)
440442

441443
# Create Feature View
442444
fv1 = FeatureView(

sdk/python/tests/integration/registration/test_inference.py

+7-7
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ def test_update_entities_with_inferred_types_from_feature_views(
5454
name="fv2", entities=["id"], batch_source=file_source_2, ttl=None,
5555
)
5656

57-
actual_1 = Entity(name="id", join_key="id_join_key")
58-
actual_2 = Entity(name="id", join_key="id_join_key")
57+
actual_1 = Entity(name="id", join_keys=["id_join_key"])
58+
actual_2 = Entity(name="id", join_keys=["id_join_key"])
5959

6060
update_entities_with_inferred_types_from_feature_views(
6161
[actual_1], [fv1], RepoConfig(provider="local", project="test")
@@ -64,16 +64,16 @@ def test_update_entities_with_inferred_types_from_feature_views(
6464
[actual_2], [fv2], RepoConfig(provider="local", project="test")
6565
)
6666
assert actual_1 == Entity(
67-
name="id", join_key="id_join_key", value_type=ValueType.INT64
67+
name="id", join_keys=["id_join_key"], value_type=ValueType.INT64
6868
)
6969
assert actual_2 == Entity(
70-
name="id", join_key="id_join_key", value_type=ValueType.STRING
70+
name="id", join_keys=["id_join_key"], value_type=ValueType.STRING
7171
)
7272

7373
with pytest.raises(RegistryInferenceFailure):
7474
# two viable data types
7575
update_entities_with_inferred_types_from_feature_views(
76-
[Entity(name="id", join_key="id_join_key")],
76+
[Entity(name="id", join_keys=["id_join_key"])],
7777
[fv1, fv2],
7878
RepoConfig(provider="local", project="test"),
7979
)
@@ -289,8 +289,8 @@ def test_view_with_missing_feature(features_df: pd.DataFrame) -> pd.DataFrame:
289289

290290
def test_update_feature_views_with_inferred_features():
291291
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")
292+
entity1 = Entity(name="test1", join_keys=["test_column_1"])
293+
entity2 = Entity(name="test2", join_keys=["test_column_2"])
294294
feature_view_1 = FeatureView(
295295
name="test1",
296296
entities=[entity1],

0 commit comments

Comments
 (0)