diff --git a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/DatastoreBackupOptions.java b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/DatastoreBackupOptions.java new file mode 100644 index 000000000000..c043c9f8f4a9 --- /dev/null +++ b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/DatastoreBackupOptions.java @@ -0,0 +1,105 @@ +/* + * Copyright 2017 Google Inc. All Rights Reserved. + * + * 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.common.base.MoreObjects; +import java.util.List; +import java.util.Objects; + +/** + * Google BigQuery options for Cloud Datastore backup. + */ +public final class DatastoreBackupOptions extends FormatOptions { + + private final List projectionFields; + + private static final long serialVersionUID = -5302774763661451947L; + + public static final class Builder { + private List projectionFields; + + private Builder() {} + + private Builder(DatastoreBackupOptions options) { + projectionFields = options.projectionFields; + } + + /** + * Sets which entity properties to load into BigQuery from a Cloud Datastore backup. Property + * names are case sensitive and must be top-level properties. + * If no properties are specified, BigQuery loads all properties. If any named property isn't + * found in the Cloud Datastore backup, an invalid error is returned in the job result. + */ + public Builder setProjectionFields(List projectionFields) { + this.projectionFields = projectionFields; + return this; + } + + /** + * Creates a {@code DatastoreBackupOptions} object. + */ + public DatastoreBackupOptions build() { + return new DatastoreBackupOptions(this); + } + } + + private DatastoreBackupOptions(Builder builder) { + super(FormatOptions.DATASTORE_BACKUP); + this.projectionFields = builder.projectionFields; + } + + /** + * Returns the value of which entity properties to load into BigQuery from a Cloud Datastore + * backup. + */ + public List getProjectionFields() { + return projectionFields; + } + + /** + * Returns a builder for the {@code DatastoreBackupOptions} object. + */ + public Builder toBuilder() { + return new Builder(this); + } + + /** + * Returns a builder for a {@code DatastoreBackupOptions} object. + */ + public static Builder newBuilder() { + return new Builder(); + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("projectionFields", projectionFields) + .toString(); + } + + @Override + public int hashCode() { + return Objects.hash(getType(), projectionFields); + } + + @Override + public boolean equals(Object obj) { + return obj == this + || obj instanceof DatastoreBackupOptions + && Objects.equals(projectionFields, ((DatastoreBackupOptions) obj).getProjectionFields()); + } +} diff --git a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/FormatOptions.java b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/FormatOptions.java index 9a7cf15ae87a..30edda568027 100644 --- a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/FormatOptions.java +++ b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/FormatOptions.java @@ -85,7 +85,7 @@ public static FormatOptions json() { * Default options for DATASTORE_BACKUP format. */ public static FormatOptions datastoreBackup() { - return new FormatOptions(DATASTORE_BACKUP); + return DatastoreBackupOptions.newBuilder().build(); } /** @@ -101,6 +101,8 @@ public static FormatOptions avro() { public static FormatOptions of(String format) { if (checkNotNull(format).equals(CSV)) { return csv(); + } else if (format.equals(DATASTORE_BACKUP)) { + return datastoreBackup(); } return new FormatOptions(format); } diff --git a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/LoadConfiguration.java b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/LoadConfiguration.java index 4fc3bfdd41e1..340ccd713426 100644 --- a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/LoadConfiguration.java +++ b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/LoadConfiguration.java @@ -92,16 +92,6 @@ interface Builder { */ Builder setIgnoreUnknownValues(Boolean ignoreUnknownValues); - - /** - * Sets which entity properties to load into BigQuery from a Cloud Datastore backup. This field - * is only used if the source format is set to {@code DATASTORE_BACKUP}. Property names are case - * sensitive and must be top-level properties. If no properties are specified, BigQuery loads - * all properties. If any named property isn't found in the Cloud Datastore backup, an invalid - * error is returned in the job result. - */ - Builder setProjectionFields(List projectionFields); - LoadConfiguration build(); } @@ -166,13 +156,9 @@ interface Builder { /** - * Returns which entity properties to load into BigQuery from a Cloud Datastore backup. This field - * is only used if the source format is set to {@code DATASTORE_BACKUP}. Property names are case - * sensitive and must be top-level properties. If no properties are specified, BigQuery loads - * all properties. If any named property isn't found in the Cloud Datastore backup, an invalid - * error is returned in the job result. + * Returns additional options used to load from a Cloud datastore backup. */ - List getProjectionFields(); + DatastoreBackupOptions getDatastoreBackupOptions(); /** * Returns a builder for the load configuration object. diff --git a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/LoadJobConfiguration.java b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/LoadJobConfiguration.java index 39873d4f1b44..6901ce52b224 100644 --- a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/LoadJobConfiguration.java +++ b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/LoadJobConfiguration.java @@ -43,7 +43,6 @@ public final class LoadJobConfiguration extends JobConfiguration implements Load private final Integer maxBadRecords; private final Schema schema; private final Boolean ignoreUnknownValues; - private final List projectionFields; public static final class Builder extends JobConfiguration.Builder @@ -72,7 +71,6 @@ private Builder(LoadJobConfiguration loadConfiguration) { this.maxBadRecords = loadConfiguration.maxBadRecords; this.schema = loadConfiguration.schema; this.ignoreUnknownValues = loadConfiguration.ignoreUnknownValues; - this.projectionFields = loadConfiguration.projectionFields; this.sourceUris = loadConfiguration.sourceUris; } @@ -172,15 +170,6 @@ public Builder setIgnoreUnknownValues(Boolean ignoreUnknownValues) { return this; } - - @Override - public Builder setProjectionFields(List projectionFields) { - this.projectionFields = - projectionFields != null ? ImmutableList.copyOf(projectionFields) : null; - return this; - } - - /** * Sets the fully-qualified URIs that point to source data in Google Cloud Storage (e.g. * gs://bucket/path). Each URI can contain one '*' wildcard character and it must come after the @@ -207,7 +196,6 @@ private LoadJobConfiguration(Builder builder) { this.maxBadRecords = builder.maxBadRecords; this.schema = builder.schema; this.ignoreUnknownValues = builder.ignoreUnknownValues; - this.projectionFields = builder.projectionFields; } @@ -234,6 +222,12 @@ public CsvOptions getCsvOptions() { return formatOptions instanceof CsvOptions ? (CsvOptions) formatOptions : null; } + @Override + public DatastoreBackupOptions getDatastoreBackupOptions() { + return formatOptions instanceof DatastoreBackupOptions ? + (DatastoreBackupOptions) formatOptions : null; + } + @Override public String getFormat() { @@ -257,13 +251,6 @@ public Boolean ignoreUnknownValues() { return ignoreUnknownValues; } - - @Override - public List getProjectionFields() { - return projectionFields; - } - - /** * Returns the fully-qualified URIs that point to source data in Google Cloud Storage (e.g. * gs://bucket/path). Each URI can contain one '*' wildcard character and it must come after the @@ -288,7 +275,6 @@ ToStringHelper toStringHelper() { .add("maxBadRecords", maxBadRecords) .add("schema", schema) .add("ignoreUnknownValue", ignoreUnknownValues) - .add("projectionFields", projectionFields) .add("sourceUris", sourceUris); } @@ -339,7 +325,10 @@ com.google.api.services.bigquery.model.JobConfiguration toPb() { } loadConfigurationPb.setMaxBadRecords(maxBadRecords); loadConfigurationPb.setIgnoreUnknownValues(ignoreUnknownValues); - loadConfigurationPb.setProjectionFields(projectionFields); + if (getDatastoreBackupOptions() != null) { + DatastoreBackupOptions backOptions = getDatastoreBackupOptions(); + loadConfigurationPb.setProjectionFields(backOptions.getProjectionFields()); + } if (sourceUris != null) { loadConfigurationPb.setSourceUris(ImmutableList.copyOf(sourceUris)); } diff --git a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/WriteChannelConfiguration.java b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/WriteChannelConfiguration.java index 24a9c3b3dae6..77bf16429b28 100644 --- a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/WriteChannelConfiguration.java +++ b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/WriteChannelConfiguration.java @@ -45,7 +45,6 @@ public final class WriteChannelConfiguration implements LoadConfiguration, Seria private final Integer maxBadRecords; private final Schema schema; private final Boolean ignoreUnknownValues; - private final List projectionFields; public static final class Builder implements LoadConfiguration.Builder { @@ -56,7 +55,6 @@ public static final class Builder implements LoadConfiguration.Builder { private Integer maxBadRecords; private Schema schema; private Boolean ignoreUnknownValues; - private List projectionFields; private Builder() {} @@ -68,7 +66,6 @@ private Builder(WriteChannelConfiguration writeChannelConfiguration) { this.maxBadRecords = writeChannelConfiguration.maxBadRecords; this.schema = writeChannelConfiguration.schema; this.ignoreUnknownValues = writeChannelConfiguration.ignoreUnknownValues; - this.projectionFields = writeChannelConfiguration.projectionFields; } private Builder(com.google.api.services.bigquery.model.JobConfiguration configurationPb) { @@ -110,7 +107,11 @@ private Builder(com.google.api.services.bigquery.model.JobConfiguration configur this.schema = Schema.fromPb(loadConfigurationPb.getSchema()); } this.ignoreUnknownValues = loadConfigurationPb.getIgnoreUnknownValues(); - this.projectionFields = loadConfigurationPb.getProjectionFields(); + if (loadConfigurationPb.getProjectionFields() != null) { + this.formatOptions = DatastoreBackupOptions.newBuilder() + .setProjectionFields(loadConfigurationPb.getProjectionFields()) + .build(); + } } @@ -162,14 +163,6 @@ public Builder setIgnoreUnknownValues(Boolean ignoreUnknownValues) { return this; } - - @Override - public Builder setProjectionFields(List projectionFields) { - this.projectionFields = - projectionFields != null ? ImmutableList.copyOf(projectionFields) : null; - return this; - } - @Override public WriteChannelConfiguration build() { return new WriteChannelConfiguration(this); @@ -184,7 +177,6 @@ protected WriteChannelConfiguration(Builder builder) { this.maxBadRecords = builder.maxBadRecords; this.schema = builder.schema; this.ignoreUnknownValues = builder.ignoreUnknownValues; - this.projectionFields = builder.projectionFields; } @@ -236,8 +228,9 @@ public Boolean ignoreUnknownValues() { @Override - public List getProjectionFields() { - return projectionFields; + public DatastoreBackupOptions getDatastoreBackupOptions() { + return formatOptions instanceof DatastoreBackupOptions ? + (DatastoreBackupOptions) formatOptions : null; } @Override @@ -253,8 +246,7 @@ MoreObjects.ToStringHelper toStringHelper() { .add("formatOptions", formatOptions) .add("maxBadRecords", maxBadRecords) .add("schema", schema) - .add("ignoreUnknownValue", ignoreUnknownValues) - .add("projectionFields", projectionFields); + .add("ignoreUnknownValue", ignoreUnknownValues); } @Override @@ -272,7 +264,7 @@ public boolean equals(Object obj) { @Override public int hashCode() { return Objects.hash(destinationTable, createDisposition, writeDisposition, formatOptions, - maxBadRecords, schema, ignoreUnknownValues, projectionFields); + maxBadRecords, schema, ignoreUnknownValues); } WriteChannelConfiguration setProjectId(String projectId) { @@ -308,7 +300,10 @@ com.google.api.services.bigquery.model.JobConfiguration toPb() { } loadConfigurationPb.setMaxBadRecords(maxBadRecords); loadConfigurationPb.setIgnoreUnknownValues(ignoreUnknownValues); - loadConfigurationPb.setProjectionFields(projectionFields); + if (getDatastoreBackupOptions() != null) { + DatastoreBackupOptions backupOptions = getDatastoreBackupOptions(); + loadConfigurationPb.setProjectionFields(backupOptions.getProjectionFields()); + } return new com.google.api.services.bigquery.model.JobConfiguration() .setLoad(loadConfigurationPb); } diff --git a/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/DatastoreBackupOptionsTest.java b/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/DatastoreBackupOptionsTest.java new file mode 100644 index 000000000000..cec6eff90936 --- /dev/null +++ b/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/DatastoreBackupOptionsTest.java @@ -0,0 +1,63 @@ +/* + * Copyright 2017 Google Inc. All Rights Reserved. + * + * 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 static org.junit.Assert.assertEquals; + +import com.google.common.collect.ImmutableList; +import org.junit.Test; + +import java.util.List; + +public class DatastoreBackupOptionsTest { + + private static final List PROJECTION_FIELDS = ImmutableList.of("field1", "field2"); + private static final DatastoreBackupOptions BACKUP_OPTIONS = DatastoreBackupOptions.newBuilder() + .setProjectionFields(PROJECTION_FIELDS) + .build(); + + @Test + public void testToBuilder() { + compareDatastoreBackupOptions(BACKUP_OPTIONS, BACKUP_OPTIONS.toBuilder().build()); + List fields = ImmutableList.of("field1", "field2"); + DatastoreBackupOptions backupOptions = BACKUP_OPTIONS.toBuilder() + .setProjectionFields(fields) + .build(); + assertEquals(fields, backupOptions.getProjectionFields()); + backupOptions = backupOptions.toBuilder().setProjectionFields(PROJECTION_FIELDS).build(); + compareDatastoreBackupOptions(BACKUP_OPTIONS, backupOptions); + } + + @Test + public void testToBuilderIncomplete() { + DatastoreBackupOptions backupOptions = + DatastoreBackupOptions.newBuilder().setProjectionFields(PROJECTION_FIELDS).build(); + assertEquals(backupOptions, backupOptions.toBuilder().build()); + } + + @Test + public void testBuilder() { + assertEquals(FormatOptions.DATASTORE_BACKUP, BACKUP_OPTIONS.getType()); + assertEquals(PROJECTION_FIELDS, BACKUP_OPTIONS.getProjectionFields()); + } + + private void compareDatastoreBackupOptions( + DatastoreBackupOptions expected, DatastoreBackupOptions value) { + assertEquals(expected, value); + assertEquals(expected.getProjectionFields(), value.getProjectionFields()); + } +} diff --git a/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/JobInfoTest.java b/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/JobInfoTest.java index 3ea71a2435f1..afedf8763b70 100644 --- a/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/JobInfoTest.java +++ b/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/JobInfoTest.java @@ -132,7 +132,6 @@ public class JobInfoTest { .setFormatOptions(CSV_OPTIONS) .setIgnoreUnknownValues(IGNORE_UNKNOWN_VALUES) .setMaxBadRecords(MAX_BAD_RECORDS) - .setProjectionFields(PROJECTION_FIELDS) .setSchema(TABLE_SCHEMA) .build(); private static final String QUERY = "BigQuery SQL"; diff --git a/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/LoadJobConfigurationTest.java b/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/LoadJobConfigurationTest.java index 28f37d05ebc3..deecdee828bd 100644 --- a/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/LoadJobConfigurationTest.java +++ b/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/LoadJobConfigurationTest.java @@ -40,33 +40,53 @@ public class LoadJobConfigurationTest { private static final Integer MAX_BAD_RECORDS = 42; private static final String FORMAT = "CSV"; private static final Boolean IGNORE_UNKNOWN_VALUES = true; - private static final List PROJECTION_FIELDS = ImmutableList.of("field1", "field2"); private static final Field FIELD_SCHEMA = Field.newBuilder("IntegerField", Field.Type.integer()) .setMode(Field.Mode.REQUIRED) .setDescription("FieldDescription") .build(); private static final List SOURCE_URIS = ImmutableList.of("uri1", "uri2"); private static final Schema TABLE_SCHEMA = Schema.of(FIELD_SCHEMA); - private static final LoadJobConfiguration LOAD_CONFIGURATION = + private static final LoadJobConfiguration LOAD_CONFIGURATION_CSV = LoadJobConfiguration.newBuilder(TABLE_ID, SOURCE_URIS) .setCreateDisposition(CREATE_DISPOSITION) .setWriteDisposition(WRITE_DISPOSITION) .setFormatOptions(CSV_OPTIONS) .setIgnoreUnknownValues(IGNORE_UNKNOWN_VALUES) .setMaxBadRecords(MAX_BAD_RECORDS) - .setProjectionFields(PROJECTION_FIELDS) + .setSchema(TABLE_SCHEMA) + .build(); + private static final DatastoreBackupOptions BACKUP_OPTIONS = DatastoreBackupOptions.newBuilder() + .setProjectionFields(ImmutableList.of("field_1", "field_2")) + .build(); + private static final LoadJobConfiguration LOAD_CONFIGURATION_BACKUP = + LoadJobConfiguration.newBuilder(TABLE_ID, SOURCE_URIS) + .setCreateDisposition(CREATE_DISPOSITION) + .setWriteDisposition(WRITE_DISPOSITION) + .setFormatOptions(BACKUP_OPTIONS) + .setIgnoreUnknownValues(IGNORE_UNKNOWN_VALUES) + .setMaxBadRecords(MAX_BAD_RECORDS) .setSchema(TABLE_SCHEMA) .build(); @Test public void testToBuilder() { - compareLoadJobConfiguration(LOAD_CONFIGURATION, LOAD_CONFIGURATION.toBuilder().build()); - LoadJobConfiguration configuration = LOAD_CONFIGURATION.toBuilder() + compareLoadJobConfiguration( + LOAD_CONFIGURATION_CSV, LOAD_CONFIGURATION_CSV.toBuilder().build()); + LoadJobConfiguration configurationCSV = LOAD_CONFIGURATION_CSV.toBuilder() + .setDestinationTable(TableId.of("dataset", "newTable")) + .build(); + assertEquals("newTable", configurationCSV.getDestinationTable().getTable()); + configurationCSV = configurationCSV.toBuilder().setDestinationTable(TABLE_ID).build(); + compareLoadJobConfiguration(LOAD_CONFIGURATION_CSV, configurationCSV); + + compareLoadJobConfiguration( + LOAD_CONFIGURATION_BACKUP, LOAD_CONFIGURATION_BACKUP.toBuilder().build()); + LoadJobConfiguration configurationBackup = LOAD_CONFIGURATION_BACKUP.toBuilder() .setDestinationTable(TableId.of("dataset", "newTable")) .build(); - assertEquals("newTable", configuration.getDestinationTable().getTable()); - configuration = configuration.toBuilder().setDestinationTable(TABLE_ID).build(); - compareLoadJobConfiguration(LOAD_CONFIGURATION, configuration); + assertEquals("newTable", configurationBackup.getDestinationTable().getTable()); + configurationBackup = configurationBackup.toBuilder().setDestinationTable(TABLE_ID).build(); + compareLoadJobConfiguration(LOAD_CONFIGURATION_BACKUP, configurationBackup); } @Test @@ -97,21 +117,21 @@ public void testToBuilderIncomplete() { @Test public void testToPbAndFromPb() { - compareLoadJobConfiguration(LOAD_CONFIGURATION, - LoadJobConfiguration.fromPb(LOAD_CONFIGURATION.toPb())); + compareLoadJobConfiguration(LOAD_CONFIGURATION_CSV, + LoadJobConfiguration.fromPb(LOAD_CONFIGURATION_CSV.toPb())); LoadJobConfiguration configuration = LoadJobConfiguration.of(TABLE_ID, SOURCE_URIS); compareLoadJobConfiguration(configuration, LoadJobConfiguration.fromPb(configuration.toPb())); } @Test public void testSetProjectId() { - LoadConfiguration configuration = LOAD_CONFIGURATION.setProjectId("p"); + LoadConfiguration configuration = LOAD_CONFIGURATION_CSV.setProjectId("p"); assertEquals("p", configuration.getDestinationTable().getProject()); } @Test public void testGetType() { - assertEquals(JobConfiguration.Type.LOAD, LOAD_CONFIGURATION.getType()); + assertEquals(JobConfiguration.Type.LOAD, LOAD_CONFIGURATION_CSV.getType()); } private void compareLoadJobConfiguration(LoadJobConfiguration expected, @@ -126,7 +146,7 @@ private void compareLoadJobConfiguration(LoadJobConfiguration expected, assertEquals(expected.getFormat(), value.getFormat()); assertEquals(expected.ignoreUnknownValues(), value.ignoreUnknownValues()); assertEquals(expected.getMaxBadRecords(), value.getMaxBadRecords()); - assertEquals(expected.getProjectionFields(), value.getProjectionFields()); assertEquals(expected.getSchema(), value.getSchema()); + assertEquals(expected.getDatastoreBackupOptions(), value.getDatastoreBackupOptions()); } } diff --git a/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/WriteChannelConfigurationTest.java b/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/WriteChannelConfigurationTest.java index f72fc5f0d856..588fa1cd170c 100644 --- a/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/WriteChannelConfigurationTest.java +++ b/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/WriteChannelConfigurationTest.java @@ -26,7 +26,6 @@ import org.junit.Test; import java.nio.charset.StandardCharsets; -import java.util.List; public class WriteChannelConfigurationTest { @@ -41,32 +40,43 @@ public class WriteChannelConfigurationTest { private static final Integer MAX_BAD_RECORDS = 42; private static final String FORMAT = "CSV"; private static final Boolean IGNORE_UNKNOWN_VALUES = true; - private static final List PROJECTION_FIELDS = ImmutableList.of("field1", "field2"); private static final Field FIELD_SCHEMA = Field.newBuilder("IntegerField", Field.Type.integer()) .setMode(Field.Mode.REQUIRED) .setDescription("FieldDescription") .build(); private static final Schema TABLE_SCHEMA = Schema.of(FIELD_SCHEMA); - private static final WriteChannelConfiguration LOAD_CONFIGURATION = + private static final WriteChannelConfiguration LOAD_CONFIGURATION_CSV = WriteChannelConfiguration.newBuilder(TABLE_ID) .setCreateDisposition(CREATE_DISPOSITION) .setWriteDisposition(WRITE_DISPOSITION) .setFormatOptions(CSV_OPTIONS) .setIgnoreUnknownValues(IGNORE_UNKNOWN_VALUES) .setMaxBadRecords(MAX_BAD_RECORDS) - .setProjectionFields(PROJECTION_FIELDS) + .setSchema(TABLE_SCHEMA) + .build(); + + private static final DatastoreBackupOptions BACKUP_OPTIONS = DatastoreBackupOptions.newBuilder() + .setProjectionFields(ImmutableList.of("field_1", "field_2")) + .build(); + private static final WriteChannelConfiguration LOAD_CONFIGURATION_BACKUP = + WriteChannelConfiguration.newBuilder(TABLE_ID) + .setCreateDisposition(CREATE_DISPOSITION) + .setWriteDisposition(WRITE_DISPOSITION) + .setFormatOptions(BACKUP_OPTIONS) + .setIgnoreUnknownValues(IGNORE_UNKNOWN_VALUES) + .setMaxBadRecords(MAX_BAD_RECORDS) .setSchema(TABLE_SCHEMA) .build(); @Test public void testToBuilder() { - compareLoadConfiguration(LOAD_CONFIGURATION, LOAD_CONFIGURATION.toBuilder().build()); - WriteChannelConfiguration configuration = LOAD_CONFIGURATION.toBuilder() + compareLoadConfiguration(LOAD_CONFIGURATION_CSV, LOAD_CONFIGURATION_CSV.toBuilder().build()); + WriteChannelConfiguration configuration = LOAD_CONFIGURATION_CSV.toBuilder() .setDestinationTable(TableId.of("dataset", "newTable")) .build(); assertEquals("newTable", configuration.getDestinationTable().getTable()); configuration = configuration.toBuilder().setDestinationTable(TABLE_ID).build(); - compareLoadConfiguration(LOAD_CONFIGURATION, configuration); + compareLoadConfiguration(LOAD_CONFIGURATION_CSV, configuration); } @Test @@ -87,41 +97,43 @@ public void testToBuilderIncomplete() { @Test public void testBuilder() { - assertEquals(TABLE_ID, LOAD_CONFIGURATION.getDestinationTable()); - assertEquals(CREATE_DISPOSITION, LOAD_CONFIGURATION.getCreateDisposition()); - assertEquals(WRITE_DISPOSITION, LOAD_CONFIGURATION.getWriteDisposition()); - assertEquals(CSV_OPTIONS, LOAD_CONFIGURATION.getCsvOptions()); - assertEquals(FORMAT, LOAD_CONFIGURATION.getFormat()); - assertEquals(IGNORE_UNKNOWN_VALUES, LOAD_CONFIGURATION.ignoreUnknownValues()); - assertEquals(MAX_BAD_RECORDS, LOAD_CONFIGURATION.getMaxBadRecords()); - assertEquals(PROJECTION_FIELDS, LOAD_CONFIGURATION.getProjectionFields()); - assertEquals(TABLE_SCHEMA, LOAD_CONFIGURATION.getSchema()); - WriteChannelConfiguration loadConfiguration = + assertEquals(TABLE_ID, LOAD_CONFIGURATION_CSV.getDestinationTable()); + assertEquals(CREATE_DISPOSITION, LOAD_CONFIGURATION_CSV.getCreateDisposition()); + assertEquals(WRITE_DISPOSITION, LOAD_CONFIGURATION_CSV.getWriteDisposition()); + assertEquals(CSV_OPTIONS, LOAD_CONFIGURATION_CSV.getCsvOptions()); + assertEquals(FORMAT, LOAD_CONFIGURATION_CSV.getFormat()); + assertEquals(IGNORE_UNKNOWN_VALUES, LOAD_CONFIGURATION_CSV.ignoreUnknownValues()); + assertEquals(MAX_BAD_RECORDS, LOAD_CONFIGURATION_CSV.getMaxBadRecords()); + assertEquals(TABLE_SCHEMA, LOAD_CONFIGURATION_CSV.getSchema()); + assertEquals(BACKUP_OPTIONS, LOAD_CONFIGURATION_BACKUP.getDatastoreBackupOptions()); + + WriteChannelConfiguration.Builder builder = WriteChannelConfiguration.newBuilder(TABLE_ID, CSV_OPTIONS) .setCreateDisposition(CREATE_DISPOSITION) .setWriteDisposition(WRITE_DISPOSITION) .setIgnoreUnknownValues(IGNORE_UNKNOWN_VALUES) .setMaxBadRecords(MAX_BAD_RECORDS) - .setProjectionFields(PROJECTION_FIELDS) - .setSchema(TABLE_SCHEMA) - .build(); - assertEquals(TABLE_ID, loadConfiguration.getDestinationTable()); - assertEquals(CREATE_DISPOSITION, loadConfiguration.getCreateDisposition()); - assertEquals(WRITE_DISPOSITION, loadConfiguration.getWriteDisposition()); - assertEquals(CSV_OPTIONS, loadConfiguration.getCsvOptions()); - assertEquals(FORMAT, loadConfiguration.getFormat()); - assertEquals(IGNORE_UNKNOWN_VALUES, loadConfiguration.ignoreUnknownValues()); - assertEquals(MAX_BAD_RECORDS, loadConfiguration.getMaxBadRecords()); - assertEquals(PROJECTION_FIELDS, loadConfiguration.getProjectionFields()); - assertEquals(TABLE_SCHEMA, loadConfiguration.getSchema()); - } + .setSchema(TABLE_SCHEMA); + WriteChannelConfiguration loadConfigurationCSV = builder.build(); + assertEquals(TABLE_ID, loadConfigurationCSV.getDestinationTable()); + assertEquals(CREATE_DISPOSITION, loadConfigurationCSV.getCreateDisposition()); + assertEquals(WRITE_DISPOSITION, loadConfigurationCSV.getWriteDisposition()); + assertEquals(CSV_OPTIONS, loadConfigurationCSV.getCsvOptions()); + assertEquals(FORMAT, loadConfigurationCSV.getFormat()); + assertEquals(IGNORE_UNKNOWN_VALUES, loadConfigurationCSV.ignoreUnknownValues()); + assertEquals(MAX_BAD_RECORDS, loadConfigurationCSV.getMaxBadRecords()); + assertEquals(TABLE_SCHEMA, loadConfigurationCSV.getSchema()); + builder.setFormatOptions(BACKUP_OPTIONS); + WriteChannelConfiguration loadConfigurationBackup = builder.build(); + assertEquals(BACKUP_OPTIONS, loadConfigurationBackup.getDatastoreBackupOptions()); + } @Test public void testToPbAndFromPb() { - assertNull(LOAD_CONFIGURATION.toPb().getLoad().getSourceUris()); - compareLoadConfiguration(LOAD_CONFIGURATION, - WriteChannelConfiguration.fromPb(LOAD_CONFIGURATION.toPb())); + assertNull(LOAD_CONFIGURATION_CSV.toPb().getLoad().getSourceUris()); + compareLoadConfiguration(LOAD_CONFIGURATION_CSV, + WriteChannelConfiguration.fromPb(LOAD_CONFIGURATION_CSV.toPb())); WriteChannelConfiguration configuration = WriteChannelConfiguration.of(TABLE_ID); compareLoadConfiguration(configuration, WriteChannelConfiguration.fromPb(configuration.toPb())); } @@ -138,7 +150,7 @@ private void compareLoadConfiguration(WriteChannelConfiguration expected, assertEquals(expected.getFormat(), value.getFormat()); assertEquals(expected.ignoreUnknownValues(), value.ignoreUnknownValues()); assertEquals(expected.getMaxBadRecords(), value.getMaxBadRecords()); - assertEquals(expected.getProjectionFields(), value.getProjectionFields()); + assertEquals(expected.getDatastoreBackupOptions(), value.getDatastoreBackupOptions()); assertEquals(expected.getSchema(), value.getSchema()); } }