diff --git a/google-cloud-bigquery/clirr-ignored-differences.xml b/google-cloud-bigquery/clirr-ignored-differences.xml index bebc7e25c..d8b1ba813 100644 --- a/google-cloud-bigquery/clirr-ignored-differences.xml +++ b/google-cloud-bigquery/clirr-ignored-differences.xml @@ -4,7 +4,32 @@ 7013 - com/google/cloud/bigquery/RoutineInfo$Builder - com.google.cloud.bigquery.RoutineInfo$Builder setReturnTableType(com.google.cloud.bigquery.StandardSQLTableType) + com/google/cloud/bigquery/MaterializedViewDefinition + com.google.cloud.bigquery.Clustering getClustering() + + + 7013 + com/google/cloud/bigquery/MaterializedViewDefinition + com.google.cloud.bigquery.RangePartitioning getRangePartitioning() + + + 7013 + com/google/cloud/bigquery/MaterializedViewDefinition + com.google.cloud.bigquery.TimePartitioning getTimePartitioning() + + + 7013 + com/google/cloud/bigquery/MaterializedViewDefinition$Builder + com.google.cloud.bigquery.MaterializedViewDefinition$Builder setClustering(com.google.cloud.bigquery.Clustering) + + + 7013 + com/google/cloud/bigquery/MaterializedViewDefinition$Builder + com.google.cloud.bigquery.MaterializedViewDefinition$Builder setRangePartitioning(com.google.cloud.bigquery.RangePartitioning) + + + 7013 + com/google/cloud/bigquery/MaterializedViewDefinition$Builder + com.google.cloud.bigquery.MaterializedViewDefinition$Builder setTimePartitioning(com.google.cloud.bigquery.TimePartitioning) \ No newline at end of file diff --git a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/MaterializedViewDefinition.java b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/MaterializedViewDefinition.java index bf3a913a9..69712bb3d 100644 --- a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/MaterializedViewDefinition.java +++ b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/MaterializedViewDefinition.java @@ -57,6 +57,25 @@ public abstract static class Builder @Override public abstract Builder setType(Type type); + /** + * Sets the time partitioning configuration for the materialized view. If not set, the + * materialized view is not time-partitioned. + */ + public abstract Builder setTimePartitioning(TimePartitioning timePartitioning); + + /** + * Sets the range partitioning configuration for the materialized view. Only one of + * timePartitioning and rangePartitioning should be specified. + */ + public abstract Builder setRangePartitioning(RangePartitioning rangePartitioning); + + /** + * Set the clustering configuration for the materialized view. If not set, the materialized view + * is not clustered. BigQuery supports clustering for both partitioned and non-partitioned + * materialized views. + */ + public abstract Builder setClustering(Clustering clustering); + /** Creates a {@code MaterializedViewDefinition} object. */ @Override public abstract MaterializedViewDefinition build(); @@ -86,6 +105,27 @@ public abstract static class Builder @Nullable public abstract Long getRefreshIntervalMs(); + /** + * Returns the time partitioning configuration for this table. If {@code null}, the table is not + * time-partitioned. + */ + @Nullable + public abstract TimePartitioning getTimePartitioning(); + + /** + * Returns the range partitioning configuration for this table. If {@code null}, the table is not + * range-partitioned. + */ + @Nullable + public abstract RangePartitioning getRangePartitioning(); + + /** + * Returns the clustering configuration for this table. If {@code null}, the table is not + * clustered. + */ + @Nullable + public abstract Clustering getClustering(); + /** Returns a builder for the {@code MaterializedViewDefinition} object. */ public abstract Builder toBuilder(); @@ -107,6 +147,15 @@ Table toPb() { materializedViewDefinition.setRefreshIntervalMs(getRefreshIntervalMs()); } tablePb.setMaterializedView(materializedViewDefinition); + if (getTimePartitioning() != null) { + tablePb.setTimePartitioning(getTimePartitioning().toPb()); + } + if (getRangePartitioning() != null) { + tablePb.setRangePartitioning(getRangePartitioning().toPb()); + } + if (getClustering() != null) { + tablePb.setClustering(getClustering().toPb()); + } return tablePb; } @@ -149,6 +198,15 @@ static MaterializedViewDefinition fromPb(Table tablePb) { if (materializedViewDefinition.getRefreshIntervalMs() != null) { builder.setRefreshIntervalMs(materializedViewDefinition.getRefreshIntervalMs()); } + if (tablePb.getTimePartitioning() != null) { + builder.setTimePartitioning(TimePartitioning.fromPb(tablePb.getTimePartitioning())); + } + if (tablePb.getRangePartitioning() != null) { + builder.setRangePartitioning(RangePartitioning.fromPb(tablePb.getRangePartitioning())); + } + if (tablePb.getClustering() != null) { + builder.setClustering(Clustering.fromPb(tablePb.getClustering())); + } } return builder.build(); } diff --git a/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/MaterializedViewDefinitionTest.java b/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/MaterializedViewDefinitionTest.java index ab1caab07..eef4324a0 100644 --- a/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/MaterializedViewDefinitionTest.java +++ b/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/MaterializedViewDefinitionTest.java @@ -19,6 +19,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import com.google.common.collect.ImmutableList; import org.junit.Test; public class MaterializedViewDefinitionTest { @@ -28,6 +29,10 @@ public class MaterializedViewDefinitionTest { private static final Boolean ENABLE_REFRESH = false; private static final Long REFRESH_INTERVAL_MS = 60000L; private static final Schema SCHEMA = Schema.of(); + private static final TimePartitioning TIME_PARTITIONING = + TimePartitioning.of(TimePartitioning.Type.DAY, 42); + private static final Clustering CLUSTERING = + Clustering.newBuilder().setFields(ImmutableList.of("Foo", "Bar")).build(); private static final MaterializedViewDefinition MATERIALIZED_VIEW_DEFINITION = MaterializedViewDefinition.newBuilder() .setSchema(SCHEMA) @@ -35,6 +40,8 @@ public class MaterializedViewDefinitionTest { .setLastRefreshTime(LAST_REFRESH_TIME) .setEnableRefresh(ENABLE_REFRESH) .setRefreshIntervalMs(REFRESH_INTERVAL_MS) + .setClustering(CLUSTERING) + .setTimePartitioning(TIME_PARTITIONING) .build(); @Test @@ -68,6 +75,8 @@ public void testBuilder() { .setLastRefreshTime(LAST_REFRESH_TIME) .setEnableRefresh(ENABLE_REFRESH) .setRefreshIntervalMs(REFRESH_INTERVAL_MS) + .setClustering(CLUSTERING) + .setTimePartitioning(TIME_PARTITIONING) .build(); assertEquals(MATERIALIZED_VIEW_DEFINITION, materializedViewDefinition); } @@ -92,6 +101,8 @@ private void compareMaterializedView( assertEquals(expected.getLastRefreshTime(), actual.getLastRefreshTime()); assertEquals(expected.getEnableRefresh(), actual.getEnableRefresh()); assertEquals(expected.getRefreshIntervalMs(), actual.getRefreshIntervalMs()); + assertEquals(expected.getClustering(), actual.getClustering()); + assertEquals(expected.getTimePartitioning(), actual.getTimePartitioning()); assertEquals(expected.toString(), actual.toString()); assertEquals(expected.hashCode(), actual.hashCode()); assertEquals(expected, actual);