What this PR does / why we need it:
Closes #6173
Feature view versioning was introduced in #6101, but version-qualified feature references (e.g. driver_stats@v2:trips_today) only worked with the SQLite online store. All other online stores raised VersionedOnlineReadNotSupported when a versioned ref was used.
This PR adds versioned read/write support to the FAISS online store, following the same pattern as the SQLite reference implementation:
- Write path: when
enable_online_feature_view_versioning is enabled, _table_id appends a _v{N} suffix to the in-memory key namespace (e.g. project_driver_stats_v2), routing materialization to the correct versioned index
- Read path: version-qualified lookups (
@v2) set projection.version_tag on the feature view before online_read is called; _table_id picks this up and routes to the correct index. projection.version_tag takes priority over current_version_number so explicit version requests are always honoured
- Multi-table support: replaced single class-level
_index/_in_memory_store with per-table _indices/_in_memory_stores dicts, so multiple feature views and versions can coexist in memory simultaneously
- Gate:
_check_versioned_read_support in online_store.py now allows FaissOnlineStore through
All existing online_read, online_write_batch, retrieve_online_documents, update, and teardown methods are covered since every method resolves its namespace through _table_id.
Which issue(s) this PR fixes:
Part of #2728
Checks
- I've made sure the tests are passing.
- My commits are signed off (
git commit -s)
- My PR title follows conventional commits format
Testing Strategy
- Unit tests
- Integration tests
- Manual tests
- Testing is not required for this change
Added 11 unit tests covering _table_id with versioning disabled, projection.version_tag priority over current_version_number, version 0 edge case, no version info fallback, versioned write/read round trips, namespace isolation between versions, missing index handling, and teardown cleanup.
Misc
- Removed
"type" from mock config in tests to match FaissOnlineStoreConfig's strict pydantic validation (no extra fields permitted)