52
52
import io .opencensus .trace .Tracing ;
53
53
import java .io .IOException ;
54
54
import java .io .Serializable ;
55
+ import java .math .BigDecimal ;
55
56
import java .util .AbstractList ;
56
57
import java .util .ArrayList ;
57
58
import java .util .BitSet ;
@@ -358,6 +359,9 @@ private Object writeReplace() {
358
359
case FLOAT64 :
359
360
builder .set (fieldName ).to ((Double ) value );
360
361
break ;
362
+ case NUMERIC :
363
+ builder .set (fieldName ).to ((BigDecimal ) value );
364
+ break ;
361
365
case STRING :
362
366
builder .set (fieldName ).to ((String ) value );
363
367
break ;
@@ -381,6 +385,9 @@ private Object writeReplace() {
381
385
case FLOAT64 :
382
386
builder .set (fieldName ).toFloat64Array ((Iterable <Double >) value );
383
387
break ;
388
+ case NUMERIC :
389
+ builder .set (fieldName ).toNumericArray ((Iterable <BigDecimal >) value );
390
+ break ;
384
391
case STRING :
385
392
builder .set (fieldName ).toStringArray ((Iterable <String >) value );
386
393
break ;
@@ -457,6 +464,8 @@ private static Object decodeValue(Type fieldType, com.google.protobuf.Value prot
457
464
return Long .parseLong (proto .getStringValue ());
458
465
case FLOAT64 :
459
466
return valueProtoToFloat64 (proto );
467
+ case NUMERIC :
468
+ return new BigDecimal (proto .getStringValue ());
460
469
case STRING :
461
470
checkType (fieldType , proto , KindCase .STRING_VALUE );
462
471
return proto .getStringValue ();
@@ -513,6 +522,18 @@ public Boolean apply(com.google.protobuf.Value input) {
513
522
return new Int64Array (listValue );
514
523
case FLOAT64 :
515
524
return new Float64Array (listValue );
525
+ case NUMERIC :
526
+ {
527
+ // Materialize list: element conversion is expensive and should happen only once.
528
+ ArrayList <Object > list = new ArrayList <>(listValue .getValuesCount ());
529
+ for (com .google .protobuf .Value value : listValue .getValuesList ()) {
530
+ list .add (
531
+ value .getKindCase () == KindCase .NULL_VALUE
532
+ ? null
533
+ : new BigDecimal (value .getStringValue ()));
534
+ }
535
+ return list ;
536
+ }
516
537
case STRING :
517
538
return Lists .transform (
518
539
listValue .getValuesList (),
@@ -620,6 +641,11 @@ protected double getDoubleInternal(int columnIndex) {
620
641
return (Double ) rowData .get (columnIndex );
621
642
}
622
643
644
+ @ Override
645
+ protected BigDecimal getBigDecimalInternal (int columnIndex ) {
646
+ return (BigDecimal ) rowData .get (columnIndex );
647
+ }
648
+
623
649
@ Override
624
650
protected String getStringInternal (int columnIndex ) {
625
651
return (String ) rowData .get (columnIndex );
@@ -685,6 +711,12 @@ protected Float64Array getDoubleListInternal(int columnIndex) {
685
711
return (Float64Array ) rowData .get (columnIndex );
686
712
}
687
713
714
+ @ Override
715
+ @ SuppressWarnings ("unchecked" ) // We know ARRAY<NUMERIC> produces a List<BigDecimal>.
716
+ protected List <BigDecimal > getBigDecimalListInternal (int columnIndex ) {
717
+ return (List <BigDecimal >) rowData .get (columnIndex );
718
+ }
719
+
688
720
@ Override
689
721
@ SuppressWarnings ("unchecked" ) // We know ARRAY<STRING> produces a List<String>.
690
722
protected List <String > getStringListInternal (int columnIndex ) {
@@ -1176,6 +1208,11 @@ protected double getDoubleInternal(int columnIndex) {
1176
1208
return currRow ().getDoubleInternal (columnIndex );
1177
1209
}
1178
1210
1211
+ @ Override
1212
+ protected BigDecimal getBigDecimalInternal (int columnIndex ) {
1213
+ return currRow ().getBigDecimalInternal (columnIndex );
1214
+ }
1215
+
1179
1216
@ Override
1180
1217
protected String getStringInternal (int columnIndex ) {
1181
1218
return currRow ().getStringInternal (columnIndex );
@@ -1226,6 +1263,11 @@ protected List<Double> getDoubleListInternal(int columnIndex) {
1226
1263
return currRow ().getDoubleListInternal (columnIndex );
1227
1264
}
1228
1265
1266
+ @ Override
1267
+ protected List <BigDecimal > getBigDecimalListInternal (int columnIndex ) {
1268
+ return currRow ().getBigDecimalListInternal (columnIndex );
1269
+ }
1270
+
1229
1271
@ Override
1230
1272
protected List <String > getStringListInternal (int columnIndex ) {
1231
1273
return currRow ().getStringListInternal (columnIndex );
0 commit comments