diff --git a/sdk/python/feast/infra/offline_stores/remote.py b/sdk/python/feast/infra/offline_stores/remote.py index a5f50c7b45c..abe75ca57e5 100644 --- a/sdk/python/feast/infra/offline_stores/remote.py +++ b/sdk/python/feast/infra/offline_stores/remote.py @@ -197,6 +197,7 @@ def get_historical_features( registry: BaseRegistry, project: str, full_feature_names: bool = False, + **kwargs, ) -> RemoteRetrievalJob: assert isinstance(config.offline_store, RemoteOfflineStoreConfig) @@ -219,6 +220,15 @@ def get_historical_features( "name_aliases": name_aliases, } + # Extract and serialize start_date/end_date for remote transmission + start_date = kwargs.get("start_date", None) + end_date = kwargs.get("end_date", None) + + if start_date is not None: + api_parameters["start_date"] = start_date.isoformat() + if end_date is not None: + api_parameters["end_date"] = end_date.isoformat() + return RemoteRetrievalJob( client=client, api=OfflineStore.get_historical_features.__name__, diff --git a/sdk/python/feast/offline_server.py b/sdk/python/feast/offline_server.py index 776a0dfb96d..6bc573888fc 100644 --- a/sdk/python/feast/offline_server.py +++ b/sdk/python/feast/offline_server.py @@ -449,6 +449,17 @@ def get_historical_features(self, command: dict, key: Optional[str] = None): resource=feature_view, actions=[AuthzedAction.READ_OFFLINE] ) + # Extract and deserialize start_date/end_date if present + kwargs = {} + if "start_date" in command and command["start_date"] is not None: + kwargs["start_date"] = utils.make_tzaware( + datetime.fromisoformat(command["start_date"]) + ) + if "end_date" in command and command["end_date"] is not None: + kwargs["end_date"] = utils.make_tzaware( + datetime.fromisoformat(command["end_date"]) + ) + retJob = self.offline_store.get_historical_features( config=self.store.config, feature_views=feature_views, @@ -457,6 +468,7 @@ def get_historical_features(self, command: dict, key: Optional[str] = None): registry=self.store.registry, project=project, full_feature_names=full_feature_names, + **kwargs, ) return retJob