diff --git a/CHANGELOG.md b/CHANGELOG.md index 6318de8f07..d2ac78e50a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## [2.32.0](https://github.com/googleapis/java-bigquerystorage/compare/v2.31.1...v2.32.0) (2023-02-21) + + +### Features + +* Add default_value_expression to TableFieldSchema ([#1988](https://github.com/googleapis/java-bigquerystorage/issues/1988)) ([89c767f](https://github.com/googleapis/java-bigquerystorage/commit/89c767f059ead3ce30842a478e395ac657f4b4ef)) +* Add functions to set missing value map in the stream writers ([#1966](https://github.com/googleapis/java-bigquerystorage/issues/1966)) ([98d7e44](https://github.com/googleapis/java-bigquerystorage/commit/98d7e446b75aba02ce27cdcb5e835c3fd0f3ad54)) + + +### Bug Fixes + +* Extra logging for investigation of the stuck case. ([#1999](https://github.com/googleapis/java-bigquerystorage/issues/1999)) ([e6ee13a](https://github.com/googleapis/java-bigquerystorage/commit/e6ee13a70304c2278d6b7a94dc19049a2b786a6e)) + ## [2.31.1](https://github.com/googleapis/java-bigquerystorage/compare/v2.31.0...v2.31.1) (2023-02-14) diff --git a/README.md b/README.md index 993057d651..cfafb5fc77 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ If you are using Maven without BOM, add this to your dependencies: com.google.cloud google-cloud-bigquerystorage - 2.30.0 + 2.31.1 ``` @@ -56,13 +56,13 @@ implementation 'com.google.cloud:google-cloud-bigquerystorage' If you are using Gradle without BOM, add this to your dependencies: ```Groovy -implementation 'com.google.cloud:google-cloud-bigquerystorage:2.31.0' +implementation 'com.google.cloud:google-cloud-bigquerystorage:2.31.1' ``` If you are using SBT, add this to your dependencies: ```Scala -libraryDependencies += "com.google.cloud" % "google-cloud-bigquerystorage" % "2.31.0" +libraryDependencies += "com.google.cloud" % "google-cloud-bigquerystorage" % "2.31.1" ``` ## Authentication diff --git a/google-cloud-bigquerystorage-bom/pom.xml b/google-cloud-bigquerystorage-bom/pom.xml index 3debd3529c..5b3cdef186 100644 --- a/google-cloud-bigquerystorage-bom/pom.xml +++ b/google-cloud-bigquerystorage-bom/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.google.cloud google-cloud-bigquerystorage-bom - 2.31.1 + 2.32.0 pom com.google.cloud @@ -52,37 +52,37 @@ com.google.cloud google-cloud-bigquerystorage - 2.31.1 + 2.32.0 com.google.api.grpc grpc-google-cloud-bigquerystorage-v1beta1 - 0.155.1 + 0.156.0 com.google.api.grpc grpc-google-cloud-bigquerystorage-v1beta2 - 0.155.1 + 0.156.0 com.google.api.grpc grpc-google-cloud-bigquerystorage-v1 - 2.31.1 + 2.32.0 com.google.api.grpc proto-google-cloud-bigquerystorage-v1beta1 - 0.155.1 + 0.156.0 com.google.api.grpc proto-google-cloud-bigquerystorage-v1beta2 - 0.155.1 + 0.156.0 com.google.api.grpc proto-google-cloud-bigquerystorage-v1 - 2.31.1 + 2.32.0 diff --git a/google-cloud-bigquerystorage/pom.xml b/google-cloud-bigquerystorage/pom.xml index 160b52c923..8ffdcd2576 100644 --- a/google-cloud-bigquerystorage/pom.xml +++ b/google-cloud-bigquerystorage/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.google.cloud google-cloud-bigquerystorage - 2.31.1 + 2.32.0 jar BigQuery Storage https://github.com/googleapis/java-bigquerystorage @@ -11,7 +11,7 @@ com.google.cloud google-cloud-bigquerystorage-parent - 2.31.1 + 2.32.0 google-cloud-bigquerystorage diff --git a/google-cloud-bigquerystorage/src/main/java/com/google/cloud/bigquery/storage/v1/ConnectionWorker.java b/google-cloud-bigquerystorage/src/main/java/com/google/cloud/bigquery/storage/v1/ConnectionWorker.java index 05390c56aa..8eab8bfdde 100644 --- a/google-cloud-bigquerystorage/src/main/java/com/google/cloud/bigquery/storage/v1/ConnectionWorker.java +++ b/google-cloud-bigquerystorage/src/main/java/com/google/cloud/bigquery/storage/v1/ConnectionWorker.java @@ -59,6 +59,7 @@ *

TODO: support updated schema */ class ConnectionWorker implements AutoCloseable { + private static final Logger log = Logger.getLogger(StreamWriter.class.getName()); // Maximum wait time on inflight quota before error out. @@ -280,6 +281,8 @@ ApiFuture append(StreamWriter streamWriter, ProtoRows rows, requestBuilder.setOffset(Int64Value.of(offset)); } requestBuilder.setWriteStream(streamWriter.getStreamName()); + requestBuilder.putAllMissingValueInterpretations( + streamWriter.getMissingValueInterpretationMap()); return appendInternal(streamWriter, requestBuilder.build()); } @@ -581,7 +584,17 @@ private void appendLoop() { } } - log.fine("Cleanup starts. Stream: " + streamName + " id: " + writerId); + log.info( + "Cleanup starts. Stream: " + + streamName + + " id: " + + writerId + + " userClose: " + + userClosed + + " final exception: " + + (this.connectionFinalStatus == null + ? "null" + : this.connectionFinalStatus.toString())); // At this point, the waiting queue is drained, so no more requests. // We can close the stream connection and handle the remaining inflight requests. if (streamConnection != null) { @@ -590,13 +603,13 @@ private void appendLoop() { } // At this point, there cannot be more callback. It is safe to clean up all inflight requests. - log.fine( + log.info( "Stream connection is fully closed. Cleaning up inflight requests. Stream: " + streamName + " id: " + writerId); cleanupInflightRequests(); - log.fine("Append thread is done. Stream: " + streamName + " id: " + writerId); + log.info("Append thread is done. Stream: " + streamName + " id: " + writerId); } /* @@ -809,7 +822,9 @@ private void doneCallback(Throwable finalStatus) { + (maxRetryDuration.toMillis() - (System.currentTimeMillis() - connectionRetryStartTime)) + ", for stream " - + streamName); + + streamName + + " id:" + + writerId); } else { Exceptions.StorageException storageException = Exceptions.toStorageException(finalStatus); this.connectionFinalStatus = storageException != null ? storageException : finalStatus; @@ -841,6 +856,7 @@ synchronized TableSchemaAndTimestamp getUpdatedSchema() { // Class that wraps AppendRowsRequest and its corresponding Response future. static final class AppendRequestAndResponse { + final SettableApiFuture appendResult; final AppendRowsRequest message; final long messageSize; @@ -872,6 +888,7 @@ public Load getLoad() { */ @AutoValue public abstract static class Load { + // Consider the load on this worker to be overwhelmed when above some percentage of // in-flight bytes or in-flight requests count. private static double overwhelmedInflightCount = 0.2; @@ -945,6 +962,7 @@ static void setMaxInflightQueueWaitTime(long waitTime) { @AutoValue abstract static class TableSchemaAndTimestamp { + // Shows the timestamp updated schema is reported from response abstract long updateTimeStamp(); diff --git a/google-cloud-bigquerystorage/src/main/java/com/google/cloud/bigquery/storage/v1/JsonStreamWriter.java b/google-cloud-bigquerystorage/src/main/java/com/google/cloud/bigquery/storage/v1/JsonStreamWriter.java index 24061878f2..edf40c1e64 100644 --- a/google-cloud-bigquerystorage/src/main/java/com/google/cloud/bigquery/storage/v1/JsonStreamWriter.java +++ b/google-cloud-bigquerystorage/src/main/java/com/google/cloud/bigquery/storage/v1/JsonStreamWriter.java @@ -275,6 +275,24 @@ public long getInflightWaitSeconds() { return streamWriter.getInflightWaitSeconds(); } + /** + * Sets the missing value interpretation map for the JsonStreamWriter. The input + * missingValueInterpretationMap is used for all append requests unless otherwise changed. + * + * @param missingValueInterpretationMap the missing value interpretation map used by the + * JsonStreamWriter. + */ + public void setMissingValueInterpretationMap( + Map missingValueInterpretationMap) { + streamWriter.setMissingValueInterpretationMap(missingValueInterpretationMap); + } + + /** @return the missing value interpretation map used for the writer. */ + public Map + getMissingValueInterpretationMap() { + return streamWriter.getMissingValueInterpretationMap(); + } + /** Sets all StreamWriter settings. */ private void setStreamWriterSettings( @Nullable TransportChannelProvider channelProvider, diff --git a/google-cloud-bigquerystorage/src/main/java/com/google/cloud/bigquery/storage/v1/StreamWriter.java b/google-cloud-bigquerystorage/src/main/java/com/google/cloud/bigquery/storage/v1/StreamWriter.java index 77bad3eb24..ff965f0477 100644 --- a/google-cloud-bigquerystorage/src/main/java/com/google/cloud/bigquery/storage/v1/StreamWriter.java +++ b/google-cloud-bigquerystorage/src/main/java/com/google/cloud/bigquery/storage/v1/StreamWriter.java @@ -32,6 +32,7 @@ import io.grpc.StatusRuntimeException; import java.io.IOException; import java.time.Duration; +import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Objects; @@ -61,6 +62,11 @@ public class StreamWriter implements AutoCloseable { // Cache of location info for a given dataset. private static Map projectAndDatasetToLocation = new ConcurrentHashMap<>(); + // Map of fields to their MissingValueInterpretation, which dictates how a field should be + // populated when it is missing from an input user row. + private Map missingValueInterpretationMap = + new HashMap(); + /* * The identifier of stream to write to. */ @@ -336,6 +342,18 @@ private void validateFetchedConnectonPool(StreamWriter.Builder builder) { } } + /** + * Sets the missing value interpretation map for the stream writer. The input + * missingValueInterpretationMap is used for all write requests unless otherwise changed. + * + * @param missingValueInterpretationMap the missing value interpretation map used by stream + * writer. + */ + public void setMissingValueInterpretationMap( + Map missingValueInterpretationMap) { + this.missingValueInterpretationMap = missingValueInterpretationMap; + } + /** * Schedules the writing of rows at the end of current stream. * @@ -419,6 +437,12 @@ public String getLocation() { return location; } + /** @return the missing value interpretation map used for the writer. */ + public Map + getMissingValueInterpretationMap() { + return missingValueInterpretationMap; + } + /** * @return if a stream writer can no longer be used for writing. It is due to either the * StreamWriter is explicitly closed or the underlying connection is broken when connection diff --git a/google-cloud-bigquerystorage/src/test/java/com/google/cloud/bigquery/storage/v1/JsonStreamWriterTest.java b/google-cloud-bigquerystorage/src/test/java/com/google/cloud/bigquery/storage/v1/JsonStreamWriterTest.java index 691ec4afde..a748678839 100644 --- a/google-cloud-bigquerystorage/src/test/java/com/google/cloud/bigquery/storage/v1/JsonStreamWriterTest.java +++ b/google-cloud-bigquerystorage/src/test/java/com/google/cloud/bigquery/storage/v1/JsonStreamWriterTest.java @@ -48,6 +48,7 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.util.Arrays; +import java.util.HashMap; import java.util.Map; import java.util.UUID; import java.util.concurrent.ExecutionException; @@ -1290,4 +1291,43 @@ private AppendRowsResponse createAppendResponse(long offset) { AppendRowsResponse.AppendResult.newBuilder().setOffset(Int64Value.of(offset)).build()) .build(); } + + @Test + public void testAppendWithMissingValueMap() throws Exception { + TableFieldSchema field = + TableFieldSchema.newBuilder() + .setType(TableFieldSchema.Type.STRING) + .setMode(TableFieldSchema.Mode.NULLABLE) + .setName("test-列") + .build(); + TableSchema tableSchema = TableSchema.newBuilder().addFields(0, field).build(); + FlexibleType expectedProto = FlexibleType.newBuilder().setColDGVzdC3LiJc("allen").build(); + JSONObject flexible = new JSONObject(); + flexible.put("test-列", "allen"); + JSONArray jsonArr = new JSONArray(); + jsonArr.put(flexible); + + try (JsonStreamWriter writer = + getTestJsonStreamWriterBuilder(TEST_STREAM, tableSchema).setTraceId("test:empty").build()) { + + Map missingValueMap = new HashMap(); + missingValueMap.put("col1", AppendRowsRequest.MissingValueInterpretation.NULL_VALUE); + missingValueMap.put("col3", AppendRowsRequest.MissingValueInterpretation.DEFAULT_VALUE); + writer.setMissingValueInterpretationMap(missingValueMap); + assertEquals(missingValueMap, writer.getMissingValueInterpretationMap()); + + testBigQueryWrite.addResponse( + AppendRowsResponse.newBuilder() + .setAppendResult( + AppendRowsResponse.AppendResult.newBuilder().setOffset(Int64Value.of(0)).build()) + .build()); + + ApiFuture appendFuture = writer.append(jsonArr); + assertEquals(0L, appendFuture.get().getAppendResult().getOffset().getValue()); + appendFuture.get(); + assertEquals( + testBigQueryWrite.getAppendRequests().get(0).getMissingValueInterpretations(), + missingValueMap); + } + } } diff --git a/google-cloud-bigquerystorage/src/test/java/com/google/cloud/bigquery/storage/v1/StreamWriterTest.java b/google-cloud-bigquerystorage/src/test/java/com/google/cloud/bigquery/storage/v1/StreamWriterTest.java index 383301d820..43c5fd2bea 100644 --- a/google-cloud-bigquerystorage/src/test/java/com/google/cloud/bigquery/storage/v1/StreamWriterTest.java +++ b/google-cloud-bigquerystorage/src/test/java/com/google/cloud/bigquery/storage/v1/StreamWriterTest.java @@ -49,7 +49,9 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.UUID; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; @@ -67,6 +69,7 @@ @RunWith(JUnit4.class) public class StreamWriterTest { + private static final Logger log = Logger.getLogger(StreamWriterTest.class.getName()); private static final String TEST_STREAM_1 = "projects/p/datasets/d1/tables/t1/streams/_default"; private static final String TEST_STREAM_2 = "projects/p/datasets/d2/tables/t2/streams/_default"; @@ -1227,6 +1230,51 @@ public void testCloseDisconnectedStream() throws Exception { writer.close(); } + @Test + public void testSetAndGetMissingValueInterpretationMap() throws Exception { + StreamWriter writer = getTestStreamWriter(); + Map missingValueMap = new HashMap(); + missingValueMap.put("col1", AppendRowsRequest.MissingValueInterpretation.NULL_VALUE); + missingValueMap.put("col3", AppendRowsRequest.MissingValueInterpretation.DEFAULT_VALUE); + writer.setMissingValueInterpretationMap(missingValueMap); + assertEquals(missingValueMap, writer.getMissingValueInterpretationMap()); + } + + @Test + public void testAppendWithMissingValueMap() throws Exception { + StreamWriter writer = getTestStreamWriter(); + + long appendCount = 2; + testBigQueryWrite.addResponse(createAppendResponse(0)); + testBigQueryWrite.addResponse(createAppendResponse(1)); + + List> futures = new ArrayList<>(); + // The first append doesn't use a missing value map. + futures.add(writer.append(createProtoRows(new String[] {String.valueOf(0)}), 0)); + + // The second append uses a missing value map. + Map missingValueMap = new HashMap(); + missingValueMap.put("col1", AppendRowsRequest.MissingValueInterpretation.NULL_VALUE); + missingValueMap.put("col3", AppendRowsRequest.MissingValueInterpretation.DEFAULT_VALUE); + writer.setMissingValueInterpretationMap(missingValueMap); + futures.add(writer.append(createProtoRows(new String[] {String.valueOf(1)}), 1)); + + for (int i = 0; i < appendCount; i++) { + assertEquals(i, futures.get(i).get().getAppendResult().getOffset().getValue()); + } + + // Ensure that the AppendRowsRequest for the first append operation does not have a missing + // value map, and that the second AppendRowsRequest has the missing value map provided in the + // second append. + verifyAppendRequests(appendCount); + AppendRowsRequest request1 = testBigQueryWrite.getAppendRequests().get(0); + AppendRowsRequest request2 = testBigQueryWrite.getAppendRequests().get(1); + assertTrue(request1.getMissingValueInterpretations().isEmpty()); + assertEquals(request2.getMissingValueInterpretations(), missingValueMap); + + writer.close(); + } + @Test(timeout = 10000) public void testStreamWriterUserCloseMultiplexing() throws Exception { StreamWriter writer = diff --git a/grpc-google-cloud-bigquerystorage-v1/pom.xml b/grpc-google-cloud-bigquerystorage-v1/pom.xml index 6c1facc6cc..7ed32d0cc4 100644 --- a/grpc-google-cloud-bigquerystorage-v1/pom.xml +++ b/grpc-google-cloud-bigquerystorage-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc grpc-google-cloud-bigquerystorage-v1 - 2.31.1 + 2.32.0 grpc-google-cloud-bigquerystorage-v1 GRPC library for grpc-google-cloud-bigquerystorage-v1 com.google.cloud google-cloud-bigquerystorage-parent - 2.31.1 + 2.32.0 diff --git a/grpc-google-cloud-bigquerystorage-v1beta1/pom.xml b/grpc-google-cloud-bigquerystorage-v1beta1/pom.xml index e16599f28b..d629786430 100644 --- a/grpc-google-cloud-bigquerystorage-v1beta1/pom.xml +++ b/grpc-google-cloud-bigquerystorage-v1beta1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc grpc-google-cloud-bigquerystorage-v1beta1 - 0.155.1 + 0.156.0 grpc-google-cloud-bigquerystorage-v1beta1 GRPC library for grpc-google-cloud-bigquerystorage-v1beta1 com.google.cloud google-cloud-bigquerystorage-parent - 2.31.1 + 2.32.0 diff --git a/grpc-google-cloud-bigquerystorage-v1beta2/pom.xml b/grpc-google-cloud-bigquerystorage-v1beta2/pom.xml index 9985b229d6..426a89d6a7 100644 --- a/grpc-google-cloud-bigquerystorage-v1beta2/pom.xml +++ b/grpc-google-cloud-bigquerystorage-v1beta2/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc grpc-google-cloud-bigquerystorage-v1beta2 - 0.155.1 + 0.156.0 grpc-google-cloud-bigquerystorage-v1beta2 GRPC library for grpc-google-cloud-bigquerystorage-v1beta2 com.google.cloud google-cloud-bigquerystorage-parent - 2.31.1 + 2.32.0 diff --git a/pom.xml b/pom.xml index f4933af4ad..d53c5ba6d8 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.google.cloud google-cloud-bigquerystorage-parent pom - 2.31.1 + 2.32.0 BigQuery Storage Parent https://github.com/googleapis/java-bigquerystorage @@ -83,37 +83,37 @@ com.google.api.grpc proto-google-cloud-bigquerystorage-v1beta1 - 0.155.1 + 0.156.0 com.google.api.grpc proto-google-cloud-bigquerystorage-v1beta2 - 0.155.1 + 0.156.0 com.google.api.grpc proto-google-cloud-bigquerystorage-v1 - 2.31.1 + 2.32.0 com.google.api.grpc grpc-google-cloud-bigquerystorage-v1beta1 - 0.155.1 + 0.156.0 com.google.api.grpc grpc-google-cloud-bigquerystorage-v1beta2 - 0.155.1 + 0.156.0 com.google.api.grpc grpc-google-cloud-bigquerystorage-v1 - 2.31.1 + 2.32.0 com.google.cloud google-cloud-bigquerystorage - 2.31.1 + 2.32.0 org.json diff --git a/proto-google-cloud-bigquerystorage-v1/pom.xml b/proto-google-cloud-bigquerystorage-v1/pom.xml index ae7d5a7698..6c1c5057d6 100644 --- a/proto-google-cloud-bigquerystorage-v1/pom.xml +++ b/proto-google-cloud-bigquerystorage-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc proto-google-cloud-bigquerystorage-v1 - 2.31.1 + 2.32.0 proto-google-cloud-bigquerystorage-v1 PROTO library for proto-google-cloud-bigquerystorage-v1 com.google.cloud google-cloud-bigquerystorage-parent - 2.31.1 + 2.32.0 diff --git a/proto-google-cloud-bigquerystorage-v1/src/main/java/com/google/cloud/bigquery/storage/v1/TableFieldSchema.java b/proto-google-cloud-bigquerystorage-v1/src/main/java/com/google/cloud/bigquery/storage/v1/TableFieldSchema.java index 717717bb91..ce3a4143f4 100644 --- a/proto-google-cloud-bigquerystorage-v1/src/main/java/com/google/cloud/bigquery/storage/v1/TableFieldSchema.java +++ b/proto-google-cloud-bigquerystorage-v1/src/main/java/com/google/cloud/bigquery/storage/v1/TableFieldSchema.java @@ -43,6 +43,7 @@ private TableFieldSchema() { mode_ = 0; fields_ = java.util.Collections.emptyList(); description_ = ""; + defaultValueExpression_ = ""; } @java.lang.Override @@ -991,6 +992,59 @@ public long getScale() { return scale_; } + public static final int DEFAULT_VALUE_EXPRESSION_FIELD_NUMBER = 10; + + @SuppressWarnings("serial") + private volatile java.lang.Object defaultValueExpression_ = ""; + /** + * + * + *

+   * Optional. A SQL expression to specify the [default value]
+   * (https://cloud.google.com/bigquery/docs/default-values) for this field.
+   * 
+ * + * string default_value_expression = 10 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The defaultValueExpression. + */ + @java.lang.Override + public java.lang.String getDefaultValueExpression() { + java.lang.Object ref = defaultValueExpression_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + defaultValueExpression_ = s; + return s; + } + } + /** + * + * + *
+   * Optional. A SQL expression to specify the [default value]
+   * (https://cloud.google.com/bigquery/docs/default-values) for this field.
+   * 
+ * + * string default_value_expression = 10 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The bytes for defaultValueExpression. + */ + @java.lang.Override + public com.google.protobuf.ByteString getDefaultValueExpressionBytes() { + java.lang.Object ref = defaultValueExpression_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + defaultValueExpression_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + private byte memoizedIsInitialized = -1; @java.lang.Override @@ -1033,6 +1087,9 @@ public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io if (scale_ != 0L) { output.writeInt64(9, scale_); } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(defaultValueExpression_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 10, defaultValueExpression_); + } getUnknownFields().writeTo(output); } @@ -1070,6 +1127,9 @@ public int getSerializedSize() { if (scale_ != 0L) { size += com.google.protobuf.CodedOutputStream.computeInt64Size(9, scale_); } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(defaultValueExpression_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(10, defaultValueExpression_); + } size += getUnknownFields().getSerializedSize(); memoizedSize = size; return size; @@ -1094,6 +1154,7 @@ public boolean equals(final java.lang.Object obj) { if (getMaxLength() != other.getMaxLength()) return false; if (getPrecision() != other.getPrecision()) return false; if (getScale() != other.getScale()) return false; + if (!getDefaultValueExpression().equals(other.getDefaultValueExpression())) return false; if (!getUnknownFields().equals(other.getUnknownFields())) return false; return true; } @@ -1123,6 +1184,8 @@ public int hashCode() { hash = (53 * hash) + com.google.protobuf.Internal.hashLong(getPrecision()); hash = (37 * hash) + SCALE_FIELD_NUMBER; hash = (53 * hash) + com.google.protobuf.Internal.hashLong(getScale()); + hash = (37 * hash) + DEFAULT_VALUE_EXPRESSION_FIELD_NUMBER; + hash = (53 * hash) + getDefaultValueExpression().hashCode(); hash = (29 * hash) + getUnknownFields().hashCode(); memoizedHashCode = hash; return hash; @@ -1277,6 +1340,7 @@ public Builder clear() { maxLength_ = 0L; precision_ = 0L; scale_ = 0L; + defaultValueExpression_ = ""; return this; } @@ -1348,6 +1412,9 @@ private void buildPartial0(com.google.cloud.bigquery.storage.v1.TableFieldSchema if (((from_bitField0_ & 0x00000080) != 0)) { result.scale_ = scale_; } + if (((from_bitField0_ & 0x00000100) != 0)) { + result.defaultValueExpression_ = defaultValueExpression_; + } } @java.lang.Override @@ -1448,6 +1515,11 @@ public Builder mergeFrom(com.google.cloud.bigquery.storage.v1.TableFieldSchema o if (other.getScale() != 0L) { setScale(other.getScale()); } + if (!other.getDefaultValueExpression().isEmpty()) { + defaultValueExpression_ = other.defaultValueExpression_; + bitField0_ |= 0x00000100; + onChanged(); + } this.mergeUnknownFields(other.getUnknownFields()); onChanged(); return this; @@ -1530,6 +1602,12 @@ public Builder mergeFrom( bitField0_ |= 0x00000080; break; } // case 72 + case 82: + { + defaultValueExpression_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000100; + break; + } // case 82 default: { if (!super.parseUnknownField(input, extensionRegistry, tag)) { @@ -2633,6 +2711,117 @@ public Builder clearScale() { return this; } + private java.lang.Object defaultValueExpression_ = ""; + /** + * + * + *
+     * Optional. A SQL expression to specify the [default value]
+     * (https://cloud.google.com/bigquery/docs/default-values) for this field.
+     * 
+ * + * string default_value_expression = 10 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The defaultValueExpression. + */ + public java.lang.String getDefaultValueExpression() { + java.lang.Object ref = defaultValueExpression_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + defaultValueExpression_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * + * + *
+     * Optional. A SQL expression to specify the [default value]
+     * (https://cloud.google.com/bigquery/docs/default-values) for this field.
+     * 
+ * + * string default_value_expression = 10 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The bytes for defaultValueExpression. + */ + public com.google.protobuf.ByteString getDefaultValueExpressionBytes() { + java.lang.Object ref = defaultValueExpression_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + defaultValueExpression_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * + * + *
+     * Optional. A SQL expression to specify the [default value]
+     * (https://cloud.google.com/bigquery/docs/default-values) for this field.
+     * 
+ * + * string default_value_expression = 10 [(.google.api.field_behavior) = OPTIONAL]; + * + * @param value The defaultValueExpression to set. + * @return This builder for chaining. + */ + public Builder setDefaultValueExpression(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + defaultValueExpression_ = value; + bitField0_ |= 0x00000100; + onChanged(); + return this; + } + /** + * + * + *
+     * Optional. A SQL expression to specify the [default value]
+     * (https://cloud.google.com/bigquery/docs/default-values) for this field.
+     * 
+ * + * string default_value_expression = 10 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return This builder for chaining. + */ + public Builder clearDefaultValueExpression() { + defaultValueExpression_ = getDefaultInstance().getDefaultValueExpression(); + bitField0_ = (bitField0_ & ~0x00000100); + onChanged(); + return this; + } + /** + * + * + *
+     * Optional. A SQL expression to specify the [default value]
+     * (https://cloud.google.com/bigquery/docs/default-values) for this field.
+     * 
+ * + * string default_value_expression = 10 [(.google.api.field_behavior) = OPTIONAL]; + * + * @param value The bytes for defaultValueExpression to set. + * @return This builder for chaining. + */ + public Builder setDefaultValueExpressionBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + defaultValueExpression_ = value; + bitField0_ |= 0x00000100; + onChanged(); + return this; + } + @java.lang.Override public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { return super.setUnknownFields(unknownFields); diff --git a/proto-google-cloud-bigquerystorage-v1/src/main/java/com/google/cloud/bigquery/storage/v1/TableFieldSchemaOrBuilder.java b/proto-google-cloud-bigquerystorage-v1/src/main/java/com/google/cloud/bigquery/storage/v1/TableFieldSchemaOrBuilder.java index 9d916b387a..69a51f61a0 100644 --- a/proto-google-cloud-bigquerystorage-v1/src/main/java/com/google/cloud/bigquery/storage/v1/TableFieldSchemaOrBuilder.java +++ b/proto-google-cloud-bigquerystorage-v1/src/main/java/com/google/cloud/bigquery/storage/v1/TableFieldSchemaOrBuilder.java @@ -269,4 +269,31 @@ public interface TableFieldSchemaOrBuilder * @return The scale. */ long getScale(); + + /** + * + * + *
+   * Optional. A SQL expression to specify the [default value]
+   * (https://cloud.google.com/bigquery/docs/default-values) for this field.
+   * 
+ * + * string default_value_expression = 10 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The defaultValueExpression. + */ + java.lang.String getDefaultValueExpression(); + /** + * + * + *
+   * Optional. A SQL expression to specify the [default value]
+   * (https://cloud.google.com/bigquery/docs/default-values) for this field.
+   * 
+ * + * string default_value_expression = 10 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The bytes for defaultValueExpression. + */ + com.google.protobuf.ByteString getDefaultValueExpressionBytes(); } diff --git a/proto-google-cloud-bigquerystorage-v1/src/main/java/com/google/cloud/bigquery/storage/v1/TableProto.java b/proto-google-cloud-bigquerystorage-v1/src/main/java/com/google/cloud/bigquery/storage/v1/TableProto.java index 1e47656907..cae3e55f1b 100644 --- a/proto-google-cloud-bigquerystorage-v1/src/main/java/com/google/cloud/bigquery/storage/v1/TableProto.java +++ b/proto-google-cloud-bigquerystorage-v1/src/main/java/com/google/cloud/bigquery/storage/v1/TableProto.java @@ -48,7 +48,7 @@ public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { + ".proto\022 google.cloud.bigquery.storage.v1" + "\032\037google/api/field_behavior.proto\"Q\n\013Tab" + "leSchema\022B\n\006fields\030\001 \003(\01322.google.cloud." - + "bigquery.storage.v1.TableFieldSchema\"\205\005\n" + + "bigquery.storage.v1.TableFieldSchema\"\254\005\n" + "\020TableFieldSchema\022\021\n\004name\030\001 \001(\tB\003\340A\002\022J\n\004" + "type\030\002 \001(\01627.google.cloud.bigquery.stora" + "ge.v1.TableFieldSchema.TypeB\003\340A\002\022J\n\004mode" @@ -57,20 +57,20 @@ public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { + " \003(\01322.google.cloud.bigquery.storage.v1." + "TableFieldSchemaB\003\340A\001\022\030\n\013description\030\006 \001" + "(\tB\003\340A\001\022\027\n\nmax_length\030\007 \001(\003B\003\340A\001\022\026\n\tprec" - + "ision\030\010 \001(\003B\003\340A\001\022\022\n\005scale\030\t \001(\003B\003\340A\001\"\325\001\n" - + "\004Type\022\024\n\020TYPE_UNSPECIFIED\020\000\022\n\n\006STRING\020\001\022" - + "\t\n\005INT64\020\002\022\n\n\006DOUBLE\020\003\022\n\n\006STRUCT\020\004\022\t\n\005BY" - + "TES\020\005\022\010\n\004BOOL\020\006\022\r\n\tTIMESTAMP\020\007\022\010\n\004DATE\020\010" - + "\022\010\n\004TIME\020\t\022\014\n\010DATETIME\020\n\022\r\n\tGEOGRAPHY\020\013\022" - + "\013\n\007NUMERIC\020\014\022\016\n\nBIGNUMERIC\020\r\022\014\n\010INTERVAL" - + "\020\016\022\010\n\004JSON\020\017\"F\n\004Mode\022\024\n\020MODE_UNSPECIFIED" - + "\020\000\022\014\n\010NULLABLE\020\001\022\014\n\010REQUIRED\020\002\022\014\n\010REPEAT" - + "ED\020\003B\272\001\n$com.google.cloud.bigquery.stora" - + "ge.v1B\nTableProtoP\001Z>cloud.google.com/go" - + "/bigquery/storage/apiv1/storagepb;storag" - + "epb\252\002 Google.Cloud.BigQuery.Storage.V1\312\002" - + " Google\\Cloud\\BigQuery\\Storage\\V1b\006proto" - + "3" + + "ision\030\010 \001(\003B\003\340A\001\022\022\n\005scale\030\t \001(\003B\003\340A\001\022%\n\030" + + "default_value_expression\030\n \001(\tB\003\340A\001\"\325\001\n\004" + + "Type\022\024\n\020TYPE_UNSPECIFIED\020\000\022\n\n\006STRING\020\001\022\t" + + "\n\005INT64\020\002\022\n\n\006DOUBLE\020\003\022\n\n\006STRUCT\020\004\022\t\n\005BYT" + + "ES\020\005\022\010\n\004BOOL\020\006\022\r\n\tTIMESTAMP\020\007\022\010\n\004DATE\020\010\022" + + "\010\n\004TIME\020\t\022\014\n\010DATETIME\020\n\022\r\n\tGEOGRAPHY\020\013\022\013" + + "\n\007NUMERIC\020\014\022\016\n\nBIGNUMERIC\020\r\022\014\n\010INTERVAL\020" + + "\016\022\010\n\004JSON\020\017\"F\n\004Mode\022\024\n\020MODE_UNSPECIFIED\020" + + "\000\022\014\n\010NULLABLE\020\001\022\014\n\010REQUIRED\020\002\022\014\n\010REPEATE" + + "D\020\003B\272\001\n$com.google.cloud.bigquery.storag" + + "e.v1B\nTableProtoP\001Z>cloud.google.com/go/" + + "bigquery/storage/apiv1/storagepb;storage" + + "pb\252\002 Google.Cloud.BigQuery.Storage.V1\312\002 " + + "Google\\Cloud\\BigQuery\\Storage\\V1b\006proto3" }; descriptor = com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom( @@ -92,7 +92,15 @@ public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( internal_static_google_cloud_bigquery_storage_v1_TableFieldSchema_descriptor, new java.lang.String[] { - "Name", "Type", "Mode", "Fields", "Description", "MaxLength", "Precision", "Scale", + "Name", + "Type", + "Mode", + "Fields", + "Description", + "MaxLength", + "Precision", + "Scale", + "DefaultValueExpression", }); com.google.protobuf.ExtensionRegistry registry = com.google.protobuf.ExtensionRegistry.newInstance(); diff --git a/proto-google-cloud-bigquerystorage-v1/src/main/proto/google/cloud/bigquery/storage/v1/table.proto b/proto-google-cloud-bigquerystorage-v1/src/main/proto/google/cloud/bigquery/storage/v1/table.proto index 56f7852a19..c9b62d7932 100644 --- a/proto-google-cloud-bigquerystorage-v1/src/main/proto/google/cloud/bigquery/storage/v1/table.proto +++ b/proto-google-cloud-bigquerystorage-v1/src/main/proto/google/cloud/bigquery/storage/v1/table.proto @@ -164,4 +164,8 @@ message TableFieldSchema { // Optional. See documentation for precision. int64 scale = 9 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. A SQL expression to specify the [default value] + // (https://cloud.google.com/bigquery/docs/default-values) for this field. + string default_value_expression = 10 [(google.api.field_behavior) = OPTIONAL]; } diff --git a/proto-google-cloud-bigquerystorage-v1beta1/pom.xml b/proto-google-cloud-bigquerystorage-v1beta1/pom.xml index 84826b4f26..ea321e02b2 100644 --- a/proto-google-cloud-bigquerystorage-v1beta1/pom.xml +++ b/proto-google-cloud-bigquerystorage-v1beta1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc proto-google-cloud-bigquerystorage-v1beta1 - 0.155.1 + 0.156.0 proto-google-cloud-bigquerystorage-v1beta1 PROTO library for proto-google-cloud-bigquerystorage-v1beta1 com.google.cloud google-cloud-bigquerystorage-parent - 2.31.1 + 2.32.0 diff --git a/proto-google-cloud-bigquerystorage-v1beta2/pom.xml b/proto-google-cloud-bigquerystorage-v1beta2/pom.xml index 637de51267..089b057b16 100644 --- a/proto-google-cloud-bigquerystorage-v1beta2/pom.xml +++ b/proto-google-cloud-bigquerystorage-v1beta2/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc proto-google-cloud-bigquerystorage-v1beta2 - 0.155.1 + 0.156.0 proto-google-cloud-bigquerystorage-v1beta2 PROTO library for proto-google-cloud-bigquerystorage-v1beta2 com.google.cloud google-cloud-bigquerystorage-parent - 2.31.1 + 2.32.0 diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml index bd112f28dd..5bdc579d52 100644 --- a/samples/install-without-bom/pom.xml +++ b/samples/install-without-bom/pom.xml @@ -30,7 +30,7 @@ com.google.cloud google-cloud-bigquerystorage - 2.30.0 + 2.31.1 diff --git a/samples/pom.xml b/samples/pom.xml index a7e1defcb6..ae24bfd59f 100644 --- a/samples/pom.xml +++ b/samples/pom.xml @@ -38,7 +38,7 @@ org.apache.maven.plugins maven-deploy-plugin - 3.0.0 + 3.1.0 true diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index e8b4217de8..6e2f456db2 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -29,7 +29,7 @@ com.google.cloud google-cloud-bigquerystorage - 2.31.1 + 2.32.0 diff --git a/tutorials/JsonWriterDefaultStream/pom.xml b/tutorials/JsonWriterDefaultStream/pom.xml index 0ed22ee454..d05c1f91bd 100644 --- a/tutorials/JsonWriterDefaultStream/pom.xml +++ b/tutorials/JsonWriterDefaultStream/pom.xml @@ -19,7 +19,7 @@ com.google.cloud google-cloud-bigquerystorage - 2.30.0 + 2.31.1 com.google.cloud diff --git a/tutorials/pom.xml b/tutorials/pom.xml index 7654b27ac1..f636d2d46e 100644 --- a/tutorials/pom.xml +++ b/tutorials/pom.xml @@ -36,7 +36,7 @@ org.apache.maven.plugins maven-deploy-plugin - 3.0.0 + 3.1.0 true diff --git a/versions.txt b/versions.txt index 77fa36fa6c..50f64e4204 100644 --- a/versions.txt +++ b/versions.txt @@ -1,10 +1,10 @@ # Format: # module:released-version:current-version -google-cloud-bigquerystorage:2.31.1:2.31.1 -grpc-google-cloud-bigquerystorage-v1beta1:0.155.1:0.155.1 -grpc-google-cloud-bigquerystorage-v1beta2:0.155.1:0.155.1 -grpc-google-cloud-bigquerystorage-v1:2.31.1:2.31.1 -proto-google-cloud-bigquerystorage-v1beta1:0.155.1:0.155.1 -proto-google-cloud-bigquerystorage-v1beta2:0.155.1:0.155.1 -proto-google-cloud-bigquerystorage-v1:2.31.1:2.31.1 +google-cloud-bigquerystorage:2.32.0:2.32.0 +grpc-google-cloud-bigquerystorage-v1beta1:0.156.0:0.156.0 +grpc-google-cloud-bigquerystorage-v1beta2:0.156.0:0.156.0 +grpc-google-cloud-bigquerystorage-v1:2.32.0:2.32.0 +proto-google-cloud-bigquerystorage-v1beta1:0.156.0:0.156.0 +proto-google-cloud-bigquerystorage-v1beta2:0.156.0:0.156.0 +proto-google-cloud-bigquerystorage-v1:2.32.0:2.32.0