@@ -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