Skip to content

Commit e95aaf1

Browse files
authored
Revert "Add batch_get_record and search API for FeatureStore (#3580)"
This reverts commit 27ebde6.
1 parent 27ebde6 commit e95aaf1

File tree

7 files changed

+3
-498
lines changed

7 files changed

+3
-498
lines changed

src/sagemaker/feature_store/feature_store.py

Lines changed: 0 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,6 @@
2626
from sagemaker import Session
2727
from sagemaker.feature_store.dataset_builder import DatasetBuilder
2828
from sagemaker.feature_store.feature_group import FeatureGroup
29-
from sagemaker.feature_store.inputs import (
30-
Filter,
31-
ResourceEnum,
32-
SearchOperatorEnum,
33-
SortOrderEnum,
34-
Identifier,
35-
)
3629

3730

3831
@attr.s
@@ -121,7 +114,6 @@ def list_feature_groups(
121114
sort_by (str): The value on which the FeatureGroup list is sorted.
122115
max_results (int): The maximum number of results returned by ListFeatureGroups.
123116
next_token (str): A token to resume pagination of ListFeatureGroups results.
124-
125117
Returns:
126118
Response dict from service.
127119
"""
@@ -136,61 +128,3 @@ def list_feature_groups(
136128
max_results=max_results,
137129
next_token=next_token,
138130
)
139-
140-
def batch_get_record(self, identifiers: Sequence[Identifier]) -> Dict[str, Any]:
141-
"""Get record in batch from FeatureStore
142-
143-
Args:
144-
identifiers (Sequence[Identifier]): A list of identifiers to uniquely identify records
145-
in FeatureStore.
146-
147-
Returns:
148-
Response dict from service.
149-
"""
150-
batch_get_record_identifiers = [identifier.to_dict() for identifier in identifiers]
151-
return self.sagemaker_session.batch_get_record(identifiers=batch_get_record_identifiers)
152-
153-
def search(
154-
self,
155-
resource: ResourceEnum,
156-
filters: Sequence[Filter] = None,
157-
operator: SearchOperatorEnum = None,
158-
sort_by: str = None,
159-
sort_order: SortOrderEnum = None,
160-
next_token: str = None,
161-
max_results: int = None,
162-
) -> Dict[str, Any]:
163-
"""Search for FeatureGroups or FeatureMetadata satisfying given filters.
164-
165-
Args:
166-
resource (ResourceEnum): The name of the Amazon SageMaker resource to search for.
167-
Valid values are ``FeatureGroup`` or ``FeatureMetadata``.
168-
filters (Sequence[Filter]): A list of filter objects (Default: None).
169-
operator (SearchOperatorEnum): A Boolean operator used to evaluate the filters.
170-
Valid values are ``And`` or ``Or``. The default is ``And`` (Default: None).
171-
sort_by (str): The name of the resource property used to sort the ``SearchResults``.
172-
The default is ``LastModifiedTime``.
173-
sort_order (SortOrderEnum): How ``SearchResults`` are ordered.
174-
Valid values are ``Ascending`` or ``Descending``. The default is ``Descending``.
175-
next_token (str): If more than ``MaxResults`` resources match the specified
176-
filters, the response includes a ``NextToken``. The ``NextToken`` can be passed to
177-
the next ``SearchRequest`` to continue retrieving results (Default: None).
178-
max_results (int): The maximum number of results to return (Default: None).
179-
180-
Returns:
181-
Response dict from service.
182-
"""
183-
search_expression = {}
184-
if filters:
185-
search_expression["Filters"] = [filter.to_dict() for filter in filters]
186-
if operator:
187-
search_expression["Operator"] = str(operator)
188-
189-
return self.sagemaker_session.search(
190-
resource=str(resource),
191-
search_expression=search_expression,
192-
sort_by=sort_by,
193-
sort_order=None if not sort_order else str(sort_order),
194-
next_token=next_token,
195-
max_results=max_results,
196-
)

src/sagemaker/feature_store/inputs.py

Lines changed: 1 addition & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
from __future__ import absolute_import
3030

3131
import abc
32-
from typing import Dict, Any, List
32+
from typing import Dict, Any
3333
from enum import Enum
3434

3535
import attr
@@ -245,127 +245,3 @@ def to_dict(self) -> Dict[str, Any]:
245245
Key=self.key,
246246
Value=self.value,
247247
)
248-
249-
250-
class ResourceEnum(Enum):
251-
"""Enum of resources.
252-
253-
The data type of resource can be ``FeatureGroup`` or ``FeatureMetadata``.
254-
"""
255-
256-
def __str__(self):
257-
"""Override str method to return enum value."""
258-
return str(self.value)
259-
260-
FEATURE_GROUP = "FeatureGroup"
261-
FEATURE_METADATA = "FeatureMetadata"
262-
263-
264-
class SearchOperatorEnum(Enum):
265-
"""Enum of search operators.
266-
267-
The data type of search operator can be ``And`` or ``Or``.
268-
"""
269-
270-
def __str__(self):
271-
"""Override str method to return enum value."""
272-
return str(self.value)
273-
274-
AND = "And"
275-
OR = "Or"
276-
277-
278-
class SortOrderEnum(Enum):
279-
"""Enum of sort orders.
280-
281-
The data type of sort order can be ``Ascending`` or ``Descending``.
282-
"""
283-
284-
def __str__(self):
285-
"""Override str method to return enum value."""
286-
return str(self.value)
287-
288-
ASCENDING = "Ascending"
289-
DESCENDING = "Descending"
290-
291-
292-
class FilterOperatorEnum(Enum):
293-
"""Enum of filter operators.
294-
295-
The data type of filter operator can be ``Equals``, ``NotEquals``, ``GreaterThan``,
296-
``GreaterThanOrEqualTo``, ``LessThan``, ``LessThanOrEqualTo``, ``Contains``, ``Exists``,
297-
``NotExists``, or ``In``.
298-
"""
299-
300-
def __str__(self):
301-
"""Override str method to return enum value."""
302-
return str(self.value)
303-
304-
EQUALS = "Equals"
305-
NOT_EQUALS = "NotEquals"
306-
GREATER_THAN = "GreaterThan"
307-
GREATER_THAN_OR_EQUAL_TO = "GreaterThanOrEqualTo"
308-
LESS_THAN = "LessThan"
309-
LESS_THAN_OR_EQUAL_TO = "LessThanOrEqualTo"
310-
CONTAINS = "Contains"
311-
EXISTS = "Exists"
312-
NOT_EXISTS = "NotExists"
313-
IN = "In"
314-
315-
316-
@attr.s
317-
class Filter(Config):
318-
"""Filter for FeatureStore search.
319-
320-
Attributes:
321-
name (str): A resource property name.
322-
value (str): A value used with ``Name`` and ``Operator`` to determine which resources
323-
satisfy the filter's condition.
324-
operator (FilterOperatorEnum): A Boolean binary operator that is used to evaluate the
325-
filter. If specify ``Value`` without ``Operator``, Amazon SageMaker uses ``Equals``
326-
(default: None).
327-
"""
328-
329-
name: str = attr.ib()
330-
value: str = attr.ib()
331-
operator: FilterOperatorEnum = attr.ib(default=None)
332-
333-
def to_dict(self) -> Dict[str, Any]:
334-
"""Construct a dictionary based on the attributes provided.
335-
336-
Returns:
337-
dict represents the attributes.
338-
"""
339-
return Config.construct_dict(
340-
Name=self.name,
341-
Value=self.value,
342-
Operator=None if not self.operator else str(self.operator),
343-
)
344-
345-
346-
@attr.s
347-
class Identifier(Config):
348-
"""Identifier of batch get record API.
349-
350-
Attributes:
351-
feature_group_name (str): name of a feature group.
352-
record_identifiers_value_as_string (List[str]): string value of record identifier.
353-
feature_names (List[str]): list of feature names (default: None).
354-
"""
355-
356-
feature_group_name: str = attr.ib()
357-
record_identifiers_value_as_string: List[str] = attr.ib()
358-
feature_names: List[str] = attr.ib(default=None)
359-
360-
def to_dict(self) -> Dict[str, Any]:
361-
"""Construct a dictionary based on the attributes provided.
362-
363-
Returns:
364-
dict represents the attributes.
365-
"""
366-
367-
return Config.construct_dict(
368-
FeatureGroupName=self.feature_group_name,
369-
RecordIdentifiersValueAsString=self.record_identifiers_value_as_string,
370-
FeatureNames=None if not self.feature_names else self.feature_names,
371-
)

src/sagemaker/session.py

Lines changed: 0 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -4536,48 +4536,6 @@ def describe_feature_metadata(
45364536
FeatureGroupName=feature_group_name, FeatureName=feature_name
45374537
)
45384538

4539-
def search(
4540-
self,
4541-
resource: str,
4542-
search_expression: Dict[str, any] = None,
4543-
sort_by: str = None,
4544-
sort_order: str = None,
4545-
next_token: str = None,
4546-
max_results: int = None,
4547-
) -> Dict[str, Any]:
4548-
"""Search for SageMaker resources satisfying given filters.
4549-
4550-
Args:
4551-
resource (str): The name of the Amazon SageMaker resource to search for.
4552-
search_expression (Dict[str, any]): A Boolean conditional statement. Resources must
4553-
satisfy this condition to be included in search results.
4554-
sort_by (str): The name of the resource property used to sort the ``SearchResults``.
4555-
The default is ``LastModifiedTime``.
4556-
sort_order (str): How ``SearchResults`` are ordered.
4557-
Valid values are ``Ascending`` or ``Descending``. The default is ``Descending``.
4558-
next_token (str): If more than ``MaxResults`` resources match the specified
4559-
``SearchExpression``, the response includes a ``NextToken``. The ``NextToken`` can
4560-
be passed to the next ``SearchRequest`` to continue retrieving results.
4561-
max_results (int): The maximum number of results to return.
4562-
4563-
Returns:
4564-
Response dict from service.
4565-
"""
4566-
search_args = {"Resource": resource}
4567-
4568-
if search_expression:
4569-
search_args["SearchExpression"] = search_expression
4570-
if sort_by:
4571-
search_args["SortBy"] = sort_by
4572-
if sort_order:
4573-
search_args["SortOrder"] = sort_order
4574-
if next_token:
4575-
search_args["NextToken"] = next_token
4576-
if max_results:
4577-
search_args["MaxResults"] = max_results
4578-
4579-
return self.sagemaker_client.search(**search_args)
4580-
45814539
def put_record(
45824540
self,
45834541
feature_group_name: str,
@@ -4637,20 +4595,6 @@ def get_record(
46374595

46384596
return self.sagemaker_featurestore_runtime_client.get_record(**get_record_args)
46394597

4640-
def batch_get_record(self, identifiers: Sequence[Dict[str, Any]]) -> Dict[str, Any]:
4641-
"""Gets a batch of record from FeatureStore.
4642-
4643-
Args:
4644-
identifiers (Sequence[Dict[str, Any]]): list of identifiers to uniquely identify records
4645-
in FeatureStore.
4646-
4647-
Returns:
4648-
Response dict from service.
4649-
"""
4650-
batch_get_record_args = {"Identifiers": identifiers}
4651-
4652-
return self.sagemaker_featurestore_runtime_client.batch_get_record(**batch_get_record_args)
4653-
46544598
def start_query_execution(
46554599
self,
46564600
catalog: str,

tests/integ/test_feature_store.py

Lines changed: 2 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,7 @@
2626
from sagemaker.feature_store.feature_definition import FractionalFeatureDefinition
2727
from sagemaker.feature_store.feature_group import FeatureGroup
2828
from sagemaker.feature_store.feature_store import FeatureStore
29-
from sagemaker.feature_store.inputs import (
30-
FeatureValue,
31-
FeatureParameter,
32-
TableFormatEnum,
33-
Filter,
34-
ResourceEnum,
35-
Identifier,
36-
)
29+
from sagemaker.feature_store.inputs import FeatureValue, FeatureParameter, TableFormatEnum
3730
from sagemaker.session import get_execution_role, Session
3831
from tests.integ.timeout import timeout
3932

@@ -328,7 +321,7 @@ def test_create_feature_group_glue_table_format(
328321
assert table_format == "Glue"
329322

330323

331-
def test_get_and_batch_get_record(
324+
def test_get_record(
332325
feature_store_session,
333326
role,
334327
feature_group_name,
@@ -374,24 +367,6 @@ def test_get_and_batch_get_record(
374367
)
375368
assert retrieved_record is None
376369

377-
# Retrieve data using batch_get_record
378-
feature_store = FeatureStore(sagemaker_session=feature_store_session)
379-
records = feature_store.batch_get_record(
380-
identifiers=[
381-
Identifier(
382-
feature_group_name=feature_group_name,
383-
record_identifiers_value_as_string=[record_identifier_value_as_string],
384-
feature_names=record_names,
385-
)
386-
]
387-
)["Records"]
388-
assert records[0]["FeatureGroupName"] == feature_group_name
389-
assert records[0]["RecordIdentifierValueAsString"] == record_identifier_value_as_string
390-
assert len(records[0]["Record"]) == len(record_names)
391-
for feature in records[0]["Record"]:
392-
assert feature["FeatureName"] in record_names
393-
assert feature["FeatureName"] is not removed_feature_name
394-
395370

396371
def test_delete_record(
397372
feature_store_session,
@@ -528,28 +503,6 @@ def test_feature_metadata(
528503
assert 1 == len(describe_feature_metadata.get("Parameters"))
529504

530505

531-
def test_search(feature_store_session, role, feature_group_name, pandas_data_frame):
532-
feature_store = FeatureStore(sagemaker_session=feature_store_session)
533-
feature_group = FeatureGroup(name=feature_group_name, sagemaker_session=feature_store_session)
534-
feature_group.load_feature_definitions(data_frame=pandas_data_frame)
535-
536-
with cleanup_feature_group(feature_group):
537-
feature_group.create(
538-
s3_uri=False,
539-
record_identifier_name="feature1",
540-
event_time_feature_name="feature3",
541-
role_arn=role,
542-
enable_online_store=True,
543-
)
544-
_wait_for_feature_group_create(feature_group)
545-
output = feature_store.search(
546-
resource=ResourceEnum.FEATURE_GROUP,
547-
filters=[Filter(name="FeatureGroupName", value=feature_group_name)],
548-
)
549-
print(output)
550-
assert output["Results"][0]["FeatureGroup"]["FeatureGroupName"] == feature_group_name
551-
552-
553506
def test_ingest_without_string_feature(
554507
feature_store_session,
555508
role,

0 commit comments

Comments
 (0)