78
78
FieldStatus ,
79
79
GetOnlineFeaturesResponse ,
80
80
)
81
+ from feast .protos .feast .types .EntityKey_pb2 import EntityKey
81
82
from feast .protos .feast .types .Value_pb2 import RepeatedValue , Value
83
+ from feast .protos .feast .types .Value_pb2 import Value as ValueProto
82
84
from feast .repo_config import RepoConfig , load_repo_config
83
85
from feast .repo_contents import RepoContents
84
86
from feast .saved_dataset import SavedDataset , SavedDatasetStorage , ValidationReference
@@ -1666,20 +1668,29 @@ def retrieve_online_documents(
1666
1668
distance_metric ,
1667
1669
)
1668
1670
1669
- # TODO Refactor to better way of populating result
1670
- # TODO populate entity in the response after returning entity in document_features is supported
1671
1671
# TODO currently not return the vector value since it is same as feature value, if embedding is supported,
1672
1672
# the feature value can be raw text before embedded
1673
- document_feature_vals = [feature [2 ] for feature in document_features ]
1674
- document_feature_distance_vals = [feature [4 ] for feature in document_features ]
1673
+ entity_key_vals = [feature [1 ] for feature in document_features ]
1674
+ join_key_values : Dict [str , List [ValueProto ]] = {}
1675
+ for entity_key_val in entity_key_vals :
1676
+ if entity_key_val is not None :
1677
+ for join_key , entity_value in zip (
1678
+ entity_key_val .join_keys , entity_key_val .entity_values
1679
+ ):
1680
+ if join_key not in join_key_values :
1681
+ join_key_values [join_key ] = []
1682
+ join_key_values [join_key ].append (entity_value )
1683
+
1684
+ document_feature_vals = [feature [4 ] for feature in document_features ]
1685
+ document_feature_distance_vals = [feature [5 ] for feature in document_features ]
1675
1686
online_features_response = GetOnlineFeaturesResponse (results = [])
1676
1687
utils ._populate_result_rows_from_columnar (
1677
1688
online_features_response = online_features_response ,
1678
- data = {requested_feature : document_feature_vals },
1679
- )
1680
- utils . _populate_result_rows_from_columnar (
1681
- online_features_response = online_features_response ,
1682
- data = { "distance" : document_feature_distance_vals },
1689
+ data = {
1690
+ ** join_key_values ,
1691
+ requested_feature : document_feature_vals ,
1692
+ "distance" : document_feature_distance_vals ,
1693
+ },
1683
1694
)
1684
1695
return OnlineResponse (online_features_response )
1685
1696
@@ -1691,7 +1702,11 @@ def _retrieve_from_online_store(
1691
1702
query : List [float ],
1692
1703
top_k : int ,
1693
1704
distance_metric : Optional [str ],
1694
- ) -> List [Tuple [Timestamp , "FieldStatus.ValueType" , Value , Value , Value ]]:
1705
+ ) -> List [
1706
+ Tuple [
1707
+ Timestamp , Optional [EntityKey ], "FieldStatus.ValueType" , Value , Value , Value
1708
+ ]
1709
+ ]:
1695
1710
"""
1696
1711
Search and return document features from the online document store.
1697
1712
"""
@@ -1707,7 +1722,7 @@ def _retrieve_from_online_store(
1707
1722
read_row_protos = []
1708
1723
row_ts_proto = Timestamp ()
1709
1724
1710
- for row_ts , feature_val , vector_value , distance_val in documents :
1725
+ for row_ts , entity_key , feature_val , vector_value , distance_val in documents :
1711
1726
# Reset timestamp to default or update if row_ts is not None
1712
1727
if row_ts is not None :
1713
1728
row_ts_proto .FromDatetime (row_ts )
@@ -1721,7 +1736,14 @@ def _retrieve_from_online_store(
1721
1736
status = FieldStatus .PRESENT
1722
1737
1723
1738
read_row_protos .append (
1724
- (row_ts_proto , status , feature_val , vector_value , distance_val )
1739
+ (
1740
+ row_ts_proto ,
1741
+ entity_key ,
1742
+ status ,
1743
+ feature_val ,
1744
+ vector_value ,
1745
+ distance_val ,
1746
+ )
1725
1747
)
1726
1748
return read_row_protos
1727
1749
0 commit comments