@@ -1753,9 +1753,10 @@ async def get_online_features_async(
17531753
17541754 def retrieve_online_documents (
17551755 self ,
1756- feature : str ,
1756+ feature : Optional [ str ] ,
17571757 query : Union [str , List [float ]],
17581758 top_k : int ,
1759+ features : Optional [List [str ]] = None ,
17591760 distance_metric : Optional [str ] = None ,
17601761 ) -> OnlineResponse :
17611762 """
@@ -1765,6 +1766,7 @@ def retrieve_online_documents(
17651766 feature: The list of document features that should be retrieved from the online document store. These features can be
17661767 specified either as a list of string document feature references or as a feature service. String feature
17671768 references must have format "feature_view:feature", e.g, "document_fv:document_embeddings".
1769+ features: The list of features that should be retrieved from the online store.
17681770 query: The query to retrieve the closest document features for.
17691771 top_k: The number of closest document features to retrieve.
17701772 distance_metric: The distance metric to use for retrieval.
@@ -1773,18 +1775,44 @@ def retrieve_online_documents(
17731775 raise ValueError (
17741776 "Using embedding functionality is not supported for document retrieval. Please embed the query before calling retrieve_online_documents."
17751777 )
1778+ feature_list : List [str ] = (
1779+ features
1780+ if features is not None
1781+ else ([feature ] if feature is not None else [])
1782+ )
1783+
17761784 (
17771785 available_feature_views ,
17781786 _ ,
17791787 ) = utils ._get_feature_views_to_use (
17801788 registry = self ._registry ,
17811789 project = self .project ,
1782- features = [ feature ] ,
1790+ features = feature_list ,
17831791 allow_cache = True ,
17841792 hide_dummy_entity = False ,
17851793 )
1794+ if features :
1795+ feature_view_set = set ()
1796+ for feature in features :
1797+ feature_view_name = feature .split (":" )[0 ]
1798+ feature_view = self .get_feature_view (feature_view_name )
1799+ feature_view_set .add (feature_view .name )
1800+ if len (feature_view_set ) > 1 :
1801+ raise ValueError (
1802+ "Document retrieval only supports a single feature view."
1803+ )
1804+ requested_feature = None
1805+ requested_features = [
1806+ f .split (":" )[1 ] for f in features if isinstance (f , str ) and ":" in f
1807+ ]
1808+ else :
1809+ requested_feature = (
1810+ feature .split (":" )[1 ] if isinstance (feature , str ) else feature
1811+ )
1812+ requested_features = [requested_feature ] if requested_feature else []
1813+
17861814 requested_feature_view_name = (
1787- feature .split (":" )[0 ] if isinstance ( feature , str ) else feature
1815+ feature .split (":" )[0 ] if feature else list ( feature_view_set )[ 0 ]
17881816 )
17891817 for feature_view in available_feature_views :
17901818 if feature_view .name == requested_feature_view_name :
@@ -1793,14 +1821,15 @@ def retrieve_online_documents(
17931821 raise ValueError (
17941822 f"Feature view { requested_feature_view } not found in the registry."
17951823 )
1796- requested_feature = (
1797- feature . split ( ":" )[ 1 ] if isinstance ( feature , str ) else feature
1798- )
1824+
1825+ requested_feature_view = available_feature_views [ 0 ]
1826+
17991827 provider = self ._get_provider ()
18001828 document_features = self ._retrieve_from_online_store (
18011829 provider ,
18021830 requested_feature_view ,
18031831 requested_feature ,
1832+ requested_features ,
18041833 query ,
18051834 top_k ,
18061835 distance_metric ,
@@ -1822,6 +1851,7 @@ def retrieve_online_documents(
18221851 document_feature_vals = [feature [4 ] for feature in document_features ]
18231852 document_feature_distance_vals = [feature [5 ] for feature in document_features ]
18241853 online_features_response = GetOnlineFeaturesResponse (results = [])
1854+ requested_feature = requested_feature or requested_features [0 ]
18251855 utils ._populate_result_rows_from_columnar (
18261856 online_features_response = online_features_response ,
18271857 data = {
@@ -1836,7 +1866,8 @@ def _retrieve_from_online_store(
18361866 self ,
18371867 provider : Provider ,
18381868 table : FeatureView ,
1839- requested_feature : str ,
1869+ requested_feature : Optional [str ],
1870+ requested_features : Optional [List [str ]],
18401871 query : List [float ],
18411872 top_k : int ,
18421873 distance_metric : Optional [str ],
@@ -1852,6 +1883,7 @@ def _retrieve_from_online_store(
18521883 config = self .config ,
18531884 table = table ,
18541885 requested_feature = requested_feature ,
1886+ requested_features = requested_features ,
18551887 query = query ,
18561888 top_k = top_k ,
18571889 distance_metric = distance_metric ,
@@ -1952,19 +1984,13 @@ def serve_ui(
19521984 )
19531985
19541986 def serve_registry (
1955- self ,
1956- port : int ,
1957- tls_key_path : str = "" ,
1958- tls_cert_path : str = "" ,
1987+ self , port : int , tls_key_path : str = "" , tls_cert_path : str = ""
19591988 ) -> None :
19601989 """Start registry server locally on a given port."""
19611990 from feast import registry_server
19621991
19631992 registry_server .start_server (
1964- self ,
1965- port = port ,
1966- tls_key_path = tls_key_path ,
1967- tls_cert_path = tls_cert_path ,
1993+ self , port = port , tls_key_path = tls_key_path , tls_cert_path = tls_cert_path
19681994 )
19691995
19701996 def serve_offline (
0 commit comments