diff --git a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/file/Column.java b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/file/Column.java new file mode 100644 index 000000000000..fe31efb9c534 --- /dev/null +++ b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/file/Column.java @@ -0,0 +1,125 @@ +/* + * 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 io.trino.plugin.hive.metastore.file; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.errorprone.annotations.Immutable; +import io.trino.plugin.hive.HiveType; + +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +import static com.google.common.base.MoreObjects.toStringHelper; +import static com.google.common.collect.ImmutableList.toImmutableList; +import static java.util.Objects.requireNonNull; + +@Immutable +public class Column +{ + private final String name; + private final HiveType type; + private final Optional comment; + + @JsonCreator + public Column( + @JsonProperty("name") String name, + @JsonProperty("type") HiveType type, + @JsonProperty("comment") Optional comment) + { + this.name = requireNonNull(name, "name is null"); + this.type = requireNonNull(type, "type is null"); + this.comment = requireNonNull(comment, "comment is null"); + } + + @JsonProperty + public String getName() + { + return name; + } + + @JsonProperty + public HiveType getType() + { + return type; + } + + @JsonProperty + public Optional getComment() + { + return comment; + } + + @Override + public String toString() + { + return toStringHelper(this) + .add("name", name) + .add("type", type) + .toString(); + } + + @Override + public boolean equals(Object o) + { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + Column column = (Column) o; + return Objects.equals(name, column.name) && + Objects.equals(type, column.type) && + Objects.equals(comment, column.comment); + } + + @Override + public int hashCode() + { + return Objects.hash(name, type, comment); + } + + public static List fromMetastoreModel(List metastoreColumns) + { + return metastoreColumns.stream() + .map(Column::fromMetastoreModel) + .collect(toImmutableList()); + } + + public static Column fromMetastoreModel(io.trino.plugin.hive.metastore.Column metastoreColumn) + { + return new Column( + metastoreColumn.getName(), + metastoreColumn.getType(), + metastoreColumn.getComment()); + } + + public static List toMetastoreModel(List fileMetastoreColumns) + { + return fileMetastoreColumns.stream() + .map(Column::toMetastoreModel) + .collect(toImmutableList()); + } + + public static io.trino.plugin.hive.metastore.Column toMetastoreModel(Column fileMetastoreColumn) + { + return new io.trino.plugin.hive.metastore.Column( + fileMetastoreColumn.getName(), + fileMetastoreColumn.getType(), + fileMetastoreColumn.getComment()); + } +} diff --git a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/file/FileHiveMetastore.java b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/file/FileHiveMetastore.java index eb97b84e6859..3d20e0f5c858 100644 --- a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/file/FileHiveMetastore.java +++ b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/file/FileHiveMetastore.java @@ -37,7 +37,6 @@ import io.trino.plugin.hive.TableAlreadyExistsException; import io.trino.plugin.hive.TableType; import io.trino.plugin.hive.acid.AcidTransaction; -import io.trino.plugin.hive.metastore.Column; import io.trino.plugin.hive.metastore.Database; import io.trino.plugin.hive.metastore.HiveColumnStatistics; import io.trino.plugin.hive.metastore.HiveMetastore; @@ -1084,7 +1083,7 @@ private boolean isValidPartition(Table table, String partitionName) } } - private List> listPartitions(Path director, List partitionColumns) + private List> listPartitions(Path director, List partitionColumns) { if (partitionColumns.isEmpty()) { return ImmutableList.of(); diff --git a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/file/TableMetadata.java b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/file/TableMetadata.java index f12461e5647c..770b6fd6dea3 100644 --- a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/file/TableMetadata.java +++ b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/file/TableMetadata.java @@ -19,7 +19,6 @@ import com.google.common.collect.ImmutableMap; import io.trino.plugin.hive.HiveBucketProperty; import io.trino.plugin.hive.HiveStorageFormat; -import io.trino.plugin.hive.metastore.Column; import io.trino.plugin.hive.metastore.HiveColumnStatistics; import io.trino.plugin.hive.metastore.Storage; import io.trino.plugin.hive.metastore.StorageFormat; @@ -105,8 +104,8 @@ public TableMetadata(String currentVersion, Table table) writerVersion = Optional.of(requireNonNull(currentVersion, "currentVersion is null")); owner = table.getOwner(); tableType = table.getTableType(); - dataColumns = table.getDataColumns(); - partitionColumns = table.getPartitionColumns(); + dataColumns = Column.fromMetastoreModel(table.getDataColumns()); + partitionColumns = Column.fromMetastoreModel(table.getPartitionColumns()); parameters = table.getParameters(); StorageFormat tableFormat = table.getStorage().getStorageFormat(); @@ -305,8 +304,8 @@ public Table toTable(String databaseName, String tableName, String location) .setBucketProperty(bucketProperty) .setSerdeParameters(serdeParameters) .build(), - dataColumns, - partitionColumns, + Column.toMetastoreModel(dataColumns), + Column.toMetastoreModel(partitionColumns), parameters, viewOriginalText, viewExpandedText,