From 799d47d99c85fb581d9aea4f9fa1887fe903b1f1 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Mon, 2 Mar 2026 11:07:52 -0500 Subject: [PATCH 1/8] chore: Fix short query tests --- .../google/cloud/bigquery/BigQueryImpl.java | 10 ++++ .../cloud/bigquery/JobCreationReason.java | 46 +++++++++++++++++++ .../google/cloud/bigquery/TableResult.java | 6 +++ .../cloud/bigquery/it/ITBigQueryTest.java | 37 ++++++++++----- 4 files changed, 87 insertions(+), 12 deletions(-) create mode 100644 google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/JobCreationReason.java 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 c057cdaca6..2b1c87c466 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 @@ -2015,6 +2015,11 @@ public com.google.api.services.bigquery.model.QueryResponse call() getOptions().getDataFormatOptions().useInt64Timestamp()))) .setJobId(jobId) .setQueryId(results.getQueryId()) + // Possibly set if the JobCreationMode is set to `JOB_CREATION_OPTIONAL` + .setJobCreationReason( + results.getJobCreationReason() != null + ? JobCreationReason.fromValue(results.getJobCreationReason().getCode()) + : null) .build(); } // only 1 page of result @@ -2033,6 +2038,11 @@ public com.google.api.services.bigquery.model.QueryResponse call() .setJobId( results.getJobReference() != null ? JobId.fromPb(results.getJobReference()) : null) .setQueryId(results.getQueryId()) + // Possibly set if the JobCreationMode is set to `JOB_CREATION_OPTIONAL` + .setJobCreationReason( + results.getJobCreationReason() != null + ? JobCreationReason.fromValue(results.getJobCreationReason().getCode()) + : null) .build(); } diff --git a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/JobCreationReason.java b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/JobCreationReason.java new file mode 100644 index 0000000000..bfb7f4ee78 --- /dev/null +++ b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/JobCreationReason.java @@ -0,0 +1,46 @@ +/* + * Copyright 2026 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; + +/** + * Enum that maps to JobCreationReason + * when used with {@link + * com.google.cloud.bigquery.QueryJobConfiguration.JobCreationMode#JOB_CREATION_OPTIONAL}. + * + *

Indicates the high level reason why a job was created. + */ +public enum JobCreationReason { + REQUESTED("REQUESTED"), + LONG_RUNNING("LONG_RUNNING"), + LARGE_RESULTS("LARGE_RESULTS"), + OTHER("OTHER"); + + private final String reason; + + JobCreationReason(String reason) { + this.reason = reason; + } + + static JobCreationReason fromValue(String reason) { + for (JobCreationReason authType : values()) { + if (authType.reason.equals(reason)) { + return authType; + } + } + throw new IllegalStateException("Invalid JobCreationReason: " + reason); + } +} diff --git a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/TableResult.java b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/TableResult.java index 42044596bd..a7aa6ba9de 100644 --- a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/TableResult.java +++ b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/TableResult.java @@ -47,6 +47,8 @@ public abstract static class Builder { public abstract TableResult.Builder setQueryId(String queryId); + public abstract TableResult.Builder setJobCreationReason(JobCreationReason jobCreationReason); + /** Creates a @code TableResult} object. */ public abstract TableResult build(); } @@ -76,6 +78,9 @@ public static Builder newBuilder() { @Nullable public abstract String getQueryId(); + @Nullable + public abstract JobCreationReason getJobCreationReason(); + @Override public boolean hasNextPage() { return getPageNoSchema().hasNextPage(); @@ -94,6 +99,7 @@ public TableResult getNextPage() { .setTotalRows(getTotalRows()) .setPageNoSchema(getPageNoSchema().getNextPage()) .setQueryId(getQueryId()) + .setJobCreationReason(getJobCreationReason()) .build(); } return null; 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 e6f403c5d0..b99d25e420 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 @@ -23,6 +23,7 @@ import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; @@ -93,6 +94,7 @@ import com.google.cloud.bigquery.InsertAllResponse; import com.google.cloud.bigquery.Job; import com.google.cloud.bigquery.JobConfiguration; +import com.google.cloud.bigquery.JobCreationReason; import com.google.cloud.bigquery.JobId; import com.google.cloud.bigquery.JobInfo; import com.google.cloud.bigquery.JobStatistics; @@ -1077,7 +1079,7 @@ static void beforeClass() throws InterruptedException, IOException { .addSpanProcessor(SimpleSpanProcessor.create(new TestSpanExporter())) .setSampler(Sampler.alwaysOn()) .build(); - otel = OpenTelemetrySdk.builder().setTracerProvider(tracerProvider).buildAndRegisterGlobal(); + otel = OpenTelemetrySdk.builder().setTracerProvider(tracerProvider).build(); bigquery = bigqueryHelper.getOptions().getService(); storage = storageHelper.getOptions().getService(); @@ -7308,14 +7310,16 @@ void testTableResultJobIdAndQueryId() throws InterruptedException { String query = "SELECT 1 as one"; QueryJobConfiguration configStateless = QueryJobConfiguration.newBuilder(query).build(); TableResult result = bigQuery.query(configStateless); - // A stateless query should result in either a queryId (stateless success) or a jobId (fallback - // to a job). - // Exactly one of them should be non-null. - // Ideally Stateless query will return queryId but in some cases it would return jobId instead - // of queryId based on the query complexity or other factors (job timeout configs). - assertTrue( - (result.getJobId() != null) ^ (result.getQueryId() != null), - "Exactly one of jobId or queryId should be non-null"); + // This should trigger a stateless query due to the query simplicity. However, BQ's engine + // may configure this to be a job due a variety of factors. The QueryID is autopopulated and + // may also return a JobId if changed to a job. For the query above, the Job Creation Reason + // would always be `OTHER` as it is not request, a large result, or due to a timeout. + assertNotNull(result.getQueryId()); + if (result.getJobCreationReason() != null) { + assertNotNull(result.getJobId()); + assertEquals(result.getQueryId(), result.getJobId().getJob()); + assertEquals(JobCreationReason.OTHER, result.getJobCreationReason()); + } // Test scenario 2 by failing stateless check by setting job timeout. QueryJobConfiguration configQueryWithJob = @@ -7408,9 +7412,18 @@ void testQueryWithTimeout() throws InterruptedException { // Stateless query returns TableResult QueryJobConfiguration config = QueryJobConfiguration.newBuilder(query).build(); Object result = bigQuery.queryWithTimeout(config, null, null); - assertTrue(result instanceof TableResult); - assertNull(((TableResult) result).getJobId()); - assertNotNull(((TableResult) result).getQueryId()); + assertInstanceOf(TableResult.class, result); + // This should trigger a stateless query due to the query simplicity. However, BQ's engine + // may configure this to be a job due a variety of factors. The QueryID is autopopulated and + // may also return a JobId if changed to a Job. For the query above, the Job Creation Reason + // would always be `OTHER` as it is not request, a large result, or due to a timeout. + TableResult tableResult = (TableResult) result; + assertNotNull(tableResult.getQueryId()); + if (tableResult.getJobCreationReason() != null) { + assertNotNull(tableResult.getJobId()); + assertEquals(tableResult.getQueryId(), tableResult.getJobId().getJob()); + assertEquals(JobCreationReason.OTHER, tableResult.getJobCreationReason()); + } // Stateful query returns Job // Test scenario 2 to ensure job is created if JobCreationMode is set, but for a small query From b79443a4aa00772f4a6f4bd935b6ac0a4913a126 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Mon, 2 Mar 2026 11:36:54 -0500 Subject: [PATCH 2/8] chore: Use global otel instance for test --- .../test/java/com/google/cloud/bigquery/it/ITBigQueryTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 b99d25e420..7431fede5e 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 @@ -1079,7 +1079,7 @@ static void beforeClass() throws InterruptedException, IOException { .addSpanProcessor(SimpleSpanProcessor.create(new TestSpanExporter())) .setSampler(Sampler.alwaysOn()) .build(); - otel = OpenTelemetrySdk.builder().setTracerProvider(tracerProvider).build(); + otel = OpenTelemetrySdk.builder().setTracerProvider(tracerProvider).buildAndRegisterGlobal(); bigquery = bigqueryHelper.getOptions().getService(); storage = storageHelper.getOptions().getService(); From 0e63de1a76cfc9b7c501fa1e2e88ae119ff32bfa Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Mon, 2 Mar 2026 15:09:08 -0500 Subject: [PATCH 3/8] chore: Refactor to account for null and invalid server mappings --- .../google/cloud/bigquery/BigQueryImpl.java | 12 +---- .../cloud/bigquery/JobCreationReason.java | 52 ++++++++++++++----- .../cloud/bigquery/it/ITBigQueryTest.java | 4 +- 3 files changed, 42 insertions(+), 26 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 2b1c87c466..320daa03a2 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 @@ -2015,11 +2015,7 @@ public com.google.api.services.bigquery.model.QueryResponse call() getOptions().getDataFormatOptions().useInt64Timestamp()))) .setJobId(jobId) .setQueryId(results.getQueryId()) - // Possibly set if the JobCreationMode is set to `JOB_CREATION_OPTIONAL` - .setJobCreationReason( - results.getJobCreationReason() != null - ? JobCreationReason.fromValue(results.getJobCreationReason().getCode()) - : null) + .setJobCreationReason(JobCreationReason.fromPb(results.getJobCreationReason())) .build(); } // only 1 page of result @@ -2038,11 +2034,7 @@ public com.google.api.services.bigquery.model.QueryResponse call() .setJobId( results.getJobReference() != null ? JobId.fromPb(results.getJobReference()) : null) .setQueryId(results.getQueryId()) - // Possibly set if the JobCreationMode is set to `JOB_CREATION_OPTIONAL` - .setJobCreationReason( - results.getJobCreationReason() != null - ? JobCreationReason.fromValue(results.getJobCreationReason().getCode()) - : null) + .setJobCreationReason(JobCreationReason.fromPb(results.getJobCreationReason())) .build(); } diff --git a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/JobCreationReason.java b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/JobCreationReason.java index bfb7f4ee78..4235ca246a 100644 --- a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/JobCreationReason.java +++ b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/JobCreationReason.java @@ -15,6 +15,8 @@ */ package com.google.cloud.bigquery; +import javax.annotation.Nullable; + /** * Enum that maps to JobCreationReason @@ -23,24 +25,46 @@ * *

Indicates the high level reason why a job was created. */ -public enum JobCreationReason { - REQUESTED("REQUESTED"), - LONG_RUNNING("LONG_RUNNING"), - LARGE_RESULTS("LARGE_RESULTS"), - OTHER("OTHER"); +public class JobCreationReason { - private final String reason; + public enum Code { + REQUESTED("REQUESTED"), + LONG_RUNNING("LONG_RUNNING"), + LARGE_RESULTS("LARGE_RESULTS"), + OTHER("OTHER"); - JobCreationReason(String reason) { - this.reason = reason; - } + private final String reason; + + Code(String reason) { + this.reason = reason; + } - static JobCreationReason fromValue(String reason) { - for (JobCreationReason authType : values()) { - if (authType.reason.equals(reason)) { - return authType; + /** Maps the server code to BQ code. Returns {@code null} if the mapping does not exist. */ + static Code fromValue(String reason) { + for (JobCreationReason.Code code : Code.values()) { + if (code.reason.equals(reason)) { + return code; + } } + return null; } - throw new IllegalStateException("Invalid JobCreationReason: " + reason); + } + + @Nullable private final Code code; + + JobCreationReason(Code code) { + this.code = code; + } + + static JobCreationReason fromPb( + com.google.api.services.bigquery.model.JobCreationReason jobCreationReason) { + return new JobCreationReason(Code.fromValue(jobCreationReason.getCode())); + } + + /** + * @return JobCreationReason code or {@code null} if mapping does not exist. + */ + public Code getCode() { + return code; } } 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 1658c9614e..39d7ed2a0d 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 @@ -7326,7 +7326,7 @@ void testTableResultJobIdAndQueryId() throws InterruptedException { if (result.getJobCreationReason() != null) { assertNotNull(result.getJobId()); assertEquals(result.getQueryId(), result.getJobId().getJob()); - assertEquals(JobCreationReason.OTHER, result.getJobCreationReason()); + assertEquals(JobCreationReason.Code.OTHER, result.getJobCreationReason().getCode()); } // Test scenario 2 by failing stateless check by setting job timeout. @@ -7430,7 +7430,7 @@ void testQueryWithTimeout() throws InterruptedException { if (tableResult.getJobCreationReason() != null) { assertNotNull(tableResult.getJobId()); assertEquals(tableResult.getQueryId(), tableResult.getJobId().getJob()); - assertEquals(JobCreationReason.OTHER, tableResult.getJobCreationReason()); + assertEquals(JobCreationReason.Code.OTHER, tableResult.getJobCreationReason().getCode()); } // Stateful query returns Job From 31e7556de1d02e7f787cbc4839f674525b89edfb Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Mon, 2 Mar 2026 15:18:29 -0500 Subject: [PATCH 4/8] chore: Default to UNKNOWN enum --- .../com/google/cloud/bigquery/JobCreationReason.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/JobCreationReason.java b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/JobCreationReason.java index 4235ca246a..72f1eb874f 100644 --- a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/JobCreationReason.java +++ b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/JobCreationReason.java @@ -31,7 +31,8 @@ public enum Code { REQUESTED("REQUESTED"), LONG_RUNNING("LONG_RUNNING"), LARGE_RESULTS("LARGE_RESULTS"), - OTHER("OTHER"); + OTHER("OTHER"), + UNKNOWN("UNKNOWN"); private final String reason; @@ -39,14 +40,16 @@ public enum Code { this.reason = reason; } - /** Maps the server code to BQ code. Returns {@code null} if the mapping does not exist. */ + /** + * Maps the server code to BQ code. Returns {@link Code#UNKNOWN} if the mapping does not exist. + */ static Code fromValue(String reason) { for (JobCreationReason.Code code : Code.values()) { if (code.reason.equals(reason)) { return code; } } - return null; + return UNKNOWN; } } @@ -62,7 +65,7 @@ static JobCreationReason fromPb( } /** - * @return JobCreationReason code or {@code null} if mapping does not exist. + * @return JobCreationReason code or {@link Code#UNKNOWN} if mapping does not exist. */ public Code getCode() { return code; From 06740ce4ec7acbc27af57a2e3d8b561e88543cf8 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Mon, 2 Mar 2026 15:22:15 -0500 Subject: [PATCH 5/8] chore: Fix nullable annotations --- .../main/java/com/google/cloud/bigquery/JobCreationReason.java | 2 +- .../src/main/java/com/google/cloud/bigquery/TableResult.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/JobCreationReason.java b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/JobCreationReason.java index 72f1eb874f..a580a60f92 100644 --- a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/JobCreationReason.java +++ b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/JobCreationReason.java @@ -43,7 +43,7 @@ public enum Code { /** * Maps the server code to BQ code. Returns {@link Code#UNKNOWN} if the mapping does not exist. */ - static Code fromValue(String reason) { + static Code fromValue(@Nullable String reason) { for (JobCreationReason.Code code : Code.values()) { if (code.reason.equals(reason)) { return code; diff --git a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/TableResult.java b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/TableResult.java index a7aa6ba9de..8e96e64158 100644 --- a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/TableResult.java +++ b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/TableResult.java @@ -78,7 +78,6 @@ public static Builder newBuilder() { @Nullable public abstract String getQueryId(); - @Nullable public abstract JobCreationReason getJobCreationReason(); @Override From 92a29ab80526223fe4da0f39c42725746b433c20 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Mon, 2 Mar 2026 15:27:13 -0500 Subject: [PATCH 6/8] chore: Update class comment --- .../java/com/google/cloud/bigquery/JobCreationReason.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/JobCreationReason.java b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/JobCreationReason.java index a580a60f92..16aa2bcda1 100644 --- a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/JobCreationReason.java +++ b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/JobCreationReason.java @@ -18,12 +18,13 @@ import javax.annotation.Nullable; /** - * Enum that maps to JobCreationReason * when used with {@link * com.google.cloud.bigquery.QueryJobConfiguration.JobCreationMode#JOB_CREATION_OPTIONAL}. * - *

Indicates the high level reason why a job was created. + *

The code indicates the high level reason why a job was created. The default is `UNKNOWN` if + * there is no mapping found between the server response and the client library. */ public class JobCreationReason { From 9ce59342f72226bd6e43e7907e5590fb3139d989 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Mon, 2 Mar 2026 16:20:36 -0500 Subject: [PATCH 7/8] chore: Move test into the correct package --- .../{ => com/google/cloud/bigquery}/MetadataCacheStatsTest.java | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename google-cloud-bigquery/src/test/java/{ => com/google/cloud/bigquery}/MetadataCacheStatsTest.java (100%) diff --git a/google-cloud-bigquery/src/test/java/MetadataCacheStatsTest.java b/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/MetadataCacheStatsTest.java similarity index 100% rename from google-cloud-bigquery/src/test/java/MetadataCacheStatsTest.java rename to google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/MetadataCacheStatsTest.java From 65c86584ee22e8815ffa2adc33ac1dd8a0580427 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Mon, 2 Mar 2026 16:33:54 -0500 Subject: [PATCH 8/8] chore: Fix test issues --- .../java/com/google/cloud/bigquery/JobCreationReason.java | 6 ++++++ .../main/java/com/google/cloud/bigquery/TableResult.java | 1 + 2 files changed, 7 insertions(+) diff --git a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/JobCreationReason.java b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/JobCreationReason.java index 16aa2bcda1..296c5cc049 100644 --- a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/JobCreationReason.java +++ b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/JobCreationReason.java @@ -62,6 +62,12 @@ static Code fromValue(@Nullable String reason) { static JobCreationReason fromPb( com.google.api.services.bigquery.model.JobCreationReason jobCreationReason) { + // JobCreationReason may be null if the JobCreationMode is specified to be Optional + // Note: JobCreationMode.Optional may also end up creating a job depending on the + // query complexity and other factors. + if (jobCreationReason == null) { + return null; + } return new JobCreationReason(Code.fromValue(jobCreationReason.getCode())); } diff --git a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/TableResult.java b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/TableResult.java index 8e96e64158..a7aa6ba9de 100644 --- a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/TableResult.java +++ b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/TableResult.java @@ -78,6 +78,7 @@ public static Builder newBuilder() { @Nullable public abstract String getQueryId(); + @Nullable public abstract JobCreationReason getJobCreationReason(); @Override