From 6ab437d0fc4cf97c817f94e6eed8984e98b1bebf Mon Sep 17 00:00:00 2001 From: Achal Shah Date: Mon, 8 Aug 2022 10:34:22 -0700 Subject: [PATCH 1/2] chore: Add types for some methods in the sql registry Signed-off-by: Achal Shah --- sdk/python/feast/infra/registry_stores/sql.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/sdk/python/feast/infra/registry_stores/sql.py b/sdk/python/feast/infra/registry_stores/sql.py index e4f08f54135..54a789a9af0 100644 --- a/sdk/python/feast/infra/registry_stores/sql.py +++ b/sdk/python/feast/infra/registry_stores/sql.py @@ -688,15 +688,16 @@ def _apply_object( self, table: Table, project: str, - id_field_name, - obj, - proto_field_name, - name=None, + id_field_name: str, + obj: Any, + proto_field_name: str, + name: Optional[str] = None, ): self._maybe_init_project_metadata(project) name = name or obj.name if hasattr(obj, "name") else None assert name, f"name needs to be provided for {obj}" + with self.engine.connect() as conn: update_datetime = datetime.utcnow() update_time = int(update_datetime.timestamp()) From 7f8d7bb23b578a58b07dcc49314be53365178047 Mon Sep 17 00:00:00 2001 From: Achal Shah Date: Mon, 8 Aug 2022 13:49:36 -0700 Subject: [PATCH 2/2] created_timestamp Signed-off-by: Achal Shah --- sdk/python/feast/infra/registry_stores/sql.py | 9 ++++++++- sdk/python/tests/unit/test_sql_registry.py | 6 ++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/sdk/python/feast/infra/registry_stores/sql.py b/sdk/python/feast/infra/registry_stores/sql.py index 54a789a9af0..39ed2a802e7 100644 --- a/sdk/python/feast/infra/registry_stores/sql.py +++ b/sdk/python/feast/infra/registry_stores/sql.py @@ -722,9 +722,16 @@ def _apply_object( ) conn.execute(update_stmt) else: + obj_proto = obj.to_proto() + + if hasattr(obj_proto, "meta") and hasattr( + obj_proto.meta, "created_timestamp" + ): + obj_proto.meta.created_timestamp.FromDatetime(update_datetime) + values = { id_field_name: name, - proto_field_name: obj.to_proto().SerializeToString(), + proto_field_name: obj_proto.SerializeToString(), "last_updated_timestamp": update_time, "project_id": project, } diff --git a/sdk/python/tests/unit/test_sql_registry.py b/sdk/python/tests/unit/test_sql_registry.py index 0a7f9ac4bea..85746eb9c5b 100644 --- a/sdk/python/tests/unit/test_sql_registry.py +++ b/sdk/python/tests/unit/test_sql_registry.py @@ -168,6 +168,9 @@ def test_apply_entity_success(sql_registry): and entity.tags["team"] == "matchmaking" ) + # After the first apply, the created_timestamp should be the same as the last_update_timestamp. + assert entity.created_timestamp == entity.last_updated_timestamp + sql_registry.delete_entity("driver_car_id", project) assert_project_uuid(project, project_uuid, sql_registry) entities = sql_registry.list_entities(project) @@ -256,6 +259,9 @@ def test_apply_feature_view_success(sql_registry): and feature_view.entities[0] == "fs1_my_entity_1" ) + # After the first apply, the created_timestamp should be the same as the last_update_timestamp. + assert feature_view.created_timestamp == feature_view.last_updated_timestamp + sql_registry.delete_feature_view("my_feature_view_1", project) feature_views = sql_registry.list_feature_views(project) assert len(feature_views) == 0