Skip to content

Commit d9d51cd

Browse files
fix: finish BIGNUMERIC support (#1449)
* fix: finish BIGNUMERIC support * 🦉 Updates from OwlBot See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
1 parent a5157fa commit d9d51cd

File tree

6 files changed

+41
-13
lines changed

6 files changed

+41
-13
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ If you are using Maven without BOM, add this to your dependencies:
4949
If you are using Gradle 5.x or later, add this to your dependencies
5050

5151
```Groovy
52-
implementation platform('com.google.cloud:libraries-bom:24.1.0')
52+
implementation platform('com.google.cloud:libraries-bom:24.1.1')
5353
5454
implementation 'com.google.cloud:google-cloud-bigquerystorage'
5555
```

google-cloud-bigquerystorage/src/main/java/com/google/cloud/bigquery/storage/v1/BQTableSchemaToProtoDescriptor.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ public class BQTableSchemaToProtoDescriptor {
5252
.put(TableFieldSchema.Type.GEOGRAPHY, FieldDescriptorProto.Type.TYPE_STRING)
5353
.put(TableFieldSchema.Type.INT64, FieldDescriptorProto.Type.TYPE_INT64)
5454
.put(TableFieldSchema.Type.NUMERIC, FieldDescriptorProto.Type.TYPE_BYTES)
55+
.put(TableFieldSchema.Type.BIGNUMERIC, FieldDescriptorProto.Type.TYPE_BYTES)
5556
.put(TableFieldSchema.Type.STRING, FieldDescriptorProto.Type.TYPE_STRING)
5657
.put(TableFieldSchema.Type.STRUCT, FieldDescriptorProto.Type.TYPE_MESSAGE)
5758
.put(TableFieldSchema.Type.TIME, FieldDescriptorProto.Type.TYPE_INT64)

google-cloud-bigquerystorage/src/main/java/com/google/cloud/bigquery/storage/v1/BigDecimalByteStringEncoder.java

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,25 +27,50 @@
2727
import java.math.BigInteger;
2828

2929
public class BigDecimalByteStringEncoder {
30-
private static int NumericScale = 9;
30+
private static int NUMERIC_SCALE = 9;
3131
private static final BigDecimal MAX_NUMERIC_VALUE =
3232
new BigDecimal("99999999999999999999999999999.999999999");
3333
private static final BigDecimal MIN_NUMERIC_VALUE =
3434
new BigDecimal("-99999999999999999999999999999.999999999");
3535

36+
// Number of digits after the decimal point supported by the BIGNUMERIC data type.
37+
private static final int BIGNUMERIC_SCALE = 38;
38+
// Maximum and minimum allowed values for the BIGNUMERIC data type.
39+
private static final BigDecimal MAX_BIGNUMERIC_VALUE =
40+
new BigDecimal(
41+
"578960446186580977117854925043439539266.34992332820282019728792003956564819967");
42+
private static final BigDecimal MIN_BIGNUMERIC_VALUE =
43+
new BigDecimal(
44+
"-578960446186580977117854925043439539266.34992332820282019728792003956564819968");
45+
3646
public static ByteString encodeToNumericByteString(BigDecimal bigDecimal) {
3747
ByteString byteString =
3848
serializeBigDecimal(
39-
bigDecimal, NumericScale, MAX_NUMERIC_VALUE, MIN_NUMERIC_VALUE, "ByteString");
49+
bigDecimal, NUMERIC_SCALE, MAX_NUMERIC_VALUE, MIN_NUMERIC_VALUE, "ByteString");
50+
return byteString;
51+
}
52+
53+
public static ByteString encodeToBigNumericByteString(BigDecimal bigDecimal) {
54+
ByteString byteString =
55+
serializeBigDecimal(
56+
bigDecimal, BIGNUMERIC_SCALE, MAX_BIGNUMERIC_VALUE, MIN_BIGNUMERIC_VALUE, "ByteString");
4057
return byteString;
4158
}
4259

4360
public static BigDecimal decodeNumericByteString(ByteString byteString) {
4461
BigDecimal bigDecimal =
4562
deserializeBigDecimal(
46-
byteString, NumericScale, MAX_NUMERIC_VALUE, MIN_NUMERIC_VALUE, "BigDecimal");
63+
byteString, NUMERIC_SCALE, MAX_NUMERIC_VALUE, MIN_NUMERIC_VALUE, "BigDecimal");
4764
return bigDecimal;
4865
}
66+
67+
public static BigDecimal decodeBigNumericByteString(ByteString byteString) {
68+
BigDecimal bigDecimal =
69+
deserializeBigDecimal(
70+
byteString, BIGNUMERIC_SCALE, MAX_BIGNUMERIC_VALUE, MIN_BIGNUMERIC_VALUE, "BigDecimal");
71+
return bigDecimal;
72+
}
73+
4974
// Make these private and make public wrapper that internalizes these min/max/scale/type
5075
private static BigDecimal deserializeBigDecimal(
5176
ByteString serializedValue,

google-cloud-bigquerystorage/src/main/java/com/google/cloud/bigquery/storage/v1/JsonToProtoMessage.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ private static void fillField(
205205
if (val instanceof String) {
206206
protoMsg.setField(
207207
fieldDescriptor,
208-
BigDecimalByteStringEncoder.encodeToNumericByteString(
208+
BigDecimalByteStringEncoder.encodeToBigNumericByteString(
209209
new BigDecimal((String) val)));
210210
return;
211211
}
@@ -373,7 +373,7 @@ private static void fillRepeatedField(
373373
if (val instanceof String) {
374374
protoMsg.addRepeatedField(
375375
fieldDescriptor,
376-
BigDecimalByteStringEncoder.encodeToNumericByteString(
376+
BigDecimalByteStringEncoder.encodeToBigNumericByteString(
377377
new BigDecimal((String) val)));
378378
added = true;
379379
}

google-cloud-bigquerystorage/src/test/java/com/google/cloud/bigquery/storage/v1/BQTableSchemaToProtoDescriptorTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -235,13 +235,13 @@ public void testStructComplex() throws Exception {
235235
.build();
236236
final TableFieldSchema TEST_BIGNUMERIC =
237237
TableFieldSchema.newBuilder()
238-
.setType(TableFieldSchema.Type.NUMERIC)
238+
.setType(TableFieldSchema.Type.BIGNUMERIC)
239239
.setMode(TableFieldSchema.Mode.NULLABLE)
240240
.setName("test_bignumeric")
241241
.build();
242242
final TableFieldSchema TEST_BIGNUMERIC_STR =
243243
TableFieldSchema.newBuilder()
244-
.setType(TableFieldSchema.Type.NUMERIC)
244+
.setType(TableFieldSchema.Type.BIGNUMERIC)
245245
.setMode(TableFieldSchema.Mode.REPEATED)
246246
.setName("test_bignumeric_str")
247247
.build();

google-cloud-bigquerystorage/src/test/java/com/google/cloud/bigquery/storage/v1/JsonToProtoMessageTest.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -411,13 +411,13 @@ public class JsonToProtoMessageTest {
411411
.build();
412412
private final TableFieldSchema TEST_BIGNUMERIC =
413413
TableFieldSchema.newBuilder()
414-
.setType(TableFieldSchema.Type.NUMERIC)
414+
.setType(TableFieldSchema.Type.BIGNUMERIC)
415415
.setMode(TableFieldSchema.Mode.NULLABLE)
416416
.setName("test_bignumeric")
417417
.build();
418418
private final TableFieldSchema TEST_BIGNUMERIC_STR =
419419
TableFieldSchema.newBuilder()
420-
.setType(TableFieldSchema.Type.NUMERIC)
420+
.setType(TableFieldSchema.Type.BIGNUMERIC)
421421
.setMode(TableFieldSchema.Mode.REPEATED)
422422
.setName("test_bignumeric_str")
423423
.build();
@@ -831,9 +831,10 @@ public void testStructComplex() throws Exception {
831831
.setTestNumericStr(
832832
BigDecimalByteStringEncoder.encodeToNumericByteString(new BigDecimal("12.4")))
833833
.setTestBignumeric(
834-
BigDecimalByteStringEncoder.encodeToNumericByteString(new BigDecimal("2.3")))
834+
BigDecimalByteStringEncoder.encodeToBigNumericByteString(
835+
new BigDecimal("578960446186580977117854925043439539266.3")))
835836
.addTestBignumericStr(
836-
BigDecimalByteStringEncoder.encodeToNumericByteString(new BigDecimal("1.23")))
837+
BigDecimalByteStringEncoder.encodeToBigNumericByteString(new BigDecimal("1.23")))
837838
.setTestInterval("0-0 0 0:0:0.000005")
838839
.addTestJson("{'a':'b'}")
839840
.build();
@@ -880,7 +881,8 @@ public void testStructComplex() throws Exception {
880881
json.put("test_numeric_str", "12.4");
881882
json.put(
882883
"test_bignumeric",
883-
BigDecimalByteStringEncoder.encodeToNumericByteString(BigDecimal.valueOf(2.3)));
884+
BigDecimalByteStringEncoder.encodeToBigNumericByteString(
885+
new BigDecimal("578960446186580977117854925043439539266.3")));
884886
json.put("test_bignumeric_str", new JSONArray(new String[] {"1.23"}));
885887
json.put("test_interval", "0-0 0 0:0:0.000005");
886888
json.put("test_json", new JSONArray(new String[] {"{'a':'b'}"}));

0 commit comments

Comments
 (0)