We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
requested_features are not passed to online_read() from passthrough_provider
`OnlineStore.online_read()` has a parameter `requested_features`. Similarly, `PassthroughProvider.online_read()` also has a parameter `requested_features`.
`PassthroughProvider.online_read()`  calls `OnlineStore.online_read()` but doesn't pass on the `requested_features` variable.
I am writing a new OnlineStore where I need the `requested_features` in `OnlineStore.online_read()`.

## Issue Detected 
In [feast/infra/passthrough_provider.py#L90](https://github.com/feast-dev/feast/blob/2d3cea1d1485d0af1a35a7f30abfed475b58973a/sdk/python/feast/infra/passthrough_provider.py#L90)
```
def online_read(
        self,
        config: RepoConfig,
        table: Union[FeatureTable, FeatureView],
        entity_keys: List[EntityKeyProto],
        requested_features: List[str] = None,
    ) -> List[Tuple[Optional[datetime], Optional[Dict[str, ValueProto]]]]:
        set_usage_attribute("provider", self.__class__.__name__)
        result = self.online_store.online_read(config, table, entity_keys) # should also pass requested_features

        return result
```

- Version: 0.15.1
- Platform: all
- Subsystem: all

## Possible Solution

In [feast/infra/passthrough_provider.py#L90](https://github.com/feast-dev/feast/blob/2d3cea1d1485d0af1a35a7f30abfed475b58973a/sdk/python/feast/infra/passthrough_provider.py#L90)
`result = self.online_store.online_read(config, table, entity_keys)` 
change to 
`result = self.online_store.online_read(config, table, entity_keys, requested_features)`

Note: This won't break any of the current tests since none of the Online store implementation uses requested_features in online_read() method.

If it was as per design, can someone explain why the variable `requested_features` was not passed on? 


--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `sdk/python/feast/infra/passthrough_provider.py`
Content:
```
1 from datetime import datetime
2 from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union
3 
4 import pandas
5 import pyarrow as pa
6 from tqdm import tqdm
7 
8 from feast.entity import Entity
9 from feast.feature_table import FeatureTable
10 from feast.feature_view import FeatureView
11 from feast.infra.offline_stores.offline_store import RetrievalJob
12 from feast.infra.offline_stores.offline_utils import get_offline_store_from_config
13 from feast.infra.online_stores.helpers import get_online_store_from_config
14 from feast.infra.provider import (
15     Provider,
16     _convert_arrow_to_proto,
17     _get_column_names,
18     _run_field_mapping,
19 )
20 from feast.protos.feast.types.EntityKey_pb2 import EntityKey as EntityKeyProto
21 from feast.protos.feast.types.Value_pb2 import Value as ValueProto
22 from feast.registry import Registry
23 from feast.repo_config import RepoConfig
24 from feast.usage import RatioSampler, log_exceptions_and_usage, set_usage_attribute
25 
26 DEFAULT_BATCH_SIZE = 10_000
27 
28 
29 class PassthroughProvider(Provider):
30     """
31     The Passthrough provider delegates all operations to the underlying online and offline stores.
32     """
33 
34     def __init__(self, config: RepoConfig):
35         super().__init__(config)
36 
37         self.repo_config = config
38         self.offline_store = get_offline_store_from_config(config.offline_store)
39         self.online_store = get_online_store_from_config(config.online_store)
40 
41     def update_infra(
42         self,
43         project: str,
44         tables_to_delete: Sequence[Union[FeatureTable, FeatureView]],
45         tables_to_keep: Sequence[Union[FeatureTable, FeatureView]],
46         entities_to_delete: Sequence[Entity],
47         entities_to_keep: Sequence[Entity],
48         partial: bool,
49     ):
50         set_usage_attribute("provider", self.__class__.__name__)
51         self.online_store.update(
52             config=self.repo_config,
53             tables_to_delete=tables_to_delete,
54             tables_to_keep=tables_to_keep,
55             entities_to_keep=entities_to_keep,
56             entities_to_delete=entities_to_delete,
57             partial=partial,
58         )
59 
60     def teardown_infra(
61         self,
62         project: str,
63         tables: Sequence[Union[FeatureTable, FeatureView]],
64         entities: Sequence[Entity],
65     ) -> None:
66         set_usage_attribute("provider", self.__class__.__name__)
67         self.online_store.teardown(self.repo_config, tables, entities)
68 
69     def online_write_batch(
70         self,
71         config: RepoConfig,
72         table: Union[FeatureTable, FeatureView],
73         data: List[
74             Tuple[EntityKeyProto, Dict[str, ValueProto], datetime, Optional[datetime]]
75         ],
76         progress: Optional[Callable[[int], Any]],
77     ) -> None:
78         set_usage_attribute("provider", self.__class__.__name__)
79         self.online_store.online_write_batch(config, table, data, progress)
80 
81     @log_exceptions_and_usage(sampler=RatioSampler(ratio=0.001))
82     def online_read(
83         self,
84         config: RepoConfig,
85         table: Union[FeatureTable, FeatureView],
86         entity_keys: List[EntityKeyProto],
87         requested_features: List[str] = None,
88     ) -> List[Tuple[Optional[datetime], Optional[Dict[str, ValueProto]]]]:
89         set_usage_attribute("provider", self.__class__.__name__)
90         result = self.online_store.online_read(config, table, entity_keys)
91 
92         return result
93 
94     def ingest_df(
95         self, feature_view: FeatureView, entities: List[Entity], df: pandas.DataFrame,
96     ):
97         set_usage_attribute("provider", self.__class__.__name__)
98         table = pa.Table.from_pandas(df)
99 
100         if feature_view.batch_source.field_mapping is not None:
101             table = _run_field_mapping(table, feature_view.batch_source.field_mapping)
102 
103         join_keys = [entity.join_key for entity in entities]
104         rows_to_write = _convert_arrow_to_proto(table, feature_view, join_keys)
105 
106         self.online_write_batch(
107             self.repo_config, feature_view, rows_to_write, progress=None
108         )
109 
110     def materialize_single_feature_view(
111         self,
112         config: RepoConfig,
113         feature_view: FeatureView,
114         start_date: datetime,
115         end_date: datetime,
116         registry: Registry,
117         project: str,
118         tqdm_builder: Callable[[int], tqdm],
119     ) -> None:
120         set_usage_attribute("provider", self.__class__.__name__)
121 
122         entities = []
123         for entity_name in feature_view.entities:
124             entities.append(registry.get_entity(entity_name, project))
125 
126         (
127             join_key_columns,
128             feature_name_columns,
129             event_timestamp_column,
130             created_timestamp_column,
131         ) = _get_column_names(feature_view, entities)
132 
133         offline_job = self.offline_store.pull_latest_from_table_or_query(
134             config=config,
135             data_source=feature_view.batch_source,
136             join_key_columns=join_key_columns,
137             feature_name_columns=feature_name_columns,
138             event_timestamp_column=event_timestamp_column,
139             created_timestamp_column=created_timestamp_column,
140             start_date=start_date,
141             end_date=end_date,
142         )
143 
144         table = offline_job.to_arrow()
145 
146         if feature_view.batch_source.field_mapping is not None:
147             table = _run_field_mapping(table, feature_view.batch_source.field_mapping)
148 
149         join_keys = [entity.join_key for entity in entities]
150 
151         with tqdm_builder(table.num_rows) as pbar:
152             for batch in table.to_batches(DEFAULT_BATCH_SIZE):
153                 rows_to_write = _convert_arrow_to_proto(batch, feature_view, join_keys)
154                 self.online_write_batch(
155                     self.repo_config,
156                     feature_view,
157                     rows_to_write,
158                     lambda x: pbar.update(x),
159                 )
160 
161     def get_historical_features(
162         self,
163         config: RepoConfig,
164         feature_views: List[FeatureView],
165         feature_refs: List[str],
166         entity_df: Union[pandas.DataFrame, str],
167         registry: Registry,
168         project: str,
169         full_feature_names: bool,
170     ) -> RetrievalJob:
171         set_usage_attribute("provider", self.__class__.__name__)
172 
173         job = self.offline_store.get_historical_features(
174             config=config,
175             feature_views=feature_views,
176             feature_refs=feature_refs,
177             entity_df=entity_df,
178             registry=registry,
179             project=project,
180             full_feature_names=full_feature_names,
181         )
182         return job
183
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/sdk/python/feast/infra/passthrough_provider.py b/sdk/python/feast/infra/passthrough_provider.py
--- a/sdk/python/feast/infra/passthrough_provider.py
+++ b/sdk/python/feast/infra/passthrough_provider.py
@@ -87,7 +87,9 @@
         requested_features: List[str] = None,
     ) -> List[Tuple[Optional[datetime], Optional[Dict[str, ValueProto]]]]:
         set_usage_attribute("provider", self.__class__.__name__)
-        result = self.online_store.online_read(config, table, entity_keys)
+        result = self.online_store.online_read(
+            config, table, entity_keys, requested_features
+        )
 
         return result

{"golden_diff": "diff --git a/sdk/python/feast/infra/passthrough_provider.py b/sdk/python/feast/infra/passthrough_provider.py\n--- a/sdk/python/feast/infra/passthrough_provider.py\n+++ b/sdk/python/feast/infra/passthrough_provider.py\n@@ -87,7 +87,9 @@\n         requested_features: List[str] = None,\n     ) -> List[Tuple[Optional[datetime], Optional[Dict[str, ValueProto]]]]:\n         set_usage_attribute(\"provider\", self.__class__.__name__)\n-        result = self.online_store.online_read(config, table, entity_keys)\n+        result = self.online_store.online_read(\n+            config, table, entity_keys, requested_features\n+        )\n \n         return result\n", "issue": "requested_features are not passed to online_read() from passthrough_provider\n`OnlineStore.online_read()` has a parameter `requested_features`. Similarly, `PassthroughProvider.online_read()` also has a parameter `requested_features`.\r\n`PassthroughProvider.online_read()`  calls `OnlineStore.online_read()` but doesn't pass on the `requested_features` variable.\r\nI am writing a new OnlineStore where I need the `requested_features` in `OnlineStore.online_read()`.\r\n\r\n## Issue Detected \r\nIn [feast/infra/passthrough_provider.py#L90](https://github.com/feast-dev/feast/blob/2d3cea1d1485d0af1a35a7f30abfed475b58973a/sdk/python/feast/infra/passthrough_provider.py#L90)\r\n```\r\ndef online_read(\r\n        self,\r\n        config: RepoConfig,\r\n        table: Union[FeatureTable, FeatureView],\r\n        entity_keys: List[EntityKeyProto],\r\n        requested_features: List[str] = None,\r\n    ) -> List[Tuple[Optional[datetime], Optional[Dict[str, ValueProto]]]]:\r\n        set_usage_attribute(\"provider\", self.__class__.__name__)\r\n        result = self.online_store.online_read(config, table, entity_keys) # should also pass requested_features\r\n\r\n        return result\r\n```\r\n\r\n- Version: 0.15.1\r\n- Platform: all\r\n- Subsystem: all\r\n\r\n## Possible Solution\r\n\r\nIn [feast/infra/passthrough_provider.py#L90](https://github.com/feast-dev/feast/blob/2d3cea1d1485d0af1a35a7f30abfed475b58973a/sdk/python/feast/infra/passthrough_provider.py#L90)\r\n`result = self.online_store.online_read(config, table, entity_keys)` \r\nchange to \r\n`result = self.online_store.online_read(config, table, entity_keys, requested_features)`\r\n\r\nNote: This won't break any of the current tests since none of the Online store implementation uses requested_features in online_read() method.\r\n\r\nIf it was as per design, can someone explain why the variable `requested_features` was not passed on? \r\n\n", "before_files": [{"content": "from datetime import datetime\nfrom typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union\n\nimport pandas\nimport pyarrow as pa\nfrom tqdm import tqdm\n\nfrom feast.entity import Entity\nfrom feast.feature_table import FeatureTable\nfrom feast.feature_view import FeatureView\nfrom feast.infra.offline_stores.offline_store import RetrievalJob\nfrom feast.infra.offline_stores.offline_utils import get_offline_store_from_config\nfrom feast.infra.online_stores.helpers import get_online_store_from_config\nfrom feast.infra.provider import (\n    Provider,\n    _convert_arrow_to_proto,\n    _get_column_names,\n    _run_field_mapping,\n)\nfrom feast.protos.feast.types.EntityKey_pb2 import EntityKey as EntityKeyProto\nfrom feast.protos.feast.types.Value_pb2 import Value as ValueProto\nfrom feast.registry import Registry\nfrom feast.repo_config import RepoConfig\nfrom feast.usage import RatioSampler, log_exceptions_and_usage, set_usage_attribute\n\nDEFAULT_BATCH_SIZE = 10_000\n\n\nclass PassthroughProvider(Provider):\n    \"\"\"\n    The Passthrough provider delegates all operations to the underlying online and offline stores.\n    \"\"\"\n\n    def __init__(self, config: RepoConfig):\n        super().__init__(config)\n\n        self.repo_config = config\n        self.offline_store = get_offline_store_from_config(config.offline_store)\n        self.online_store = get_online_store_from_config(config.online_store)\n\n    def update_infra(\n        self,\n        project: str,\n        tables_to_delete: Sequence[Union[FeatureTable, FeatureView]],\n        tables_to_keep: Sequence[Union[FeatureTable, FeatureView]],\n        entities_to_delete: Sequence[Entity],\n        entities_to_keep: Sequence[Entity],\n        partial: bool,\n    ):\n        set_usage_attribute(\"provider\", self.__class__.__name__)\n        self.online_store.update(\n            config=self.repo_config,\n            tables_to_delete=tables_to_delete,\n            tables_to_keep=tables_to_keep,\n            entities_to_keep=entities_to_keep,\n            entities_to_delete=entities_to_delete,\n            partial=partial,\n        )\n\n    def teardown_infra(\n        self,\n        project: str,\n        tables: Sequence[Union[FeatureTable, FeatureView]],\n        entities: Sequence[Entity],\n    ) -> None:\n        set_usage_attribute(\"provider\", self.__class__.__name__)\n        self.online_store.teardown(self.repo_config, tables, entities)\n\n    def online_write_batch(\n        self,\n        config: RepoConfig,\n        table: Union[FeatureTable, FeatureView],\n        data: List[\n            Tuple[EntityKeyProto, Dict[str, ValueProto], datetime, Optional[datetime]]\n        ],\n        progress: Optional[Callable[[int], Any]],\n    ) -> None:\n        set_usage_attribute(\"provider\", self.__class__.__name__)\n        self.online_store.online_write_batch(config, table, data, progress)\n\n    @log_exceptions_and_usage(sampler=RatioSampler(ratio=0.001))\n    def online_read(\n        self,\n        config: RepoConfig,\n        table: Union[FeatureTable, FeatureView],\n        entity_keys: List[EntityKeyProto],\n        requested_features: List[str] = None,\n    ) -> List[Tuple[Optional[datetime], Optional[Dict[str, ValueProto]]]]:\n        set_usage_attribute(\"provider\", self.__class__.__name__)\n        result = self.online_store.online_read(config, table, entity_keys)\n\n        return result\n\n    def ingest_df(\n        self, feature_view: FeatureView, entities: List[Entity], df: pandas.DataFrame,\n    ):\n        set_usage_attribute(\"provider\", self.__class__.__name__)\n        table = pa.Table.from_pandas(df)\n\n        if feature_view.batch_source.field_mapping is not None:\n            table = _run_field_mapping(table, feature_view.batch_source.field_mapping)\n\n        join_keys = [entity.join_key for entity in entities]\n        rows_to_write = _convert_arrow_to_proto(table, feature_view, join_keys)\n\n        self.online_write_batch(\n            self.repo_config, feature_view, rows_to_write, progress=None\n        )\n\n    def materialize_single_feature_view(\n        self,\n        config: RepoConfig,\n        feature_view: FeatureView,\n        start_date: datetime,\n        end_date: datetime,\n        registry: Registry,\n        project: str,\n        tqdm_builder: Callable[[int], tqdm],\n    ) -> None:\n        set_usage_attribute(\"provider\", self.__class__.__name__)\n\n        entities = []\n        for entity_name in feature_view.entities:\n            entities.append(registry.get_entity(entity_name, project))\n\n        (\n            join_key_columns,\n            feature_name_columns,\n            event_timestamp_column,\n            created_timestamp_column,\n        ) = _get_column_names(feature_view, entities)\n\n        offline_job = self.offline_store.pull_latest_from_table_or_query(\n            config=config,\n            data_source=feature_view.batch_source,\n            join_key_columns=join_key_columns,\n            feature_name_columns=feature_name_columns,\n            event_timestamp_column=event_timestamp_column,\n            created_timestamp_column=created_timestamp_column,\n            start_date=start_date,\n            end_date=end_date,\n        )\n\n        table = offline_job.to_arrow()\n\n        if feature_view.batch_source.field_mapping is not None:\n            table = _run_field_mapping(table, feature_view.batch_source.field_mapping)\n\n        join_keys = [entity.join_key for entity in entities]\n\n        with tqdm_builder(table.num_rows) as pbar:\n            for batch in table.to_batches(DEFAULT_BATCH_SIZE):\n                rows_to_write = _convert_arrow_to_proto(batch, feature_view, join_keys)\n                self.online_write_batch(\n                    self.repo_config,\n                    feature_view,\n                    rows_to_write,\n                    lambda x: pbar.update(x),\n                )\n\n    def get_historical_features(\n        self,\n        config: RepoConfig,\n        feature_views: List[FeatureView],\n        feature_refs: List[str],\n        entity_df: Union[pandas.DataFrame, str],\n        registry: Registry,\n        project: str,\n        full_feature_names: bool,\n    ) -> RetrievalJob:\n        set_usage_attribute(\"provider\", self.__class__.__name__)\n\n        job = self.offline_store.get_historical_features(\n            config=config,\n            feature_views=feature_views,\n            feature_refs=feature_refs,\n            entity_df=entity_df,\n            registry=registry,\n            project=project,\n            full_feature_names=full_feature_names,\n        )\n        return job\n", "path": "sdk/python/feast/infra/passthrough_provider.py"}], "after_files": [{"content": "from datetime import datetime\nfrom typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union\n\nimport pandas\nimport pyarrow as pa\nfrom tqdm import tqdm\n\nfrom feast.entity import Entity\nfrom feast.feature_table import FeatureTable\nfrom feast.feature_view import FeatureView\nfrom feast.infra.offline_stores.offline_store import RetrievalJob\nfrom feast.infra.offline_stores.offline_utils import get_offline_store_from_config\nfrom feast.infra.online_stores.helpers import get_online_store_from_config\nfrom feast.infra.provider import (\n    Provider,\n    _convert_arrow_to_proto,\n    _get_column_names,\n    _run_field_mapping,\n)\nfrom feast.protos.feast.types.EntityKey_pb2 import EntityKey as EntityKeyProto\nfrom feast.protos.feast.types.Value_pb2 import Value as ValueProto\nfrom feast.registry import Registry\nfrom feast.repo_config import RepoConfig\nfrom feast.usage import RatioSampler, log_exceptions_and_usage, set_usage_attribute\n\nDEFAULT_BATCH_SIZE = 10_000\n\n\nclass PassthroughProvider(Provider):\n    \"\"\"\n    The Passthrough provider delegates all operations to the underlying online and offline stores.\n    \"\"\"\n\n    def __init__(self, config: RepoConfig):\n        super().__init__(config)\n\n        self.repo_config = config\n        self.offline_store = get_offline_store_from_config(config.offline_store)\n        self.online_store = get_online_store_from_config(config.online_store)\n\n    def update_infra(\n        self,\n        project: str,\n        tables_to_delete: Sequence[Union[FeatureTable, FeatureView]],\n        tables_to_keep: Sequence[Union[FeatureTable, FeatureView]],\n        entities_to_delete: Sequence[Entity],\n        entities_to_keep: Sequence[Entity],\n        partial: bool,\n    ):\n        set_usage_attribute(\"provider\", self.__class__.__name__)\n        self.online_store.update(\n            config=self.repo_config,\n            tables_to_delete=tables_to_delete,\n            tables_to_keep=tables_to_keep,\n            entities_to_keep=entities_to_keep,\n            entities_to_delete=entities_to_delete,\n            partial=partial,\n        )\n\n    def teardown_infra(\n        self,\n        project: str,\n        tables: Sequence[Union[FeatureTable, FeatureView]],\n        entities: Sequence[Entity],\n    ) -> None:\n        set_usage_attribute(\"provider\", self.__class__.__name__)\n        self.online_store.teardown(self.repo_config, tables, entities)\n\n    def online_write_batch(\n        self,\n        config: RepoConfig,\n        table: Union[FeatureTable, FeatureView],\n        data: List[\n            Tuple[EntityKeyProto, Dict[str, ValueProto], datetime, Optional[datetime]]\n        ],\n        progress: Optional[Callable[[int], Any]],\n    ) -> None:\n        set_usage_attribute(\"provider\", self.__class__.__name__)\n        self.online_store.online_write_batch(config, table, data, progress)\n\n    @log_exceptions_and_usage(sampler=RatioSampler(ratio=0.001))\n    def online_read(\n        self,\n        config: RepoConfig,\n        table: Union[FeatureTable, FeatureView],\n        entity_keys: List[EntityKeyProto],\n        requested_features: List[str] = None,\n    ) -> List[Tuple[Optional[datetime], Optional[Dict[str, ValueProto]]]]:\n        set_usage_attribute(\"provider\", self.__class__.__name__)\n        result = self.online_store.online_read(\n            config, table, entity_keys, requested_features\n        )\n\n        return result\n\n    def ingest_df(\n        self, feature_view: FeatureView, entities: List[Entity], df: pandas.DataFrame,\n    ):\n        set_usage_attribute(\"provider\", self.__class__.__name__)\n        table = pa.Table.from_pandas(df)\n\n        if feature_view.batch_source.field_mapping is not None:\n            table = _run_field_mapping(table, feature_view.batch_source.field_mapping)\n\n        join_keys = [entity.join_key for entity in entities]\n        rows_to_write = _convert_arrow_to_proto(table, feature_view, join_keys)\n\n        self.online_write_batch(\n            self.repo_config, feature_view, rows_to_write, progress=None\n        )\n\n    def materialize_single_feature_view(\n        self,\n        config: RepoConfig,\n        feature_view: FeatureView,\n        start_date: datetime,\n        end_date: datetime,\n        registry: Registry,\n        project: str,\n        tqdm_builder: Callable[[int], tqdm],\n    ) -> None:\n        set_usage_attribute(\"provider\", self.__class__.__name__)\n\n        entities = []\n        for entity_name in feature_view.entities:\n            entities.append(registry.get_entity(entity_name, project))\n\n        (\n            join_key_columns,\n            feature_name_columns,\n            event_timestamp_column,\n            created_timestamp_column,\n        ) = _get_column_names(feature_view, entities)\n\n        offline_job = self.offline_store.pull_latest_from_table_or_query(\n            config=config,\n            data_source=feature_view.batch_source,\n            join_key_columns=join_key_columns,\n            feature_name_columns=feature_name_columns,\n            event_timestamp_column=event_timestamp_column,\n            created_timestamp_column=created_timestamp_column,\n            start_date=start_date,\n            end_date=end_date,\n        )\n\n        table = offline_job.to_arrow()\n\n        if feature_view.batch_source.field_mapping is not None:\n            table = _run_field_mapping(table, feature_view.batch_source.field_mapping)\n\n        join_keys = [entity.join_key for entity in entities]\n\n        with tqdm_builder(table.num_rows) as pbar:\n            for batch in table.to_batches(DEFAULT_BATCH_SIZE):\n                rows_to_write = _convert_arrow_to_proto(batch, feature_view, join_keys)\n                self.online_write_batch(\n                    self.repo_config,\n                    feature_view,\n                    rows_to_write,\n                    lambda x: pbar.update(x),\n                )\n\n    def get_historical_features(\n        self,\n        config: RepoConfig,\n        feature_views: List[FeatureView],\n        feature_refs: List[str],\n        entity_df: Union[pandas.DataFrame, str],\n        registry: Registry,\n        project: str,\n        full_feature_names: bool,\n    ) -> RetrievalJob:\n        set_usage_attribute(\"provider\", self.__class__.__name__)\n\n        job = self.offline_store.get_historical_features(\n            config=config,\n            feature_views=feature_views,\n            feature_refs=feature_refs,\n            entity_df=entity_df,\n            registry=registry,\n            project=project,\n            full_feature_names=full_feature_names,\n        )\n        return job\n", "path": "sdk/python/feast/infra/passthrough_provider.py"}]}