◐ Shell
clean mode source ↗

feat: Make udf optional if agg defined (#5689) by nquinn408 · Pull Request #6328 · feast-dev/feast

@nquinn408 self-assigned this

Apr 24, 2026

devin-ai-integration[bot]

Signed-off-by: Nick Quinn <nicholas_quinn@apple.com>
Fixes ruff I001 import ordering violation introduced with the
aggregations-without-udf test.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Signed-off-by: Nick Quinn <nicholas_quinn@apple.com>
_parse_transformation_from_proto fell through to _handle_backward_compatible_udf
when feature_transformation was absent, crashing on dill.loads(b"") for ODFVs
that have no transformation but do have aggregations.

Return None early when transformation_type is None and proto.spec.aggregations
is non-empty.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Signed-off-by: Nick Quinn <nicholas_quinn@apple.com>
infer_features() unconditionally asserted feature_transformation is not
None, crashing during apply() for aggregation-only ODFVs. Add an early
return when aggregations are present and feature_transformation is None;
features are explicitly declared via schema so inference via transformation
execution is not needed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Signed-off-by: Nick Quinn <nicholas_quinn@apple.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Signed-off-by: Nick Quinn <nicholas_quinn@apple.com>
- Redirect feast.types.Value_pb2 stub imports to
  feast.protos.feast.types.Value_pb2 where typed .pyi stubs live
- Add # type: ignore[arg-type] where .value (int) is passed to a
  proto field typed as NewType("ValueType", int)
- Add # type: ignore[arg-type] for getattr call with Optional[str]
  from WhichOneof in remote.py

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Signed-off-by: Nick Quinn <nicholas_quinn@apple.com>

ntkathole