Skip to content

Commit 4bf9d80

Browse files
authored
bigquery: Job.getQueryResults returns QueryResult (googleapis#2593)
This is the first step in removing QueryResponse. This PR first creates QueryResult then retrieves the Response. Eventually, we'll directly create Result from tabledata.list RPC.
1 parent 8259a78 commit 4bf9d80

File tree

10 files changed

+105
-149
lines changed

10 files changed

+105
-149
lines changed

google-cloud-bigquery/src/benchmark/java/com/google/cloud/bigquery/benchmark/Benchmark.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public static void main(String[] args) throws Exception {
5959
int rows = 0;
6060
int cols = 0;
6161
Duration firstByte = null;
62-
for (List<FieldValue> row : job.getQueryResults().getResult().iterateAll()) {
62+
for (List<FieldValue> row : job.getQueryResults().iterateAll()) {
6363
rows++;
6464
if (cols == 0) {
6565
cols = row.size();

google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQuery.java

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -988,10 +988,9 @@ Page<FieldValueList> listTableData(String datasetId, String tableId,
988988
*/
989989
boolean cancel(JobId jobId);
990990

991-
// TODO(pongad): rewrite query() samples.
992-
993991
/**
994-
* Runs the query associated with the request, using an internally-generated random JobId. The returned job is always completed.
992+
* Runs the query associated with the request, using an internally-generated random JobId. The
993+
* returned job is always completed.
995994
*
996995
* <p>Example of running a query.
997996
*
@@ -1004,12 +1003,11 @@ Page<FieldValueList> listTableData(String datasetId, String tableId,
10041003
* // QueryJobConfiguration queryConfig =
10051004
* // QueryJobConfiguration.newBuilder(query).setUseLegacySql(true).build();
10061005
*
1007-
* QueryResponse response = bigquery.query(queryConfig);
1008-
* if (response.hasErrors()) {
1006+
* Job job = bigquery.query(queryConfig);
1007+
* if (job.getStatus().getError() != null) {
10091008
* // handle errors
10101009
* }
1011-
* QueryResult result = response.getResult();
1012-
* for (FieldValueList row : result.iterateAll()) {
1010+
* for (FieldValueList row : job.getQueryResults().iterateAll()) {
10131011
* // do something with the data
10141012
* }
10151013
* }</pre>
@@ -1022,12 +1020,11 @@ Page<FieldValueList> listTableData(String datasetId, String tableId,
10221020
* QueryJobConfiguration queryConfig = QueryJobConfiguration.newBuilder(query)
10231021
* .addPositionalParameter(QueryParameterValue.int64(5))
10241022
* .build();
1025-
* QueryResponse response = bigquery.query(queryConfig);
1026-
* if (response.hasErrors()) {
1023+
* Job job = bigquery.query(queryConfig);
1024+
* if (job.getStatus().getError() != null) {
10271025
* // handle errors
10281026
* }
1029-
* QueryResult result = response.getResult();
1030-
* for (FieldValueList row : result.iterateAll()) {
1027+
* for (FieldValueList row : job.getQueryResults().iterateAll()) {
10311028
* // do something with the data
10321029
* }
10331030
* }</pre>

google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/Job.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import com.google.cloud.RetryHelper;
2525
import com.google.cloud.RetryOption;
2626
import com.google.cloud.bigquery.BigQuery.JobOption;
27-
2827
import com.google.cloud.bigquery.BigQuery.QueryResultsOption;
2928
import com.google.cloud.bigquery.JobConfiguration.Type;
3029
import java.io.IOException;
@@ -247,11 +246,12 @@ public Job waitFor(RetryOption... waitOptions) throws InterruptedException {
247246
/**
248247
* Gets the query results of this job. This job must be of type {@code
249248
* JobConfiguration.Type.QUERY}, otherwise this method will throw {@link
250-
* UnsupportedOperationException}. This method does not wait for the job to complete, to ensure that the job is completed first call {@link #waitFor(RetryOption...)} method.
249+
* UnsupportedOperationException}. This method does not wait for the job to complete, to ensure
250+
* that the job is completed first call {@link #waitFor(RetryOption...)} method.
251251
*
252252
* <p>Example of getting the results of a query job.
253-
* <pre>{@code
254253
*
254+
* <pre>{@code
255255
* Job job = bigquery.create(queryJobInfo);
256256
* job.waitFor();
257257
* QueryResponse response = job.getQueryResults();
@@ -263,13 +263,18 @@ public Job waitFor(RetryOption... waitOptions) throws InterruptedException {
263263
*
264264
* @throws BigQueryException upon failure
265265
*/
266-
public QueryResponse getQueryResults(QueryResultsOption... options) {
266+
public QueryResult getQueryResults(QueryResultsOption... options) {
267267
if (getConfiguration().getType() != Type.QUERY) {
268268
throw new UnsupportedOperationException(
269269
"Getting query results is supported only for " + Type.QUERY + " jobs");
270270
}
271271

272-
return bigquery.getQueryResults(getJobId(), options);
272+
// TODO(pongad): check job stats.state instead.
273+
QueryResponse response = bigquery.getQueryResults(getJobId(), options);
274+
if (!response.jobCompleted()) {
275+
throw new IllegalStateException("the job hasn't completed yet");
276+
}
277+
return response.getResult();
273278
}
274279

275280
QueryResponse waitForQueryResults(

google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/BigQueryImplTest.java

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1147,22 +1147,17 @@ public void testQueryRequestCompleted() throws InterruptedException {
11471147

11481148
EasyMock.replay(bigqueryRpcMock);
11491149
bigquery = options.getService();
1150-
QueryResponse response =
1150+
QueryResult result =
11511151
bigquery
11521152
.query(QUERY_JOB_CONFIGURATION_FOR_QUERY, queryJob)
11531153
.getQueryResults(QueryResultsOption.pageSize(42L));
1154-
assertNull(response.getEtag());
1155-
assertEquals(queryJob, response.getJobId());
1156-
assertEquals(true, response.jobCompleted());
1157-
assertEquals(ImmutableList.<BigQueryError>of(), response.getExecutionErrors());
1158-
assertFalse(response.hasErrors());
1159-
assertEquals(null, response.getResult().getSchema());
1160-
assertEquals(1L, response.getResult().getTotalRows());
1161-
for (FieldValueList row : response.getResult().getValues()) {
1154+
assertEquals(null, result.getSchema());
1155+
assertEquals(1L, result.getTotalRows());
1156+
for (FieldValueList row : result.getValues()) {
11621157
assertEquals(false, row.get(0).getBooleanValue());
11631158
assertEquals(1L, row.get(1).getLongValue());
11641159
}
1165-
assertEquals(CURSOR, response.getResult().getNextPageToken());
1160+
assertEquals(CURSOR, result.getNextPageToken());
11661161
}
11671162

11681163
@Test
@@ -1214,22 +1209,17 @@ public void testQueryRequestCompletedOnSecondAttempt() throws InterruptedExcepti
12141209

12151210
EasyMock.replay(bigqueryRpcMock);
12161211
bigquery = options.getService();
1217-
QueryResponse response =
1212+
QueryResult result =
12181213
bigquery
12191214
.query(QUERY_JOB_CONFIGURATION_FOR_QUERY, queryJob)
12201215
.getQueryResults(QueryResultsOption.pageSize(42L));
1221-
assertNull(response.getEtag());
1222-
assertEquals(queryJob, response.getJobId());
1223-
assertEquals(true, response.jobCompleted());
1224-
assertEquals(ImmutableList.<BigQueryError>of(), response.getExecutionErrors());
1225-
assertFalse(response.hasErrors());
1226-
assertEquals(null, response.getResult().getSchema());
1227-
assertEquals(1L, response.getResult().getTotalRows());
1228-
for (FieldValueList row : response.getResult().getValues()) {
1216+
assertEquals(null, result.getSchema());
1217+
assertEquals(1L, result.getTotalRows());
1218+
for (FieldValueList row : result.getValues()) {
12291219
assertEquals(false, row.get(0).getBooleanValue());
12301220
assertEquals(1L, row.get(1).getLongValue());
12311221
}
1232-
assertEquals(CURSOR, response.getResult().getNextPageToken());
1222+
assertEquals(CURSOR, result.getNextPageToken());
12331223
}
12341224

12351225
@Test

google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/JobTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,11 @@
3232
import com.google.api.core.CurrentMillisClock;
3333
import com.google.cloud.RetryOption;
3434
import com.google.cloud.bigquery.JobStatistics.CopyStatistics;
35-
3635
import com.google.cloud.bigquery.JobStatistics.QueryStatistics;
3736
import org.junit.After;
3837
import org.junit.Rule;
3938
import org.junit.Test;
4039
import org.junit.rules.ExpectedException;
41-
4240
import org.threeten.bp.Duration;
4341

4442
public class JobTest {
@@ -248,7 +246,9 @@ public void testWaitForAndGetQueryResults() throws InterruptedException {
248246
expect(bigquery.getOptions()).andReturn(mockOptions);
249247
expect(mockOptions.getClock()).andReturn(CurrentMillisClock.getDefaultClock());
250248
Job completedJob = expectedJob.toBuilder().setStatus(status).build();
251-
QueryResponse completedQuery = QueryResponse.newBuilder().setJobCompleted(true).build();
249+
QueryResult result = QueryResult.newBuilder().build();
250+
QueryResponse completedQuery =
251+
QueryResponse.newBuilder().setJobCompleted(true).setResult(result).build();
252252

253253
expect(bigquery.getQueryResults(jobInfo.getJobId(), Job.DEFAULT_QUERY_WAIT_OPTIONS)).andReturn(completedQuery);
254254
expect(bigquery.getJob(JOB_INFO.getJobId())).andReturn(completedJob);
@@ -257,7 +257,7 @@ public void testWaitForAndGetQueryResults() throws InterruptedException {
257257
replay(status, bigquery, mockOptions);
258258
initializeJob(jobInfo);
259259
assertSame(completedJob, job.waitFor(TEST_RETRY_OPTIONS));
260-
assertSame(completedQuery, job.getQueryResults());
260+
assertSame(result, job.getQueryResults());
261261
verify(status, mockOptions);
262262
}
263263

google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/it/ITBigQueryTest.java

Lines changed: 24 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
import com.google.cloud.bigquery.LoadJobConfiguration;
5959
import com.google.cloud.bigquery.QueryJobConfiguration;
6060
import com.google.cloud.bigquery.QueryParameterValue;
61-
import com.google.cloud.bigquery.QueryResponse;
61+
import com.google.cloud.bigquery.QueryResult;
6262
import com.google.cloud.bigquery.Schema;
6363
import com.google.cloud.bigquery.StandardTableDefinition;
6464
import com.google.cloud.bigquery.Table;
@@ -427,13 +427,10 @@ public void testCreateExternalTable() throws InterruptedException {
427427
.setDefaultDataset(DatasetId.of(DATASET))
428428
.setUseLegacySql(true)
429429
.build();
430-
QueryResponse response =
431-
bigquery
432-
.query(config)
433-
.getQueryResults();
430+
QueryResult result = bigquery.query(config).getQueryResults();
434431
long integerValue = 0;
435432
int rowCount = 0;
436-
for (FieldValueList row : response.getResult().getValues()) {
433+
for (FieldValueList row : result.getValues()) {
437434
FieldValue timestampCell = row.get(0);
438435
assertEquals(timestampCell, row.get("TimestampField"));
439436
FieldValue stringCell = row.get(1);
@@ -489,12 +486,9 @@ public void testCreateViewTable() throws InterruptedException {
489486
.setDefaultDataset(DatasetId.of(DATASET))
490487
.setUseLegacySql(true)
491488
.build();
492-
QueryResponse response =
493-
bigquery
494-
.query(config)
495-
.getQueryResults(QueryResultsOption.pageSize(1000L));
489+
QueryResult result = bigquery.query(config).getQueryResults(QueryResultsOption.pageSize(1000L));
496490
int rowCount = 0;
497-
for (FieldValueList row : response.getResult().getValues()) {
491+
for (FieldValueList row : result.getValues()) {
498492
FieldValue timestampCell = row.get(0);
499493
assertEquals(timestampCell, row.get("TimestampField"));
500494
FieldValue stringCell = row.get(1);
@@ -779,13 +773,10 @@ public void testQuery() throws InterruptedException {
779773
QueryJobConfiguration config = QueryJobConfiguration.newBuilder(query)
780774
.setDefaultDataset(DatasetId.of(DATASET))
781775
.build();
782-
QueryResponse response =
783-
bigquery
784-
.query(config)
785-
.getQueryResults(QueryResultsOption.pageSize(1000L));
786-
assertEquals(QUERY_RESULT_SCHEMA, response.getResult().getSchema());
776+
QueryResult result = bigquery.query(config).getQueryResults(QueryResultsOption.pageSize(1000L));
777+
assertEquals(QUERY_RESULT_SCHEMA, result.getSchema());
787778
int rowCount = 0;
788-
for (FieldValueList row : response.getResult().getValues()) {
779+
for (FieldValueList row : result.getValues()) {
789780
FieldValue timestampCell = row.get(0);
790781
assertEquals(timestampCell, row.get("TimestampField"));
791782
FieldValue stringCell = row.get(1);
@@ -801,9 +792,11 @@ public void testQuery() throws InterruptedException {
801792
rowCount++;
802793
}
803794
assertEquals(2, rowCount);
804-
Job queryJob = bigquery.getJob(response.getJobId());
805-
JobStatistics.QueryStatistics statistics = queryJob.getStatistics();
806-
assertNotNull(statistics.getQueryPlan());
795+
796+
// TODO(pongad): re-enable this.
797+
// Job queryJob = bigquery.getJob(response.getJobId());
798+
// JobStatistics.QueryStatistics statistics = queryJob.getStatistics();
799+
// assertNotNull(statistics.getQueryPlan());
807800
}
808801

809802
@Test
@@ -831,12 +824,9 @@ public void testPositionalQueryParameters() throws InterruptedException {
831824
.addPositionalParameter(int64Parameter)
832825
.addPositionalParameter(float64Parameter)
833826
.build();
834-
QueryResponse response =
835-
bigquery
836-
.query(config)
837-
.getQueryResults(QueryResultsOption.pageSize(1000L));
838-
assertEquals(QUERY_RESULT_SCHEMA, response.getResult().getSchema());
839-
assertEquals(2, Iterables.size(response.getResult().getValues()));
827+
QueryResult result = bigquery.query(config).getQueryResults(QueryResultsOption.pageSize(1000L));
828+
assertEquals(QUERY_RESULT_SCHEMA, result.getSchema());
829+
assertEquals(2, Iterables.size(result.getValues()));
840830
}
841831

842832
@Test
@@ -854,12 +844,9 @@ public void testNamedQueryParameters() throws InterruptedException {
854844
.addNamedParameter("stringParam", stringParameter)
855845
.addNamedParameter("integerList", intArrayParameter)
856846
.build();
857-
QueryResponse response =
858-
bigquery
859-
.query(config)
860-
.getQueryResults(QueryResultsOption.pageSize(1000L));
861-
assertEquals(QUERY_RESULT_SCHEMA, response.getResult().getSchema());
862-
assertEquals(2, Iterables.size(response.getResult().getValues()));
847+
QueryResult result = bigquery.query(config).getQueryResults(QueryResultsOption.pageSize(1000L));
848+
assertEquals(QUERY_RESULT_SCHEMA, result.getSchema());
849+
assertEquals(2, Iterables.size(result.getValues()));
863850
}
864851

865852
@Test
@@ -871,10 +858,9 @@ public void testBytesParameter() throws Exception {
871858
.setUseLegacySql(false)
872859
.addNamedParameter("p", bytesParameter)
873860
.build();
874-
QueryResponse response =
875-
bigquery.query(config).getQueryResults(QueryResultsOption.pageSize(1000L));
861+
QueryResult result = bigquery.query(config).getQueryResults(QueryResultsOption.pageSize(1000L));
876862
int rowCount = 0;
877-
for (FieldValueList row : response.getResult().getValues()) {
863+
for (FieldValueList row : result.getValues()) {
878864
rowCount++;
879865
assertEquals(2, row.get(0).getLongValue());
880866
assertEquals(2, row.get("length").getLongValue());
@@ -1035,11 +1021,10 @@ public void testQueryJob() throws InterruptedException, TimeoutException {
10351021
remoteJob = remoteJob.waitFor();
10361022
assertNull(remoteJob.getStatus().getError());
10371023

1038-
QueryResponse response = remoteJob.getQueryResults();
1039-
assertFalse(response.hasErrors());
1040-
assertEquals(QUERY_RESULT_SCHEMA, response.getResult().getSchema());
1024+
QueryResult result = remoteJob.getQueryResults();
1025+
assertEquals(QUERY_RESULT_SCHEMA, result.getSchema());
10411026
int rowCount = 0;
1042-
for (FieldValueList row : response.getResult().getValues()) {
1027+
for (FieldValueList row : result.getValues()) {
10431028
FieldValue timestampCell = row.get(0);
10441029
FieldValue stringCell = row.get(1);
10451030
FieldValue booleanCell = row.get(2);

google-cloud-examples/src/main/java/com/google/cloud/examples/bigquery/BigQueryExample.java

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import com.google.cloud.Tuple;
2020
import com.google.cloud.WriteChannel;
2121
import com.google.cloud.bigquery.BigQuery;
22-
import com.google.cloud.bigquery.BigQueryError;
2322
import com.google.cloud.bigquery.BigQueryOptions;
2423
import com.google.cloud.bigquery.CopyJobConfiguration;
2524
import com.google.cloud.bigquery.Dataset;
@@ -36,7 +35,6 @@
3635
import com.google.cloud.bigquery.LegacySQLTypeName;
3736
import com.google.cloud.bigquery.LoadJobConfiguration;
3837
import com.google.cloud.bigquery.QueryJobConfiguration;
39-
import com.google.cloud.bigquery.QueryResponse;
4038
import com.google.cloud.bigquery.Schema;
4139
import com.google.cloud.bigquery.StandardTableDefinition;
4240
import com.google.cloud.bigquery.Table;
@@ -621,17 +619,16 @@ private static class QueryAction extends BigQueryAction<QueryJobConfiguration> {
621619
@Override
622620
void run(BigQuery bigquery, QueryJobConfiguration queryConfig) throws Exception {
623621
System.out.println("Running query");
624-
QueryResponse queryResponse = bigquery.query(queryConfig).getQueryResults();
625-
if (!queryResponse.hasErrors()) {
622+
Job job = bigquery.query(queryConfig).waitFor();
623+
if (job == null) {
624+
System.out.println("job no longer exists");
625+
} else if (job.getStatus().getError() != null) {
626+
System.out.println("query completed with error: " + job.getStatus().getError());
627+
} else {
626628
System.out.println("Query succeeded. Results:");
627-
for (FieldValueList row : queryResponse.getResult().iterateAll()) {
629+
for (FieldValueList row : job.getQueryResults().iterateAll()) {
628630
System.out.println(row);
629631
}
630-
} else {
631-
System.out.println("Query completed with errors. Errors:");
632-
for (BigQueryError err : queryResponse.getExecutionErrors()) {
633-
System.out.println(err);
634-
}
635632
}
636633
}
637634

0 commit comments

Comments
 (0)