Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
d2c637d
feat: Add MongoDB offline store (ibis-based PIT join, v1 alpha)
caseyclements Mar 3, 2026
77f243e
refactor: improve MongoDB offline store code quality
caseyclements Mar 4, 2026
bb134a2
Started work on full Mongo/MQL implementation. Kept MongoDBOfflineSto…
caseyclements Mar 9, 2026
46e67b7
refactor: rename alpha to preview, clarify MQL pipeline comments
caseyclements Mar 17, 2026
d0c00ca
Added unit tests for offline store retrieval, requiring docker and py…
caseyclements Mar 17, 2026
c940d05
Added test of multiple feature views and compound join keys
caseyclements Mar 17, 2026
37fad38
Initial implementation of native single-collection offline store
caseyclements Mar 17, 2026
67c39d4
Added DriverInfo to MongoDBClients
caseyclements Mar 18, 2026
7987405
Optimized MQL. Applied FV-level TTL
caseyclements Mar 18, 2026
adf1fb0
filter TTL by relevant FVs only, cautiously reset df index; add creat…
caseyclements Mar 18, 2026
ed1571e
Updated docstrings
caseyclements Mar 18, 2026
c09faee
Lazy index creation via _get_client_and_ensure_indexes
caseyclements Mar 18, 2026
91e939c
Add performance benchmarks comparing Ibis vs Native MongoDB offline s…
caseyclements Mar 18, 2026
e4bfc31
Refactor Native get_historical_features: replace with fetch+pandas join
caseyclements Mar 18, 2026
6218fa8
Refactor get_historical_features with chunked processing for large en…
caseyclements Mar 19, 2026
b7ffd84
Optimize Native get_historical_features: reuse client, increase batch…
caseyclements Mar 19, 2026
affdc2d
Remove duplicate MongoDBOfflineStoreNative from mongodb.py
caseyclements Mar 19, 2026
afef4fd
Consolidate mongodb_source.py into mongodb.py
caseyclements Mar 19, 2026
f273744
Rename mongodb_offline_store to mongodb, use One/Many naming convention
caseyclements Mar 19, 2026
df00e47
Add README.md documenting MongoDB offline store implementations
caseyclements Mar 20, 2026
83d063b
Rename mongodb/ to mongodb_offline_store/, organize tests
caseyclements Mar 20, 2026
977c240
Update docstring in benchmark.py
caseyclements Mar 20, 2026
166d151
Update README to show created_at tie-breaker in Many schema
caseyclements Mar 20, 2026
fe24361
Update README index recommendations for Many implementation
caseyclements Mar 20, 2026
398110c
Add auto-create index to MongoDBOfflineStoreMany
caseyclements Mar 20, 2026
2feb97d
Update benchmark.py to use One/Many naming convention
caseyclements Mar 20, 2026
9624311
Add comprehensive module docstring to mongodb_many.py
caseyclements Mar 20, 2026
5c93a51
Add Feature Freshness and Schema Evolution docs to mongodb_many.py
caseyclements Mar 20, 2026
fd70c13
Add MongoDB DataSourceCreators for universal Feast tests
caseyclements Mar 20, 2026
b4a0260
Add .secrets.baseline
caseyclements Mar 20, 2026
9efd700
Addressed PR comment: join_keys = get_expected_join_keys(project, fea…
caseyclements Apr 14, 2026
5d67b3f
Adds tests scenario that not using offline_utils.get_expected_join_ke…
caseyclements Apr 14, 2026
f889e10
Tests revealed possible name collision in pandas.merge_asof
caseyclements Apr 15, 2026
fcbd609
Add further (Large) benchmark tests
caseyclements Apr 15, 2026
7786393
Upgrades from Devin comments. Class cache _index_initialized; get_exp…
caseyclements Apr 15, 2026
b8fa01c
Addressed PR comments
caseyclements Apr 15, 2026
6db7cce
Apply lower bound via max(TTL) when all feature viewws in a chunk hav…
caseyclements Apr 15, 2026
596b126
Add created_at to compound index so that materialization is correct i…
caseyclements Apr 15, 2026
c0173e0
Handdle numpy scalers in _serialize_entity_key_from_row as suggested.
caseyclements Apr 15, 2026
1f80f47
Add persist and tests
caseyclements Apr 15, 2026
daaaf32
Remove accidentally included design notes.
caseyclements Apr 15, 2026
3a78f9d
Fix entity key serialization: per-FV join key types and numpy 2.0 compat
caseyclements Apr 16, 2026
44abd92
Add offline_write_batch to MongoDBOfflineStoreOne
caseyclements Apr 16, 2026
63fab1b
mongodb_one: clarify pipeline sort rationale and avoid sparse-column …
caseyclements Apr 16, 2026
90dd224
Add mongodb_native.py: initial MQL-based offline store (pre-refactor …
caseyclements Apr 17, 2026
0733688
Refactor mongodb_native: Atlas-first $documents+$lookup PIT join
caseyclements Apr 17, 2026
47f1040
Add unit tests for MongoDBOfflineStoreNative
caseyclements Apr 17, 2026
84ac27b
Add cross-implementation equivalence suite (test_cross.py)
caseyclements Apr 17, 2026
8346f28
Add benchmark_sweep.py: four-dimensional scaling suite across all thr…
caseyclements Apr 17, 2026
448a698
Add mongodb_agg offline store — $match+$sort+$group, O(log P) without…
caseyclements Apr 19, 2026
810b7d0
Vectorize agg scoring path, add upfront index build, ignore design/
caseyclements Apr 19, 2026
2a56c13
Adds offline_write_batch
caseyclements Apr 20, 2026
7e35e6a
Adds detail to handling of K in benchmarks.
caseyclements Apr 20, 2026
fcbb8e1
Adds missing typing.
caseyclements Apr 21, 2026
6e8f502
Consolidate MongoDB offline store to single implementation
caseyclements Apr 23, 2026
a6dca86
Fixes strict_pit_false unit test.
caseyclements Apr 23, 2026
055d238
Fix MongoDB offline store: projection keying, TTL bounds, field mappi…
caseyclements Apr 24, 2026
136dc09
Fix MongoDB test DataSourceCreator: implement create_logged_features_…
caseyclements Apr 24, 2026
f7e6230
Fix pd.isna() ValueError on list/array features in offline_write_batch
caseyclements Apr 24, 2026
9d9f7f1
Merge branch 'master' into FEAST-OfflineStore-INTPYTHON-297
caseyclements Apr 24, 2026
274e6f8
Fix bool/int type inference order in get_table_column_names_and_types
caseyclements Apr 24, 2026
fcb92da
Fix mongodb_to_feast_value_type to accept type strings from get_table…
caseyclements Apr 24, 2026
23b6788
Sort join keys in _serialize_entity_key_from_row for consistent entit…
caseyclements Apr 24, 2026
26b5153
Resolve .secrets.baseline merge conflict with master
caseyclements Apr 24, 2026
5227804
Add mongodb to CI extras so pymongo is installed in CI
caseyclements Apr 24, 2026
2905b80
Remove MongoDB from universal test parametrization
caseyclements Apr 24, 2026
a9b9e8f
Regenerate pixi lockfile after pymongo addition to ci extras
caseyclements Apr 24, 2026
f558aa5
Fix scoring_path heuristic: check entity uniqueness per-FV, not globally
caseyclements Apr 28, 2026
349c5f1
Fix offline_write_batch: use original join key names for entity seria…
caseyclements Apr 28, 2026
8f8de11
Fix pull_latest and pull_all to return join key columns
caseyclements Apr 28, 2026
9de5548
Fix scoring_path: require homogeneous timestamps to prevent data loss
caseyclements Apr 29, 2026
c34b6cd
Fix training path: sort fv_df by created_at to break event_timestamp …
caseyclements Apr 29, 2026
1d2a1c9
Clean up stale docstrings: remove references to MongoDBOfflineStoreOn…
caseyclements Apr 29, 2026
02e457c
Clean up stale docstrings: remove references to MongoDBOfflineStoreOn…
caseyclements Apr 29, 2026
ae5256f
Added driver metadata to clients
caseyclements Apr 30, 2026
f1996fc
Update .secrets.baseline
caseyclements Apr 30, 2026
b3b7563
Remove preview warnings from MongoDB offline store
caseyclements Apr 30, 2026
4a43815
Merge branch 'master' into FEAST-OfflineStore-INTPYTHON-297
caseyclements Apr 30, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Rename mongodb_offline_store to mongodb, use One/Many naming convention
- Rename module: mongodb_offline_store/ → mongodb/
- Rename files: mongodb.py → mongodb_many.py, mongodb_native.py → mongodb_one.py

Class renames:
- MongoDBSource → MongoDBSourceMany
- MongoDBOptions → MongoDBOptionsMany
- SavedDatasetMongoDBStorage → SavedDatasetMongoDBStorageMany
- MongoDBOfflineStoreIbis → MongoDBOfflineStoreMany
- MongoDBOfflineStoreIbisConfig → MongoDBOfflineStoreManyConfig
- MongoDBSourceNative → MongoDBSourceOne
- MongoDBOfflineStoreNative → MongoDBOfflineStoreOne
- MongoDBOfflineStoreNativeConfig → MongoDBOfflineStoreOneConfig
- MongoDBNativeRetrievalJob → MongoDBOneRetrievalJob

The One/Many naming reflects the core architectural difference:
- One: Single shared collection for all FeatureViews
- Many: One collection per FeatureView

Signed-off-by: Casey Clements <casey.clements@mongodb.com>
  • Loading branch information
caseyclements committed Apr 24, 2026
commit f273744fad69ca74464110bea574f4e52ecd9f72
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
SavedDatasetLocationAlreadyExists,
)
from feast.feature_view import FeatureView
from feast.infra.offline_stores.contrib.mongodb_offline_store import DRIVER_METADATA
from feast.infra.offline_stores.contrib.mongodb import DRIVER_METADATA
from feast.infra.offline_stores.ibis import (
get_historical_features_ibis,
pull_all_from_table_or_query_ibis,
Expand Down Expand Up @@ -86,11 +86,11 @@ def _infer_python_type_str(value: Any) -> Optional[str]:


# ---------------------------------------------------------------------------
# MongoDBSource and related classes (collection-per-FeatureView schema)
# MongoDBSourceMany and related classes (one collection per FeatureView)
# ---------------------------------------------------------------------------


class MongoDBOptions:
class MongoDBOptionsMany:
"""Options for a MongoDB data source (database + collection)."""

def __init__(self, database: str, collection: str):
Expand All @@ -108,21 +108,21 @@ def to_proto(self) -> DataSourceProto.CustomSourceOptions:
@classmethod
def from_proto(
cls, options_proto: DataSourceProto.CustomSourceOptions
) -> "MongoDBOptions":
"""Deserialize a CustomSourceOptions proto back into a MongoDBOptions instance."""
) -> "MongoDBOptionsMany":
"""Deserialize a CustomSourceOptions proto back into a MongoDBOptionsMany instance."""
config = json.loads(options_proto.configuration.decode("utf8"))
return cls(database=config["database"], collection=config["collection"])


class MongoDBSource(DataSource):
"""A MongoDB collection used as a Feast offline data source.
class MongoDBSourceMany(DataSource):
"""A MongoDB collection used as a Feast offline data source (one collection per FeatureView).

``name`` is the logical Feast name for this source. If omitted, it defaults
to the value of ``collection``. At least one of ``name`` or ``collection``
must be supplied.

``database`` is the MongoDB database that contains the collection. When
omitted it falls back to ``MongoDBOfflineStoreConfig.database`` at query
omitted it falls back to ``MongoDBOfflineStoreManyConfig.database`` at query
time, so a single store-level default can be shared across many sources.

``schema_sample_size`` controls how many documents are randomly sampled
Expand Down Expand Up @@ -153,7 +153,7 @@ def __init__(
# At least one of name / collection is non-None; cast to satisfy the type checker.
name = cast(str, name or collection)

self._mongodb_options = MongoDBOptions(
self._mongodb_options = MongoDBOptionsMany(
database=database or "",
collection=collection or name,
)
Expand All @@ -173,9 +173,9 @@ def __hash__(self):
return super().__hash__()

def __eq__(self, other):
if not isinstance(other, MongoDBSource):
if not isinstance(other, MongoDBSourceMany):
raise TypeError(
"Comparisons should only involve MongoDBSource class objects."
"Comparisons should only involve MongoDBSourceMany class objects."
)
return (
super().__eq__(other)
Expand All @@ -195,10 +195,10 @@ def collection(self) -> str:
return self._mongodb_options._collection

@staticmethod
def from_proto(data_source: DataSourceProto) -> "MongoDBSource":
def from_proto(data_source: DataSourceProto) -> "MongoDBSourceMany":
assert data_source.HasField("custom_options")
options = json.loads(data_source.custom_options.configuration)
return MongoDBSource(
return MongoDBSourceMany(
name=data_source.name,
database=options["database"],
collection=options["collection"],
Expand All @@ -214,7 +214,7 @@ def _to_proto_impl(self) -> DataSourceProto:
data_source_proto = DataSourceProto(
name=self.name,
type=DataSourceProto.CUSTOM_SOURCE,
data_source_class_type="feast.infra.offline_stores.contrib.mongodb_offline_store.mongodb.MongoDBSource",
data_source_class_type="feast.infra.offline_stores.contrib.mongodb.mongodb_many.MongoDBSourceMany",
field_mapping=self.field_mapping,
custom_options=self._mongodb_options.to_proto(),
description=self.description,
Expand Down Expand Up @@ -281,25 +281,25 @@ def get_table_column_names_and_types(
]


class SavedDatasetMongoDBStorage(SavedDatasetStorage):
"""Persists a Feast SavedDataset into a MongoDB collection."""
class SavedDatasetMongoDBStorageMany(SavedDatasetStorage):
"""Persists a Feast SavedDataset into a MongoDB collection (many-collection schema)."""

_proto_attr_name = "custom_storage"

mongodb_options: MongoDBOptions
mongodb_options: MongoDBOptionsMany

def __init__(self, database: str, collection: str):
self.mongodb_options = MongoDBOptions(
self.mongodb_options = MongoDBOptionsMany(
database=database,
collection=collection,
)

@staticmethod
def from_proto(
storage_proto: SavedDatasetStorageProto,
) -> "SavedDatasetMongoDBStorage":
) -> "SavedDatasetMongoDBStorageMany":
options = json.loads(storage_proto.custom_storage.configuration)
return SavedDatasetMongoDBStorage(
return SavedDatasetMongoDBStorageMany(
database=options["database"],
collection=options["collection"],
)
Expand All @@ -308,7 +308,7 @@ def to_proto(self) -> SavedDatasetStorageProto:
return SavedDatasetStorageProto(custom_storage=self.mongodb_options.to_proto())

def to_data_source(self) -> DataSource:
return MongoDBSource(
return MongoDBSourceMany(
database=self.mongodb_options._database,
collection=self.mongodb_options._collection,
)
Expand All @@ -319,10 +319,10 @@ def to_data_source(self) -> DataSource:
# ---------------------------------------------------------------------------


class MongoDBOfflineStoreIbisConfig(FeastConfigBaseModel):
"""Configuration for the MongoDB Ibis-backed offline store."""
class MongoDBOfflineStoreManyConfig(FeastConfigBaseModel):
"""Configuration for the MongoDB offline store (one collection per FeatureView)."""

type: StrictStr = "feast.infra.offline_stores.contrib.mongodb_offline_store.mongodb.MongoDBOfflineStoreIbis"
type: StrictStr = "feast.infra.offline_stores.contrib.mongodb.mongodb_many.MongoDBOfflineStoreMany"
"""Offline store type selector"""

connection_string: StrictStr = "mongodb://localhost:27017"
Expand All @@ -332,8 +332,12 @@ class MongoDBOfflineStoreIbisConfig(FeastConfigBaseModel):
"""Default MongoDB database name"""


class MongoDBOfflineStoreIbis(OfflineStore):
"""Offline store backed by MongoDB, using Ibis for point-in-time joins."""
class MongoDBOfflineStoreMany(OfflineStore):
"""Offline store backed by MongoDB (one collection per FeatureView).

Uses Ibis memtables for point-in-time joins. Each FeatureView's data is stored
in a separate MongoDB collection, with the collection name matching the source name.
"""

@staticmethod
def pull_latest_from_table_or_query(
Expand All @@ -346,9 +350,9 @@ def pull_latest_from_table_or_query(
start_date: datetime,
end_date: datetime,
) -> RetrievalJob:
if not isinstance(data_source, MongoDBSource):
if not isinstance(data_source, MongoDBSourceMany):
raise ValueError(
f"MongoDBOfflineStore expected a MongoDBSource, "
f"MongoDBOfflineStoreMany expected a MongoDBSourceMany, "
f"got {type(data_source).__name__!r}."
)
warnings.warn(
Expand Down Expand Up @@ -405,9 +409,9 @@ def pull_all_from_table_or_query(
start_date: Optional[datetime] = None,
end_date: Optional[datetime] = None,
) -> RetrievalJob:
if not isinstance(data_source, MongoDBSource):
if not isinstance(data_source, MongoDBSourceMany):
raise ValueError(
f"MongoDBOfflineStore expected a MongoDBSource, "
f"MongoDBOfflineStoreMany expected a MongoDBSourceMany, "
f"got {type(data_source).__name__!r}."
)
warnings.warn(
Expand Down Expand Up @@ -436,9 +440,9 @@ def reader(data_source: DataSource, repo_path: str) -> Table:
raise FeastExtrasDependencyImportError(
"mongodb", "pymongo is not installed."
)
if not isinstance(data_source, MongoDBSource):
if not isinstance(data_source, MongoDBSourceMany):
raise ValueError(
f"MongoDBOfflineStore reader expected a MongoDBSource, "
f"MongoDBOfflineStoreMany reader expected a MongoDBSourceMany, "
f"got {type(data_source).__name__!r}."
)
connection_string = config.offline_store.connection_string
Expand Down Expand Up @@ -487,9 +491,9 @@ def writer(
raise FeastExtrasDependencyImportError(
"mongodb", "pymongo is not installed."
)
if not isinstance(data_source, MongoDBSource):
if not isinstance(data_source, MongoDBSourceMany):
raise ValueError(
f"MongoDBOfflineStore writer expected a MongoDBSource, "
f"MongoDBOfflineStoreMany writer expected a MongoDBSourceMany, "
f"got {type(data_source).__name__!r}."
)
connection_string = config.offline_store.connection_string
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@
from feast.errors import DataSourceNoNameException, FeastExtrasDependencyImportError
from feast.feature_view import FeatureView
from feast.infra.key_encoding_utils import serialize_entity_key
from feast.infra.offline_stores.contrib.mongodb_offline_store import DRIVER_METADATA
from feast.infra.offline_stores.contrib.mongodb import DRIVER_METADATA
from feast.infra.offline_stores.offline_store import (
OfflineStore,
RetrievalJob,
Expand All @@ -127,10 +127,12 @@
from feast.value_type import ValueType


class MongoDBOfflineStoreNativeConfig(FeastConfigBaseModel):
"""Configuration for the Native MongoDB offline store."""
class MongoDBOfflineStoreOneConfig(FeastConfigBaseModel):
"""Configuration for the MongoDB offline store (single shared collection)."""

type: StrictStr = "feast.infra.offline_stores.contrib.mongodb_offline_store.mongodb_native.MongoDBOfflineStoreNative"
type: StrictStr = (
"feast.infra.offline_stores.contrib.mongodb.mongodb_one.MongoDBOfflineStoreOne"
)
"""Offline store type selector"""

connection_string: StrictStr = "mongodb://localhost:27017"
Expand All @@ -143,12 +145,12 @@ class MongoDBOfflineStoreNativeConfig(FeastConfigBaseModel):
"""Single collection name for all feature views"""


class MongoDBSourceNative(DataSource):
"""A MongoDB data source for the native offline store.
class MongoDBSourceOne(DataSource):
"""A MongoDB data source for the single-collection offline store.

Unlike many data source implementations, this source does not map each
FeatureView to its own table or collection. Instead, all FeatureViews
share a single MongoDB collection (configured at the store level).
Unlike MongoDBSourceMany, this source does not map each FeatureView to
its own collection. Instead, all FeatureViews share a single MongoDB
collection (configured at the store level).

Each document in that collection includes a ``feature_view`` field that
identifies which FeatureView it belongs to. The ``name`` of this data
Expand Down Expand Up @@ -183,9 +185,9 @@ def __hash__(self):
return super().__hash__()

def __eq__(self, other):
if not isinstance(other, MongoDBSourceNative):
if not isinstance(other, MongoDBSourceOne):
raise TypeError(
"Comparisons should only involve MongoDBSourceNative class objects."
"Comparisons should only involve MongoDBSourceOne class objects."
)
return (
super().__eq__(other)
Expand All @@ -203,9 +205,9 @@ def source_type(self) -> DataSourceProto.SourceType.ValueType:
return DataSourceProto.CUSTOM_SOURCE

@staticmethod
def from_proto(data_source: DataSourceProto) -> "MongoDBSourceNative":
def from_proto(data_source: DataSourceProto) -> "MongoDBSourceOne":
assert data_source.HasField("custom_options")
return MongoDBSourceNative(
return MongoDBSourceOne(
name=data_source.name,
timestamp_field=data_source.timestamp_field,
created_timestamp_column=data_source.created_timestamp_column,
Expand All @@ -219,7 +221,7 @@ def _to_proto_impl(self) -> DataSourceProto:
return DataSourceProto(
name=self.name,
type=DataSourceProto.CUSTOM_SOURCE,
data_source_class_type="feast.infra.offline_stores.contrib.mongodb_offline_store.mongodb_native.MongoDBSourceNative",
data_source_class_type="feast.infra.offline_stores.contrib.mongodb_offline_store.mongodb_native.MongoDBSourceOne",
field_mapping=self.field_mapping,
custom_options=DataSourceProto.CustomSourceOptions(
configuration=json.dumps({"feature_view": self.name}).encode()
Expand Down Expand Up @@ -320,7 +322,7 @@ def _fetch_documents(
return list(client[database][collection].aggregate(pipeline))


class MongoDBNativeRetrievalJob(RetrievalJob):
class MongoDBOneRetrievalJob(RetrievalJob):
"""Retrieval job for native MongoDB offline store queries."""

def __init__(
Expand Down Expand Up @@ -384,7 +386,7 @@ def _serialize_entity_key_from_row(
return serialize_entity_key(entity_key, entity_key_serialization_version)


class MongoDBOfflineStoreNative(OfflineStore):
class MongoDBOfflineStoreOne(OfflineStore):
"""Native MongoDB offline store using single-collection schema.

All feature views share one collection (``feature_history``), with documents
Expand Down Expand Up @@ -452,9 +454,9 @@ def pull_latest_from_table_or_query(
start_date: datetime,
end_date: datetime,
) -> RetrievalJob:
if not isinstance(data_source, MongoDBSourceNative):
if not isinstance(data_source, MongoDBSourceOne):
raise ValueError(
f"MongoDBOfflineStoreNative expected MongoDBSourceNative, "
f"MongoDBOfflineStoreOne expected MongoDBSourceOne, "
f"got {type(data_source).__name__!r}."
)
warnings.warn(
Expand Down Expand Up @@ -499,7 +501,7 @@ def pull_latest_from_table_or_query(
]

def _run() -> pyarrow.Table:
client = MongoDBOfflineStoreNative._get_client_and_ensure_indexes(config)
client = MongoDBOfflineStoreOne._get_client_and_ensure_indexes(config)
try:
docs = _fetch_documents(client, db_name, collection, pipeline)
if not docs:
Expand All @@ -515,7 +517,7 @@ def _run() -> pyarrow.Table:
finally:
client.close()

return MongoDBNativeRetrievalJob(query_fn=_run, full_feature_names=False)
return MongoDBOneRetrievalJob(query_fn=_run, full_feature_names=False)

@staticmethod
def pull_all_from_table_or_query(
Expand All @@ -528,9 +530,9 @@ def pull_all_from_table_or_query(
start_date: Optional[datetime] = None,
end_date: Optional[datetime] = None,
) -> RetrievalJob:
if not isinstance(data_source, MongoDBSourceNative):
if not isinstance(data_source, MongoDBSourceOne):
raise ValueError(
f"MongoDBOfflineStoreNative expected MongoDBSourceNative, "
f"MongoDBOfflineStoreOne expected MongoDBSourceOne, "
f"got {type(data_source).__name__!r}."
)
warnings.warn(
Expand Down Expand Up @@ -571,7 +573,7 @@ def pull_all_from_table_or_query(
]

def _run() -> pyarrow.Table:
client = MongoDBOfflineStoreNative._get_client_and_ensure_indexes(config)
client = MongoDBOfflineStoreOne._get_client_and_ensure_indexes(config)
try:
docs = _fetch_documents(client, db_name, collection, pipeline)
if not docs:
Expand All @@ -587,7 +589,7 @@ def _run() -> pyarrow.Table:
finally:
client.close()

return MongoDBNativeRetrievalJob(query_fn=_run, full_feature_names=False)
return MongoDBOneRetrievalJob(query_fn=_run, full_feature_names=False)

@staticmethod
def get_historical_features(
Expand All @@ -610,7 +612,7 @@ def get_historical_features(
"""
if isinstance(entity_df, str):
raise ValueError(
"MongoDBOfflineStoreNative does not support SQL entity_df strings. "
"MongoDBOfflineStoreOne does not support SQL entity_df strings. "
"Pass a pandas DataFrame instead."
)
warnings.warn(
Expand Down Expand Up @@ -777,7 +779,7 @@ def _run() -> pyarrow.Table:
working_df["_row_idx"] = range(len(working_df))

# Create client once for all chunks
client = MongoDBOfflineStoreNative._get_client_and_ensure_indexes(config)
client = MongoDBOfflineStoreOne._get_client_and_ensure_indexes(config)
try:
coll = client[db_name][feature_collection]

Expand Down Expand Up @@ -807,7 +809,7 @@ def _run() -> pyarrow.Table:

return pyarrow.Table.from_pandas(result_df, preserve_index=False)

return MongoDBNativeRetrievalJob(
return MongoDBOneRetrievalJob(
query_fn=_run,
full_feature_names=full_feature_names,
)
Loading