Skip to content

Commit 6412fb2

Browse files
feat: add JsonToProtoMessage support for TIMESTAMP (#1574)
Fixes #1515
1 parent b6eddeb commit 6412fb2

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import com.google.protobuf.Message;
2626
import com.google.protobuf.UninitializedMessageException;
2727
import java.math.BigDecimal;
28+
import java.sql.Timestamp;
2829
import java.time.LocalDate;
2930
import java.util.List;
3031
import java.util.logging.Logger;
@@ -294,6 +295,14 @@ private static void fillField(
294295
protoMsg.setField(fieldDescriptor, (Long) val);
295296
return;
296297
}
298+
} else if (fieldSchema.getType() == TableFieldSchema.Type.TIMESTAMP) {
299+
if (val instanceof String) {
300+
protoMsg.setField(fieldDescriptor, Timestamp.valueOf((String) val).getTime());
301+
return;
302+
} else if (val instanceof Long) {
303+
protoMsg.setField(fieldDescriptor, (Long) val);
304+
return;
305+
}
297306
}
298307
}
299308
if (val instanceof Integer) {
@@ -469,6 +478,15 @@ private static void fillRepeatedField(
469478
} else {
470479
fail = true;
471480
}
481+
} else if (fieldSchema != null
482+
&& fieldSchema.getType() == TableFieldSchema.Type.TIMESTAMP) {
483+
if (val instanceof String) {
484+
protoMsg.addRepeatedField(fieldDescriptor, Timestamp.valueOf((String) val).getTime());
485+
} else if (val instanceof Long) {
486+
protoMsg.addRepeatedField(fieldDescriptor, (Long) val);
487+
} else {
488+
fail = true;
489+
}
472490
} else if (val instanceof Integer) {
473491
protoMsg.addRepeatedField(fieldDescriptor, new Long((Integer) val));
474492
} else if (val instanceof Long) {

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import io.grpc.Status.Code;
4040
import java.io.IOException;
4141
import java.math.BigDecimal;
42+
import java.sql.Timestamp;
4243
import java.util.*;
4344
import java.util.concurrent.*;
4445
import java.util.concurrent.atomic.AtomicInteger;
@@ -339,12 +340,19 @@ public void testJsonStreamWriterWithDefaultStream()
339340
.setMode(TableFieldSchema.Mode.REPEATED)
340341
.setName("test_bytestring_repeated")
341342
.build();
343+
TableFieldSchema TEST_TIMESTAMP =
344+
TableFieldSchema.newBuilder()
345+
.setName("test_timeStamp")
346+
.setType(TableFieldSchema.Type.TIMESTAMP)
347+
.setMode(TableFieldSchema.Mode.NULLABLE)
348+
.build();
342349
TableSchema tableSchema =
343350
TableSchema.newBuilder()
344351
.addFields(0, TEST_STRING)
345352
.addFields(1, TEST_DATE)
346353
.addFields(2, TEST_NUMERIC)
347354
.addFields(3, TEST_REPEATED_BYTESTRING)
355+
.addFields(4, TEST_TIMESTAMP)
348356
.build();
349357
TableInfo tableInfo =
350358
TableInfo.newBuilder(
@@ -364,6 +372,9 @@ public void testJsonStreamWriterWithDefaultStream()
364372
com.google.cloud.bigquery.Field.newBuilder(
365373
"test_bytestring_repeated", StandardSQLTypeName.BYTES)
366374
.setMode(Field.Mode.REPEATED)
375+
.build(),
376+
com.google.cloud.bigquery.Field.newBuilder(
377+
"test_timestamp", StandardSQLTypeName.TIMESTAMP)
367378
.build())))
368379
.build();
369380

@@ -396,6 +407,7 @@ public void testJsonStreamWriterWithDefaultStream()
396407
ByteString.copyFromUtf8("a").toByteArray(),
397408
ByteString.copyFromUtf8("b").toByteArray()
398409
}));
410+
row1.put("test_timestamp", "2022-02-06 07:24:47.84");
399411
JSONArray jsonArr1 = new JSONArray(new JSONObject[] {row1});
400412

401413
ApiFuture<AppendRowsResponse> response1 = jsonStreamWriter.append(jsonArr1, -1);
@@ -444,6 +456,9 @@ public void testJsonStreamWriterWithDefaultStream()
444456
assertEquals("2020-10-01T12:00:00", currentRow.get(2).getStringValue());
445457
assertEquals(2, currentRow.get(3).getRepeatedValue().size());
446458
assertEquals("Yg==", currentRow.get(3).getRepeatedValue().get(1).getStringValue());
459+
assertEquals(
460+
Timestamp.valueOf("2022-02-06 07:24:47.84").getTime(),
461+
currentRow.get(4).getTimestampValue()); // timestamp long of "2022-02-06 07:24:47.84"
447462
assertEquals("bbb", iter.next().get(0).getStringValue());
448463
assertEquals("ccc", iter.next().get(0).getStringValue());
449464
assertEquals("ddd", iter.next().get(0).getStringValue());

0 commit comments

Comments
 (0)