Skip to content

Commit 7ea615a

Browse files
committed
Convert proto values to native values to support Go feature server
Signed-off-by: Felix Wang <wangfelix98@gmail.com>
1 parent 772a8e0 commit 7ea615a

File tree

1 file changed

+26
-8
lines changed

1 file changed

+26
-8
lines changed

sdk/python/feast/feature_store.py

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,10 @@
8282
from feast.repo_contents import RepoContents
8383
from feast.request_feature_view import RequestFeatureView
8484
from feast.saved_dataset import SavedDataset, SavedDatasetStorage
85-
from feast.type_map import python_values_to_proto_values
85+
from feast.type_map import (
86+
feast_value_type_to_python_type,
87+
python_values_to_proto_values,
88+
)
8689
from feast.usage import log_exceptions, log_exceptions_and_usage, set_usage_attribute
8790
from feast.value_type import ValueType
8891
from feast.version import get_version
@@ -1301,6 +1304,12 @@ def _get_online_features(
13011304
full_feature_names: bool = False,
13021305
native_entity_values: bool = True,
13031306
):
1307+
# Extract Sequence from RepeatedValue Protobuf.
1308+
entity_value_lists: Dict[str, Union[List[Any], List[Value]]] = {
1309+
k: list(v) if isinstance(v, Sequence) else list(v.val)
1310+
for k, v in entity_values.items()
1311+
}
1312+
13041313
# If Go feature server is enabled, send request to it instead of going through regular Python logic
13051314
if self.config.go_feature_server:
13061315
from feast.embedded_go.online_features_service import (
@@ -1313,12 +1322,27 @@ def _get_online_features(
13131322
str(self.repo_path.absolute()), self.config, self
13141323
)
13151324

1325+
entity_native_values: Dict[str, List[Any]]
1326+
if not native_entity_values:
1327+
# Convert proto types to native types since Go feature server currently
1328+
# only handles native types.
1329+
# TODO(felixwang9817): Remove this logic once native types are supported.
1330+
entity_native_values = {
1331+
k: [
1332+
feast_value_type_to_python_type(proto_value)
1333+
for proto_value in v
1334+
]
1335+
for k, v in entity_value_lists.items()
1336+
}
1337+
else:
1338+
entity_native_values = entity_value_lists
1339+
13161340
return self._go_server.get_online_features(
13171341
features_refs=features if isinstance(features, list) else [],
13181342
feature_service=features
13191343
if isinstance(features, FeatureService)
13201344
else None,
1321-
entities=entity_values,
1345+
entities=entity_native_values,
13221346
request_data={}, # TODO: add request data parameter to public API
13231347
full_feature_names=full_feature_names,
13241348
)
@@ -1345,12 +1369,6 @@ def _get_online_features(
13451369
join_keys_set,
13461370
) = self._get_entity_maps(requested_feature_views)
13471371

1348-
# Extract Sequence from RepeatedValue Protobuf.
1349-
entity_value_lists: Dict[str, Union[List[Any], List[Value]]] = {
1350-
k: list(v) if isinstance(v, Sequence) else list(v.val)
1351-
for k, v in entity_values.items()
1352-
}
1353-
13541372
entity_proto_values: Dict[str, List[Value]]
13551373
if native_entity_values:
13561374
# Convert values to Protobuf once.

0 commit comments

Comments
 (0)