Skip to content

Commit 7eb9748

Browse files
committed
Address CR comments
Signed-off-by: Felix Wang <wangfelix98@gmail.com>
1 parent c8d672b commit 7eb9748

File tree

2 files changed

+112
-72
lines changed

2 files changed

+112
-72
lines changed

common/src/main/java/feast/common/models/FeatureV2.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,9 @@ public static String getFeatureStringRef(FeatureReferenceV2 featureReference) {
3636
}
3737

3838
/**
39-
* Accepts a feature reference as a string and returns the base feature name. For example, given
40-
* "driver_hourly_stats:conv_rate", "conv_rate" would be returned.
39+
* Accepts either a feature reference of the form "featuretable_name:feature_name" or just a
40+
* feature name, and returns just the feature name. For example, given either
41+
* "driver_hourly_stats:conv_rate" or "conv_rate", "conv_rate" would be returned.
4142
*
4243
* @param featureReference {String}
4344
* @return Base feature name of the feature reference

serving/src/main/java/feast/serving/service/OnlineServingServiceV2.java

Lines changed: 109 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ public class OnlineServingServiceV2 implements ServingServiceV2 {
7979
private final Tracer tracer;
8080
private final OnlineRetrieverV2 retriever;
8181
private final FeatureSpecRetriever featureSpecRetriever;
82+
static final int INT64_BITWIDTH = 64;
83+
static final int INT32_BITWIDTH = 32;
8284

8385
public OnlineServingServiceV2(
8486
OnlineRetrieverV2 retriever, Tracer tracer, FeatureSpecRetriever featureSpecRetriever) {
@@ -126,24 +128,32 @@ public GetOnlineFeaturesResponse getOnlineFeatures(GetOnlineFeaturesRequestV2 re
126128

127129
for (OnDemandInput input : inputs.values()) {
128130
OnDemandInput.InputCase inputCase = input.getInputCase();
129-
if (inputCase.equals(inputCase.REQUEST_DATA_SOURCE)) {
130-
DataSource requestDataSource = input.getRequestDataSource();
131-
RequestDataOptions requestDataOptions = requestDataSource.getRequestDataOptions();
132-
Set<String> requestDataNames = requestDataOptions.getSchemaMap().keySet();
133-
requestDataFeatureNames.addAll(requestDataNames);
134-
} else if (inputCase.equals(inputCase.FEATURE_VIEW)) {
135-
FeatureView featureView = input.getFeatureView();
136-
FeatureViewSpec featureViewSpec = featureView.getSpec();
137-
String featureViewName = featureViewSpec.getName();
138-
for (FeatureSpecV2 featureSpec : featureViewSpec.getFeaturesList()) {
139-
String featureName = featureSpec.getName();
140-
FeatureReferenceV2 onDemandFeatureInput =
141-
FeatureReferenceV2.newBuilder()
142-
.setFeatureTable(featureViewName)
143-
.setName(featureName)
144-
.build();
145-
onDemandFeatureInputs.add(onDemandFeatureInput);
146-
}
131+
switch (inputCase) {
132+
case REQUEST_DATA_SOURCE:
133+
DataSource requestDataSource = input.getRequestDataSource();
134+
RequestDataOptions requestDataOptions = requestDataSource.getRequestDataOptions();
135+
Set<String> requestDataNames = requestDataOptions.getSchemaMap().keySet();
136+
requestDataFeatureNames.addAll(requestDataNames);
137+
break;
138+
case FEATURE_VIEW:
139+
FeatureView featureView = input.getFeatureView();
140+
FeatureViewSpec featureViewSpec = featureView.getSpec();
141+
String featureViewName = featureViewSpec.getName();
142+
for (FeatureSpecV2 featureSpec : featureViewSpec.getFeaturesList()) {
143+
String featureName = featureSpec.getName();
144+
FeatureReferenceV2 onDemandFeatureInput =
145+
FeatureReferenceV2.newBuilder()
146+
.setFeatureTable(featureViewName)
147+
.setName(featureName)
148+
.build();
149+
onDemandFeatureInputs.add(onDemandFeatureInput);
150+
}
151+
break;
152+
default:
153+
throw Status.INTERNAL
154+
.withDescription(
155+
"OnDemandInput proto input field has an unexpected type: " + inputCase)
156+
.asRuntimeException();
147157
}
148158
}
149159
}
@@ -181,7 +191,7 @@ public GetOnlineFeaturesResponse getOnlineFeatures(GetOnlineFeaturesRequestV2 re
181191
}
182192

183193
// Construct new entity row containing the extracted entity data, if necessary.
184-
if (fieldsMap.size() > 0) {
194+
if (!fieldsMap.isEmpty()) {
185195
GetOnlineFeaturesRequestV2.EntityRow newEntityRow =
186196
GetOnlineFeaturesRequestV2.EntityRow.newBuilder()
187197
.setTimestamp(entityRow.getTimestamp())
@@ -192,11 +202,6 @@ public GetOnlineFeaturesResponse getOnlineFeatures(GetOnlineFeaturesRequestV2 re
192202
}
193203
// TODO: error checking on lengths of lists in entityRows and requestDataFeatures
194204

195-
for (Map.Entry<String, List<ValueProto.Value>> entry : requestDataFeatures.entrySet()) {
196-
String key = entry.getKey();
197-
List<ValueProto.Value> values = entry.getValue();
198-
}
199-
200205
// Extract values and statuses to be used later in constructing FieldValues for the response.
201206
// The online features retrieved will augment these two data structures.
202207
List<Map<String, ValueProto.Value>> values =
@@ -397,7 +402,13 @@ public GetOnlineFeaturesResponse getOnlineFeatures(GetOnlineFeaturesRequestV2 re
397402
((Float4Vector) column).setSafe(i, value.getFloatVal());
398403
break;
399404
default:
400-
column = null;
405+
throw Status.INTERNAL
406+
.withDescription(
407+
"Column "
408+
+ columnName
409+
+ " has a type that is currently not handled: "
410+
+ valCase)
411+
.asRuntimeException();
401412
}
402413
}
403414
}
@@ -420,7 +431,11 @@ public GetOnlineFeaturesResponse getOnlineFeatures(GetOnlineFeaturesRequestV2 re
420431
writer.writeBatch();
421432
writer.end();
422433
} catch (IOException e) {
423-
e.printStackTrace();
434+
log.info(e.toString());
435+
throw Status.INTERNAL
436+
.withDescription(
437+
"ArrowFileWriter could not write properly; failed with error: " + e.toString())
438+
.asRuntimeException();
424439
}
425440
byte[] byteData = out.toByteArray();
426441
ByteString inputData = ByteString.copyFrom(byteData);
@@ -475,54 +490,78 @@ public GetOnlineFeaturesResponse getOnlineFeatures(GetOnlineFeaturesRequestV2 re
475490
// TODO: support all Feast types
476491
if (columnType instanceof ArrowType.Int) {
477492
int bitWidth = ((ArrowType.Int) columnType).getBitWidth();
478-
if (bitWidth == 64) {
479-
// handle as int64
480-
for (int i = 0; i < valueCount; i++) {
481-
long int64Value = ((BigIntVector) fieldVector).get(i);
482-
Map<String, ValueProto.Value> rowValues = values.get(i);
483-
Map<String, GetOnlineFeaturesResponse.FieldStatus> rowStatuses = statuses.get(i);
484-
ValueProto.Value value =
485-
ValueProto.Value.newBuilder().setInt64Val(int64Value).build();
486-
rowValues.put(fullFeatureName, value);
487-
rowStatuses.put(fullFeatureName, GetOnlineFeaturesResponse.FieldStatus.PRESENT);
488-
}
489-
} else if (bitWidth == 32) {
490-
// handle as int32
491-
for (int i = 0; i < valueCount; i++) {
492-
int intValue = ((IntVector) fieldVector).get(i);
493-
Map<String, ValueProto.Value> rowValues = values.get(i);
494-
Map<String, GetOnlineFeaturesResponse.FieldStatus> rowStatuses = statuses.get(i);
495-
ValueProto.Value value =
496-
ValueProto.Value.newBuilder().setInt32Val(intValue).build();
497-
rowValues.put(fullFeatureName, value);
498-
rowStatuses.put(fullFeatureName, GetOnlineFeaturesResponse.FieldStatus.PRESENT);
499-
}
493+
switch (bitWidth) {
494+
case INT64_BITWIDTH:
495+
for (int i = 0; i < valueCount; i++) {
496+
long int64Value = ((BigIntVector) fieldVector).get(i);
497+
Map<String, ValueProto.Value> rowValues = values.get(i);
498+
Map<String, GetOnlineFeaturesResponse.FieldStatus> rowStatuses =
499+
statuses.get(i);
500+
ValueProto.Value value =
501+
ValueProto.Value.newBuilder().setInt64Val(int64Value).build();
502+
rowValues.put(fullFeatureName, value);
503+
rowStatuses.put(fullFeatureName, GetOnlineFeaturesResponse.FieldStatus.PRESENT);
504+
}
505+
break;
506+
case INT32_BITWIDTH:
507+
for (int i = 0; i < valueCount; i++) {
508+
int intValue = ((IntVector) fieldVector).get(i);
509+
Map<String, ValueProto.Value> rowValues = values.get(i);
510+
Map<String, GetOnlineFeaturesResponse.FieldStatus> rowStatuses =
511+
statuses.get(i);
512+
ValueProto.Value value =
513+
ValueProto.Value.newBuilder().setInt32Val(intValue).build();
514+
rowValues.put(fullFeatureName, value);
515+
rowStatuses.put(fullFeatureName, GetOnlineFeaturesResponse.FieldStatus.PRESENT);
516+
}
517+
break;
518+
default:
519+
throw Status.INTERNAL
520+
.withDescription(
521+
"Column "
522+
+ columnName
523+
+ " is of type ArrowType.Int but has bitWidth "
524+
+ bitWidth
525+
+ " which cannot be handled.")
526+
.asRuntimeException();
500527
}
501528
} else if (columnType instanceof ArrowType.FloatingPoint) {
502529
FloatingPointPrecision precision =
503530
((ArrowType.FloatingPoint) columnType).getPrecision();
504-
if (precision == FloatingPointPrecision.DOUBLE) {
505-
// handle as double
506-
for (int i = 0; i < valueCount; i++) {
507-
double doubleValue = ((Float8Vector) fieldVector).get(i);
508-
Map<String, ValueProto.Value> rowValues = values.get(i);
509-
Map<String, GetOnlineFeaturesResponse.FieldStatus> rowStatuses = statuses.get(i);
510-
ValueProto.Value value =
511-
ValueProto.Value.newBuilder().setDoubleVal(doubleValue).build();
512-
rowValues.put(fullFeatureName, value);
513-
rowStatuses.put(fullFeatureName, GetOnlineFeaturesResponse.FieldStatus.PRESENT);
514-
}
515-
} else if (precision == FloatingPointPrecision.SINGLE) {
516-
// handle as float
517-
for (int i = 0; i < valueCount; i++) {
518-
float floatValue = ((Float4Vector) fieldVector).get(i);
519-
Map<String, ValueProto.Value> rowValues = values.get(i);
520-
Map<String, GetOnlineFeaturesResponse.FieldStatus> rowStatuses = statuses.get(i);
521-
ValueProto.Value value =
522-
ValueProto.Value.newBuilder().setFloatVal(floatValue).build();
523-
rowValues.put(fullFeatureName, value);
524-
rowStatuses.put(fullFeatureName, GetOnlineFeaturesResponse.FieldStatus.PRESENT);
525-
}
531+
switch (precision) {
532+
case DOUBLE:
533+
for (int i = 0; i < valueCount; i++) {
534+
double doubleValue = ((Float8Vector) fieldVector).get(i);
535+
Map<String, ValueProto.Value> rowValues = values.get(i);
536+
Map<String, GetOnlineFeaturesResponse.FieldStatus> rowStatuses =
537+
statuses.get(i);
538+
ValueProto.Value value =
539+
ValueProto.Value.newBuilder().setDoubleVal(doubleValue).build();
540+
rowValues.put(fullFeatureName, value);
541+
rowStatuses.put(fullFeatureName, GetOnlineFeaturesResponse.FieldStatus.PRESENT);
542+
}
543+
break;
544+
case SINGLE:
545+
for (int i = 0; i < valueCount; i++) {
546+
float floatValue = ((Float4Vector) fieldVector).get(i);
547+
Map<String, ValueProto.Value> rowValues = values.get(i);
548+
Map<String, GetOnlineFeaturesResponse.FieldStatus> rowStatuses =
549+
statuses.get(i);
550+
ValueProto.Value value =
551+
ValueProto.Value.newBuilder().setFloatVal(floatValue).build();
552+
rowValues.put(fullFeatureName, value);
553+
rowStatuses.put(fullFeatureName, GetOnlineFeaturesResponse.FieldStatus.PRESENT);
554+
}
555+
break;
556+
default:
557+
throw Status.INTERNAL
558+
.withDescription(
559+
"Column "
560+
+ columnName
561+
+ " is of type ArrowType.FloatingPoint but has precision "
562+
+ precision
563+
+ " which cannot be handled.")
564+
.asRuntimeException();
526565
}
527566
}
528567
}

0 commit comments

Comments
 (0)