8282from feast .repo_contents import RepoContents
8383from feast .request_feature_view import RequestFeatureView
8484from 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+ )
8689from feast .usage import log_exceptions , log_exceptions_and_usage , set_usage_attribute
8790from feast .value_type import ValueType
8891from 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