2121import com .google .api .services .bigquery .model .JobConfigurationQuery ;
2222import com .google .cloud .bigquery .JobInfo .CreateDisposition ;
2323import com .google .cloud .bigquery .JobInfo .WriteDisposition ;
24+ import com .google .cloud .bigquery .JobInfo .SchemaUpdateOption ;
2425import com .google .common .base .MoreObjects .ToStringHelper ;
2526import com .google .common .collect .ImmutableList ;
2627import com .google .common .collect .ImmutableMap ;
@@ -52,6 +53,7 @@ public final class QueryJobConfiguration extends JobConfiguration {
5253 private final Boolean flattenResults ;
5354 private final Boolean dryRun ;
5455 private final Boolean useLegacySql ;
56+ private final List <SchemaUpdateOption > schemaUpdateOptions ;
5557
5658 /**
5759 * Priority levels for a query. If not specified the priority is assumed to be
@@ -89,6 +91,7 @@ public static final class Builder
8991 private Boolean flattenResults ;
9092 private Boolean dryRun ;
9193 private Boolean useLegacySql ;
94+ private List <SchemaUpdateOption > schemaUpdateOptions ;
9295
9396 private Builder () {
9497 super (Type .QUERY );
@@ -109,6 +112,7 @@ private Builder(QueryJobConfiguration jobConfiguration) {
109112 this .flattenResults = jobConfiguration .flattenResults ;
110113 this .dryRun = jobConfiguration .dryRun ;
111114 this .useLegacySql = jobConfiguration .useLegacySql ;
115+ this .schemaUpdateOptions = jobConfiguration .schemaUpdateOptions ;
112116 }
113117
114118 private Builder (com .google .api .services .bigquery .model .JobConfiguration configurationPb ) {
@@ -146,6 +150,13 @@ private Builder(com.google.api.services.bigquery.model.JobConfiguration configur
146150 writeDisposition =
147151 WriteDisposition .valueOf (queryConfigurationPb .getWriteDisposition ());
148152 }
153+ if (queryConfigurationPb .getSchemaUpdateOptions () != null ) {
154+ ImmutableList .Builder <JobInfo .SchemaUpdateOption > schemaUpdateOptionsBuilder = new ImmutableList .Builder <>();
155+ for (String rawSchemaUpdateOption : queryConfigurationPb .getSchemaUpdateOptions ()) {
156+ schemaUpdateOptionsBuilder .add (JobInfo .SchemaUpdateOption .valueOf (rawSchemaUpdateOption ));
157+ }
158+ this .schemaUpdateOptions = schemaUpdateOptionsBuilder .build ();
159+ }
149160 }
150161
151162
@@ -325,6 +336,18 @@ public Builder setUseLegacySql(Boolean useLegacySql) {
325336 return this ;
326337 }
327338
339+
340+ /**
341+ * [Experimental] Sets options allowing the schema of the destination table to be updated as a side effect of the
342+ * query job. Schema update options are supported in two cases: when writeDisposition is WRITE_APPEND; when
343+ * writeDisposition is WRITE_TRUNCATE and the destination table is a partition of a table, specified by partition
344+ * decorators. For normal tables, WRITE_TRUNCATE will always overwrite the schema.
345+ */
346+ public Builder setSchemaUpdateOptions (List <SchemaUpdateOption > schemaUpdateOptions ) {
347+ this .schemaUpdateOptions = schemaUpdateOptions ;
348+ return this ;
349+ }
350+
328351 public QueryJobConfiguration build () {
329352 return new QueryJobConfiguration (this );
330353 }
@@ -346,6 +369,7 @@ private QueryJobConfiguration(Builder builder) {
346369 builder .tableDefinitions != null ? ImmutableMap .copyOf (builder .tableDefinitions ) : null ;
347370 this .dryRun = builder .dryRun ;
348371 this .useLegacySql = builder .useLegacySql ;
372+ this .schemaUpdateOptions = builder .schemaUpdateOptions ;
349373 }
350374
351375 /**
@@ -479,6 +503,16 @@ public Boolean useLegacySql() {
479503 return useLegacySql ;
480504 }
481505
506+ /**
507+ * [Experimental] Returns options allowing the schema of the destination table to be updated as a side effect of the
508+ * query job. Schema update options are supported in two cases: when writeDisposition is WRITE_APPEND; when
509+ * writeDisposition is WRITE_TRUNCATE and the destination table is a partition of a table, specified by partition
510+ * decorators. For normal tables, WRITE_TRUNCATE will always overwrite the schema.
511+ */
512+ public List <SchemaUpdateOption > getSchemaUpdateOptions () {
513+ return schemaUpdateOptions ;
514+ }
515+
482516 @ Override
483517 public Builder toBuilder () {
484518 return new Builder (this );
@@ -499,7 +533,8 @@ ToStringHelper toStringHelper() {
499533 .add ("createDisposition" , createDisposition )
500534 .add ("writeDisposition" , writeDisposition )
501535 .add ("dryRun" , dryRun )
502- .add ("useLegacySql" , useLegacySql );
536+ .add ("useLegacySql" , useLegacySql )
537+ .add ("schemaUpdateOptions" , schemaUpdateOptions );
503538 }
504539
505540 @ Override
@@ -513,7 +548,7 @@ public boolean equals(Object obj) {
513548 public int hashCode () {
514549 return Objects .hash (baseHashCode (), allowLargeResults , createDisposition , destinationTable ,
515550 defaultDataset , flattenResults , priority , query , tableDefinitions , useQueryCache ,
516- userDefinedFunctions , writeDisposition , dryRun , useLegacySql );
551+ userDefinedFunctions , writeDisposition , dryRun , useLegacySql , schemaUpdateOptions );
517552 }
518553
519554 @ Override
@@ -570,6 +605,13 @@ com.google.api.services.bigquery.model.JobConfiguration toPb() {
570605 if (useLegacySql != null ) {
571606 queryConfigurationPb .setUseLegacySql (useLegacySql );
572607 }
608+ if (schemaUpdateOptions != null ) {
609+ ImmutableList .Builder <String > schemaUpdateOptionsBuilder = new ImmutableList .Builder <>();
610+ for (JobInfo .SchemaUpdateOption schemaUpdateOption : schemaUpdateOptions ) {
611+ schemaUpdateOptionsBuilder .add (schemaUpdateOption .name ());
612+ }
613+ queryConfigurationPb .setSchemaUpdateOptions (schemaUpdateOptionsBuilder .build ());
614+ }
573615 return configurationPb .setQuery (queryConfigurationPb );
574616 }
575617
0 commit comments