This is an automated email from the ASF dual-hosted git repository. arina pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/drill.git
The following commit(s) were added to refs/heads/master by this push: new b827d7f DRILL-7368: Fix Iceberg Metastore failure when filter column contains nulls b827d7f is described below commit b827d7f29590dd120fda1a6b653fa34c5701f664 Author: Arina Ielchiieva <arina.yelchiy...@gmail.com> AuthorDate: Tue Sep 10 15:30:10 2019 +0300 DRILL-7368: Fix Iceberg Metastore failure when filter column contains nulls --- exec/java-exec/pom.xml | 6 ++ .../drill/exec/ops/ExecutorFragmentContext.java | 4 +- .../org/apache/drill/exec/ops/FragmentContext.java | 37 +++++--- .../apache/drill/exec/ops/FragmentContextImpl.java | 43 +++++---- .../org/apache/drill/exec/ops/QueryContext.java | 5 - .../apache/drill/exec/server/DrillbitContext.java | 7 +- .../org/apache/drill/test/OperatorFixture.java | 6 ++ .../apache/drill/test/PhysicalOpUnitTestBase.java | 2 +- metastore/iceberg-metastore/pom.xml | 2 +- .../drill/metastore/iceberg/operate/Overwrite.java | 2 +- .../components/tables/TestBasicRequests.java | 105 +++++++++++++-------- 11 files changed, 136 insertions(+), 83 deletions(-) diff --git a/exec/java-exec/pom.xml b/exec/java-exec/pom.xml index a80bc48..a9ac685 100644 --- a/exec/java-exec/pom.xml +++ b/exec/java-exec/pom.xml @@ -547,6 +547,12 @@ <groupId>sqlline</groupId> <artifactId>sqlline</artifactId> </dependency> + <dependency> + <groupId>org.apache.drill.metastore</groupId> + <artifactId>drill-iceberg-metastore</artifactId> + <version>${project.version}</version> + <scope>test</scope> + </dependency> </dependencies> <profiles> diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/ops/ExecutorFragmentContext.java b/exec/java-exec/src/main/java/org/apache/drill/exec/ops/ExecutorFragmentContext.java index dbf440c..df782b1 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/ops/ExecutorFragmentContext.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/ops/ExecutorFragmentContext.java @@ -36,8 +36,10 @@ import java.util.Set; * {@link org.apache.drill.exec.work.fragment.FragmentExecutor}. */ public interface ExecutorFragmentContext extends RootFragmentContext { + /** * Returns the root allocator for the Drillbit. + * * @return The root allocator for the Drillbit. */ BufferAllocator getRootAllocator(); @@ -58,7 +60,7 @@ public interface ExecutorFragmentContext extends RootFragmentContext { QueryProfileStoreContext getProfileStoreContext(); - WorkEventBus getWorkEventbus(); + WorkEventBus getWorkEventBus(); Set<Map.Entry<UserServer.BitToUserConnection, UserServer.BitToUserConnectionConfig>> getUserConnections(); diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/ops/FragmentContext.java b/exec/java-exec/src/main/java/org/apache/drill/exec/ops/FragmentContext.java index 46f94f0..414d583 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/ops/FragmentContext.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/ops/FragmentContext.java @@ -21,6 +21,8 @@ import java.io.IOException; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; + +import org.apache.drill.metastore.MetastoreRegistry; import org.apache.drill.shaded.guava.com.google.common.annotations.VisibleForTesting; import org.apache.calcite.schema.SchemaPlus; import org.apache.drill.common.config.DrillConfig; @@ -96,9 +98,10 @@ public interface FragmentContext extends UdfUtilities, AutoCloseable { /** * Returns the statement type (e.g. SELECT, CTAS, ANALYZE) from the query context. + * * @return query statement type {@link SqlStatementType}, if known. */ - public SqlStatementType getSQLStatementType(); + SqlStatementType getSQLStatementType(); /** * Get this node's identity. @@ -145,12 +148,12 @@ public interface FragmentContext extends UdfUtilities, AutoCloseable { /** * @return ID {@link java.util.UUID} of the current query */ - public QueryId getQueryId(); + QueryId getQueryId(); /** * @return The string representation of the ID {@link java.util.UUID} of the current query */ - public String getQueryIdString(); + String getQueryIdString(); OperatorContext newOperatorContext(PhysicalOperator popConfig); @@ -171,22 +174,32 @@ public interface FragmentContext extends UdfUtilities, AutoCloseable { @Override void close(); + /** - * add a RuntimeFilter when the RuntimeFilter receiver belongs to the same MinorFragment - * @param runtimeFilter + * Add a RuntimeFilter when the RuntimeFilter receiver belongs to the same MinorFragment. + * + * @param runtimeFilter runtime filter */ - public void addRuntimeFilter(RuntimeFilterWritable runtimeFilter); + void addRuntimeFilter(RuntimeFilterWritable runtimeFilter); - public RuntimeFilterWritable getRuntimeFilter(long rfIdentifier); + RuntimeFilterWritable getRuntimeFilter(long rfIdentifier); /** - * get the RuntimeFilter with a blocking wait, if the waiting option is enabled - * @param rfIdentifier - * @param maxWaitTime - * @param timeUnit + * Get the RuntimeFilter with a blocking wait, if the waiting option is enabled. + * + * @param rfIdentifier runtime filter identifier + * @param maxWaitTime max wait time + * @param timeUnit time unit * @return the RFW or null */ - public RuntimeFilterWritable getRuntimeFilter(long rfIdentifier, long maxWaitTime, TimeUnit timeUnit); + RuntimeFilterWritable getRuntimeFilter(long rfIdentifier, long maxWaitTime, TimeUnit timeUnit); + + /** + * Get instance of Metastore registry to obtain Metastore instance if needed. + * + * @return Metastore registry + */ + MetastoreRegistry getMetastoreRegistry(); interface ExecutorState { /** diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/ops/FragmentContextImpl.java b/exec/java-exec/src/main/java/org/apache/drill/exec/ops/FragmentContextImpl.java index afbcd1c..cb35318 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/ops/FragmentContextImpl.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/ops/FragmentContextImpl.java @@ -19,6 +19,8 @@ package org.apache.drill.exec.ops; import io.netty.buffer.DrillBuf; import java.util.Collection; +import java.util.HashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; @@ -69,10 +71,9 @@ import org.apache.drill.exec.testing.ExecutionControls; import org.apache.drill.exec.util.ImpersonationUtil; import org.apache.drill.exec.work.batch.IncomingBuffers; import org.apache.drill.exec.work.filter.RuntimeFilterWritable; +import org.apache.drill.metastore.MetastoreRegistry; import org.apache.drill.shaded.guava.com.google.common.base.Function; import org.apache.drill.shaded.guava.com.google.common.base.Preconditions; -import org.apache.drill.shaded.guava.com.google.common.collect.Lists; -import org.apache.drill.shaded.guava.com.google.common.collect.Maps; /** * <p> @@ -104,8 +105,8 @@ import org.apache.drill.shaded.guava.com.google.common.collect.Maps; public class FragmentContextImpl extends BaseFragmentContext implements ExecutorFragmentContext { private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(FragmentContextImpl.class); - private final Map<DrillbitEndpoint, AccountingDataTunnel> tunnels = Maps.newHashMap(); - private final List<OperatorContextImpl> contexts = Lists.newLinkedList(); + private final Map<DrillbitEndpoint, AccountingDataTunnel> tunnels = new HashMap<>(); + private final List<OperatorContextImpl> contexts = new LinkedList<>(); private final DrillbitContext context; private final UserClientConnection connection; // is null if this context is for non-root fragment @@ -150,10 +151,10 @@ public class FragmentContextImpl extends BaseFragmentContext implements Executor /** * Create a FragmentContext instance for non-root fragment. * - * @param dbContext DrillbitContext. - * @param fragment Fragment implementation. - * @param funcRegistry FunctionImplementationRegistry. - * @throws ExecutionSetupException + * @param dbContext DrillbitContext + * @param fragment Fragment implementation + * @param funcRegistry FunctionImplementationRegistry + * @throws ExecutionSetupException when unable to init fragment context */ public FragmentContextImpl(final DrillbitContext dbContext, final PlanFragment fragment, final FunctionImplementationRegistry funcRegistry) throws ExecutionSetupException { @@ -163,12 +164,12 @@ public class FragmentContextImpl extends BaseFragmentContext implements Executor /** * Create a FragmentContext instance for root fragment. * - * @param dbContext DrillbitContext. - * @param fragment Fragment implementation. - * @param queryContext QueryContext. - * @param connection UserClientConnection. - * @param funcRegistry FunctionImplementationRegistry. - * @throws ExecutionSetupException + * @param dbContext DrillbitContext + * @param fragment Fragment implementation + * @param queryContext QueryContext + * @param connection UserClientConnection + * @param funcRegistry FunctionImplementationRegistry + * @throws ExecutionSetupException when unable to init fragment context */ public FragmentContextImpl(final DrillbitContext dbContext, final PlanFragment fragment, final QueryContext queryContext, final UserClientConnection connection, final FunctionImplementationRegistry funcRegistry) @@ -216,7 +217,7 @@ public class FragmentContextImpl extends BaseFragmentContext implements Executor stats = new FragmentStats(allocator, fragment.getAssignment()); bufferManager = new BufferManagerImpl(this.allocator); - constantValueHolderCache = Maps.newHashMap(); + constantValueHolderCache = new HashMap<>(); enableRuntimeFilter = this.getOptions().getOption(ExecConstants.HASHJOIN_ENABLE_RUNTIME_FILTER_KEY).bool_val; enableRFWaiting = this.getOptions().getOption(ExecConstants.HASHJOIN_RUNTIME_FILTER_WAITING_ENABLE_KEY).bool_val && enableRuntimeFilter; if (enableRFWaiting) { @@ -354,8 +355,7 @@ public class FragmentContextImpl extends BaseFragmentContext implements Executor @Override public String getFragIdString() { final FragmentHandle handle = getHandle(); - final String frag = handle != null ? handle.getMajorFragmentId() + ":" + handle.getMinorFragmentId() : "0:0"; - return frag; + return handle != null ? handle.getMajorFragmentId() + ":" + handle.getMinorFragmentId() : "0:0"; } @Override @@ -566,7 +566,7 @@ public class FragmentContextImpl extends BaseFragmentContext implements Executor @Override public ValueHolder getConstantValueHolder(String value, MinorType type, Function<DrillBuf, ValueHolder> holderInitializer) { if (!constantValueHolderCache.containsKey(value)) { - constantValueHolderCache.put(value, Maps.<MinorType, ValueHolder>newHashMap()); + constantValueHolderCache.put(value, new HashMap<>()); } Map<MinorType, ValueHolder> holdersByType = constantValueHolderCache.get(value); @@ -589,7 +589,7 @@ public class FragmentContextImpl extends BaseFragmentContext implements Executor } @Override - public WorkEventBus getWorkEventbus() { + public WorkEventBus getWorkEventBus() { return context.getWorkBus(); } @@ -620,4 +620,9 @@ public class FragmentContextImpl extends BaseFragmentContext implements Executor + " Calling from non-root fragment"); return queryContext.getSQLStatementType(); } + + @Override + public MetastoreRegistry getMetastoreRegistry() { + return context.getMetastoreRegistry(); + } } diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/ops/QueryContext.java b/exec/java-exec/src/main/java/org/apache/drill/exec/ops/QueryContext.java index fb1b4a9..97db9b2 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/ops/QueryContext.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/ops/QueryContext.java @@ -52,7 +52,6 @@ import org.apache.drill.exec.store.StoragePluginRegistry; import org.apache.drill.exec.testing.ExecutionControls; import org.apache.drill.exec.util.Utilities; -import org.apache.drill.metastore.Metastore; import org.apache.drill.shaded.guava.com.google.common.base.Function; import org.apache.drill.shaded.guava.com.google.common.collect.Lists; import org.apache.drill.shaded.guava.com.google.common.collect.Maps; @@ -390,8 +389,4 @@ public class QueryContext implements AutoCloseable, OptimizerRulesContext, Schem public boolean isSkipProfileWrite() { return skipProfileWrite; } - - public Metastore getMetastore() { - return drillbitContext.getMetastore(); - } } diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/server/DrillbitContext.java b/exec/java-exec/src/main/java/org/apache/drill/exec/server/DrillbitContext.java index b3cd6f0..79d3bed 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/server/DrillbitContext.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/server/DrillbitContext.java @@ -44,7 +44,6 @@ import org.apache.drill.exec.store.StoragePluginRegistry; import org.apache.drill.exec.store.sys.PersistentStoreProvider; import org.apache.drill.exec.work.foreman.rm.ResourceManager; import org.apache.drill.exec.work.foreman.rm.ResourceManagerBuilder; -import org.apache.drill.metastore.Metastore; import org.apache.drill.metastore.MetastoreRegistry; import java.util.Collection; @@ -300,14 +299,14 @@ public class DrillbitContext implements AutoCloseable { getFunctionImplementationRegistry().close(); getRemoteFunctionRegistry().close(); getCompiler().close(); - metastoreRegistry.close(); + getMetastoreRegistry().close(); } public ResourceManager getResourceManager() { return resourceManager; } - public Metastore getMetastore() { - return metastoreRegistry.get(); + public MetastoreRegistry getMetastoreRegistry() { + return metastoreRegistry; } } diff --git a/exec/java-exec/src/test/java/org/apache/drill/test/OperatorFixture.java b/exec/java-exec/src/test/java/org/apache/drill/test/OperatorFixture.java index cb71071..ef6a9c2 100644 --- a/exec/java-exec/src/test/java/org/apache/drill/test/OperatorFixture.java +++ b/exec/java-exec/src/test/java/org/apache/drill/test/OperatorFixture.java @@ -17,6 +17,7 @@ */ package org.apache.drill.test; +import org.apache.drill.metastore.MetastoreRegistry; import org.apache.drill.shaded.guava.com.google.common.base.Function; import org.apache.drill.shaded.guava.com.google.common.base.Preconditions; import org.apache.drill.shaded.guava.com.google.common.collect.Lists; @@ -334,6 +335,11 @@ public class OperatorFixture extends BaseFixture implements AutoCloseable { public ValueHolder getConstantValueHolder(String value, TypeProtos.MinorType type, Function<DrillBuf, ValueHolder> holderInitializer) { return null; } + + @Override + public MetastoreRegistry getMetastoreRegistry() { + return null; + } } private final SystemOptionManager options; diff --git a/exec/java-exec/src/test/java/org/apache/drill/test/PhysicalOpUnitTestBase.java b/exec/java-exec/src/test/java/org/apache/drill/test/PhysicalOpUnitTestBase.java index 27a4ad6..172bd46 100644 --- a/exec/java-exec/src/test/java/org/apache/drill/test/PhysicalOpUnitTestBase.java +++ b/exec/java-exec/src/test/java/org/apache/drill/test/PhysicalOpUnitTestBase.java @@ -250,7 +250,7 @@ public class PhysicalOpUnitTestBase extends ExecTest { } @Override - public WorkEventBus getWorkEventbus() { + public WorkEventBus getWorkEventBus() { return null; } diff --git a/metastore/iceberg-metastore/pom.xml b/metastore/iceberg-metastore/pom.xml index 41d4690..5a2746b 100644 --- a/metastore/iceberg-metastore/pom.xml +++ b/metastore/iceberg-metastore/pom.xml @@ -33,7 +33,7 @@ <name>metastore/Drill Iceberg Metastore</name> <properties> - <iceberg.version>1b0b9c2</iceberg.version> + <iceberg.version>4d8ae52</iceberg.version> <caffeine.version>2.7.0</caffeine.version> </properties> diff --git a/metastore/iceberg-metastore/src/main/java/org/apache/drill/metastore/iceberg/operate/Overwrite.java b/metastore/iceberg-metastore/src/main/java/org/apache/drill/metastore/iceberg/operate/Overwrite.java index 67f88fd..9fc4b50 100644 --- a/metastore/iceberg-metastore/src/main/java/org/apache/drill/metastore/iceberg/operate/Overwrite.java +++ b/metastore/iceberg-metastore/src/main/java/org/apache/drill/metastore/iceberg/operate/Overwrite.java @@ -47,7 +47,7 @@ public class Overwrite implements IcebergOperation { transaction.newOverwrite() .overwriteByRowFilter(filter) .addFile(dataFile) - .validateAddedFiles() + .validateAddedFilesMatchOverwriteFilter() .commit(); } } diff --git a/metastore/iceberg-metastore/src/test/java/org/apache/drill/metastore/iceberg/components/tables/TestBasicRequests.java b/metastore/iceberg-metastore/src/test/java/org/apache/drill/metastore/iceberg/components/tables/TestBasicRequests.java index 9862c9b..c5608d7 100644 --- a/metastore/iceberg-metastore/src/test/java/org/apache/drill/metastore/iceberg/components/tables/TestBasicRequests.java +++ b/metastore/iceberg-metastore/src/test/java/org/apache/drill/metastore/iceberg/components/tables/TestBasicRequests.java @@ -18,10 +18,10 @@ package org.apache.drill.metastore.iceberg.components.tables; import org.apache.drill.common.config.DrillConfig; -import org.apache.drill.metastore.components.tables.BasicTablesTransformer; import org.apache.drill.metastore.components.tables.BasicTablesRequests; -import org.apache.drill.metastore.components.tables.TableMetadataUnit; +import org.apache.drill.metastore.components.tables.BasicTablesTransformer; import org.apache.drill.metastore.components.tables.MetastoreTableInfo; +import org.apache.drill.metastore.components.tables.TableMetadataUnit; import org.apache.drill.metastore.components.tables.Tables; import org.apache.drill.metastore.expressions.FilterExpression; import org.apache.drill.metastore.iceberg.IcebergBaseTest; @@ -317,69 +317,90 @@ public class TestBasicRequests extends IcebergBaseTest { * @param tables Drill Metastore Tables instance */ private static void prepareData(Tables tables) { - nationTable = basicUnit().toBuilder() - .tableName("nation") - .metadataType(MetadataType.TABLE.name()) - .metadataKey(MetadataInfo.GENERAL_INFO_KEY) - .build(); + TableMetadataUnit basicUnit = basicUnit(); + + nationTable = BaseTableMetadata.builder() + .metadataUnit(basicUnit.toBuilder() + .tableName("nation") + .metadataType(MetadataType.TABLE.name()) + .metadataKey(MetadataInfo.GENERAL_INFO_KEY) + .build()) + .build() + .toMetadataUnit(); nationTableInfo = TableInfo.builder().metadataUnit(nationTable).build(); - TableMetadataUnit nationSegment1 = nationTable.toBuilder() - .metadataType(MetadataType.SEGMENT.name()) + TableMetadataUnit basicSegment = SegmentMetadata.builder() + .metadataUnit(basicUnit.toBuilder() + .tableName(nationTableInfo.name()) + .metadataType(MetadataType.SEGMENT.name()) + .build()) + .build() + .toMetadataUnit(); + + TableMetadataUnit nationSegment1 = basicSegment.toBuilder() .metadataKey("part_int=3") .location("/tmp/nation/part_int=3/d3") .column("n_nation") .lastModifiedTime(1L) .build(); - TableMetadataUnit nationSegment2 = nationTable.toBuilder() - .metadataType(MetadataType.SEGMENT.name()) + TableMetadataUnit nationSegment2 = basicSegment.toBuilder() .metadataKey("part_int=3") .location("/tmp/nation/part_int=3/d4") .column("n_nation") .lastModifiedTime(2L) .build(); - TableMetadataUnit nationSegment3 = nationTable.toBuilder() - .metadataType(MetadataType.SEGMENT.name()) + TableMetadataUnit nationSegment3 = basicSegment.toBuilder() .metadataKey("part_int=4") .location("/tmp/nation/part_int=4/d5") .column("n_nation") .lastModifiedTime(3L) .build(); - TableMetadataUnit nationPartition1 = nationTable.toBuilder() - .metadataType(MetadataType.PARTITION.name()) + TableMetadataUnit basicPartition = PartitionMetadata.builder() + .metadataUnit(basicUnit.toBuilder() + .tableName(nationTableInfo.name()) + .metadataType(MetadataType.PARTITION.name()) + .build()) + .build() + .toMetadataUnit(); + + TableMetadataUnit nationPartition1 = basicPartition.toBuilder() .metadataKey("part_int=3") .location("/tmp/nation/part_int=3/d5") .column("n_nation") .build(); - TableMetadataUnit nationPartition2 = nationTable.toBuilder() - .metadataType(MetadataType.PARTITION.name()) + TableMetadataUnit nationPartition2 = basicPartition.toBuilder() .metadataKey("part_int=4") .location("/tmp/nation/part_int=4/d5") .column("n_nation") .build(); - TableMetadataUnit nationPartition3 = nationTable.toBuilder() - .metadataType(MetadataType.PARTITION.name()) + TableMetadataUnit nationPartition3 = basicPartition.toBuilder() .metadataKey("part_int=4") .column("n_region") .location("/tmp/nation/part_int=4/d6") .build(); - TableMetadataUnit nationFile1 = nationTable.toBuilder() - .metadataType(MetadataType.FILE.name()) + TableMetadataUnit basicFile = FileMetadata.builder() + .metadataUnit(basicUnit.toBuilder() + .tableName(nationTableInfo.name()) + .metadataType(MetadataType.FILE.name()) + .build()) + .build() + .toMetadataUnit(); + + TableMetadataUnit nationFile1 = basicFile.toBuilder() .metadataKey("part_int=3") .location("/tmp/nation/part_int=3/part_varchar=g") .path("/tmp/nation/part_int=3/part_varchar=g/0_0_0.parquet") .lastModifiedTime(1L) .build(); - TableMetadataUnit nationFile2 = nationTable.toBuilder() - .metadataType(MetadataType.FILE.name()) + TableMetadataUnit nationFile2 = basicFile.toBuilder() .metadataKey("part_int=3") .location("/tmp/nation/part_int=3/part_varchar=g") .path("/tmp/nation/part_int=3/part_varchar=g/0_0_1.parquet") @@ -387,51 +408,57 @@ public class TestBasicRequests extends IcebergBaseTest { .lastModifiedTime(2L) .build(); - TableMetadataUnit nationFile3 = nationTable.toBuilder() - .metadataType(MetadataType.FILE.name()) + TableMetadataUnit nationFile3 = basicFile.toBuilder() .metadataKey("part_int=4") .location("/tmp/nation/part_int=4/part_varchar=g") .path("/tmp/nation/part_int=4/part_varchar=g/0_0_0.parquet") .lastModifiedTime(3L) .build(); - TableMetadataUnit nationRowGroup1 = nationTable.toBuilder() - .metadataType(MetadataType.ROW_GROUP.name()) + TableMetadataUnit basicRowGroup = RowGroupMetadata.builder() + .metadataUnit(basicUnit.toBuilder() + .tableName(nationTableInfo.name()) + .metadataType(MetadataType.ROW_GROUP.name()) + .build()) + .build() + .toMetadataUnit(); + + TableMetadataUnit nationRowGroup1 = basicRowGroup.toBuilder() .metadataKey("part_int=3") .location("/tmp/nation/part_int=3/part_varchar=g") .path("/tmp/nation/part_int=3/part_varchar=g/0_0_0.parquet") .rowGroupIndex(1) .build(); - TableMetadataUnit nationRowGroup2 = nationTable.toBuilder() - .metadataType(MetadataType.ROW_GROUP.name()) + TableMetadataUnit nationRowGroup2 = basicRowGroup.toBuilder() .metadataKey("part_int=3") .location("/tmp/nation/part_int=3/part_varchar=g") .path("/tmp/nation/part_int=3/part_varchar=g/0_0_0.parquet") .rowGroupIndex(2) .build(); - TableMetadataUnit nationRowGroup3 = nationTable.toBuilder() - .metadataType(MetadataType.ROW_GROUP.name()) + TableMetadataUnit nationRowGroup3 = basicRowGroup.toBuilder() .metadataKey("part_int=4") .location("/tmp/nation/part_int=4/part_varchar=g") .path("/tmp/nation/part_int=4/part_varchar=g/0_0_0.parquet") .rowGroupIndex(1) .build(); - TableMetadataUnit nationRowGroup4 = nationTable.toBuilder() - .metadataType(MetadataType.ROW_GROUP.name()) + TableMetadataUnit nationRowGroup4 = basicRowGroup.toBuilder() .metadataKey("part_int=4") .location("/tmp/nation/part_int=4/part_varchar=g") .path("/tmp/nation/part_int=4/part_varchar=g/0_0_0.parquet") .rowGroupIndex(2) .build(); - TableMetadataUnit regionTable = basicUnit().toBuilder() - .tableName("region") - .metadataType(MetadataType.TABLE.name()) - .metadataKey(MetadataInfo.GENERAL_INFO_KEY) - .build(); + TableMetadataUnit regionTable = BaseTableMetadata.builder() + .metadataUnit(basicUnit.toBuilder() + .tableName("region") + .metadataType(MetadataType.TABLE.name()) + .metadataKey(MetadataInfo.GENERAL_INFO_KEY) + .build()) + .build() + .toMetadataUnit(); tables.modify() .overwrite(nationTable, @@ -471,7 +498,7 @@ public class TestBasicRequests extends IcebergBaseTest { "\"statisticsKind\":{\"name\":\"approx_count_distinct\"}}")) .lastModifiedTime(System.currentTimeMillis()) .partitionKeys(Collections.singletonMap("dir0", "2018")) - .additionalMetadata("test table metadata") + .additionalMetadata("additional test metadata") .metadataIdentifier("part_int=3/part_varchar=g/0_0_0.parquet") .column("`id`") .locations(Arrays.asList("/tmp/nation/1", "/tmp/nation/2"))