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);