Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
837e34f
feat: Add unified transformation
franciscojavierarceo Nov 26, 2025
d12fbfd
feat: Unify transformations
franciscojavierarceo Nov 27, 2025
9a2df49
feat: Unify Transformations
franciscojavierarceo Nov 28, 2025
9aceb7f
feat: Unify Transformations
franciscojavierarceo Nov 28, 2025
5c8b93c
updated docs
franciscojavierarceo Dec 4, 2025
6d5ce47
refactor: separate transformation logic from execution decisions with…
franciscojavierarceo Dec 23, 2025
9380cf9
format
franciscojavierarceo Dec 23, 2025
5b759ed
incorporaitng feedback
franciscojavierarceo Dec 24, 2025
2d7a43b
updated
franciscojavierarceo Dec 25, 2025
b6299d2
fix
franciscojavierarceo Dec 26, 2025
3726733
linter
franciscojavierarceo Dec 26, 2025
f55d4b4
cleanup
franciscojavierarceo Dec 26, 2025
716e692
cleanup
franciscojavierarceo Dec 26, 2025
a4f2e0a
more fix
franciscojavierarceo Dec 29, 2025
02ae40b
more fix
franciscojavierarceo Dec 29, 2025
74de467
updated
franciscojavierarceo Dec 31, 2025
c360aef
fix
franciscojavierarceo Jan 5, 2026
f73431c
fix
franciscojavierarceo Jan 5, 2026
50e536a
fix
franciscojavierarceo Jan 5, 2026
a87c4b4
fix
franciscojavierarceo Jan 5, 2026
e2f722c
Merge branch 'master' into refactor-odfv
franciscojavierarceo Jan 5, 2026
dde05bd
lint
franciscojavierarceo Jan 5, 2026
0e1f037
fix
franciscojavierarceo Jan 6, 2026
662e21b
linter
franciscojavierarceo Jan 6, 2026
9f48c75
fix linter
franciscojavierarceo Jan 6, 2026
a058aac
fix
franciscojavierarceo Jan 6, 2026
b8771c9
fix(redis): Preserve millisecond timestamp precision for Redis online…
jatin5251 Jan 6, 2026
34d9b52
feat: Add GCS registry store in Go feature server (#5818)
samuelkim7 Jan 6, 2026
6c35d45
chore: Refactor some unit tests into integration tests (#5820)
franciscojavierarceo Jan 6, 2026
5bcd6e6
test: Remove e2e_rhoai package tests
Srihari1192 Jan 5, 2026
61812ba
fix
franciscojavierarceo Jan 7, 2026
d4adcd5
fix
franciscojavierarceo Jan 7, 2026
a007be3
fix
franciscojavierarceo Jan 8, 2026
416b15c
uploading progress
franciscojavierarceo Jan 13, 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
updated
Signed-off-by: Francisco Javier Arceo <farceo@redhat.com>
  • Loading branch information
franciscojavierarceo committed Jan 5, 2026
commit 74de4670094323f0c45147805ac82d6f70860d5d
1 change: 0 additions & 1 deletion sdk/python/feast/feature_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -380,7 +380,6 @@ async def write_to_online_store(request: WriteToFeatureStoreRequest) -> None:
feature_view_name=feature_view_name,
df=df,
allow_registry_cache=allow_registry_cache,
transform=request.transform_on_write,
)

@app.get("/health")
Expand Down
7 changes: 2 additions & 5 deletions sdk/python/feast/feature_store.py
Original file line number Diff line number Diff line change
Expand Up @@ -1767,7 +1767,6 @@ def push(
fv.name,
df,
allow_registry_cache=allow_registry_cache,
transform=transform_on_write,
)
if to == PushMode.OFFLINE or to == PushMode.ONLINE_AND_OFFLINE:
self.write_to_offline_store(
Expand Down Expand Up @@ -2094,10 +2093,9 @@ def write_to_online_store(
"""

# Get feature view to enable schema-based transformation detection
registry = self._get_registry_and_project()[0]
feature_view = cast(
FeatureView,
registry.get_feature_view(
self._registry.get_feature_view(
feature_view_name, self.project, allow_cache=allow_registry_cache
),
)
Expand Down Expand Up @@ -2156,10 +2154,9 @@ async def write_to_online_store_async(
"""

# Get feature view to enable schema-based transformation detection
registry = self._get_registry_and_project()[0]
feature_view = cast(
FeatureView,
registry.get_feature_view(
self._registry.get_feature_view(
feature_view_name, self.project, allow_cache=allow_registry_cache
),
)
Expand Down
18 changes: 10 additions & 8 deletions sdk/python/feast/schema_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,14 +93,16 @@ def get_output_schema_columns(
schema_columns.add(field.name)

# Add entity columns (present in both input and output)
for entity in feature_view.entities:
if hasattr(entity, "join_keys"):
# Entity object
schema_columns.update(entity.join_keys)
elif isinstance(entity, str):
# Entity name string - need to get entity object from somewhere
# For now, we'll assume the entity name is the join key
schema_columns.add(entity)
# For OnDemandFeatureViews, we skip adding entity columns since they're not meaningful
if not isinstance(feature_view, OnDemandFeatureView):
for entity in feature_view.entities:
if hasattr(entity, "join_keys"):
# Entity object
schema_columns.update(entity.join_keys)
elif isinstance(entity, str):
# Entity name string - filter out dummy entities
if entity != "__dummy":
schema_columns.add(entity)

return schema_columns

Expand Down
18 changes: 10 additions & 8 deletions sdk/python/tests/unit/test_schema_detection.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ def test_get_input_schema_columns(self):
"""Test getting input schema columns from FeatureView."""
input_columns = get_input_schema_columns(self.feature_view)
# Note: FileSource without explicit schema falls back to entity names + timestamp
# Since entities are stored as strings, we use entity name rather than join keys
expected_columns = {"driver", "event_timestamp"}
self.assertEqual(input_columns, expected_columns)

Expand Down Expand Up @@ -151,7 +152,7 @@ def test_should_apply_transformation_dataframe_input(self):
# DataFrame with input schema
input_df = pd.DataFrame(
{
"driver_id": [1, 2],
"driver": [1, 2],
"value": [5, 10],
"event_timestamp": ["2023-01-01", "2023-01-02"],
}
Expand All @@ -163,7 +164,7 @@ def test_should_apply_transformation_dataframe_input(self):
)

# DataFrame with output schema
output_df = pd.DataFrame({"driver_id": [1, 2], "doubled_value": [10, 20]})
output_df = pd.DataFrame({"driver": [1, 2], "doubled_value": [10, 20]})

result = should_apply_transformation(self.feature_view, output_df)
self.assertFalse(
Expand All @@ -175,7 +176,7 @@ def test_should_apply_transformation_subset_matching(self):
"""Test detection with subset schema matching (superset data)."""
# Data is superset of input schema (extra columns are ok)
superset_input_data = {
"driver_id": 1,
"driver": 1,
"value": 5,
"event_timestamp": "2023-01-01",
"extra_field": "extra_value",
Expand All @@ -189,28 +190,29 @@ def test_should_apply_transformation_subset_matching(self):
def test_validate_transformation_compatibility(self):
"""Test transformation compatibility validation."""
# Valid input data
input_data = {"driver_id": 1, "value": 5, "event_timestamp": "2023-01-01"}
transformed_data = {"driver_id": 1, "doubled_value": 10}
input_data = {"driver": 1, "value": 5, "event_timestamp": "2023-01-01"}
transformed_data = {"driver": 1, "doubled_value": 10}

errors = validate_transformation_compatibility(
self.feature_view, input_data, transformed_data
)
self.assertEqual(len(errors), 0, "Should have no errors for valid data")

# Invalid input data (missing required column)
invalid_input_data = {"driver_id": 1} # Missing value and timestamp
invalid_input_data = {"driver": 1} # Missing value and timestamp

errors = validate_transformation_compatibility(
self.feature_view, invalid_input_data
)
self.assertGreater(
len(errors), 0, "Should have errors for missing input columns"
)
self.assertIn("value", str(errors))
# Only event_timestamp is required from the input schema (entity + timestamp)
# 'value' is not part of the detected input schema for sources without explicit schema
self.assertIn("event_timestamp", str(errors))

# Invalid transformed data (missing required output column)
invalid_transformed_data = {"driver_id": 1} # Missing doubled_value
invalid_transformed_data = {"driver": 1} # Missing doubled_value

errors = validate_transformation_compatibility(
self.feature_view, input_data, invalid_transformed_data
Expand Down