Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
a90cb7f
feat: Add version tracking to FeatureView, StreamFeatureView, and OnD…
franciscojavierarceo Mar 12, 2026
f28942b
fix: Address PR review feedback from Devin
franciscojavierarceo Mar 12, 2026
171785e
docs: Add feature view versioning documentation
franciscojavierarceo Mar 13, 2026
f035e96
fix: Address second round of PR review feedback from Devin
franciscojavierarceo Mar 13, 2026
0c12655
fix: Clean up version history on delete and use write_engine consiste…
franciscojavierarceo Mar 13, 2026
d32ed52
docs: Clarify versioning auto-increment behavior and pin/revert flow
franciscojavierarceo Mar 13, 2026
f9e896f
fix: Add pin conflict detection to both file and SQL registries
franciscojavierarceo Mar 13, 2026
2069b22
fix: Address Devin review feedback on versioning
franciscojavierarceo Mar 13, 2026
83393aa
docs: Document concurrent multi-version serving limitations
franciscojavierarceo Mar 13, 2026
94afe6e
feat: Implement version-qualified feature references (@v<N>)
franciscojavierarceo Mar 14, 2026
76d1afc
fix: Resolve mypy type errors in proto_registry_utils.py
franciscojavierarceo Mar 15, 2026
2541e41
feat: Add version metadata to clean @v2 syntax from feature names
franciscojavierarceo Mar 16, 2026
bceb052
fix: Update provider implementations with version metadata parameter
franciscojavierarceo Mar 16, 2026
14b2da0
fix: Add version metadata parameter to all online store implementations
franciscojavierarceo Mar 16, 2026
fd776fc
fix: Resolve mypy type errors in versioning code
franciscojavierarceo Mar 17, 2026
e9c4c68
fix: Address Devin review feedback on versioning
franciscojavierarceo Mar 17, 2026
903bda5
fix: Address additional Devin review feedback
franciscojavierarceo Mar 17, 2026
af47911
Merge branch 'master' into featureview-versioning
franciscojavierarceo Mar 17, 2026
dd31cdb
feat: Make feature view versioning opt-in via registry config
franciscojavierarceo Mar 17, 2026
8809805
fix: Address Devin review feedback on versioning issues
franciscojavierarceo Mar 17, 2026
d23c4bb
fix: Preserve version tag in response column names for multi-version …
franciscojavierarceo Mar 17, 2026
c5d4b49
feat: Handle version race conditions gracefully with retry and forwar…
franciscojavierarceo Mar 18, 2026
2a3e544
feat: Gate feature services that reference versioned feature views
franciscojavierarceo Mar 18, 2026
66c280b
fix: Resolve mypy errors and rename config field for clarity
franciscojavierarceo Mar 18, 2026
cfc038b
feat: Enable feature service serving for versioned feature views
franciscojavierarceo Mar 18, 2026
c9aea43
docs: Update RFC for feature service support and rename CLI command
franciscojavierarceo Mar 18, 2026
221e0ed
feat(ui): Add version display and Versions tab to feature view pages
franciscojavierarceo Mar 19, 2026
3efccbf
style(ui): Fix prettier formatting in feature view components
franciscojavierarceo Mar 19, 2026
6878fb0
updated utcnow
franciscojavierarceo Mar 20, 2026
280daf6
feat: Add version-aware materialization support
franciscojavierarceo Mar 20, 2026
43674ac
fix: Resolve three versioning regressions from review feedback
franciscojavierarceo Mar 20, 2026
01e4e77
feat: Add --no-promote flag to feast apply and fix versioned ref parsing
franciscojavierarceo Mar 23, 2026
1876060
docs: Consolidate versioning docs into alpha reference page
franciscojavierarceo Mar 23, 2026
760c003
docs: Add no_promote to apply_diff_to_registry docstring
franciscojavierarceo Mar 24, 2026
bc986ef
fix: Reject reserved chars in FV names and make version parser resilient
franciscojavierarceo Mar 24, 2026
b2d6c09
Merge branch 'master' into featureview-versioning
franciscojavierarceo Mar 24, 2026
3a73c87
fix: Add ensure_valid() call in Snowflake registry apply_feature_view
franciscojavierarceo Mar 24, 2026
1468bc5
Merge branch 'master' into featureview-versioning
franciscojavierarceo Mar 25, 2026
3c1ddbe
fix: Make version_tag optional in proto and use HasField() for correc…
franciscojavierarceo Mar 25, 2026
8c1259f
fix: Address versioning review feedback (Snowflake, Go server, SQL re…
franciscojavierarceo Mar 26, 2026
ac0348d
Merge branch 'master' into featureview-versioning
franciscojavierarceo Mar 26, 2026
7dfc447
fix: Handle @latest in Go feature server and pre-compile version regex
franciscojavierarceo Mar 26, 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
fix: Address versioning review feedback (Snowflake, Go server, SQL re…
…gistry)

- Snowflake registry: raise NotImplementedError when no_promote=True
  since versioning is not supported
- Go feature server: return error on versioned refs (@vn) instead of
  silently stripping the version and serving unversioned data
- SQL registry: inline delete logic in delete_feature_view so the FV
  delete and version history cleanup run in a single transaction,
  preventing orphaned rows on partial failure

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
  • Loading branch information
franciscojavierarceo and claude committed Mar 26, 2026
commit 8c1259fb6a1ff888476169e6e503e396bafc6f28
5 changes: 3 additions & 2 deletions go/internal/feast/onlineserving/serving.go
Original file line number Diff line number Diff line change
Expand Up @@ -494,12 +494,13 @@ func ParseFeatureReference(featureRef string) (featureViewName, featureName stri
featureName = parsedFeatureName[1]
}

// Strip @v<N> version qualifier from feature view name
// Reject @v<N> version qualifier — Go feature server does not support versioned reads
if atIdx := strings.Index(featureViewName, "@"); atIdx >= 0 {
suffix := featureViewName[atIdx+1:]
matched, _ := regexp.MatchString(`^[vV]\d+$`, suffix)
Comment thread
devin-ai-integration[bot] marked this conversation as resolved.
Outdated
if matched {
featureViewName = featureViewName[:atIdx]
e = fmt.Errorf("versioned feature refs (@%s) are not supported by the Go feature server", suffix)
return
}
}
Comment thread
devin-ai-integration[bot] marked this conversation as resolved.
return
Expand Down
5 changes: 5 additions & 0 deletions sdk/python/feast/infra/registry/snowflake.py
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,11 @@ def apply_feature_view(
commit: bool = True,
no_promote: bool = False,
):
if no_promote:
raise NotImplementedError(
"Feature view versioning (no_promote) is not supported by the Snowflake registry. "
"Use the SQL registry or file registry for versioning support."
)
feature_view.ensure_valid()
fv_table_str = self._infer_fv_table(feature_view)
fv_column_name = fv_table_str[:-1]
Expand Down
36 changes: 24 additions & 12 deletions sdk/python/feast/infra/registry/sql.py
Original file line number Diff line number Diff line change
Expand Up @@ -561,25 +561,37 @@ def delete_entity(self, name: str, project: str, commit: bool = True):
)

def delete_feature_view(self, name: str, project: str, commit: bool = True):
deleted_count = 0
for table in {
feature_views,
on_demand_feature_views,
stream_feature_views,
}:
deleted_count += self._delete_object(
table, name, project, "feature_view_name", None
)
if deleted_count == 0:
raise FeatureViewNotFoundException(name, project)
# Clean up version history for the deleted feature view
with self.write_engine.begin() as conn:
deleted_count = 0
for table in {
feature_views,
on_demand_feature_views,
stream_feature_views,
}:
stmt = delete(table).where(
table.c.feature_view_name == name,
table.c.project_id == project,
)
rows = conn.execute(stmt)
deleted_count += rows.rowcount
if deleted_count == 0:
raise FeatureViewNotFoundException(name, project)
# Clean up version history in the same transaction
stmt = delete(feature_view_version_history).where(
feature_view_version_history.c.feature_view_name == name,
feature_view_version_history.c.project_id == project,
)
conn.execute(stmt)

self.apply_project(
self.get_project(name=project, allow_cache=False), commit=True
)
if not self.purge_feast_metadata:
with self.write_engine.begin() as conn:
self._set_last_updated_metadata(_utc_now(), project, conn)
if self.cache_mode == "sync":
self.refresh()

def delete_feature_service(self, name: str, project: str, commit: bool = True):
return self._delete_object(
feature_services,
Expand Down
Loading