From 7c8c47f0907654b73091b517f9cb4dab92101a7d Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Wed, 3 Dec 2025 14:05:29 -0500 Subject: [PATCH 1/8] feat: Create DataFormatOptions in BigQuery --- .../cloud/bigquery/DataFormatOptions.java | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/DataFormatOptions.java diff --git a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/DataFormatOptions.java b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/DataFormatOptions.java new file mode 100644 index 000000000..197beb5dd --- /dev/null +++ b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/DataFormatOptions.java @@ -0,0 +1,66 @@ +package com.google.cloud.bigquery; + +/** + * Google BigQuery DataFormatOptions. Configures the output format for data types returned from + * BigQuery. + */ +public class DataFormatOptions { + public enum TimestampFormatOptions { + TIMESTAMP_OUTPUT_FORMAT_UNSPECIFIED("TIMESTAMP_OUTPUT_FORMAT_UNSPECIFIED"), + FLOAT64("FLOAT64"), + INT64("INT64"), + ISO8601_STRING("ISO8601_STRING"); + + private final String format; + + TimestampFormatOptions(String format) { + this.format = format; + } + + @Override + public String toString() { + return format; + } + } + + private boolean useInt64Timestamp; + private TimestampFormatOptions timestampFormatOptions; + + public DataFormatOptions( + boolean useInt64Timestamp, TimestampFormatOptions timestampFormatOptions) { + this.useInt64Timestamp = useInt64Timestamp; + this.timestampFormatOptions = timestampFormatOptions; + } + + public boolean isUseInt64Timestamp() { + return useInt64Timestamp; + } + + public void setUseInt64Timestamp(boolean useInt64Timestamp) { + this.useInt64Timestamp = useInt64Timestamp; + } + + public TimestampFormatOptions getTimestampFormatOptions() { + return timestampFormatOptions; + } + + public void setTimestampFormatOptions(TimestampFormatOptions timestampFormatOptions) { + this.timestampFormatOptions = timestampFormatOptions; + } + + com.google.api.services.bigquery.model.DataFormatOptions toPb() { + com.google.api.services.bigquery.model.DataFormatOptions request = + new com.google.api.services.bigquery.model.DataFormatOptions(); + request.setUseInt64Timestamp(useInt64Timestamp); + if (timestampFormatOptions != null) { + request.setTimestampOutputFormat(timestampFormatOptions.toString()); + } + return request; + } + + DataFormatOptions fromPb(com.google.api.services.bigquery.model.DataFormatOptions request) { + return new DataFormatOptions( + request.getUseInt64Timestamp(), + TimestampFormatOptions.valueOf(request.getTimestampOutputFormat())); + } +} From 9caca679847b35c5e9c1c3841296ed834fb153ea Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Wed, 3 Dec 2025 15:25:59 -0500 Subject: [PATCH 2/8] feat: Add Builder class for DataFormatOptions --- .../cloud/bigquery/BigQueryOptions.java | 28 +++++++++ .../cloud/bigquery/DataFormatOptions.java | 62 ++++++++++++++----- 2 files changed, 75 insertions(+), 15 deletions(-) diff --git a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryOptions.java b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryOptions.java index 7adb58d3a..ed30f9e6f 100644 --- a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryOptions.java +++ b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryOptions.java @@ -17,6 +17,7 @@ package com.google.cloud.bigquery; import com.google.api.core.BetaApi; +import com.google.api.core.ObsoleteApi; import com.google.api.gax.retrying.ResultRetryAlgorithm; import com.google.cloud.ServiceDefaults; import com.google.cloud.ServiceOptions; @@ -41,6 +42,7 @@ public class BigQueryOptions extends ServiceOptions { // set the option ThrowNotFound when you want to throw the exception when the value not found private boolean setThrowNotFound; private boolean useInt64Timestamps; + private final DataFormatOptions dataFormatOptions; private JobCreationMode defaultJobCreationMode = JobCreationMode.JOB_CREATION_MODE_UNSPECIFIED; private boolean enableOpenTelemetryTracing; private Tracer openTelemetryTracer; @@ -70,6 +72,7 @@ public static class Builder extends ServiceOptions.Builder resultRetryAlgorithm; @@ -94,11 +97,31 @@ public Builder setLocation(String location) { return this; } + /** + * This setter is marked as Obsolete. Prefer {@link #setDataFormatOptions(DataFormatOptions)} to + * set the int64timestamp configuration instead. + * + *

If useInt64Timestamps value is set in here and via DataFormatOptions, the + * DataFormatOptions configuration value is used. + * + *

{@code DataFormatOptions.newBuilder().setUseInt64Timestamp(...).build()} + */ + @ObsoleteApi("Use setDataFormatOptions(DataFormatOptions) instead") public Builder setUseInt64Timestamps(boolean useInt64Timestamps) { this.useInt64Timestamps = useInt64Timestamps; return this; } + /** + * Set the format options for the BigQuery data types + * + * @param dataFormatOptions Configuration of the formatting options + */ + public Builder setDataFormatOptions(DataFormatOptions dataFormatOptions) { + this.dataFormatOptions = dataFormatOptions; + return this; + } + /** * Enables OpenTelemetry tracing functionality for this BigQuery instance * @@ -136,6 +159,7 @@ private BigQueryOptions(Builder builder) { super(BigQueryFactory.class, BigQueryRpcFactory.class, builder, new BigQueryDefaults()); this.location = builder.location; this.useInt64Timestamps = builder.useInt64Timestamps; + this.dataFormatOptions = builder.dataFormatOptions; this.enableOpenTelemetryTracing = builder.enableOpenTelemetryTracing; this.openTelemetryTracer = builder.openTelemetryTracer; if (builder.resultRetryAlgorithm != null) { @@ -210,6 +234,10 @@ public boolean getUseInt64Timestamps() { return useInt64Timestamps; } + public DataFormatOptions getDataFormatOptions() { + return dataFormatOptions; + } + public JobCreationMode getDefaultJobCreationMode() { return defaultJobCreationMode; } diff --git a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/DataFormatOptions.java b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/DataFormatOptions.java index 197beb5dd..ad3328ff7 100644 --- a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/DataFormatOptions.java +++ b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/DataFormatOptions.java @@ -23,29 +23,59 @@ public String toString() { } } - private boolean useInt64Timestamp; - private TimestampFormatOptions timestampFormatOptions; + private final boolean useInt64Timestamp; + private final TimestampFormatOptions timestampFormatOptions; - public DataFormatOptions( - boolean useInt64Timestamp, TimestampFormatOptions timestampFormatOptions) { - this.useInt64Timestamp = useInt64Timestamp; - this.timestampFormatOptions = timestampFormatOptions; + DataFormatOptions() { + this(new Builder()); } - public boolean isUseInt64Timestamp() { - return useInt64Timestamp; + DataFormatOptions(Builder builder) { + this.useInt64Timestamp = builder.useInt64Timestamp; + this.timestampFormatOptions = builder.timestampFormatOptions; } - public void setUseInt64Timestamp(boolean useInt64Timestamp) { - this.useInt64Timestamp = useInt64Timestamp; + public boolean isUseInt64Timestamp() { + return useInt64Timestamp; } public TimestampFormatOptions getTimestampFormatOptions() { return timestampFormatOptions; } - public void setTimestampFormatOptions(TimestampFormatOptions timestampFormatOptions) { - this.timestampFormatOptions = timestampFormatOptions; + public static Builder newBuilder() { + return new Builder(); + } + + public Builder toBuilder() { + return new Builder(this); + } + + public static class Builder { + private boolean useInt64Timestamp; + private TimestampFormatOptions timestampFormatOptions = + TimestampFormatOptions.TIMESTAMP_OUTPUT_FORMAT_UNSPECIFIED; + + public Builder() {} + + public Builder(DataFormatOptions dataFormatOptions) { + this.useInt64Timestamp = dataFormatOptions.useInt64Timestamp; + this.timestampFormatOptions = dataFormatOptions.timestampFormatOptions; + } + + public Builder setUseInt64Timestamp(boolean useInt64Timestamp) { + this.useInt64Timestamp = useInt64Timestamp; + return this; + } + + public Builder setTimestampFormatOptions(TimestampFormatOptions timestampFormatOptions) { + this.timestampFormatOptions = timestampFormatOptions; + return this; + } + + public DataFormatOptions build() { + return new DataFormatOptions(this); + } } com.google.api.services.bigquery.model.DataFormatOptions toPb() { @@ -59,8 +89,10 @@ com.google.api.services.bigquery.model.DataFormatOptions toPb() { } DataFormatOptions fromPb(com.google.api.services.bigquery.model.DataFormatOptions request) { - return new DataFormatOptions( - request.getUseInt64Timestamp(), - TimestampFormatOptions.valueOf(request.getTimestampOutputFormat())); + return new Builder() + .setUseInt64Timestamp(request.getUseInt64Timestamp()) + .setTimestampFormatOptions( + TimestampFormatOptions.valueOf(request.getTimestampOutputFormat())) + .build(); } } From 6e16c8176ce529bf379b6c6d18ca795a637bc85c Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Wed, 3 Dec 2025 17:15:51 -0500 Subject: [PATCH 3/8] fix: Update existing references of useInt64Timestamp to use DataFormatOption's variant --- .../google/cloud/bigquery/BigQueryImpl.java | 6 +- .../cloud/bigquery/BigQueryOptions.java | 29 +++++- .../cloud/bigquery/DataFormatOptions.java | 93 +++++++++---------- .../cloud/bigquery/QueryRequestInfo.java | 5 +- .../cloud/bigquery/QueryRequestInfoTest.java | 20 ++-- 5 files changed, 90 insertions(+), 63 deletions(-) diff --git a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryImpl.java b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryImpl.java index ac8fce708..0392fc95a 100644 --- a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryImpl.java +++ b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryImpl.java @@ -2066,10 +2066,8 @@ && getOptions().getOpenTelemetryTracer() != null) { } try (Scope queryScope = querySpan != null ? querySpan.makeCurrent() : null) { // If all parameters passed in configuration are supported by the query() method on the - // backend, - // put on fast path - QueryRequestInfo requestInfo = - new QueryRequestInfo(configuration, getOptions().getUseInt64Timestamps()); + // backend, put on fast path + QueryRequestInfo requestInfo = new QueryRequestInfo(configuration, getOptions().getDataFormatOptions()); if (requestInfo.isFastQuerySupported(jobId)) { // Be careful when setting the projectID in JobId, if a projectID is specified in the JobId, // the job created by the query method will use that project. This may cause the query to diff --git a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryOptions.java b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryOptions.java index ed30f9e6f..32fdf88c3 100644 --- a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryOptions.java +++ b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryOptions.java @@ -27,6 +27,7 @@ import com.google.cloud.bigquery.spi.BigQueryRpcFactory; import com.google.cloud.bigquery.spi.v2.HttpBigQueryRpc; import com.google.cloud.http.HttpTransportOptions; +import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableSet; import io.opentelemetry.api.trace.Tracer; import java.util.Set; @@ -72,7 +73,7 @@ public static class Builder extends ServiceOptions.Builder resultRetryAlgorithm; @@ -118,6 +119,7 @@ public Builder setUseInt64Timestamps(boolean useInt64Timestamps) { * @param dataFormatOptions Configuration of the formatting options */ public Builder setDataFormatOptions(DataFormatOptions dataFormatOptions) { + Preconditions.checkNotNull(dataFormatOptions, "DataFormatOptions cannot be null"); this.dataFormatOptions = dataFormatOptions; return this; } @@ -159,7 +161,6 @@ private BigQueryOptions(Builder builder) { super(BigQueryFactory.class, BigQueryRpcFactory.class, builder, new BigQueryDefaults()); this.location = builder.location; this.useInt64Timestamps = builder.useInt64Timestamps; - this.dataFormatOptions = builder.dataFormatOptions; this.enableOpenTelemetryTracing = builder.enableOpenTelemetryTracing; this.openTelemetryTracer = builder.openTelemetryTracer; if (builder.resultRetryAlgorithm != null) { @@ -167,6 +168,15 @@ private BigQueryOptions(Builder builder) { } else { this.resultRetryAlgorithm = BigQueryBaseService.DEFAULT_BIGQUERY_EXCEPTION_HANDLER; } + + // If dataFormatOptions is not set, then create a new instance and set it with the + // useInt64Timestamps configured in BigQueryOptions + if (builder.dataFormatOptions == null) { + this.dataFormatOptions = + DataFormatOptions.newBuilder().useInt64Timestamp(builder.useInt64Timestamps).build(); + } else { + this.dataFormatOptions = builder.dataFormatOptions; + } } private static class BigQueryDefaults implements ServiceDefaults { @@ -215,6 +225,16 @@ public void setThrowNotFound(boolean setThrowNotFound) { this.setThrowNotFound = setThrowNotFound; } + /** + * This setter is marked as Obsolete. Prefer {@link + * Builder#setDataFormatOptions(DataFormatOptions)} to set the int64timestamp configuration + * instead. + * + *

If useInt64Timestamps is set via DataFormatOptions, then that value will be used. + * + *

{@code DataFormatOptions.newBuilder().setUseInt64Timestamp(...).build()} + */ + @ObsoleteApi("Use setDataFormatOptions(DataFormatOptions) instead") public void setUseInt64Timestamps(boolean useInt64Timestamps) { this.useInt64Timestamps = useInt64Timestamps; } @@ -230,6 +250,11 @@ public boolean getThrowNotFound() { return setThrowNotFound; } + /** + * This getter is marked as Obsolete. Prefer {@link #getDataFormatOptions().isUseInt64Timestamp()} + * to set the int64timestamp configuration instead. + */ + @ObsoleteApi("Use getDataFormatOptions().isUseInt64Timestamp() instead") public boolean getUseInt64Timestamps() { return useInt64Timestamps; } diff --git a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/DataFormatOptions.java b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/DataFormatOptions.java index ad3328ff7..e04b46ef0 100644 --- a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/DataFormatOptions.java +++ b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/DataFormatOptions.java @@ -1,10 +1,31 @@ +/* + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.google.cloud.bigquery; +import com.google.auto.value.AutoValue; +import org.jspecify.annotations.Nullable; + +import java.io.Serializable; + /** * Google BigQuery DataFormatOptions. Configures the output format for data types returned from * BigQuery. */ -public class DataFormatOptions { +@AutoValue +public abstract class DataFormatOptions implements Serializable { public enum TimestampFormatOptions { TIMESTAMP_OUTPUT_FORMAT_UNSPECIFIED("TIMESTAMP_OUTPUT_FORMAT_UNSPECIFIED"), FLOAT64("FLOAT64"), @@ -23,76 +44,50 @@ public String toString() { } } - private final boolean useInt64Timestamp; - private final TimestampFormatOptions timestampFormatOptions; - - DataFormatOptions() { - this(new Builder()); - } - - DataFormatOptions(Builder builder) { - this.useInt64Timestamp = builder.useInt64Timestamp; - this.timestampFormatOptions = builder.timestampFormatOptions; - } + public abstract boolean useInt64Timestamp(); - public boolean isUseInt64Timestamp() { - return useInt64Timestamp; - } - - public TimestampFormatOptions getTimestampFormatOptions() { - return timestampFormatOptions; - } + @Nullable + public abstract TimestampFormatOptions timestampFormatOptions(); public static Builder newBuilder() { - return new Builder(); + return new AutoValue_DataFormatOptions.Builder() + .useInt64Timestamp(false); } - public Builder toBuilder() { - return new Builder(this); - } + public abstract Builder toBuilder(); - public static class Builder { - private boolean useInt64Timestamp; - private TimestampFormatOptions timestampFormatOptions = - TimestampFormatOptions.TIMESTAMP_OUTPUT_FORMAT_UNSPECIFIED; + @AutoValue.Builder + public abstract static class Builder { + public abstract Builder useInt64Timestamp(boolean useInt64Timestamp); - public Builder() {} + public abstract Builder timestampFormatOptions(TimestampFormatOptions timestampFormatOptions); - public Builder(DataFormatOptions dataFormatOptions) { - this.useInt64Timestamp = dataFormatOptions.useInt64Timestamp; - this.timestampFormatOptions = dataFormatOptions.timestampFormatOptions; - } + abstract TimestampFormatOptions timestampFormatOptions(); - public Builder setUseInt64Timestamp(boolean useInt64Timestamp) { - this.useInt64Timestamp = useInt64Timestamp; - return this; - } - - public Builder setTimestampFormatOptions(TimestampFormatOptions timestampFormatOptions) { - this.timestampFormatOptions = timestampFormatOptions; - return this; - } + abstract DataFormatOptions autoBuild(); public DataFormatOptions build() { - return new DataFormatOptions(this); + if (timestampFormatOptions() == null) { + timestampFormatOptions(TimestampFormatOptions.TIMESTAMP_OUTPUT_FORMAT_UNSPECIFIED); + } + return autoBuild(); } } com.google.api.services.bigquery.model.DataFormatOptions toPb() { com.google.api.services.bigquery.model.DataFormatOptions request = new com.google.api.services.bigquery.model.DataFormatOptions(); - request.setUseInt64Timestamp(useInt64Timestamp); - if (timestampFormatOptions != null) { - request.setTimestampOutputFormat(timestampFormatOptions.toString()); + request.setUseInt64Timestamp(useInt64Timestamp()); + if (timestampFormatOptions() != null) { + request.setTimestampOutputFormat(timestampFormatOptions().toString()); } return request; } DataFormatOptions fromPb(com.google.api.services.bigquery.model.DataFormatOptions request) { - return new Builder() - .setUseInt64Timestamp(request.getUseInt64Timestamp()) - .setTimestampFormatOptions( - TimestampFormatOptions.valueOf(request.getTimestampOutputFormat())) + return new AutoValue_DataFormatOptions.Builder() + .useInt64Timestamp(request.getUseInt64Timestamp()) + .timestampFormatOptions(TimestampFormatOptions.valueOf(request.getTimestampOutputFormat())) .build(); } } diff --git a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/QueryRequestInfo.java b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/QueryRequestInfo.java index 588b7cae8..c7033817c 100644 --- a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/QueryRequestInfo.java +++ b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/QueryRequestInfo.java @@ -46,7 +46,8 @@ final class QueryRequestInfo { private final DataFormatOptions formatOptions; private final String reservation; - QueryRequestInfo(QueryJobConfiguration config, Boolean useInt64Timestamps) { + QueryRequestInfo( + QueryJobConfiguration config, com.google.cloud.bigquery.DataFormatOptions dataFormatOptions) { this.config = config; this.connectionProperties = config.getConnectionProperties(); this.defaultDataset = config.getDefaultDataset(); @@ -61,7 +62,7 @@ final class QueryRequestInfo { this.useLegacySql = config.useLegacySql(); this.useQueryCache = config.useQueryCache(); this.jobCreationMode = config.getJobCreationMode(); - this.formatOptions = new DataFormatOptions().setUseInt64Timestamp(useInt64Timestamps); + this.formatOptions = dataFormatOptions.toPb(); this.reservation = config.getReservation(); } diff --git a/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/QueryRequestInfoTest.java b/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/QueryRequestInfoTest.java index ed9effe0b..4ff620df0 100644 --- a/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/QueryRequestInfoTest.java +++ b/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/QueryRequestInfoTest.java @@ -140,7 +140,8 @@ public class QueryRequestInfoTest { .setJobCreationMode(jobCreationModeRequired) .setReservation(RESERVATION) .build(); - QueryRequestInfo REQUEST_INFO = new QueryRequestInfo(QUERY_JOB_CONFIGURATION, false); + QueryRequestInfo REQUEST_INFO = + new QueryRequestInfo(QUERY_JOB_CONFIGURATION, DataFormatOptions.newBuilder().build()); private static final QueryJobConfiguration QUERY_JOB_CONFIGURATION_SUPPORTED = QueryJobConfiguration.newBuilder(QUERY) .setUseQueryCache(USE_QUERY_CACHE) @@ -156,7 +157,8 @@ public class QueryRequestInfoTest { .setReservation(RESERVATION) .build(); QueryRequestInfo REQUEST_INFO_SUPPORTED = - new QueryRequestInfo(QUERY_JOB_CONFIGURATION_SUPPORTED, false); + new QueryRequestInfo( + QUERY_JOB_CONFIGURATION_SUPPORTED, DataFormatOptions.newBuilder().build()); @Test public void testIsFastQuerySupported() { @@ -177,17 +179,23 @@ public void testToPb() { @Test public void equalTo() { compareQueryRequestInfo( - new QueryRequestInfo(QUERY_JOB_CONFIGURATION_SUPPORTED, false), REQUEST_INFO_SUPPORTED); - compareQueryRequestInfo(new QueryRequestInfo(QUERY_JOB_CONFIGURATION, false), REQUEST_INFO); + new QueryRequestInfo( + QUERY_JOB_CONFIGURATION_SUPPORTED, DataFormatOptions.newBuilder().build()), + REQUEST_INFO_SUPPORTED); + compareQueryRequestInfo( + new QueryRequestInfo(QUERY_JOB_CONFIGURATION, DataFormatOptions.newBuilder().build()), + REQUEST_INFO); } @Test public void testInt64Timestamp() { - QueryRequestInfo requestInfo = new QueryRequestInfo(QUERY_JOB_CONFIGURATION, false); + QueryRequestInfo requestInfo = + new QueryRequestInfo(QUERY_JOB_CONFIGURATION, DataFormatOptions.newBuilder().build()); QueryRequest requestPb = requestInfo.toPb(); assertFalse(requestPb.getFormatOptions().getUseInt64Timestamp()); - QueryRequestInfo requestInfoLosslessTs = new QueryRequestInfo(QUERY_JOB_CONFIGURATION, true); + QueryRequestInfo requestInfoLosslessTs = + new QueryRequestInfo(QUERY_JOB_CONFIGURATION, DataFormatOptions.newBuilder().useInt64Timestamp(true).build()); QueryRequest requestLosslessTsPb = requestInfoLosslessTs.toPb(); assertTrue(requestLosslessTsPb.getFormatOptions().getUseInt64Timestamp()); } From cfc0b2636cc05cfbe0e80c65388f98b435c82f95 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Wed, 3 Dec 2025 18:40:10 -0500 Subject: [PATCH 4/8] chore: Fix lint issues --- .../google/cloud/bigquery/BigQueryImpl.java | 3 ++- .../cloud/bigquery/BigQueryOptions.java | 8 +++++--- .../cloud/bigquery/DataFormatOptions.java | 19 +++++++++++-------- .../cloud/bigquery/QueryRequestInfoTest.java | 4 +++- 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryImpl.java b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryImpl.java index 0392fc95a..16c4a3e29 100644 --- a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryImpl.java +++ b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryImpl.java @@ -2067,7 +2067,8 @@ && getOptions().getOpenTelemetryTracer() != null) { try (Scope queryScope = querySpan != null ? querySpan.makeCurrent() : null) { // If all parameters passed in configuration are supported by the query() method on the // backend, put on fast path - QueryRequestInfo requestInfo = new QueryRequestInfo(configuration, getOptions().getDataFormatOptions()); + QueryRequestInfo requestInfo = + new QueryRequestInfo(configuration, getOptions().getDataFormatOptions()); if (requestInfo.isFastQuerySupported(jobId)) { // Be careful when setting the projectID in JobId, if a projectID is specified in the JobId, // the job created by the query method will use that project. This may cause the query to diff --git a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryOptions.java b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryOptions.java index 32fdf88c3..6943970c5 100644 --- a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryOptions.java +++ b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryOptions.java @@ -230,7 +230,8 @@ public void setThrowNotFound(boolean setThrowNotFound) { * Builder#setDataFormatOptions(DataFormatOptions)} to set the int64timestamp configuration * instead. * - *

If useInt64Timestamps is set via DataFormatOptions, then that value will be used. + *

If useInt64Timestamps is set via DataFormatOptions, then that value in DataFormatOptions + * will be used. * *

{@code DataFormatOptions.newBuilder().setUseInt64Timestamp(...).build()} */ @@ -251,8 +252,9 @@ public boolean getThrowNotFound() { } /** - * This getter is marked as Obsolete. Prefer {@link #getDataFormatOptions().isUseInt64Timestamp()} - * to set the int64timestamp configuration instead. + * This getter is marked as Obsolete. Prefer {@link + * DataFormatOptions.Builder#useInt64Timestamp(boolean)} to set the int64timestamp configuration + * instead. */ @ObsoleteApi("Use getDataFormatOptions().isUseInt64Timestamp() instead") public boolean getUseInt64Timestamps() { diff --git a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/DataFormatOptions.java b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/DataFormatOptions.java index e04b46ef0..18fb618e1 100644 --- a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/DataFormatOptions.java +++ b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/DataFormatOptions.java @@ -16,9 +16,8 @@ package com.google.cloud.bigquery; import com.google.auto.value.AutoValue; -import org.jspecify.annotations.Nullable; - import java.io.Serializable; +import javax.annotation.Nullable; /** * Google BigQuery DataFormatOptions. Configures the output format for data types returned from @@ -50,8 +49,7 @@ public String toString() { public abstract TimestampFormatOptions timestampFormatOptions(); public static Builder newBuilder() { - return new AutoValue_DataFormatOptions.Builder() - .useInt64Timestamp(false); + return new AutoValue_DataFormatOptions.Builder().useInt64Timestamp(false); } public abstract Builder toBuilder(); @@ -85,9 +83,14 @@ com.google.api.services.bigquery.model.DataFormatOptions toPb() { } DataFormatOptions fromPb(com.google.api.services.bigquery.model.DataFormatOptions request) { - return new AutoValue_DataFormatOptions.Builder() - .useInt64Timestamp(request.getUseInt64Timestamp()) - .timestampFormatOptions(TimestampFormatOptions.valueOf(request.getTimestampOutputFormat())) - .build(); + AutoValue_DataFormatOptions.Builder builder = new AutoValue_DataFormatOptions.Builder(); + if (request.getUseInt64Timestamp() != null) { + builder.useInt64Timestamp(request.getUseInt64Timestamp()); + } + if (request.getTimestampOutputFormat() != null) { + builder.timestampFormatOptions( + TimestampFormatOptions.valueOf(request.getTimestampOutputFormat())); + } + return builder.build(); } } diff --git a/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/QueryRequestInfoTest.java b/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/QueryRequestInfoTest.java index 4ff620df0..866134677 100644 --- a/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/QueryRequestInfoTest.java +++ b/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/QueryRequestInfoTest.java @@ -195,7 +195,9 @@ public void testInt64Timestamp() { assertFalse(requestPb.getFormatOptions().getUseInt64Timestamp()); QueryRequestInfo requestInfoLosslessTs = - new QueryRequestInfo(QUERY_JOB_CONFIGURATION, DataFormatOptions.newBuilder().useInt64Timestamp(true).build()); + new QueryRequestInfo( + QUERY_JOB_CONFIGURATION, + DataFormatOptions.newBuilder().useInt64Timestamp(true).build()); QueryRequest requestLosslessTsPb = requestInfoLosslessTs.toPb(); assertTrue(requestLosslessTsPb.getFormatOptions().getUseInt64Timestamp()); } From dd4e58f02b677afe225f0d768c89e3f4a416a6fa Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Wed, 3 Dec 2025 19:08:15 -0500 Subject: [PATCH 5/8] chore: Address PR feedback --- .../cloud/bigquery/BigQueryOptions.java | 10 ++++++--- .../cloud/bigquery/DataFormatOptions.java | 22 ++++++------------- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryOptions.java b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryOptions.java index 6943970c5..1f0269da8 100644 --- a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryOptions.java +++ b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryOptions.java @@ -230,10 +230,10 @@ public void setThrowNotFound(boolean setThrowNotFound) { * Builder#setDataFormatOptions(DataFormatOptions)} to set the int64timestamp configuration * instead. * - *

If useInt64Timestamps is set via DataFormatOptions, then that value in DataFormatOptions - * will be used. + *

If useInt64Timestamps is set via DataFormatOptions, then the value in DataFormatOptions will + * be used. Otherwise, this value will be passed to DataFormatOptions. * - *

{@code DataFormatOptions.newBuilder().setUseInt64Timestamp(...).build()} + *

Alternative: {@code DataFormatOptions.newBuilder().setUseInt64Timestamp(...).build()} */ @ObsoleteApi("Use setDataFormatOptions(DataFormatOptions) instead") public void setUseInt64Timestamps(boolean useInt64Timestamps) { @@ -255,6 +255,10 @@ public boolean getThrowNotFound() { * This getter is marked as Obsolete. Prefer {@link * DataFormatOptions.Builder#useInt64Timestamp(boolean)} to set the int64timestamp configuration * instead. + * + *

Warning: DataFormatOptions values have precedence. Use {@link + * DataFormatOptions#useInt64Timestamp()} to get `useInt64Timestamp` value used by the BigQuery + * client. */ @ObsoleteApi("Use getDataFormatOptions().isUseInt64Timestamp() instead") public boolean getUseInt64Timestamps() { diff --git a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/DataFormatOptions.java b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/DataFormatOptions.java index 18fb618e1..63fc23e80 100644 --- a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/DataFormatOptions.java +++ b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/DataFormatOptions.java @@ -17,7 +17,6 @@ import com.google.auto.value.AutoValue; import java.io.Serializable; -import javax.annotation.Nullable; /** * Google BigQuery DataFormatOptions. Configures the output format for data types returned from @@ -45,11 +44,12 @@ public String toString() { public abstract boolean useInt64Timestamp(); - @Nullable public abstract TimestampFormatOptions timestampFormatOptions(); public static Builder newBuilder() { - return new AutoValue_DataFormatOptions.Builder().useInt64Timestamp(false); + return new AutoValue_DataFormatOptions.Builder() + .useInt64Timestamp(false) + .timestampFormatOptions(TimestampFormatOptions.TIMESTAMP_OUTPUT_FORMAT_UNSPECIFIED); } public abstract Builder toBuilder(); @@ -62,27 +62,19 @@ public abstract static class Builder { abstract TimestampFormatOptions timestampFormatOptions(); - abstract DataFormatOptions autoBuild(); - - public DataFormatOptions build() { - if (timestampFormatOptions() == null) { - timestampFormatOptions(TimestampFormatOptions.TIMESTAMP_OUTPUT_FORMAT_UNSPECIFIED); - } - return autoBuild(); - } + public abstract DataFormatOptions build(); } com.google.api.services.bigquery.model.DataFormatOptions toPb() { com.google.api.services.bigquery.model.DataFormatOptions request = new com.google.api.services.bigquery.model.DataFormatOptions(); request.setUseInt64Timestamp(useInt64Timestamp()); - if (timestampFormatOptions() != null) { - request.setTimestampOutputFormat(timestampFormatOptions().toString()); - } + request.setTimestampOutputFormat(timestampFormatOptions().toString()); return request; } - DataFormatOptions fromPb(com.google.api.services.bigquery.model.DataFormatOptions request) { + static DataFormatOptions fromPb( + com.google.api.services.bigquery.model.DataFormatOptions request) { AutoValue_DataFormatOptions.Builder builder = new AutoValue_DataFormatOptions.Builder(); if (request.getUseInt64Timestamp() != null) { builder.useInt64Timestamp(request.getUseInt64Timestamp()); From 65e0927bccfa8946cbb8393ba324e74fbed2dc2d Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Thu, 4 Dec 2025 18:51:01 -0500 Subject: [PATCH 6/8] chore: Add tests for useInt64Timestamp behavior --- .../google/cloud/bigquery/BigQueryImpl.java | 13 +++-- .../cloud/bigquery/BigQueryOptions.java | 10 ++-- .../cloud/bigquery/BigQueryOptionsTest.java | 53 +++++++++++++++++++ .../cloud/bigquery/it/ITBigQueryTest.java | 8 ++- 4 files changed, 76 insertions(+), 8 deletions(-) diff --git a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryImpl.java b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryImpl.java index 16c4a3e29..c057cdaca 100644 --- a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryImpl.java +++ b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryImpl.java @@ -1731,7 +1731,10 @@ public TableDataList call() throws IOException { new PageImpl<>( new TableDataPageFetcher(tableId, schema, serviceOptions, cursor, pageOptionMap), cursor, - transformTableData(result.getRows(), schema, serviceOptions.getUseInt64Timestamps())), + transformTableData( + result.getRows(), + schema, + serviceOptions.getDataFormatOptions().useInt64Timestamp())), result.getTotalRows()); } catch (BigQueryRetryHelperException e) { throw BigQueryException.translateAndThrow(e); @@ -2007,7 +2010,9 @@ public com.google.api.services.bigquery.model.QueryResponse call() new QueryPageFetcher(jobId, schema, getOptions(), cursor, optionMap(options)), cursor, transformTableData( - results.getRows(), schema, getOptions().getUseInt64Timestamps()))) + results.getRows(), + schema, + getOptions().getDataFormatOptions().useInt64Timestamp()))) .setJobId(jobId) .setQueryId(results.getQueryId()) .build(); @@ -2021,7 +2026,9 @@ public com.google.api.services.bigquery.model.QueryResponse call() new TableDataPageFetcher(null, schema, getOptions(), null, optionMap(options)), null, transformTableData( - results.getRows(), schema, getOptions().getUseInt64Timestamps()))) + results.getRows(), + schema, + getOptions().getDataFormatOptions().useInt64Timestamp()))) // Return the JobID of the successful job .setJobId( results.getJobReference() != null ? JobId.fromPb(results.getJobReference()) : null) diff --git a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryOptions.java b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryOptions.java index 1f0269da8..10ae77930 100644 --- a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryOptions.java +++ b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryOptions.java @@ -43,7 +43,7 @@ public class BigQueryOptions extends ServiceOptions { // set the option ThrowNotFound when you want to throw the exception when the value not found private boolean setThrowNotFound; private boolean useInt64Timestamps; - private final DataFormatOptions dataFormatOptions; + private DataFormatOptions dataFormatOptions; private JobCreationMode defaultJobCreationMode = JobCreationMode.JOB_CREATION_MODE_UNSPECIFIED; private boolean enableOpenTelemetryTracing; private Tracer openTelemetryTracer; @@ -235,9 +235,13 @@ public void setThrowNotFound(boolean setThrowNotFound) { * *

Alternative: {@code DataFormatOptions.newBuilder().setUseInt64Timestamp(...).build()} */ - @ObsoleteApi("Use setDataFormatOptions(DataFormatOptions) instead") + @ObsoleteApi("Use Builder#setDataFormatOptions(DataFormatOptions) instead") public void setUseInt64Timestamps(boolean useInt64Timestamps) { this.useInt64Timestamps = useInt64Timestamps; + // Because this setter exists outside the Builder, DataFormatOptions needs be rebuilt to + // account for this setting. + this.dataFormatOptions = + dataFormatOptions.toBuilder().useInt64Timestamp(useInt64Timestamps).build(); } @Deprecated @@ -262,7 +266,7 @@ public boolean getThrowNotFound() { */ @ObsoleteApi("Use getDataFormatOptions().isUseInt64Timestamp() instead") public boolean getUseInt64Timestamps() { - return useInt64Timestamps; + return dataFormatOptions.useInt64Timestamp(); } public DataFormatOptions getDataFormatOptions() { diff --git a/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/BigQueryOptionsTest.java b/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/BigQueryOptionsTest.java index 4176ec24d..99a49b58e 100644 --- a/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/BigQueryOptionsTest.java +++ b/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/BigQueryOptionsTest.java @@ -16,6 +16,11 @@ package com.google.cloud.bigquery; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + import com.google.cloud.TransportOptions; import org.junit.Assert; import org.junit.Test; @@ -35,4 +40,52 @@ public void testInvalidTransport() { Assert.assertNotNull(expected.getMessage()); } } + + @Test + public void dataFormatOptions_createdByDefault() { + BigQueryOptions options = BigQueryOptions.newBuilder().build(); + + assertNotNull(options.getDataFormatOptions()); + assertFalse(options.getDataFormatOptions().useInt64Timestamp()); + assertEquals( + DataFormatOptions.TimestampFormatOptions.TIMESTAMP_OUTPUT_FORMAT_UNSPECIFIED, + options.getDataFormatOptions().timestampFormatOptions()); + } + + @Test + public void nonBuilderSetUseInt64Timestamp_capturedInDataFormatOptions() { + BigQueryOptions options = + BigQueryOptions.newBuilder() + .setDataFormatOptions(DataFormatOptions.newBuilder().useInt64Timestamp(false).build()) + .build(); + options.setUseInt64Timestamps(true); + + assertTrue(options.getDataFormatOptions().useInt64Timestamp()); + } + + @Test + public void nonBuilderSetUseInt64Timestamp_overridesEverything() { + BigQueryOptions options = BigQueryOptions.newBuilder().build(); + options.setUseInt64Timestamps(true); + + assertTrue(options.getDataFormatOptions().useInt64Timestamp()); + } + + @Test + public void noDataFormatOptions_capturesUseInt64TimestampSetInBuilder() { + BigQueryOptions options = BigQueryOptions.newBuilder().setUseInt64Timestamps(true).build(); + + assertTrue(options.getDataFormatOptions().useInt64Timestamp()); + } + + @Test + public void dataFormatOptionsSetterHasPrecedence() { + BigQueryOptions options = + BigQueryOptions.newBuilder() + .setDataFormatOptions(DataFormatOptions.newBuilder().useInt64Timestamp(true).build()) + .setUseInt64Timestamps(false) + .build(); + + assertTrue(options.getDataFormatOptions().useInt64Timestamp()); + } } diff --git a/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/it/ITBigQueryTest.java b/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/it/ITBigQueryTest.java index ec1f7b5a0..268199869 100644 --- a/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/it/ITBigQueryTest.java +++ b/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/it/ITBigQueryTest.java @@ -71,6 +71,7 @@ import com.google.cloud.bigquery.ConnectionSettings; import com.google.cloud.bigquery.CopyJobConfiguration; import com.google.cloud.bigquery.CsvOptions; +import com.google.cloud.bigquery.DataFormatOptions; import com.google.cloud.bigquery.Dataset; import com.google.cloud.bigquery.DatasetId; import com.google.cloud.bigquery.DatasetInfo; @@ -3462,8 +3463,11 @@ public void testLosslessTimestamp() throws InterruptedException { // Create new BQ object to toggle lossless timestamps without affecting // other tests. RemoteBigQueryHelper bigqueryHelper = RemoteBigQueryHelper.create(); - BigQuery bigqueryLossless = bigqueryHelper.getOptions().getService(); - bigqueryLossless.getOptions().setUseInt64Timestamps(true); + DataFormatOptions dataFormatOptions = + DataFormatOptions.newBuilder().useInt64Timestamp(true).build(); + BigQueryOptions options = + bigqueryHelper.getOptions().toBuilder().setDataFormatOptions(dataFormatOptions).build(); + BigQuery bigqueryLossless = options.getService(); TableResult resultLossless = bigqueryLossless.query( From ad4128c14e2e323803f552d27515816ab8ff0812 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Thu, 4 Dec 2025 18:59:56 -0500 Subject: [PATCH 7/8] chore: Address failing tests and GCA --- .../com/google/cloud/bigquery/DataFormatOptions.java | 4 +--- .../com/google/cloud/bigquery/BigQueryOptionsTest.java | 9 ++++++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/DataFormatOptions.java b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/DataFormatOptions.java index 63fc23e80..6960aef4a 100644 --- a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/DataFormatOptions.java +++ b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/DataFormatOptions.java @@ -60,8 +60,6 @@ public abstract static class Builder { public abstract Builder timestampFormatOptions(TimestampFormatOptions timestampFormatOptions); - abstract TimestampFormatOptions timestampFormatOptions(); - public abstract DataFormatOptions build(); } @@ -75,7 +73,7 @@ com.google.api.services.bigquery.model.DataFormatOptions toPb() { static DataFormatOptions fromPb( com.google.api.services.bigquery.model.DataFormatOptions request) { - AutoValue_DataFormatOptions.Builder builder = new AutoValue_DataFormatOptions.Builder(); + DataFormatOptions.Builder builder = newBuilder(); if (request.getUseInt64Timestamp() != null) { builder.useInt64Timestamp(request.getUseInt64Timestamp()); } diff --git a/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/BigQueryOptionsTest.java b/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/BigQueryOptionsTest.java index 99a49b58e..e77d7936a 100644 --- a/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/BigQueryOptionsTest.java +++ b/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/BigQueryOptionsTest.java @@ -43,7 +43,7 @@ public void testInvalidTransport() { @Test public void dataFormatOptions_createdByDefault() { - BigQueryOptions options = BigQueryOptions.newBuilder().build(); + BigQueryOptions options = BigQueryOptions.newBuilder().setProjectId("project-id").build(); assertNotNull(options.getDataFormatOptions()); assertFalse(options.getDataFormatOptions().useInt64Timestamp()); @@ -57,6 +57,7 @@ public void nonBuilderSetUseInt64Timestamp_capturedInDataFormatOptions() { BigQueryOptions options = BigQueryOptions.newBuilder() .setDataFormatOptions(DataFormatOptions.newBuilder().useInt64Timestamp(false).build()) + .setProjectId("project-id") .build(); options.setUseInt64Timestamps(true); @@ -65,7 +66,7 @@ public void nonBuilderSetUseInt64Timestamp_capturedInDataFormatOptions() { @Test public void nonBuilderSetUseInt64Timestamp_overridesEverything() { - BigQueryOptions options = BigQueryOptions.newBuilder().build(); + BigQueryOptions options = BigQueryOptions.newBuilder().setProjectId("project-id").build(); options.setUseInt64Timestamps(true); assertTrue(options.getDataFormatOptions().useInt64Timestamp()); @@ -73,7 +74,8 @@ public void nonBuilderSetUseInt64Timestamp_overridesEverything() { @Test public void noDataFormatOptions_capturesUseInt64TimestampSetInBuilder() { - BigQueryOptions options = BigQueryOptions.newBuilder().setUseInt64Timestamps(true).build(); + BigQueryOptions options = + BigQueryOptions.newBuilder().setUseInt64Timestamps(true).setProjectId("project-id").build(); assertTrue(options.getDataFormatOptions().useInt64Timestamp()); } @@ -82,6 +84,7 @@ public void noDataFormatOptions_capturesUseInt64TimestampSetInBuilder() { public void dataFormatOptionsSetterHasPrecedence() { BigQueryOptions options = BigQueryOptions.newBuilder() + .setProjectId("project-id") .setDataFormatOptions(DataFormatOptions.newBuilder().useInt64Timestamp(true).build()) .setUseInt64Timestamps(false) .build(); From 0affa6d61f37ee42dbc0ef15aeff51a8f0950a25 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Fri, 5 Dec 2025 15:36:49 -0500 Subject: [PATCH 8/8] chore: Remove unused fromPb method --- .../google/cloud/bigquery/DataFormatOptions.java | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/DataFormatOptions.java b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/DataFormatOptions.java index 6960aef4a..beaadf32c 100644 --- a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/DataFormatOptions.java +++ b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/DataFormatOptions.java @@ -70,17 +70,4 @@ com.google.api.services.bigquery.model.DataFormatOptions toPb() { request.setTimestampOutputFormat(timestampFormatOptions().toString()); return request; } - - static DataFormatOptions fromPb( - com.google.api.services.bigquery.model.DataFormatOptions request) { - DataFormatOptions.Builder builder = newBuilder(); - if (request.getUseInt64Timestamp() != null) { - builder.useInt64Timestamp(request.getUseInt64Timestamp()); - } - if (request.getTimestampOutputFormat() != null) { - builder.timestampFormatOptions( - TimestampFormatOptions.valueOf(request.getTimestampOutputFormat())); - } - return builder.build(); - } }