|
33 | 33 | Filter,
|
34 | 34 | ResourceEnum,
|
35 | 35 | Identifier,
|
| 36 | + DeletionModeEnum, |
36 | 37 | )
|
37 | 38 | from sagemaker.feature_store.dataset_builder import (
|
38 | 39 | JoinTypeEnum,
|
@@ -162,6 +163,15 @@ def pandas_data_frame_without_string():
|
162 | 163 | return df
|
163 | 164 |
|
164 | 165 |
|
| 166 | +@pytest.fixture |
| 167 | +def historic_record(): |
| 168 | + return [ |
| 169 | + FeatureValue(feature_name="feature1", value_as_string="10.0"), |
| 170 | + FeatureValue(feature_name="feature2", value_as_string="7"), |
| 171 | + FeatureValue(feature_name="feature3", value_as_string="2020-10-29T03:43:21Z"), |
| 172 | + ] |
| 173 | + |
| 174 | + |
165 | 175 | @pytest.fixture
|
166 | 176 | def record():
|
167 | 177 | return [
|
@@ -398,7 +408,7 @@ def test_get_and_batch_get_record(
|
398 | 408 | assert feature["FeatureName"] is not removed_feature_name
|
399 | 409 |
|
400 | 410 |
|
401 |
| -def test_delete_record( |
| 411 | +def test_soft_delete_record( |
402 | 412 | feature_store_session,
|
403 | 413 | role,
|
404 | 414 | feature_group_name,
|
@@ -437,6 +447,55 @@ def test_delete_record(
|
437 | 447 | assert retrieved_record is None
|
438 | 448 |
|
439 | 449 |
|
| 450 | +def test_hard_delete_record( |
| 451 | + feature_store_session, |
| 452 | + role, |
| 453 | + feature_group_name, |
| 454 | + pandas_data_frame, |
| 455 | + historic_record, |
| 456 | + record, |
| 457 | +): |
| 458 | + feature_group = FeatureGroup(name=feature_group_name, sagemaker_session=feature_store_session) |
| 459 | + feature_group.load_feature_definitions(data_frame=pandas_data_frame) |
| 460 | + |
| 461 | + record_identifier_value_as_string = record[0].value_as_string |
| 462 | + historic_record_identifier_value_as_string = historic_record[0].value_as_string |
| 463 | + with cleanup_feature_group(feature_group): |
| 464 | + feature_group.create( |
| 465 | + s3_uri=False, |
| 466 | + record_identifier_name="feature1", |
| 467 | + event_time_feature_name="feature3", |
| 468 | + role_arn=role, |
| 469 | + enable_online_store=True, |
| 470 | + ) |
| 471 | + _wait_for_feature_group_create(feature_group) |
| 472 | + # Ingest data |
| 473 | + feature_group.put_record(record=record) |
| 474 | + # Retrieve data |
| 475 | + retrieved_record = feature_group.get_record( |
| 476 | + record_identifier_value_as_string=record_identifier_value_as_string, |
| 477 | + ) |
| 478 | + assert retrieved_record is not None |
| 479 | + # Delete data |
| 480 | + feature_group.delete_record( |
| 481 | + record_identifier_value_as_string=record_identifier_value_as_string, |
| 482 | + event_time=datetime.datetime.now().replace(microsecond=0).isoformat() + "Z", |
| 483 | + deletion_mode=DeletionModeEnum.HARD_DELETE, |
| 484 | + ) |
| 485 | + # Retrieve data |
| 486 | + retrieved_record = feature_group.get_record( |
| 487 | + record_identifier_value_as_string=record_identifier_value_as_string, |
| 488 | + ) |
| 489 | + assert retrieved_record is None |
| 490 | + # Ingest data |
| 491 | + feature_group.put_record(historic_record) |
| 492 | + # Retrieve data |
| 493 | + retrieved_record = feature_group.get_record( |
| 494 | + record_identifier_value_as_string=historic_record_identifier_value_as_string, |
| 495 | + ) |
| 496 | + assert retrieved_record is not None |
| 497 | + |
| 498 | + |
440 | 499 | def test_update_feature_group(
|
441 | 500 | feature_store_session,
|
442 | 501 | role,
|
|
0 commit comments