Skip to content

Commit 20777d3

Browse files
authored
Add DatastoreBackupOptions class for BigQuery (#1757)
1 parent e2edc3c commit 20777d3

9 files changed

Lines changed: 276 additions & 105 deletions

File tree

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
/*
2+
* Copyright 2017 Google Inc. All Rights Reserved.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.google.cloud.bigquery;
18+
19+
import com.google.common.base.MoreObjects;
20+
import java.util.List;
21+
import java.util.Objects;
22+
23+
/**
24+
* Google BigQuery options for Cloud Datastore backup.
25+
*/
26+
public final class DatastoreBackupOptions extends FormatOptions {
27+
28+
private final List<String> projectionFields;
29+
30+
private static final long serialVersionUID = -5302774763661451947L;
31+
32+
public static final class Builder {
33+
private List<String> projectionFields;
34+
35+
private Builder() {}
36+
37+
private Builder(DatastoreBackupOptions options) {
38+
projectionFields = options.projectionFields;
39+
}
40+
41+
/**
42+
* Sets which entity properties to load into BigQuery from a Cloud Datastore backup. Property
43+
* names are case sensitive and must be top-level properties.
44+
* If no properties are specified, BigQuery loads all properties. If any named property isn't
45+
* found in the Cloud Datastore backup, an invalid error is returned in the job result.
46+
*/
47+
public Builder setProjectionFields(List<String> projectionFields) {
48+
this.projectionFields = projectionFields;
49+
return this;
50+
}
51+
52+
/**
53+
* Creates a {@code DatastoreBackupOptions} object.
54+
*/
55+
public DatastoreBackupOptions build() {
56+
return new DatastoreBackupOptions(this);
57+
}
58+
}
59+
60+
private DatastoreBackupOptions(Builder builder) {
61+
super(FormatOptions.DATASTORE_BACKUP);
62+
this.projectionFields = builder.projectionFields;
63+
}
64+
65+
/**
66+
* Returns the value of which entity properties to load into BigQuery from a Cloud Datastore
67+
* backup.
68+
*/
69+
public List<String> getProjectionFields() {
70+
return projectionFields;
71+
}
72+
73+
/**
74+
* Returns a builder for the {@code DatastoreBackupOptions} object.
75+
*/
76+
public Builder toBuilder() {
77+
return new Builder(this);
78+
}
79+
80+
/**
81+
* Returns a builder for a {@code DatastoreBackupOptions} object.
82+
*/
83+
public static Builder newBuilder() {
84+
return new Builder();
85+
}
86+
87+
@Override
88+
public String toString() {
89+
return MoreObjects.toStringHelper(this)
90+
.add("projectionFields", projectionFields)
91+
.toString();
92+
}
93+
94+
@Override
95+
public int hashCode() {
96+
return Objects.hash(getType(), projectionFields);
97+
}
98+
99+
@Override
100+
public boolean equals(Object obj) {
101+
return obj == this
102+
|| obj instanceof DatastoreBackupOptions
103+
&& Objects.equals(projectionFields, ((DatastoreBackupOptions) obj).getProjectionFields());
104+
}
105+
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ public static FormatOptions json() {
8585
* Default options for DATASTORE_BACKUP format.
8686
*/
8787
public static FormatOptions datastoreBackup() {
88-
return new FormatOptions(DATASTORE_BACKUP);
88+
return DatastoreBackupOptions.newBuilder().build();
8989
}
9090

9191
/**
@@ -101,6 +101,8 @@ public static FormatOptions avro() {
101101
public static FormatOptions of(String format) {
102102
if (checkNotNull(format).equals(CSV)) {
103103
return csv();
104+
} else if (format.equals(DATASTORE_BACKUP)) {
105+
return datastoreBackup();
104106
}
105107
return new FormatOptions(format);
106108
}

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

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -92,16 +92,6 @@ interface Builder {
9292
*/
9393
Builder setIgnoreUnknownValues(Boolean ignoreUnknownValues);
9494

95-
96-
/**
97-
* Sets which entity properties to load into BigQuery from a Cloud Datastore backup. This field
98-
* is only used if the source format is set to {@code DATASTORE_BACKUP}. Property names are case
99-
* sensitive and must be top-level properties. If no properties are specified, BigQuery loads
100-
* all properties. If any named property isn't found in the Cloud Datastore backup, an invalid
101-
* error is returned in the job result.
102-
*/
103-
Builder setProjectionFields(List<String> projectionFields);
104-
10595
LoadConfiguration build();
10696
}
10797

@@ -166,13 +156,9 @@ interface Builder {
166156

167157

168158
/**
169-
* Returns which entity properties to load into BigQuery from a Cloud Datastore backup. This field
170-
* is only used if the source format is set to {@code DATASTORE_BACKUP}. Property names are case
171-
* sensitive and must be top-level properties. If no properties are specified, BigQuery loads
172-
* all properties. If any named property isn't found in the Cloud Datastore backup, an invalid
173-
* error is returned in the job result.
159+
* Returns additional options used to load from a Cloud datastore backup.
174160
*/
175-
List<String> getProjectionFields();
161+
DatastoreBackupOptions getDatastoreBackupOptions();
176162

177163
/**
178164
* Returns a builder for the load configuration object.

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

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ public final class LoadJobConfiguration extends JobConfiguration implements Load
4343
private final Integer maxBadRecords;
4444
private final Schema schema;
4545
private final Boolean ignoreUnknownValues;
46-
private final List<String> projectionFields;
4746

4847
public static final class Builder
4948
extends JobConfiguration.Builder<LoadJobConfiguration, Builder>
@@ -72,7 +71,6 @@ private Builder(LoadJobConfiguration loadConfiguration) {
7271
this.maxBadRecords = loadConfiguration.maxBadRecords;
7372
this.schema = loadConfiguration.schema;
7473
this.ignoreUnknownValues = loadConfiguration.ignoreUnknownValues;
75-
this.projectionFields = loadConfiguration.projectionFields;
7674
this.sourceUris = loadConfiguration.sourceUris;
7775
}
7876

@@ -172,15 +170,6 @@ public Builder setIgnoreUnknownValues(Boolean ignoreUnknownValues) {
172170
return this;
173171
}
174172

175-
176-
@Override
177-
public Builder setProjectionFields(List<String> projectionFields) {
178-
this.projectionFields =
179-
projectionFields != null ? ImmutableList.copyOf(projectionFields) : null;
180-
return this;
181-
}
182-
183-
184173
/**
185174
* Sets the fully-qualified URIs that point to source data in Google Cloud Storage (e.g.
186175
* gs://bucket/path). Each URI can contain one '*' wildcard character and it must come after the
@@ -207,7 +196,6 @@ private LoadJobConfiguration(Builder builder) {
207196
this.maxBadRecords = builder.maxBadRecords;
208197
this.schema = builder.schema;
209198
this.ignoreUnknownValues = builder.ignoreUnknownValues;
210-
this.projectionFields = builder.projectionFields;
211199
}
212200

213201

@@ -234,6 +222,12 @@ public CsvOptions getCsvOptions() {
234222
return formatOptions instanceof CsvOptions ? (CsvOptions) formatOptions : null;
235223
}
236224

225+
@Override
226+
public DatastoreBackupOptions getDatastoreBackupOptions() {
227+
return formatOptions instanceof DatastoreBackupOptions ?
228+
(DatastoreBackupOptions) formatOptions : null;
229+
}
230+
237231

238232
@Override
239233
public String getFormat() {
@@ -257,13 +251,6 @@ public Boolean ignoreUnknownValues() {
257251
return ignoreUnknownValues;
258252
}
259253

260-
261-
@Override
262-
public List<String> getProjectionFields() {
263-
return projectionFields;
264-
}
265-
266-
267254
/**
268255
* Returns the fully-qualified URIs that point to source data in Google Cloud Storage (e.g.
269256
* gs://bucket/path). Each URI can contain one '*' wildcard character and it must come after the
@@ -288,7 +275,6 @@ ToStringHelper toStringHelper() {
288275
.add("maxBadRecords", maxBadRecords)
289276
.add("schema", schema)
290277
.add("ignoreUnknownValue", ignoreUnknownValues)
291-
.add("projectionFields", projectionFields)
292278
.add("sourceUris", sourceUris);
293279
}
294280

@@ -339,7 +325,10 @@ com.google.api.services.bigquery.model.JobConfiguration toPb() {
339325
}
340326
loadConfigurationPb.setMaxBadRecords(maxBadRecords);
341327
loadConfigurationPb.setIgnoreUnknownValues(ignoreUnknownValues);
342-
loadConfigurationPb.setProjectionFields(projectionFields);
328+
if (getDatastoreBackupOptions() != null) {
329+
DatastoreBackupOptions backOptions = getDatastoreBackupOptions();
330+
loadConfigurationPb.setProjectionFields(backOptions.getProjectionFields());
331+
}
343332
if (sourceUris != null) {
344333
loadConfigurationPb.setSourceUris(ImmutableList.copyOf(sourceUris));
345334
}

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

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ public final class WriteChannelConfiguration implements LoadConfiguration, Seria
4545
private final Integer maxBadRecords;
4646
private final Schema schema;
4747
private final Boolean ignoreUnknownValues;
48-
private final List<String> projectionFields;
4948

5049
public static final class Builder implements LoadConfiguration.Builder {
5150

@@ -56,7 +55,6 @@ public static final class Builder implements LoadConfiguration.Builder {
5655
private Integer maxBadRecords;
5756
private Schema schema;
5857
private Boolean ignoreUnknownValues;
59-
private List<String> projectionFields;
6058

6159
private Builder() {}
6260

@@ -68,7 +66,6 @@ private Builder(WriteChannelConfiguration writeChannelConfiguration) {
6866
this.maxBadRecords = writeChannelConfiguration.maxBadRecords;
6967
this.schema = writeChannelConfiguration.schema;
7068
this.ignoreUnknownValues = writeChannelConfiguration.ignoreUnknownValues;
71-
this.projectionFields = writeChannelConfiguration.projectionFields;
7269
}
7370

7471
private Builder(com.google.api.services.bigquery.model.JobConfiguration configurationPb) {
@@ -110,7 +107,11 @@ private Builder(com.google.api.services.bigquery.model.JobConfiguration configur
110107
this.schema = Schema.fromPb(loadConfigurationPb.getSchema());
111108
}
112109
this.ignoreUnknownValues = loadConfigurationPb.getIgnoreUnknownValues();
113-
this.projectionFields = loadConfigurationPb.getProjectionFields();
110+
if (loadConfigurationPb.getProjectionFields() != null) {
111+
this.formatOptions = DatastoreBackupOptions.newBuilder()
112+
.setProjectionFields(loadConfigurationPb.getProjectionFields())
113+
.build();
114+
}
114115
}
115116

116117

@@ -162,14 +163,6 @@ public Builder setIgnoreUnknownValues(Boolean ignoreUnknownValues) {
162163
return this;
163164
}
164165

165-
166-
@Override
167-
public Builder setProjectionFields(List<String> projectionFields) {
168-
this.projectionFields =
169-
projectionFields != null ? ImmutableList.copyOf(projectionFields) : null;
170-
return this;
171-
}
172-
173166
@Override
174167
public WriteChannelConfiguration build() {
175168
return new WriteChannelConfiguration(this);
@@ -184,7 +177,6 @@ protected WriteChannelConfiguration(Builder builder) {
184177
this.maxBadRecords = builder.maxBadRecords;
185178
this.schema = builder.schema;
186179
this.ignoreUnknownValues = builder.ignoreUnknownValues;
187-
this.projectionFields = builder.projectionFields;
188180
}
189181

190182

@@ -236,8 +228,9 @@ public Boolean ignoreUnknownValues() {
236228

237229

238230
@Override
239-
public List<String> getProjectionFields() {
240-
return projectionFields;
231+
public DatastoreBackupOptions getDatastoreBackupOptions() {
232+
return formatOptions instanceof DatastoreBackupOptions ?
233+
(DatastoreBackupOptions) formatOptions : null;
241234
}
242235

243236
@Override
@@ -253,8 +246,7 @@ MoreObjects.ToStringHelper toStringHelper() {
253246
.add("formatOptions", formatOptions)
254247
.add("maxBadRecords", maxBadRecords)
255248
.add("schema", schema)
256-
.add("ignoreUnknownValue", ignoreUnknownValues)
257-
.add("projectionFields", projectionFields);
249+
.add("ignoreUnknownValue", ignoreUnknownValues);
258250
}
259251

260252
@Override
@@ -272,7 +264,7 @@ public boolean equals(Object obj) {
272264
@Override
273265
public int hashCode() {
274266
return Objects.hash(destinationTable, createDisposition, writeDisposition, formatOptions,
275-
maxBadRecords, schema, ignoreUnknownValues, projectionFields);
267+
maxBadRecords, schema, ignoreUnknownValues);
276268
}
277269

278270
WriteChannelConfiguration setProjectId(String projectId) {
@@ -308,7 +300,10 @@ com.google.api.services.bigquery.model.JobConfiguration toPb() {
308300
}
309301
loadConfigurationPb.setMaxBadRecords(maxBadRecords);
310302
loadConfigurationPb.setIgnoreUnknownValues(ignoreUnknownValues);
311-
loadConfigurationPb.setProjectionFields(projectionFields);
303+
if (getDatastoreBackupOptions() != null) {
304+
DatastoreBackupOptions backupOptions = getDatastoreBackupOptions();
305+
loadConfigurationPb.setProjectionFields(backupOptions.getProjectionFields());
306+
}
312307
return new com.google.api.services.bigquery.model.JobConfiguration()
313308
.setLoad(loadConfigurationPb);
314309
}

0 commit comments

Comments
 (0)