Skip to content

Commit bc183bc

Browse files
committed
Add updated type IT
Signed-off-by: Terence Lim <terencelimxp@gmail.com>
1 parent b4c3a9f commit bc183bc

2 files changed

Lines changed: 103 additions & 27 deletions

File tree

serving/src/test/java/feast/serving/it/ServingServiceBigTableIT.java

Lines changed: 72 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,7 @@ private static byte[] recordToAvro(GenericRecord datum, Schema schema) throws IO
391391
}
392392

393393
@Test
394-
public void shouldRegisterAndGetOnlineFeaturesWithNotFound() {
394+
public void shouldGetOnlineFeaturesForSingleEntity() {
395395
// getOnlineFeatures Information
396396
String projectName = "default";
397397
String entityName = "driver_id";
@@ -447,7 +447,7 @@ public void shouldRegisterAndGetOnlineFeaturesWithNotFound() {
447447
}
448448

449449
@Test
450-
public void shouldRegisterCompoundEntityAndGetOnlineFeatures() {
450+
public void shouldGetOnlineFeaturesForCompoundEntity() {
451451
String projectName = "default";
452452
String driverEntityName = "driver_id";
453453
String merchantEntityName = "merchant_id";
@@ -511,6 +511,76 @@ public void shouldRegisterCompoundEntityAndGetOnlineFeatures() {
511511
assertEquals(expectedFieldValuesList, featureResponse.getFieldValuesList());
512512
}
513513

514+
@Test
515+
public void shouldReturnNotFoundForUpdatedType() {
516+
String projectName = "default";
517+
String entityName = "driver_id";
518+
String featureTableName = "rides";
519+
520+
ImmutableList<String> entities = ImmutableList.of(entityName);
521+
ImmutableMap<String, ValueProto.ValueType.Enum> features =
522+
ImmutableMap.of(
523+
feature1Reference.getName(),
524+
ValueProto.ValueType.Enum.INT64,
525+
feature2Reference.getName(),
526+
ValueProto.ValueType.Enum.STRING,
527+
feature3Reference.getName(),
528+
ValueProto.ValueType.Enum.DOUBLE,
529+
feature4Reference.getName(),
530+
ValueProto.ValueType.Enum.STRING);
531+
532+
TestUtils.applyFeatureTable(
533+
coreClient, projectName, featureTableName, entities, features, 7200);
534+
535+
// Sleep is necessary to ensure caching (every 1s) of updated FeatureTable is done
536+
try {
537+
Thread.sleep(2000);
538+
} catch (InterruptedException e) {
539+
}
540+
541+
ValueProto.Value entityValue = ValueProto.Value.newBuilder().setInt64Val(1).build();
542+
// Instantiate EntityRows
543+
GetOnlineFeaturesRequestV2.EntityRow entityRow1 =
544+
DataGenerator.createEntityRow(entityName, DataGenerator.createInt64Value(1), 100);
545+
ImmutableList<GetOnlineFeaturesRequestV2.EntityRow> entityRows = ImmutableList.of(entityRow1);
546+
547+
// Instantiate FeatureReferences
548+
FeatureReferenceV2 featureReference =
549+
DataGenerator.createFeatureReference("rides", "trip_distance");
550+
551+
ImmutableList<FeatureReferenceV2> featureReferences = ImmutableList.of(featureReference);
552+
553+
// Build GetOnlineFeaturesRequestV2
554+
GetOnlineFeaturesRequestV2 onlineFeatureRequest =
555+
TestUtils.createOnlineFeatureRequest(projectName, featureReferences, entityRows);
556+
GetOnlineFeaturesResponse featureResponse =
557+
servingStub.getOnlineFeaturesV2(onlineFeatureRequest);
558+
559+
ImmutableMap<String, ValueProto.Value> expectedValueMap =
560+
ImmutableMap.of(
561+
entityName,
562+
entityValue,
563+
FeatureV2.getFeatureStringRef(featureReference),
564+
DataGenerator.createEmptyValue());
565+
566+
ImmutableMap<String, GetOnlineFeaturesResponse.FieldStatus> expectedStatusMap =
567+
ImmutableMap.of(
568+
entityName,
569+
GetOnlineFeaturesResponse.FieldStatus.PRESENT,
570+
FeatureV2.getFeatureStringRef(featureReference),
571+
GetOnlineFeaturesResponse.FieldStatus.NOT_FOUND);
572+
573+
GetOnlineFeaturesResponse.FieldValues expectedFieldValues =
574+
GetOnlineFeaturesResponse.FieldValues.newBuilder()
575+
.putAllFields(expectedValueMap)
576+
.putAllStatuses(expectedStatusMap)
577+
.build();
578+
ImmutableList<GetOnlineFeaturesResponse.FieldValues> expectedFieldValuesList =
579+
ImmutableList.of(expectedFieldValues);
580+
581+
assertEquals(expectedFieldValuesList, featureResponse.getFieldValuesList());
582+
}
583+
514584
@TestConfiguration
515585
public static class TestConfig {
516586
@Bean

storage/api/src/main/java/feast/storage/api/retriever/NativeFeature.java

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -41,32 +41,38 @@ public NativeFeature(
4141
public ValueProto.Value getFeatureValue(ValueProto.ValueType.Enum valueType) {
4242
ValueProto.Value finalValue;
4343

44-
// Add various type cases
45-
switch (valueType) {
46-
case STRING:
47-
finalValue = ValueProto.Value.newBuilder().setStringVal((String) featureValue).build();
48-
break;
49-
case INT32:
50-
finalValue = ValueProto.Value.newBuilder().setInt32Val((Integer) featureValue).build();
51-
break;
52-
case INT64:
53-
finalValue = ValueProto.Value.newBuilder().setInt64Val((Integer) featureValue).build();
54-
break;
55-
case DOUBLE:
56-
finalValue = ValueProto.Value.newBuilder().setDoubleVal((Double) featureValue).build();
57-
break;
58-
case FLOAT:
59-
finalValue = ValueProto.Value.newBuilder().setFloatVal((Long) featureValue).build();
60-
break;
61-
case BYTES:
62-
finalValue = ValueProto.Value.newBuilder().setBytesVal((ByteString) featureValue).build();
63-
break;
64-
case BOOL:
65-
finalValue = ValueProto.Value.newBuilder().setBoolVal((Boolean) featureValue).build();
66-
break;
67-
default:
68-
throw new RuntimeException("FeatureType is not supported");
44+
try {
45+
// Add various type cases
46+
switch (valueType) {
47+
case STRING:
48+
finalValue = ValueProto.Value.newBuilder().setStringVal((String) featureValue).build();
49+
break;
50+
case INT32:
51+
finalValue = ValueProto.Value.newBuilder().setInt32Val((Integer) featureValue).build();
52+
break;
53+
case INT64:
54+
finalValue = ValueProto.Value.newBuilder().setInt64Val((Integer) featureValue).build();
55+
break;
56+
case DOUBLE:
57+
finalValue = ValueProto.Value.newBuilder().setDoubleVal((Double) featureValue).build();
58+
break;
59+
case FLOAT:
60+
finalValue = ValueProto.Value.newBuilder().setFloatVal((Long) featureValue).build();
61+
break;
62+
case BYTES:
63+
finalValue = ValueProto.Value.newBuilder().setBytesVal((ByteString) featureValue).build();
64+
break;
65+
case BOOL:
66+
finalValue = ValueProto.Value.newBuilder().setBoolVal((Boolean) featureValue).build();
67+
break;
68+
default:
69+
throw new RuntimeException("FeatureType is not supported");
70+
}
71+
} catch (ClassCastException e) {
72+
// Feature type has changed
73+
finalValue = ValueProto.Value.newBuilder().build();
6974
}
75+
7076
return finalValue;
7177
}
7278

0 commit comments

Comments
 (0)