|
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