We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Missing documentation for abstract `pull_all_from_table_or_query` offline store method
## Expected Behavior 

Since https://github.com/feast-dev/feast/pull/2197, offline store method `pull_all_from_table_or_query` must be overridden by custom offline stores. This is currently not documented.

Expectations: 
- [Docstring](https://github.com/feast-dev/feast/blob/b35e1e84720523cef70cba6d6306af8f193b469f/sdk/python/feast/infra/offline_stores/offline_store.py#L203) of `pull_all_from_table_or_query` contains a meaningful description of the method

- [Web doc](https://docs.feast.dev/how-to-guides/adding-a-new-offline-store) mentions that `pull_all_from_table_or_query` must be overriden.

## Current Behavior
No documentation for `pull_all_from_table_or_query`.



--- 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/offline_stores/offline_store.py`
Content:
```
1 # Copyright 2019 The Feast Authors
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 #     https://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14 import warnings
15 from abc import ABC, abstractmethod
16 from datetime import datetime
17 from typing import TYPE_CHECKING, List, Optional, Union
18 
19 import pandas as pd
20 import pyarrow
21 
22 from feast.data_source import DataSource
23 from feast.dqm.errors import ValidationFailed
24 from feast.feature_view import FeatureView
25 from feast.on_demand_feature_view import OnDemandFeatureView
26 from feast.registry import Registry
27 from feast.repo_config import RepoConfig
28 from feast.saved_dataset import SavedDatasetStorage
29 
30 if TYPE_CHECKING:
31     from feast.saved_dataset import ValidationReference
32 
33 
34 class RetrievalMetadata:
35     min_event_timestamp: Optional[datetime]
36     max_event_timestamp: Optional[datetime]
37 
38     # List of feature references
39     features: List[str]
40     # List of entity keys + ODFV inputs
41     keys: List[str]
42 
43     def __init__(
44         self,
45         features: List[str],
46         keys: List[str],
47         min_event_timestamp: Optional[datetime] = None,
48         max_event_timestamp: Optional[datetime] = None,
49     ):
50         self.features = features
51         self.keys = keys
52         self.min_event_timestamp = min_event_timestamp
53         self.max_event_timestamp = max_event_timestamp
54 
55 
56 class RetrievalJob(ABC):
57     """RetrievalJob is used to manage the execution of a historical feature retrieval"""
58 
59     @property
60     @abstractmethod
61     def full_feature_names(self) -> bool:
62         pass
63 
64     @property
65     @abstractmethod
66     def on_demand_feature_views(self) -> Optional[List[OnDemandFeatureView]]:
67         pass
68 
69     def to_df(
70         self, validation_reference: Optional["ValidationReference"] = None
71     ) -> pd.DataFrame:
72         """
73         Return dataset as Pandas DataFrame synchronously including on demand transforms
74         Args:
75             validation_reference: If provided resulting dataset will be validated against this reference profile.
76         """
77         features_df = self._to_df_internal()
78 
79         if self.on_demand_feature_views:
80             # TODO(adchia): Fix requirement to specify dependent feature views in feature_refs
81             for odfv in self.on_demand_feature_views:
82                 features_df = features_df.join(
83                     odfv.get_transformed_features_df(
84                         features_df, self.full_feature_names,
85                     )
86                 )
87 
88         if validation_reference:
89             warnings.warn(
90                 "Dataset validation is an experimental feature. "
91                 "This API is unstable and it could and most probably will be changed in the future. "
92                 "We do not guarantee that future changes will maintain backward compatibility.",
93                 RuntimeWarning,
94             )
95 
96             validation_result = validation_reference.profile.validate(features_df)
97             if not validation_result.is_success:
98                 raise ValidationFailed(validation_result)
99 
100         return features_df
101 
102     @abstractmethod
103     def _to_df_internal(self) -> pd.DataFrame:
104         """Return dataset as Pandas DataFrame synchronously"""
105         pass
106 
107     @abstractmethod
108     def _to_arrow_internal(self) -> pyarrow.Table:
109         """Return dataset as pyarrow Table synchronously"""
110         pass
111 
112     def to_arrow(
113         self, validation_reference: Optional["ValidationReference"] = None
114     ) -> pyarrow.Table:
115         """
116         Return dataset as pyarrow Table synchronously
117         Args:
118             validation_reference: If provided resulting dataset will be validated against this reference profile.
119         """
120         if not self.on_demand_feature_views and not validation_reference:
121             return self._to_arrow_internal()
122 
123         features_df = self._to_df_internal()
124         if self.on_demand_feature_views:
125             for odfv in self.on_demand_feature_views:
126                 features_df = features_df.join(
127                     odfv.get_transformed_features_df(
128                         features_df, self.full_feature_names,
129                     )
130                 )
131 
132         if validation_reference:
133             warnings.warn(
134                 "Dataset validation is an experimental feature. "
135                 "This API is unstable and it could and most probably will be changed in the future. "
136                 "We do not guarantee that future changes will maintain backward compatibility.",
137                 RuntimeWarning,
138             )
139 
140             validation_result = validation_reference.profile.validate(features_df)
141             if not validation_result.is_success:
142                 raise ValidationFailed(validation_result)
143 
144         return pyarrow.Table.from_pandas(features_df)
145 
146     @abstractmethod
147     def persist(self, storage: SavedDatasetStorage):
148         """
149         Run the retrieval and persist the results in the same offline store used for read.
150         """
151         pass
152 
153     @property
154     @abstractmethod
155     def metadata(self) -> Optional[RetrievalMetadata]:
156         """
157         Return metadata information about retrieval.
158         Should be available even before materializing the dataset itself.
159         """
160         pass
161 
162 
163 class OfflineStore(ABC):
164     """
165     OfflineStore is an object used for all interaction between Feast and the service used for offline storage of
166     features.
167     """
168 
169     @staticmethod
170     @abstractmethod
171     def pull_latest_from_table_or_query(
172         config: RepoConfig,
173         data_source: DataSource,
174         join_key_columns: List[str],
175         feature_name_columns: List[str],
176         event_timestamp_column: str,
177         created_timestamp_column: Optional[str],
178         start_date: datetime,
179         end_date: datetime,
180     ) -> RetrievalJob:
181         """
182         Note that join_key_columns, feature_name_columns, event_timestamp_column, and created_timestamp_column
183         have all already been mapped to column names of the source table and those column names are the values passed
184         into this function.
185         """
186         pass
187 
188     @staticmethod
189     @abstractmethod
190     def get_historical_features(
191         config: RepoConfig,
192         feature_views: List[FeatureView],
193         feature_refs: List[str],
194         entity_df: Union[pd.DataFrame, str],
195         registry: Registry,
196         project: str,
197         full_feature_names: bool = False,
198     ) -> RetrievalJob:
199         pass
200 
201     @staticmethod
202     @abstractmethod
203     def pull_all_from_table_or_query(
204         config: RepoConfig,
205         data_source: DataSource,
206         join_key_columns: List[str],
207         feature_name_columns: List[str],
208         event_timestamp_column: str,
209         start_date: datetime,
210         end_date: datetime,
211     ) -> RetrievalJob:
212         """
213         Note that join_key_columns, feature_name_columns, event_timestamp_column, and created_timestamp_column
214         have all already been mapped to column names of the source table and those column names are the values passed
215         into this function.
216         """
217         pass
218
```
--- 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/offline_stores/offline_store.py b/sdk/python/feast/infra/offline_stores/offline_store.py
--- a/sdk/python/feast/infra/offline_stores/offline_store.py
+++ b/sdk/python/feast/infra/offline_stores/offline_store.py
@@ -179,9 +179,24 @@
         end_date: datetime,
     ) -> RetrievalJob:
         """
+        This method pulls data from the offline store, and the FeatureStore class is used to write
+        this data into the online store. This method is invoked when running materialization (using
+        the `feast materialize` or `feast materialize-incremental` commands, or the corresponding
+        FeatureStore.materialize() method. This method pulls data from the offline store, and the FeatureStore
+        class is used to write this data into the online store.
+
         Note that join_key_columns, feature_name_columns, event_timestamp_column, and created_timestamp_column
         have all already been mapped to column names of the source table and those column names are the values passed
         into this function.
+
+        Args:
+            config: Repo configuration object
+            data_source: Data source to pull all of the columns from
+            join_key_columns: Columns of the join keys
+            feature_name_columns: Columns of the feature names needed
+            event_timestamp_column: Timestamp column
+            start_date: Starting date of query
+            end_date: Ending date of query
         """
         pass
 
@@ -210,8 +225,19 @@
         end_date: datetime,
     ) -> RetrievalJob:
         """
+        Returns a Retrieval Job for all join key columns, feature name columns, and the event timestamp columns that occur between the start_date and end_date.
+
         Note that join_key_columns, feature_name_columns, event_timestamp_column, and created_timestamp_column
         have all already been mapped to column names of the source table and those column names are the values passed
         into this function.
+
+        Args:
+            config: Repo configuration object
+            data_source: Data source to pull all of the columns from
+            join_key_columns: Columns of the join keys
+            feature_name_columns: Columns of the feature names needed
+            event_timestamp_column: Timestamp column
+            start_date: Starting date of query
+            end_date: Ending date of query
         """
         pass

{"golden_diff": "diff --git a/sdk/python/feast/infra/offline_stores/offline_store.py b/sdk/python/feast/infra/offline_stores/offline_store.py\n--- a/sdk/python/feast/infra/offline_stores/offline_store.py\n+++ b/sdk/python/feast/infra/offline_stores/offline_store.py\n@@ -179,9 +179,24 @@\n         end_date: datetime,\n     ) -> RetrievalJob:\n         \"\"\"\n+        This method pulls data from the offline store, and the FeatureStore class is used to write\n+        this data into the online store. This method is invoked when running materialization (using\n+        the `feast materialize` or `feast materialize-incremental` commands, or the corresponding\n+        FeatureStore.materialize() method. This method pulls data from the offline store, and the FeatureStore\n+        class is used to write this data into the online store.\n+\n         Note that join_key_columns, feature_name_columns, event_timestamp_column, and created_timestamp_column\n         have all already been mapped to column names of the source table and those column names are the values passed\n         into this function.\n+\n+        Args:\n+            config: Repo configuration object\n+            data_source: Data source to pull all of the columns from\n+            join_key_columns: Columns of the join keys\n+            feature_name_columns: Columns of the feature names needed\n+            event_timestamp_column: Timestamp column\n+            start_date: Starting date of query\n+            end_date: Ending date of query\n         \"\"\"\n         pass\n \n@@ -210,8 +225,19 @@\n         end_date: datetime,\n     ) -> RetrievalJob:\n         \"\"\"\n+        Returns a Retrieval Job for all join key columns, feature name columns, and the event timestamp columns that occur between the start_date and end_date.\n+\n         Note that join_key_columns, feature_name_columns, event_timestamp_column, and created_timestamp_column\n         have all already been mapped to column names of the source table and those column names are the values passed\n         into this function.\n+\n+        Args:\n+            config: Repo configuration object\n+            data_source: Data source to pull all of the columns from\n+            join_key_columns: Columns of the join keys\n+            feature_name_columns: Columns of the feature names needed\n+            event_timestamp_column: Timestamp column\n+            start_date: Starting date of query\n+            end_date: Ending date of query\n         \"\"\"\n         pass\n", "issue": "Missing documentation for abstract `pull_all_from_table_or_query` offline store method\n## Expected Behavior \r\n\r\nSince https://github.com/feast-dev/feast/pull/2197, offline store method `pull_all_from_table_or_query` must be overridden by custom offline stores. This is currently not documented.\r\n\r\nExpectations: \r\n- [Docstring](https://github.com/feast-dev/feast/blob/b35e1e84720523cef70cba6d6306af8f193b469f/sdk/python/feast/infra/offline_stores/offline_store.py#L203) of `pull_all_from_table_or_query` contains a meaningful description of the method\r\n\r\n- [Web doc](https://docs.feast.dev/how-to-guides/adding-a-new-offline-store) mentions that `pull_all_from_table_or_query` must be overriden.\r\n\r\n## Current Behavior\r\nNo documentation for `pull_all_from_table_or_query`.\r\n\r\n\n", "before_files": [{"content": "# Copyright 2019 The Feast Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\nimport warnings\nfrom abc import ABC, abstractmethod\nfrom datetime import datetime\nfrom typing import TYPE_CHECKING, List, Optional, Union\n\nimport pandas as pd\nimport pyarrow\n\nfrom feast.data_source import DataSource\nfrom feast.dqm.errors import ValidationFailed\nfrom feast.feature_view import FeatureView\nfrom feast.on_demand_feature_view import OnDemandFeatureView\nfrom feast.registry import Registry\nfrom feast.repo_config import RepoConfig\nfrom feast.saved_dataset import SavedDatasetStorage\n\nif TYPE_CHECKING:\n    from feast.saved_dataset import ValidationReference\n\n\nclass RetrievalMetadata:\n    min_event_timestamp: Optional[datetime]\n    max_event_timestamp: Optional[datetime]\n\n    # List of feature references\n    features: List[str]\n    # List of entity keys + ODFV inputs\n    keys: List[str]\n\n    def __init__(\n        self,\n        features: List[str],\n        keys: List[str],\n        min_event_timestamp: Optional[datetime] = None,\n        max_event_timestamp: Optional[datetime] = None,\n    ):\n        self.features = features\n        self.keys = keys\n        self.min_event_timestamp = min_event_timestamp\n        self.max_event_timestamp = max_event_timestamp\n\n\nclass RetrievalJob(ABC):\n    \"\"\"RetrievalJob is used to manage the execution of a historical feature retrieval\"\"\"\n\n    @property\n    @abstractmethod\n    def full_feature_names(self) -> bool:\n        pass\n\n    @property\n    @abstractmethod\n    def on_demand_feature_views(self) -> Optional[List[OnDemandFeatureView]]:\n        pass\n\n    def to_df(\n        self, validation_reference: Optional[\"ValidationReference\"] = None\n    ) -> pd.DataFrame:\n        \"\"\"\n        Return dataset as Pandas DataFrame synchronously including on demand transforms\n        Args:\n            validation_reference: If provided resulting dataset will be validated against this reference profile.\n        \"\"\"\n        features_df = self._to_df_internal()\n\n        if self.on_demand_feature_views:\n            # TODO(adchia): Fix requirement to specify dependent feature views in feature_refs\n            for odfv in self.on_demand_feature_views:\n                features_df = features_df.join(\n                    odfv.get_transformed_features_df(\n                        features_df, self.full_feature_names,\n                    )\n                )\n\n        if validation_reference:\n            warnings.warn(\n                \"Dataset validation is an experimental feature. \"\n                \"This API is unstable and it could and most probably will be changed in the future. \"\n                \"We do not guarantee that future changes will maintain backward compatibility.\",\n                RuntimeWarning,\n            )\n\n            validation_result = validation_reference.profile.validate(features_df)\n            if not validation_result.is_success:\n                raise ValidationFailed(validation_result)\n\n        return features_df\n\n    @abstractmethod\n    def _to_df_internal(self) -> pd.DataFrame:\n        \"\"\"Return dataset as Pandas DataFrame synchronously\"\"\"\n        pass\n\n    @abstractmethod\n    def _to_arrow_internal(self) -> pyarrow.Table:\n        \"\"\"Return dataset as pyarrow Table synchronously\"\"\"\n        pass\n\n    def to_arrow(\n        self, validation_reference: Optional[\"ValidationReference\"] = None\n    ) -> pyarrow.Table:\n        \"\"\"\n        Return dataset as pyarrow Table synchronously\n        Args:\n            validation_reference: If provided resulting dataset will be validated against this reference profile.\n        \"\"\"\n        if not self.on_demand_feature_views and not validation_reference:\n            return self._to_arrow_internal()\n\n        features_df = self._to_df_internal()\n        if self.on_demand_feature_views:\n            for odfv in self.on_demand_feature_views:\n                features_df = features_df.join(\n                    odfv.get_transformed_features_df(\n                        features_df, self.full_feature_names,\n                    )\n                )\n\n        if validation_reference:\n            warnings.warn(\n                \"Dataset validation is an experimental feature. \"\n                \"This API is unstable and it could and most probably will be changed in the future. \"\n                \"We do not guarantee that future changes will maintain backward compatibility.\",\n                RuntimeWarning,\n            )\n\n            validation_result = validation_reference.profile.validate(features_df)\n            if not validation_result.is_success:\n                raise ValidationFailed(validation_result)\n\n        return pyarrow.Table.from_pandas(features_df)\n\n    @abstractmethod\n    def persist(self, storage: SavedDatasetStorage):\n        \"\"\"\n        Run the retrieval and persist the results in the same offline store used for read.\n        \"\"\"\n        pass\n\n    @property\n    @abstractmethod\n    def metadata(self) -> Optional[RetrievalMetadata]:\n        \"\"\"\n        Return metadata information about retrieval.\n        Should be available even before materializing the dataset itself.\n        \"\"\"\n        pass\n\n\nclass OfflineStore(ABC):\n    \"\"\"\n    OfflineStore is an object used for all interaction between Feast and the service used for offline storage of\n    features.\n    \"\"\"\n\n    @staticmethod\n    @abstractmethod\n    def pull_latest_from_table_or_query(\n        config: RepoConfig,\n        data_source: DataSource,\n        join_key_columns: List[str],\n        feature_name_columns: List[str],\n        event_timestamp_column: str,\n        created_timestamp_column: Optional[str],\n        start_date: datetime,\n        end_date: datetime,\n    ) -> RetrievalJob:\n        \"\"\"\n        Note that join_key_columns, feature_name_columns, event_timestamp_column, and created_timestamp_column\n        have all already been mapped to column names of the source table and those column names are the values passed\n        into this function.\n        \"\"\"\n        pass\n\n    @staticmethod\n    @abstractmethod\n    def get_historical_features(\n        config: RepoConfig,\n        feature_views: List[FeatureView],\n        feature_refs: List[str],\n        entity_df: Union[pd.DataFrame, str],\n        registry: Registry,\n        project: str,\n        full_feature_names: bool = False,\n    ) -> RetrievalJob:\n        pass\n\n    @staticmethod\n    @abstractmethod\n    def pull_all_from_table_or_query(\n        config: RepoConfig,\n        data_source: DataSource,\n        join_key_columns: List[str],\n        feature_name_columns: List[str],\n        event_timestamp_column: str,\n        start_date: datetime,\n        end_date: datetime,\n    ) -> RetrievalJob:\n        \"\"\"\n        Note that join_key_columns, feature_name_columns, event_timestamp_column, and created_timestamp_column\n        have all already been mapped to column names of the source table and those column names are the values passed\n        into this function.\n        \"\"\"\n        pass\n", "path": "sdk/python/feast/infra/offline_stores/offline_store.py"}], "after_files": [{"content": "# Copyright 2019 The Feast Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\nimport warnings\nfrom abc import ABC, abstractmethod\nfrom datetime import datetime\nfrom typing import TYPE_CHECKING, List, Optional, Union\n\nimport pandas as pd\nimport pyarrow\n\nfrom feast.data_source import DataSource\nfrom feast.dqm.errors import ValidationFailed\nfrom feast.feature_view import FeatureView\nfrom feast.on_demand_feature_view import OnDemandFeatureView\nfrom feast.registry import Registry\nfrom feast.repo_config import RepoConfig\nfrom feast.saved_dataset import SavedDatasetStorage\n\nif TYPE_CHECKING:\n    from feast.saved_dataset import ValidationReference\n\n\nclass RetrievalMetadata:\n    min_event_timestamp: Optional[datetime]\n    max_event_timestamp: Optional[datetime]\n\n    # List of feature references\n    features: List[str]\n    # List of entity keys + ODFV inputs\n    keys: List[str]\n\n    def __init__(\n        self,\n        features: List[str],\n        keys: List[str],\n        min_event_timestamp: Optional[datetime] = None,\n        max_event_timestamp: Optional[datetime] = None,\n    ):\n        self.features = features\n        self.keys = keys\n        self.min_event_timestamp = min_event_timestamp\n        self.max_event_timestamp = max_event_timestamp\n\n\nclass RetrievalJob(ABC):\n    \"\"\"RetrievalJob is used to manage the execution of a historical feature retrieval\"\"\"\n\n    @property\n    @abstractmethod\n    def full_feature_names(self) -> bool:\n        pass\n\n    @property\n    @abstractmethod\n    def on_demand_feature_views(self) -> Optional[List[OnDemandFeatureView]]:\n        pass\n\n    def to_df(\n        self, validation_reference: Optional[\"ValidationReference\"] = None\n    ) -> pd.DataFrame:\n        \"\"\"\n        Return dataset as Pandas DataFrame synchronously including on demand transforms\n        Args:\n            validation_reference: If provided resulting dataset will be validated against this reference profile.\n        \"\"\"\n        features_df = self._to_df_internal()\n\n        if self.on_demand_feature_views:\n            # TODO(adchia): Fix requirement to specify dependent feature views in feature_refs\n            for odfv in self.on_demand_feature_views:\n                features_df = features_df.join(\n                    odfv.get_transformed_features_df(\n                        features_df, self.full_feature_names,\n                    )\n                )\n\n        if validation_reference:\n            warnings.warn(\n                \"Dataset validation is an experimental feature. \"\n                \"This API is unstable and it could and most probably will be changed in the future. \"\n                \"We do not guarantee that future changes will maintain backward compatibility.\",\n                RuntimeWarning,\n            )\n\n            validation_result = validation_reference.profile.validate(features_df)\n            if not validation_result.is_success:\n                raise ValidationFailed(validation_result)\n\n        return features_df\n\n    @abstractmethod\n    def _to_df_internal(self) -> pd.DataFrame:\n        \"\"\"Return dataset as Pandas DataFrame synchronously\"\"\"\n        pass\n\n    @abstractmethod\n    def _to_arrow_internal(self) -> pyarrow.Table:\n        \"\"\"Return dataset as pyarrow Table synchronously\"\"\"\n        pass\n\n    def to_arrow(\n        self, validation_reference: Optional[\"ValidationReference\"] = None\n    ) -> pyarrow.Table:\n        \"\"\"\n        Return dataset as pyarrow Table synchronously\n        Args:\n            validation_reference: If provided resulting dataset will be validated against this reference profile.\n        \"\"\"\n        if not self.on_demand_feature_views and not validation_reference:\n            return self._to_arrow_internal()\n\n        features_df = self._to_df_internal()\n        if self.on_demand_feature_views:\n            for odfv in self.on_demand_feature_views:\n                features_df = features_df.join(\n                    odfv.get_transformed_features_df(\n                        features_df, self.full_feature_names,\n                    )\n                )\n\n        if validation_reference:\n            warnings.warn(\n                \"Dataset validation is an experimental feature. \"\n                \"This API is unstable and it could and most probably will be changed in the future. \"\n                \"We do not guarantee that future changes will maintain backward compatibility.\",\n                RuntimeWarning,\n            )\n\n            validation_result = validation_reference.profile.validate(features_df)\n            if not validation_result.is_success:\n                raise ValidationFailed(validation_result)\n\n        return pyarrow.Table.from_pandas(features_df)\n\n    @abstractmethod\n    def persist(self, storage: SavedDatasetStorage):\n        \"\"\"\n        Run the retrieval and persist the results in the same offline store used for read.\n        \"\"\"\n        pass\n\n    @property\n    @abstractmethod\n    def metadata(self) -> Optional[RetrievalMetadata]:\n        \"\"\"\n        Return metadata information about retrieval.\n        Should be available even before materializing the dataset itself.\n        \"\"\"\n        pass\n\n\nclass OfflineStore(ABC):\n    \"\"\"\n    OfflineStore is an object used for all interaction between Feast and the service used for offline storage of\n    features.\n    \"\"\"\n\n    @staticmethod\n    @abstractmethod\n    def pull_latest_from_table_or_query(\n        config: RepoConfig,\n        data_source: DataSource,\n        join_key_columns: List[str],\n        feature_name_columns: List[str],\n        event_timestamp_column: str,\n        created_timestamp_column: Optional[str],\n        start_date: datetime,\n        end_date: datetime,\n    ) -> RetrievalJob:\n        \"\"\"\n        This method pulls data from the offline store, and the FeatureStore class is used to write\n        this data into the online store. This method is invoked when running materialization (using\n        the `feast materialize` or `feast materialize-incremental` commands, or the corresponding\n        FeatureStore.materialize() method. This method pulls data from the offline store, and the FeatureStore\n        class is used to write this data into the online store.\n\n        Note that join_key_columns, feature_name_columns, event_timestamp_column, and created_timestamp_column\n        have all already been mapped to column names of the source table and those column names are the values passed\n        into this function.\n\n        Args:\n            config: Repo configuration object\n            data_source: Data source to pull all of the columns from\n            join_key_columns: Columns of the join keys\n            feature_name_columns: Columns of the feature names needed\n            event_timestamp_column: Timestamp column\n            start_date: Starting date of query\n            end_date: Ending date of query\n        \"\"\"\n        pass\n\n    @staticmethod\n    @abstractmethod\n    def get_historical_features(\n        config: RepoConfig,\n        feature_views: List[FeatureView],\n        feature_refs: List[str],\n        entity_df: Union[pd.DataFrame, str],\n        registry: Registry,\n        project: str,\n        full_feature_names: bool = False,\n    ) -> RetrievalJob:\n        pass\n\n    @staticmethod\n    @abstractmethod\n    def pull_all_from_table_or_query(\n        config: RepoConfig,\n        data_source: DataSource,\n        join_key_columns: List[str],\n        feature_name_columns: List[str],\n        event_timestamp_column: str,\n        start_date: datetime,\n        end_date: datetime,\n    ) -> RetrievalJob:\n        \"\"\"\n        Returns a Retrieval Job for all join key columns, feature name columns, and the event timestamp columns that occur between the start_date and end_date.\n\n        Note that join_key_columns, feature_name_columns, event_timestamp_column, and created_timestamp_column\n        have all already been mapped to column names of the source table and those column names are the values passed\n        into this function.\n\n        Args:\n            config: Repo configuration object\n            data_source: Data source to pull all of the columns from\n            join_key_columns: Columns of the join keys\n            feature_name_columns: Columns of the feature names needed\n            event_timestamp_column: Timestamp column\n            start_date: Starting date of query\n            end_date: Ending date of query\n        \"\"\"\n        pass\n", "path": "sdk/python/feast/infra/offline_stores/offline_store.py"}]}