blob: 9ecbf39f92235ced8eff32478ac544717925784f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.drill.metastore.rdbms.components.tables;
import org.apache.drill.metastore.MetastoreColumn;
import org.apache.drill.metastore.components.tables.TableMetadataUnit;
import org.apache.drill.metastore.rdbms.transform.AbstractMetadataMapper;
import org.apache.drill.metastore.rdbms.transform.RdbmsFilterExpressionVisitor;
import org.apache.drill.metastore.rdbms.util.ConverterUtil;
import org.apache.drill.shaded.guava.com.google.common.collect.ImmutableMap;
import org.jooq.Condition;
import org.jooq.Field;
import org.jooq.Record;
import org.jooq.Table;
import org.jooq.generated.Tables;
import org.jooq.generated.tables.records.FilesRecord;
import org.jooq.generated.tables.records.PartitionsRecord;
import org.jooq.generated.tables.records.RowGroupsRecord;
import org.jooq.generated.tables.records.SegmentsRecord;
import org.jooq.generated.tables.records.TablesRecord;
import org.jooq.impl.DSL;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* Abstract implementation of {@link AbstractMetadataMapper} for RDBMS Metastore tables component.
* Contains common code for specific RDBMS Metastore tables component tables.
*
* @param <R> RDBMS table record type
*/
public abstract class TablesMetadataMapper<R extends Record> extends AbstractMetadataMapper<TableMetadataUnit, R> {
protected static final Function<TableMetadataUnit, List<String>> TABLE_PARTITION_KEY = unit ->
Arrays.asList(unit.storagePlugin(), unit.workspace(), unit.tableName());
protected static final Function<TableMetadataUnit, List<String>> COMPONENT_PARTITION_KEY = unit ->
Arrays.asList(unit.storagePlugin(), unit.workspace(), unit.tableName(), unit.metadataKey());
@Override
public TableMetadataUnit emptyUnit() {
return TableMetadataUnit.EMPTY_UNIT;
}
@Override
public List<Condition> toDeleteConditions(List<TableMetadataUnit> units) {
Set<List<String>> partitionValues = units.stream()
.collect(Collectors.groupingBy(partitionKey(), Collectors.toList()))
.keySet();
return partitionValues.stream()
.map(values -> DSL.and(toConditions(values)))
.collect(Collectors.toList());
}
/**
* @return function to determine partition key for specific table
*/
protected abstract Function<TableMetadataUnit, List<String>> partitionKey();
/**
* Creates JOOQ conditions based on given list of partition values.
* Matching is order based.
*
* @param values partition values
* @return list of JOOQ conditions
*/
protected abstract List<Condition> toConditions(List<String> values);
/**
* {@link TablesMetadataMapper} implementation for {@link Tables#TABLES} table.
*/
public static class TableMapper extends TablesMetadataMapper<TablesRecord> {
private static final TableMapper INSTANCE = new TableMapper();
private static final Map<MetastoreColumn, Field<?>> COLUMNS_MAP = ImmutableMap.<MetastoreColumn, Field<?>>builder()
.put(MetastoreColumn.STORAGE_PLUGIN, Tables.TABLES.STORAGE_PLUGIN)
.put(MetastoreColumn.WORKSPACE, Tables.TABLES.WORKSPACE)
.put(MetastoreColumn.TABLE_NAME, Tables.TABLES.TABLE_NAME)
.put(MetastoreColumn.OWNER, Tables.TABLES.OWNER)
.put(MetastoreColumn.TABLE_TYPE, Tables.TABLES.TABLE_TYPE)
.put(MetastoreColumn.METADATA_KEY, Tables.TABLES.METADATA_KEY)
.put(MetastoreColumn.METADATA_TYPE, Tables.TABLES.METADATA_TYPE)
.put(MetastoreColumn.LOCATION, Tables.TABLES.LOCATION)
.put(MetastoreColumn.INTERESTING_COLUMNS, Tables.TABLES.INTERESTING_COLUMNS)
.put(MetastoreColumn.SCHEMA, Tables.TABLES.SCHEMA)
.put(MetastoreColumn.COLUMNS_STATISTICS, Tables.TABLES.COLUMN_STATISTICS)
.put(MetastoreColumn.METADATA_STATISTICS, Tables.TABLES.METADATA_STATISTICS)
.put(MetastoreColumn.PARTITION_KEYS, Tables.TABLES.PARTITION_KEYS)
.put(MetastoreColumn.LAST_MODIFIED_TIME, Tables.TABLES.LAST_MODIFIED_TIME)
.put(MetastoreColumn.ADDITIONAL_METADATA, Tables.TABLES.ADDITIONAL_METADATA)
.build();
private static final RdbmsFilterExpressionVisitor FILTER_VISITOR = new RdbmsFilterExpressionVisitor(COLUMNS_MAP);
public static TableMapper get() {
return INSTANCE;
}
@Override
public Table<TablesRecord> table() {
return Tables.TABLES;
}
@Override
public TableMetadataUnit toUnit(Record record) {
TablesRecord tablesRecord = (TablesRecord) record;
return TableMetadataUnit.builder()
.storagePlugin(tablesRecord.getStoragePlugin())
.workspace(tablesRecord.getWorkspace())
.tableName(tablesRecord.getTableName())
.owner(tablesRecord.getOwner())
.tableType(tablesRecord.getTableType())
.metadataKey(tablesRecord.getMetadataKey())
.metadataType(tablesRecord.getMetadataType())
.location(tablesRecord.getLocation())
.interestingColumns(ConverterUtil.convertToListString(tablesRecord.getInterestingColumns()))
.schema(tablesRecord.getSchema())
.columnsStatistics(ConverterUtil.convertToMapStringString(tablesRecord.getColumnStatistics()))
.metadataStatistics(ConverterUtil.convertToListString(tablesRecord.getMetadataStatistics()))
.partitionKeys(ConverterUtil.convertToMapStringString(tablesRecord.getPartitionKeys()))
.lastModifiedTime(tablesRecord.getLastModifiedTime())
.additionalMetadata(tablesRecord.getAdditionalMetadata())
.build();
}
@Override
public TablesRecord toRecord(TableMetadataUnit unit) {
TablesRecord record = new TablesRecord();
record.setStoragePlugin(unit.storagePlugin());
record.setWorkspace(unit.workspace());
record.setTableName(unit.tableName());
record.setOwner(unit.owner());
record.setTableType(unit.tableType());
record.setMetadataKey(unit.metadataKey());
record.setMetadataType(unit.metadataType());
record.setLocation(unit.location());
record.setInterestingColumns(ConverterUtil.convertToString(unit.interestingColumns()));
record.setSchema(unit.schema());
record.setColumnStatistics(ConverterUtil.convertToString(unit.columnsStatistics()));
record.setMetadataStatistics(ConverterUtil.convertToString(unit.metadataStatistics()));
record.setPartitionKeys(ConverterUtil.convertToString(unit.partitionKeys()));
record.setLastModifiedTime(unit.lastModifiedTime());
record.setAdditionalMetadata(unit.additionalMetadata());
return record;
}
@Override
protected Map<MetastoreColumn, Field<?>> fieldMapper() {
return COLUMNS_MAP;
}
@Override
protected RdbmsFilterExpressionVisitor filterVisitor() {
return FILTER_VISITOR;
}
@Override
protected Function<TableMetadataUnit, List<String>> partitionKey() {
return TABLE_PARTITION_KEY;
}
@Override
protected List<Condition> toConditions(List<String> values) {
assert values.size() == 3;
return Arrays.asList(
Tables.TABLES.STORAGE_PLUGIN.eq(values.get(0)),
Tables.TABLES.WORKSPACE.eq(values.get(1)),
Tables.TABLES.TABLE_NAME.eq(values.get(2))
);
}
}
/**
* {@link TablesMetadataMapper} implementation for {@link Tables#SEGMENTS} table.
*/
public static class SegmentMapper extends TablesMetadataMapper<SegmentsRecord> {
private static final SegmentMapper INSTANCE = new SegmentMapper();
private static final Map<MetastoreColumn, Field<?>> COLUMNS_MAP = ImmutableMap.<MetastoreColumn, Field<?>>builder()
.put(MetastoreColumn.STORAGE_PLUGIN, Tables.SEGMENTS.STORAGE_PLUGIN)
.put(MetastoreColumn.WORKSPACE, Tables.SEGMENTS.WORKSPACE)
.put(MetastoreColumn.TABLE_NAME, Tables.SEGMENTS.TABLE_NAME)
.put(MetastoreColumn.METADATA_KEY, Tables.SEGMENTS.METADATA_KEY)
.put(MetastoreColumn.METADATA_IDENTIFIER, Tables.SEGMENTS.METADATA_IDENTIFIER)
.put(MetastoreColumn.METADATA_TYPE, Tables.SEGMENTS.METADATA_TYPE)
.put(MetastoreColumn.LOCATION, Tables.SEGMENTS.LOCATION)
.put(MetastoreColumn.SCHEMA, Tables.SEGMENTS.SCHEMA)
.put(MetastoreColumn.COLUMNS_STATISTICS, Tables.SEGMENTS.COLUMN_STATISTICS)
.put(MetastoreColumn.METADATA_STATISTICS, Tables.SEGMENTS.METADATA_STATISTICS)
.put(MetastoreColumn.COLUMN, Tables.SEGMENTS.COLUMN)
.put(MetastoreColumn.LOCATIONS, Tables.SEGMENTS.LOCATIONS)
.put(MetastoreColumn.PARTITION_VALUES, Tables.SEGMENTS.PARTITION_VALUES)
.put(MetastoreColumn.PATH, Tables.SEGMENTS.PATH)
.put(MetastoreColumn.LAST_MODIFIED_TIME, Tables.SEGMENTS.LAST_MODIFIED_TIME)
.put(MetastoreColumn.ADDITIONAL_METADATA, Tables.SEGMENTS.ADDITIONAL_METADATA)
.build();
private static final RdbmsFilterExpressionVisitor FILTER_VISITOR = new RdbmsFilterExpressionVisitor(COLUMNS_MAP);
public static SegmentMapper get() {
return INSTANCE;
}
@Override
public Table<SegmentsRecord> table() {
return Tables.SEGMENTS;
}
@Override
public TableMetadataUnit toUnit(Record record) {
SegmentsRecord segmentsRecord = (SegmentsRecord) record;
return TableMetadataUnit.builder()
.storagePlugin(segmentsRecord.getStoragePlugin())
.workspace(segmentsRecord.getWorkspace())
.tableName(segmentsRecord.getTableName())
.metadataKey(segmentsRecord.getMetadataKey())
.metadataIdentifier(segmentsRecord.getMetadataIdentifier())
.metadataType(segmentsRecord.getMetadataType())
.location(segmentsRecord.getLocation())
.schema(segmentsRecord.getSchema())
.columnsStatistics(ConverterUtil.convertToMapStringString(segmentsRecord.getColumnStatistics()))
.metadataStatistics(ConverterUtil.convertToListString(segmentsRecord.getMetadataStatistics()))
.column(segmentsRecord.getColumn())
.locations(ConverterUtil.convertToListString(segmentsRecord.getLocations()))
.partitionValues(ConverterUtil.convertToListString(segmentsRecord.getPartitionValues()))
.path(segmentsRecord.getPath())
.lastModifiedTime(segmentsRecord.getLastModifiedTime())
.additionalMetadata(segmentsRecord.getAdditionalMetadata())
.build();
}
@Override
public SegmentsRecord toRecord(TableMetadataUnit unit) {
SegmentsRecord record = new SegmentsRecord();
record.setStoragePlugin(unit.storagePlugin());
record.setWorkspace(unit.workspace());
record.setTableName(unit.tableName());
record.setMetadataKey(unit.metadataKey());
record.setMetadataIdentifier(unit.metadataIdentifier());
record.setMetadataType(unit.metadataType());
record.setLocation(unit.location());
record.setSchema(unit.schema());
record.setColumnStatistics(ConverterUtil.convertToString(unit.columnsStatistics()));
record.setMetadataStatistics(ConverterUtil.convertToString(unit.metadataStatistics()));
record.setColumn(unit.column());
record.setLocations(ConverterUtil.convertToString(unit.locations()));
record.setPartitionValues(ConverterUtil.convertToString(unit.partitionValues()));
record.setPath(unit.path());
record.setLastModifiedTime(unit.lastModifiedTime());
record.setAdditionalMetadata(unit.additionalMetadata());
return record;
}
@Override
protected Map<MetastoreColumn, Field<?>> fieldMapper() {
return COLUMNS_MAP;
}
@Override
protected RdbmsFilterExpressionVisitor filterVisitor() {
return FILTER_VISITOR;
}
@Override
protected Function<TableMetadataUnit, List<String>> partitionKey() {
return COMPONENT_PARTITION_KEY;
}
@Override
protected List<Condition> toConditions(List<String> values) {
assert values.size() == 4;
return Arrays.asList(Tables.SEGMENTS.STORAGE_PLUGIN.eq(values.get(0)),
Tables.SEGMENTS.WORKSPACE.eq(values.get(1)),
Tables.SEGMENTS.TABLE_NAME.eq(values.get(2)),
Tables.SEGMENTS.METADATA_KEY.eq(values.get(3)));
}
}
/**
* {@link TablesMetadataMapper} implementation for {@link Tables#FILES} table.
*/
public static class FileMapper extends TablesMetadataMapper<FilesRecord> {
private static final FileMapper INSTANCE = new FileMapper();
private static final Map<MetastoreColumn, Field<?>> COLUMNS_MAP = ImmutableMap.<MetastoreColumn, Field<?>>builder()
.put(MetastoreColumn.STORAGE_PLUGIN, Tables.FILES.STORAGE_PLUGIN)
.put(MetastoreColumn.WORKSPACE, Tables.FILES.WORKSPACE)
.put(MetastoreColumn.TABLE_NAME, Tables.FILES.TABLE_NAME)
.put(MetastoreColumn.METADATA_KEY, Tables.FILES.METADATA_KEY)
.put(MetastoreColumn.METADATA_IDENTIFIER, Tables.FILES.METADATA_IDENTIFIER)
.put(MetastoreColumn.METADATA_TYPE, Tables.FILES.METADATA_TYPE)
.put(MetastoreColumn.LOCATION, Tables.FILES.LOCATION)
.put(MetastoreColumn.SCHEMA, Tables.FILES.SCHEMA)
.put(MetastoreColumn.COLUMNS_STATISTICS, Tables.FILES.COLUMN_STATISTICS)
.put(MetastoreColumn.METADATA_STATISTICS, Tables.FILES.METADATA_STATISTICS)
.put(MetastoreColumn.PATH, Tables.FILES.PATH)
.put(MetastoreColumn.LAST_MODIFIED_TIME, Tables.FILES.LAST_MODIFIED_TIME)
.put(MetastoreColumn.ADDITIONAL_METADATA, Tables.FILES.ADDITIONAL_METADATA)
.build();
private static final RdbmsFilterExpressionVisitor FILTER_VISITOR = new RdbmsFilterExpressionVisitor(COLUMNS_MAP);
public static FileMapper get() {
return INSTANCE;
}
@Override
public Table<FilesRecord> table() {
return Tables.FILES;
}
@Override
public TableMetadataUnit toUnit(Record record) {
FilesRecord filesRecord = (FilesRecord) record;
return TableMetadataUnit.builder()
.storagePlugin(filesRecord.getStoragePlugin())
.workspace(filesRecord.getWorkspace())
.tableName(filesRecord.getTableName())
.metadataKey(filesRecord.getMetadataKey())
.metadataIdentifier(filesRecord.getMetadataIdentifier())
.metadataType(filesRecord.getMetadataType())
.location(filesRecord.getLocation())
.schema(filesRecord.getSchema())
.columnsStatistics(ConverterUtil.convertToMapStringString(filesRecord.getColumnStatistics()))
.metadataStatistics(ConverterUtil.convertToListString(filesRecord.getMetadataStatistics()))
.path(filesRecord.getPath())
.lastModifiedTime(filesRecord.getLastModifiedTime())
.additionalMetadata(filesRecord.getAdditionalMetadata())
.build();
}
@Override
public FilesRecord toRecord(TableMetadataUnit unit) {
FilesRecord record = new FilesRecord();
record.setStoragePlugin(unit.storagePlugin());
record.setWorkspace(unit.workspace());
record.setTableName(unit.tableName());
record.setMetadataKey(unit.metadataKey());
record.setMetadataIdentifier(unit.metadataIdentifier());
record.setMetadataType(unit.metadataType());
record.setLocation(unit.location());
record.setSchema(unit.schema());
record.setColumnStatistics(ConverterUtil.convertToString(unit.columnsStatistics()));
record.setMetadataStatistics(ConverterUtil.convertToString(unit.metadataStatistics()));
record.setPath(unit.path());
record.setLastModifiedTime(unit.lastModifiedTime());
record.setAdditionalMetadata(unit.additionalMetadata());
return record;
}
@Override
protected Map<MetastoreColumn, Field<?>> fieldMapper() {
return COLUMNS_MAP;
}
@Override
protected RdbmsFilterExpressionVisitor filterVisitor() {
return FILTER_VISITOR;
}
@Override
protected Function<TableMetadataUnit, List<String>> partitionKey() {
return COMPONENT_PARTITION_KEY;
}
@Override
protected List<Condition> toConditions(List<String> values) {
assert values.size() == 4;
return Arrays.asList(
Tables.FILES.STORAGE_PLUGIN.eq(values.get(0)),
Tables.FILES.WORKSPACE.eq(values.get(1)),
Tables.FILES.TABLE_NAME.eq(values.get(2)),
Tables.FILES.METADATA_KEY.eq(values.get(3)));
}
}
/**
* {@link TablesMetadataMapper} implementation for {@link Tables#ROW_GROUPS} table.
*/
public static class RowGroupMapper extends TablesMetadataMapper<RowGroupsRecord> {
private static final RowGroupMapper INSTANCE = new RowGroupMapper();
private static final Map<MetastoreColumn, Field<?>> COLUMNS_MAP = ImmutableMap.<MetastoreColumn, Field<?>>builder()
.put(MetastoreColumn.STORAGE_PLUGIN, Tables.ROW_GROUPS.STORAGE_PLUGIN)
.put(MetastoreColumn.WORKSPACE, Tables.ROW_GROUPS.WORKSPACE)
.put(MetastoreColumn.TABLE_NAME, Tables.ROW_GROUPS.TABLE_NAME)
.put(MetastoreColumn.METADATA_KEY, Tables.ROW_GROUPS.METADATA_KEY)
.put(MetastoreColumn.METADATA_IDENTIFIER, Tables.ROW_GROUPS.METADATA_IDENTIFIER)
.put(MetastoreColumn.METADATA_TYPE, Tables.ROW_GROUPS.METADATA_TYPE)
.put(MetastoreColumn.LOCATION, Tables.ROW_GROUPS.LOCATION)
.put(MetastoreColumn.SCHEMA, Tables.ROW_GROUPS.SCHEMA)
.put(MetastoreColumn.COLUMNS_STATISTICS, Tables.ROW_GROUPS.COLUMN_STATISTICS)
.put(MetastoreColumn.METADATA_STATISTICS, Tables.ROW_GROUPS.METADATA_STATISTICS)
.put(MetastoreColumn.PATH, Tables.ROW_GROUPS.PATH)
.put(MetastoreColumn.ROW_GROUP_INDEX, Tables.ROW_GROUPS.ROW_GROUP_INDEX)
.put(MetastoreColumn.HOST_AFFINITY, Tables.ROW_GROUPS.HOST_AFFINITY)
.put(MetastoreColumn.LAST_MODIFIED_TIME, Tables.ROW_GROUPS.LAST_MODIFIED_TIME)
.put(MetastoreColumn.ADDITIONAL_METADATA, Tables.ROW_GROUPS.ADDITIONAL_METADATA)
.build();
private static final RdbmsFilterExpressionVisitor FILTER_VISITOR = new RdbmsFilterExpressionVisitor(COLUMNS_MAP);
public static RowGroupMapper get() {
return INSTANCE;
}
@Override
public Table<RowGroupsRecord> table() {
return Tables.ROW_GROUPS;
}
@Override
public TableMetadataUnit toUnit(Record record) {
RowGroupsRecord rowGroupsRecord = (RowGroupsRecord) record;
return TableMetadataUnit.builder()
.storagePlugin(rowGroupsRecord.getStoragePlugin())
.workspace(rowGroupsRecord.getWorkspace())
.tableName(rowGroupsRecord.getTableName())
.metadataKey(rowGroupsRecord.getMetadataKey())
.metadataIdentifier(rowGroupsRecord.getMetadataIdentifier())
.metadataType(rowGroupsRecord.getMetadataType())
.location(rowGroupsRecord.getLocation())
.schema(rowGroupsRecord.getSchema())
.columnsStatistics(ConverterUtil.convertToMapStringString(rowGroupsRecord.getColumnStatistics()))
.metadataStatistics(ConverterUtil.convertToListString(rowGroupsRecord.getMetadataStatistics()))
.path(rowGroupsRecord.getPath())
.rowGroupIndex(rowGroupsRecord.getRowGroupIndex())
.hostAffinity(ConverterUtil.convertToMapStringFloat(rowGroupsRecord.getHostAffinity()))
.lastModifiedTime(rowGroupsRecord.getLastModifiedTime())
.additionalMetadata(rowGroupsRecord.getAdditionalMetadata())
.build();
}
@Override
public RowGroupsRecord toRecord(TableMetadataUnit unit) {
RowGroupsRecord record = new RowGroupsRecord();
record.setStoragePlugin(unit.storagePlugin());
record.setWorkspace(unit.workspace());
record.setTableName(unit.tableName());
record.setMetadataKey(unit.metadataKey());
record.setMetadataIdentifier(unit.metadataIdentifier());
record.setMetadataType(unit.metadataType());
record.setLocation(unit.location());
record.setSchema(unit.schema());
record.setColumnStatistics(ConverterUtil.convertToString(unit.columnsStatistics()));
record.setMetadataStatistics(ConverterUtil.convertToString(unit.metadataStatistics()));
record.setPath(unit.path());
record.setRowGroupIndex(unit.rowGroupIndex());
record.setHostAffinity(ConverterUtil.convertToString(unit.hostAffinity()));
record.setLastModifiedTime(unit.lastModifiedTime());
record.setAdditionalMetadata(unit.additionalMetadata());
return record;
}
@Override
protected Map<MetastoreColumn, Field<?>> fieldMapper() {
return COLUMNS_MAP;
}
@Override
protected RdbmsFilterExpressionVisitor filterVisitor() {
return FILTER_VISITOR;
}
@Override
protected Function<TableMetadataUnit, List<String>> partitionKey() {
return COMPONENT_PARTITION_KEY;
}
@Override
protected List<Condition> toConditions(List<String> values) {
assert values.size() == 4;
return Arrays.asList(
Tables.ROW_GROUPS.STORAGE_PLUGIN.eq(values.get(0)),
Tables.ROW_GROUPS.WORKSPACE.eq(values.get(1)),
Tables.ROW_GROUPS.TABLE_NAME.eq(values.get(2)),
Tables.ROW_GROUPS.METADATA_KEY.eq(values.get(3)));
}
}
/**
* {@link TablesMetadataMapper} implementation for {@link Tables#PARTITIONS} table.
*/
public static class PartitionMapper extends TablesMetadataMapper<PartitionsRecord> {
private static final PartitionMapper INSTANCE = new PartitionMapper();
private static final Map<MetastoreColumn, Field<?>> COLUMNS_MAP = ImmutableMap.<MetastoreColumn, Field<?>>builder()
.put(MetastoreColumn.STORAGE_PLUGIN, Tables.PARTITIONS.STORAGE_PLUGIN)
.put(MetastoreColumn.WORKSPACE, Tables.PARTITIONS.WORKSPACE)
.put(MetastoreColumn.TABLE_NAME, Tables.PARTITIONS.TABLE_NAME)
.put(MetastoreColumn.METADATA_KEY, Tables.PARTITIONS.METADATA_KEY)
.put(MetastoreColumn.METADATA_IDENTIFIER, Tables.PARTITIONS.METADATA_IDENTIFIER)
.put(MetastoreColumn.METADATA_TYPE, Tables.PARTITIONS.METADATA_TYPE)
.put(MetastoreColumn.SCHEMA, Tables.PARTITIONS.SCHEMA)
.put(MetastoreColumn.COLUMNS_STATISTICS, Tables.PARTITIONS.COLUMN_STATISTICS)
.put(MetastoreColumn.METADATA_STATISTICS, Tables.PARTITIONS.METADATA_STATISTICS)
.put(MetastoreColumn.COLUMN, Tables.PARTITIONS.COLUMN)
.put(MetastoreColumn.LOCATIONS, Tables.PARTITIONS.LOCATIONS)
.put(MetastoreColumn.PARTITION_VALUES, Tables.PARTITIONS.PARTITION_VALUES)
.put(MetastoreColumn.LAST_MODIFIED_TIME, Tables.PARTITIONS.LAST_MODIFIED_TIME)
.put(MetastoreColumn.ADDITIONAL_METADATA, Tables.PARTITIONS.ADDITIONAL_METADATA)
.build();
private static final RdbmsFilterExpressionVisitor FILTER_VISITOR = new RdbmsFilterExpressionVisitor(COLUMNS_MAP);
public static PartitionMapper get() {
return INSTANCE;
}
@Override
public Table<PartitionsRecord> table() {
return Tables.PARTITIONS;
}
@Override
public TableMetadataUnit toUnit(Record record) {
PartitionsRecord partitionsRecord = (PartitionsRecord) record;
return TableMetadataUnit.builder()
.storagePlugin(partitionsRecord.getStoragePlugin())
.workspace(partitionsRecord.getWorkspace())
.tableName(partitionsRecord.getTableName())
.metadataKey(partitionsRecord.getMetadataKey())
.metadataIdentifier(partitionsRecord.getMetadataIdentifier())
.metadataType(partitionsRecord.getMetadataType())
.schema(partitionsRecord.getSchema())
.columnsStatistics(ConverterUtil.convertToMapStringString(partitionsRecord.getColumnStatistics()))
.metadataStatistics(ConverterUtil.convertToListString(partitionsRecord.getMetadataStatistics()))
.column(partitionsRecord.getColumn())
.locations(ConverterUtil.convertToListString(partitionsRecord.getLocations()))
.partitionValues(ConverterUtil.convertToListString(partitionsRecord.getPartitionValues()))
.lastModifiedTime(partitionsRecord.getLastModifiedTime())
.additionalMetadata(partitionsRecord.getAdditionalMetadata())
.build();
}
@Override
public PartitionsRecord toRecord(TableMetadataUnit unit) {
PartitionsRecord record = new PartitionsRecord();
record.setStoragePlugin(unit.storagePlugin());
record.setWorkspace(unit.workspace());
record.setTableName(unit.tableName());
record.setMetadataKey(unit.metadataKey());
record.setMetadataIdentifier(unit.metadataIdentifier());
record.setMetadataType(unit.metadataType());
record.setSchema(unit.schema());
record.setColumnStatistics(ConverterUtil.convertToString(unit.columnsStatistics()));
record.setMetadataStatistics(ConverterUtil.convertToString(unit.metadataStatistics()));
record.setColumn(unit.column());
record.setLocations(ConverterUtil.convertToString(unit.locations()));
record.setPartitionValues(ConverterUtil.convertToString(unit.partitionValues()));
record.setLastModifiedTime(unit.lastModifiedTime());
record.setAdditionalMetadata(unit.additionalMetadata());
return record;
}
@Override
protected Map<MetastoreColumn, Field<?>> fieldMapper() {
return COLUMNS_MAP;
}
@Override
protected RdbmsFilterExpressionVisitor filterVisitor() {
return FILTER_VISITOR;
}
@Override
protected Function<TableMetadataUnit, List<String>> partitionKey() {
return COMPONENT_PARTITION_KEY;
}
@Override
protected List<Condition> toConditions(List<String> values) {
assert values.size() == 4;
return Arrays.asList(
Tables.PARTITIONS.STORAGE_PLUGIN.eq(values.get(0)),
Tables.PARTITIONS.WORKSPACE.eq(values.get(1)),
Tables.PARTITIONS.TABLE_NAME.eq(values.get(2)),
Tables.PARTITIONS.METADATA_KEY.eq(values.get(3)));
}
}
}