Skip to content

Commit 41aaeeb

Browse files
fix: Fixing failure of protos during ODFV transformations for missing entities (feast-dev#4667)
1 parent a1ff129 commit 41aaeeb

File tree

2 files changed

+32
-18
lines changed

2 files changed

+32
-18
lines changed

sdk/python/feast/utils.py

+19-5
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
from feast.protos.feast.types.Value_pb2 import RepeatedValue as RepeatedValueProto
4343
from feast.protos.feast.types.Value_pb2 import Value as ValueProto
4444
from feast.type_map import python_values_to_proto_values
45-
from feast.types import from_feast_to_pyarrow_type
45+
from feast.types import ComplexFeastType, PrimitiveFeastType, from_feast_to_pyarrow_type
4646
from feast.value_type import ValueType
4747
from feast.version import get_version
4848

@@ -552,13 +552,27 @@ def _augment_response_with_on_demand_transforms(
552552
selected_subset = [f for f in transformed_columns if f in _feature_refs]
553553

554554
proto_values = []
555+
schema_dict = {k.name: k.dtype for k in odfv.schema}
555556
for selected_feature in selected_subset:
556557
feature_vector = transformed_features[selected_feature]
558+
selected_feature_type = schema_dict.get(selected_feature, None)
559+
feature_type: ValueType = ValueType.UNKNOWN
560+
if selected_feature_type is not None:
561+
if isinstance(
562+
selected_feature_type, (ComplexFeastType, PrimitiveFeastType)
563+
):
564+
feature_type = selected_feature_type.to_value_type()
565+
elif not isinstance(selected_feature_type, ValueType):
566+
raise TypeError(
567+
f"Unexpected type for feature_type: {type(feature_type)}"
568+
)
569+
557570
proto_values.append(
558-
python_values_to_proto_values(feature_vector, ValueType.UNKNOWN)
559-
if odfv.mode == "python"
560-
else python_values_to_proto_values(
561-
feature_vector.to_numpy(), ValueType.UNKNOWN
571+
python_values_to_proto_values(
572+
feature_vector
573+
if odfv.mode == "python"
574+
else feature_vector.to_numpy(),
575+
feature_type,
562576
)
563577
)
564578

sdk/python/tests/unit/test_on_demand_python_transformation.py

+13-13
Original file line numberDiff line numberDiff line change
@@ -609,19 +609,19 @@ def pandas_view(features_df: pd.DataFrame) -> pd.DataFrame:
609609
"val_to_add",
610610
"val_to_add_2",
611611
]
612-
with pytest.raises(TypeError):
613-
_ = self.store.get_online_features(
614-
entity_rows=[
615-
{"driver_id": 1234567890, "val_to_add": 0, "val_to_add_2": 1}
616-
],
617-
features=[
618-
"driver_hourly_stats:conv_rate",
619-
"driver_hourly_stats:acc_rate",
620-
"driver_hourly_stats:avg_daily_trips",
621-
"pandas_view:conv_rate_plus_val1",
622-
"pandas_view:conv_rate_plus_val2",
623-
],
624-
)
612+
resp_online_missing_entity = self.store.get_online_features(
613+
entity_rows=[
614+
{"driver_id": 1234567890, "val_to_add": 0, "val_to_add_2": 1}
615+
],
616+
features=[
617+
"driver_hourly_stats:conv_rate",
618+
"driver_hourly_stats:acc_rate",
619+
"driver_hourly_stats:avg_daily_trips",
620+
"pandas_view:conv_rate_plus_val1",
621+
"pandas_view:conv_rate_plus_val2",
622+
],
623+
)
624+
assert resp_online_missing_entity is not None
625625
resp_online = self.store.get_online_features(
626626
entity_rows=[{"driver_id": 1001, "val_to_add": 0, "val_to_add_2": 1}],
627627
features=[

0 commit comments

Comments
 (0)