From f0180e69e9a2bfbfa5152ce9ddbcddd8962a482a Mon Sep 17 00:00:00 2001 From: tokoko Date: Tue, 13 Feb 2024 20:52:22 +0000 Subject: [PATCH] OnDemandFeatureView: keep udf and udf_string parameters for backwards compatibility Signed-off-by: tokoko --- sdk/python/feast/on_demand_feature_view.py | 20 ++++++++++++++++++- .../tests/unit/test_on_demand_feature_view.py | 11 ++++++---- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/sdk/python/feast/on_demand_feature_view.py b/sdk/python/feast/on_demand_feature_view.py index 41d7cb817a..706f2ec4e4 100644 --- a/sdk/python/feast/on_demand_feature_view.py +++ b/sdk/python/feast/on_demand_feature_view.py @@ -2,6 +2,7 @@ import functools import warnings from datetime import datetime +from types import FunctionType from typing import Any, Dict, List, Optional, Type, Union import dill @@ -77,7 +78,9 @@ def __init__( # noqa: C901 FeatureViewProjection, ] ], - transformation: Union[OnDemandPandasTransformation], + udf: Optional[FunctionType] = None, + udf_string: str = "", + transformation: Optional[Union[OnDemandPandasTransformation]] = None, description: str = "", tags: Optional[Dict[str, str]] = None, owner: str = "", @@ -92,6 +95,9 @@ def __init__( # noqa: C901 sources: A map from input source names to the actual input sources, which may be feature views, or request data sources. These sources serve as inputs to the udf, which will refer to them by name. + udf (deprecated): The user defined transformation function, which must take pandas + dataframes as inputs. + udf_string (deprecated): The source code version of the udf (for diffing and displaying in Web UI) transformation: The user defined transformation. description (optional): A human-readable description. tags (optional): A dictionary of key-value pairs to store arbitrary metadata. @@ -106,6 +112,18 @@ def __init__( # noqa: C901 owner=owner, ) + if not transformation: + if udf: + warnings.warn( + "udf and udf_string parameters are deprecated. Please use transformation=OnDemandPandasTransformation(udf, udf_string) instead.", + DeprecationWarning, + ) + transformation = OnDemandPandasTransformation(udf, udf_string) + else: + raise Exception( + "OnDemandFeatureView needs to be initialized with either transformation or udf arguments" + ) + self.source_feature_view_projections: Dict[str, FeatureViewProjection] = {} self.source_request_sources: Dict[str, RequestSource] = {} for odfv_source in sources: diff --git a/sdk/python/tests/unit/test_on_demand_feature_view.py b/sdk/python/tests/unit/test_on_demand_feature_view.py index 24a4af449b..721026ea46 100644 --- a/sdk/python/tests/unit/test_on_demand_feature_view.py +++ b/sdk/python/tests/unit/test_on_demand_feature_view.py @@ -95,16 +95,15 @@ def test_hash(): ), description="test", ) - on_demand_feature_view_4 = OnDemandFeatureView( + on_demand_feature_view_5 = OnDemandFeatureView( name="my-on-demand-feature-view", sources=sources, schema=[ Field(name="output1", dtype=Float32), Field(name="output2", dtype=Float32), ], - transformation=OnDemandPandasTransformation( - udf=udf2, udf_string="udf2 source code" - ), + udf=udf2, + udf_string="udf2 source code", description="test", ) @@ -124,3 +123,7 @@ def test_hash(): on_demand_feature_view_4, } assert len(s4) == 3 + + assert on_demand_feature_view_5.transformation == OnDemandPandasTransformation( + udf2, "udf2 source code" + )