Skip to content

Commit 3edfa43

Browse files
committed
ODSC-45790: Addressing review comments
1 parent 40eac53 commit 3edfa43

File tree

4 files changed

+106
-12
lines changed

4 files changed

+106
-12
lines changed

ads/feature_store/dataset.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -517,7 +517,7 @@ def feature_groups(self) -> List["FeatureGroup"]:
517517
self.CONST_FEATURE_GROUP
518518
)
519519
feature_groups: List["FeatureGroup"] = []
520-
if collection:
520+
if collection and collection.items:
521521
for datasetFGSummary in collection.items:
522522
feature_groups.append(
523523
FeatureGroup.from_id(datasetFGSummary.feature_group_id)
@@ -700,6 +700,7 @@ def create(self, **kwargs) -> "Dataset":
700700
# Create dataset
701701
logger.info("Saving dataset.")
702702
self.oci_dataset = self._to_oci_dataset(**kwargs).create()
703+
self._update_from_oci_dataset_model(self.oci_dataset)
703704
self.with_id(self.oci_dataset.id)
704705
return self
705706

@@ -777,11 +778,10 @@ def _update_from_oci_dataset_model(self, oci_dataset: OCIDataset) -> "Dataset":
777778

778779
# Update the main properties
779780
self.oci_dataset = oci_dataset
780-
dataset_details = oci_dataset.to_dict()
781781

782782
for infra_attr, dsc_attr in self.attribute_map.items():
783-
if infra_attr in dataset_details:
784-
self.set_spec(infra_attr, dataset_details[infra_attr])
783+
if dsc_attr in self.oci_dataset.attribute_map:
784+
self.set_spec(infra_attr, getattr(self.oci_dataset, dsc_attr))
785785

786786
return self
787787

@@ -1061,6 +1061,10 @@ def to_dict(self) -> Dict:
10611061
for key, value in spec.items():
10621062
if hasattr(value, "to_dict"):
10631063
value = value.to_dict()
1064+
if hasattr(value, "attribute_map"):
1065+
value = self.oci_dataset.client.base_client.sanitize_for_serialization(
1066+
value
1067+
)
10641068
spec[key] = value
10651069

10661070
return {

tests/integration/feature_store/test_base.py

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
import oci
1212
import pandas as pd
13+
from ads.feature_store.entity import Entity
1314
from great_expectations.core import ExpectationSuite, ExpectationConfiguration
1415
import ads
1516
import os
@@ -22,7 +23,7 @@
2223

2324
client_kwargs = dict(
2425
retry_strategy=oci.retry.NoneRetryStrategy,
25-
service_endpoint=os.getenv("service_endpoint"),
26+
service_endpoint="http://127.0.0.1:21000/20230101",
2627
)
2728
ads.set_auth(client_kwargs=client_kwargs)
2829

@@ -36,20 +37,26 @@
3637

3738

3839
def transformation_with_kwargs(data_frame, **kwargs):
39-
is_area_enabled = kwargs.get('is_area_enabled')
40+
is_area_enabled = kwargs.get("is_area_enabled")
4041

4142
if is_area_enabled:
4243
# Calculate petal area and sepal area
43-
data_frame["petal_area"] = data_frame["petal_length"] * data_frame["petal_width"]
44-
data_frame["sepal_area"] = data_frame["sepal_length"] * data_frame["sepal_width"]
44+
data_frame["petal_area"] = (
45+
data_frame["petal_length"] * data_frame["petal_width"]
46+
)
47+
data_frame["sepal_area"] = (
48+
data_frame["sepal_length"] * data_frame["sepal_width"]
49+
)
4550

4651
# Return the updated DataFrame
4752
return data_frame
4853

4954

5055
class FeatureStoreTestCase:
5156
# networks compartment in feature store
52-
TIME_NOW = str.format("{}_{}",datetime.utcnow().strftime("%Y_%m_%d_%H_%M_%S"),int(random()*1000))
57+
TIME_NOW = str.format(
58+
"{}_{}", datetime.utcnow().strftime("%Y_%m_%d_%H_%M_%S"), int(random() * 1000)
59+
)
5360
TENANCY_ID = "ocid1.tenancy.oc1..aaaaaaaa462hfhplpx652b32ix62xrdijppq2c7okwcqjlgrbknhgtj2kofa"
5461
COMPARTMENT_ID = "ocid1.tenancy.oc1..aaaaaaaa462hfhplpx652b32ix62xrdijppq2c7okwcqjlgrbknhgtj2kofa"
5562
METASTORE_ID = "ocid1.datacatalogmetastore.oc1.iad.amaaaaaabiudgxyap7tizm4gscwz7amu7dixz7ml3mtesqzzwwg3urvvdgua"
@@ -376,9 +383,11 @@ def create_entity_resource(self, feature_store) -> "Entity":
376383
return entity
377384

378385
def create_transformation_resource(self, feature_store) -> "Transformation":
379-
transformation = feature_store.create_transformation(source_code_func=transformation_with_kwargs,
380-
display_name="transformation_with_kwargs",
381-
transformation_mode=TransformationMode.PANDAS)
386+
transformation = feature_store.create_transformation(
387+
source_code_func=transformation_with_kwargs,
388+
display_name="transformation_with_kwargs",
389+
transformation_mode=TransformationMode.PANDAS,
390+
)
382391
return transformation
383392

384393
def define_feature_group_resource(
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*--
3+
4+
# Copyright (c) 2023 Oracle and/or its affiliates.
5+
# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
6+
7+
import pytest
8+
import unittest
9+
10+
from ads.feature_store.dataset import Dataset
11+
12+
from ads.feature_store.entity import Entity
13+
14+
from ads.feature_store.feature_store import FeatureStore
15+
16+
from ads.feature_store.feature_group import FeatureGroup
17+
18+
from ads.feature_store.feature_option_details import FeatureOptionDetails
19+
from tests.integration.feature_store.test_base import FeatureStoreTestCase
20+
21+
22+
class TestDatasetComplex(FeatureStoreTestCase):
23+
"""Contains integration tests for Dataset Delta changes."""
24+
25+
@pytest.fixture()
26+
def feature_store(self) -> FeatureStore:
27+
feature_store = self.define_feature_store_resource().create()
28+
yield feature_store
29+
# self.clean_up_feature_store(feature_store)
30+
31+
@pytest.fixture()
32+
def entity(self, feature_store: FeatureStore):
33+
entity = self.create_entity_resource(feature_store)
34+
yield entity
35+
# self.clean_up_entity(entity)
36+
37+
@pytest.fixture()
38+
def feature_group(self, entity, feature_store) -> "FeatureGroup":
39+
feature_group = self.define_feature_group_resource(
40+
entity.oci_fs_entity.id, feature_store.oci_fs.id
41+
).create()
42+
yield feature_group
43+
# self.clean_up_feature_group(feature_group)
44+
45+
def test_manual_dataset(
46+
self,
47+
feature_store: FeatureStore,
48+
entity: Entity,
49+
feature_group: FeatureGroup,
50+
):
51+
query = """
52+
(SELECT
53+
name, games, goals
54+
FROM tblMadrid WHERE name = 'ronaldo')
55+
UNION
56+
(SELECT
57+
name, games, goals
58+
FROM tblBarcelona WHERE name = 'messi')
59+
ORDER BY goals"""
60+
name = self.get_name("fireside_football_debate")
61+
dataset_resource = (
62+
Dataset()
63+
.with_description("dataset description")
64+
.with_compartment_id(self.COMPARTMENT_ID)
65+
.with_name(name)
66+
.with_entity_id(entity_id=entity.id)
67+
.with_feature_store_id(feature_store_id=feature_store.id)
68+
.with_query(query)
69+
.with_feature_groups([feature_group])
70+
).create()
71+
assert len(dataset_resource.feature_groups) == 1
72+
assert dataset_resource.feature_groups[0].id == feature_group.id
73+
assert dataset_resource.get_spec(
74+
Dataset.CONST_FEATURE_GROUP
75+
).is_manual_association
76+
return dataset_resource

tests/integration/feature_store/test_dataset_delta.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import pytest
88
import unittest
99

10+
from ads.feature_store.dataset import Dataset
11+
1012
from ads.feature_store.feature_option_details import FeatureOptionDetails
1113
from tests.integration.feature_store.test_base import FeatureStoreTestCase
1214

@@ -125,6 +127,9 @@ def test_dataset_materialise_overwrite(self, feature_group, dataset):
125127
dataset.materialise(ingestion_mode=IngestionMode.OVERWRITE)
126128

127129
df = dataset.preview(row_count=50)
130+
assert (
131+
dataset.get_spec(Dataset.CONST_FEATURE_GROUP).is_manual_association == False
132+
)
128133
assert df.count() == 14
129134
assert len(df.columns) == 6
130135

0 commit comments

Comments
 (0)