diff --git a/core/trino-main/src/main/java/io/trino/json/ir/IrLiteral.java b/core/trino-main/src/main/java/io/trino/json/ir/IrLiteral.java index 36b7d754fd0b..3915c17ecbf0 100644 --- a/core/trino-main/src/main/java/io/trino/json/ir/IrLiteral.java +++ b/core/trino-main/src/main/java/io/trino/json/ir/IrLiteral.java @@ -15,6 +15,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.errorprone.annotations.DoNotCall; import io.trino.spi.block.Block; import io.trino.spi.type.Type; @@ -35,8 +36,8 @@ public record IrLiteral(Optional type, Object value) requireNonNull(value, "value is null"); // (boxed) native representation. No null values allowed. } - @Deprecated // For JSON deserialization only @JsonCreator + @DoNotCall // For JSON deserialization only public static IrLiteral fromJson(@JsonProperty("type") Type type, @JsonProperty("valueAsBlock") Block value) { checkArgument(value.getPositionCount() == 1); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/Partitioning.java b/core/trino-main/src/main/java/io/trino/sql/planner/Partitioning.java index 44bf49249a69..b89c54c9079b 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/Partitioning.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/Partitioning.java @@ -17,6 +17,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; +import com.google.errorprone.annotations.DoNotCall; import com.google.errorprone.annotations.Immutable; import io.trino.Session; import io.trino.metadata.Metadata; @@ -59,8 +60,8 @@ public static Partitioning create(PartitioningHandle handle, List column .collect(toImmutableList())); } - // Factory method for JSON serde only! @JsonCreator + @DoNotCall // For JSON deserialization only public static Partitioning jsonCreate( @JsonProperty("handle") PartitioningHandle handle, @JsonProperty("arguments") List arguments) diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/plan/StatisticAggregationsDescriptor.java b/core/trino-main/src/main/java/io/trino/sql/planner/plan/StatisticAggregationsDescriptor.java index 2ca0511f6ac5..73a30edf0d9c 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/plan/StatisticAggregationsDescriptor.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/plan/StatisticAggregationsDescriptor.java @@ -17,6 +17,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.collect.ImmutableMap; +import com.google.errorprone.annotations.DoNotCall; import io.trino.spi.statistics.ColumnStatisticMetadata; import io.trino.spi.statistics.TableStatisticType; @@ -52,7 +53,7 @@ public StatisticAggregationsDescriptor( } @JsonCreator - @Deprecated // for JSON serialization only + @DoNotCall // for JSON serialization only public static StatisticAggregationsDescriptor fromJson( @JsonProperty("grouping") Map grouping, @JsonProperty("tableStatistics") Map tableStatistics, @@ -84,8 +85,8 @@ public Map getColumnStatistics() } @JsonProperty - @Deprecated // for JSON serialization only - public List> getColumnStatisticsList() + @DoNotCall // for JSON serialization only + public final List> getColumnStatisticsList() { return columnStatistics.entrySet().stream() .map(entry -> new ColumnStatisticAggregationsDescriptor(entry.getKey(), entry.getValue())) diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/plan/TableScanNode.java b/core/trino-main/src/main/java/io/trino/sql/planner/plan/TableScanNode.java index c63390929100..0fa645de6762 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/plan/TableScanNode.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/plan/TableScanNode.java @@ -79,7 +79,7 @@ public static TableScanNode newInstance( * This constructor is for JSON deserialization only. Do not use. * It's marked as @Deprecated to help avoid usage, and not because we plan to remove it. */ - @Deprecated + /* TODO @DoNotCall once it's applicable to constructors */ @JsonCreator public TableScanNode( @JsonProperty("id") PlanNodeId id, diff --git a/core/trino-main/src/main/java/io/trino/sql/relational/ConstantExpression.java b/core/trino-main/src/main/java/io/trino/sql/relational/ConstantExpression.java index 9baaf0b88748..9cbf9fd8c824 100644 --- a/core/trino-main/src/main/java/io/trino/sql/relational/ConstantExpression.java +++ b/core/trino-main/src/main/java/io/trino/sql/relational/ConstantExpression.java @@ -15,6 +15,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.errorprone.annotations.DoNotCall; import io.airlift.slice.Slice; import io.trino.spi.block.Block; import io.trino.spi.block.BlockBuilder; @@ -33,6 +34,7 @@ public final class ConstantExpression extends RowExpression { @JsonCreator + @DoNotCall // For JSON deserialization only public static ConstantExpression fromJson( @JsonProperty Block value, @JsonProperty Type type) diff --git a/core/trino-spi/src/main/java/io/trino/spi/SplitWeight.java b/core/trino-spi/src/main/java/io/trino/spi/SplitWeight.java index 7b0fe2cdfa9e..3d9c96ada266 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/SplitWeight.java +++ b/core/trino-spi/src/main/java/io/trino/spi/SplitWeight.java @@ -82,6 +82,7 @@ public String toString() * to avoid breakages that could arise if {@link SplitWeight#UNIT_VALUE} changes in the future. */ @JsonCreator + // TODO Mark with @DoNotCall public static SplitWeight fromRawValue(long value) { return value == UNIT_VALUE ? STANDARD_WEIGHT : new SplitWeight(value); diff --git a/core/trino-spi/src/main/java/io/trino/spi/function/FunctionDependencyDeclaration.java b/core/trino-spi/src/main/java/io/trino/spi/function/FunctionDependencyDeclaration.java index 382a9a8db3a6..110c6a5b2e95 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/function/FunctionDependencyDeclaration.java +++ b/core/trino-spi/src/main/java/io/trino/spi/function/FunctionDependencyDeclaration.java @@ -15,6 +15,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.errorprone.annotations.DoNotCall; import io.trino.spi.Experimental; import io.trino.spi.type.Type; import io.trino.spi.type.TypeSignature; @@ -80,6 +81,7 @@ public Set getCastDependencies() } @JsonCreator + @DoNotCall // For JSON deserialization only public static FunctionDependencyDeclaration fromJson( @JsonProperty Set typeDependencies, @JsonProperty Set functionDependencies, diff --git a/core/trino-spi/src/main/java/io/trino/spi/function/FunctionMetadata.java b/core/trino-spi/src/main/java/io/trino/spi/function/FunctionMetadata.java index 312ffc94c805..8f96946ebdfa 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/function/FunctionMetadata.java +++ b/core/trino-spi/src/main/java/io/trino/spi/function/FunctionMetadata.java @@ -15,6 +15,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.errorprone.annotations.DoNotCall; import io.trino.spi.Experimental; import java.util.ArrayList; @@ -149,6 +150,7 @@ public boolean isDeprecated() } @JsonCreator + @DoNotCall // For JSON deserialization only public static FunctionMetadata fromJson( @JsonProperty FunctionId functionId, @JsonProperty Signature signature, diff --git a/core/trino-spi/src/main/java/io/trino/spi/function/LongVariableConstraint.java b/core/trino-spi/src/main/java/io/trino/spi/function/LongVariableConstraint.java index 2557cabf708f..3cd9dc973029 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/function/LongVariableConstraint.java +++ b/core/trino-spi/src/main/java/io/trino/spi/function/LongVariableConstraint.java @@ -15,6 +15,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.errorprone.annotations.DoNotCall; import io.trino.spi.Experimental; import java.util.Objects; @@ -71,13 +72,9 @@ public int hashCode() return Objects.hash(name, expression); } - /** - * This method is only visible for JSON deserialization. - * - * @deprecated use builder - */ - @Deprecated @JsonCreator + @DoNotCall // For JSON deserialization only + @Deprecated // Discourage usages in SPI consumers public static LongVariableConstraint fromJson( @JsonProperty("name") String name, @JsonProperty("expression") String expression) diff --git a/core/trino-spi/src/main/java/io/trino/spi/function/Signature.java b/core/trino-spi/src/main/java/io/trino/spi/function/Signature.java index bd5659b1e4c4..2c0f8fb8dea8 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/function/Signature.java +++ b/core/trino-spi/src/main/java/io/trino/spi/function/Signature.java @@ -15,6 +15,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.errorprone.annotations.DoNotCall; import io.trino.spi.Experimental; import io.trino.spi.type.Type; import io.trino.spi.type.TypeSignature; @@ -239,13 +240,9 @@ public Signature build() } } - /** - * This method is only visible for JSON deserialization. - * - * @deprecated use builder - */ - @Deprecated @JsonCreator + @DoNotCall // For JSON deserialization only + @Deprecated // Discourage usages in SPI consumers public static Signature fromJson( @JsonProperty("typeVariableConstraints") List typeVariableConstraints, @JsonProperty("longVariableConstraints") List longVariableConstraints, diff --git a/core/trino-spi/src/main/java/io/trino/spi/function/TypeVariableConstraint.java b/core/trino-spi/src/main/java/io/trino/spi/function/TypeVariableConstraint.java index a5787180336e..69c36df6ae0d 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/function/TypeVariableConstraint.java +++ b/core/trino-spi/src/main/java/io/trino/spi/function/TypeVariableConstraint.java @@ -15,6 +15,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.errorprone.annotations.DoNotCall; import io.trino.spi.Experimental; import io.trino.spi.type.Type; import io.trino.spi.type.TypeSignature; @@ -208,13 +209,9 @@ public TypeVariableConstraint build() } } - /** - * This method is only visible for JSON deserialization. - * - * @deprecated use builder - */ - @Deprecated @JsonCreator + @DoNotCall // For JSON deserialization only + @Deprecated // Discourage usages in SPI consumers public static TypeVariableConstraint fromJson( @JsonProperty("name") String name, @JsonProperty("comparableRequired") boolean comparableRequired, diff --git a/core/trino-spi/src/main/java/io/trino/spi/function/table/ScalarArgument.java b/core/trino-spi/src/main/java/io/trino/spi/function/table/ScalarArgument.java index c059f1fcbca9..44ca552508a5 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/function/table/ScalarArgument.java +++ b/core/trino-spi/src/main/java/io/trino/spi/function/table/ScalarArgument.java @@ -15,6 +15,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.errorprone.annotations.DoNotCall; import io.trino.spi.Experimental; import io.trino.spi.expression.ConnectorExpression; import io.trino.spi.predicate.NullableValue; @@ -60,6 +61,7 @@ public Object getValue() // deserialization @JsonCreator + @DoNotCall // For JSON deserialization only public static ScalarArgument fromNullableValue(@JsonProperty("nullableValue") NullableValue nullableValue) { return new ScalarArgument(nullableValue.getType(), nullableValue.getValue()); diff --git a/core/trino-spi/src/main/java/io/trino/spi/predicate/NullableValue.java b/core/trino-spi/src/main/java/io/trino/spi/predicate/NullableValue.java index 32c25482fb44..6f28f8b950f5 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/predicate/NullableValue.java +++ b/core/trino-spi/src/main/java/io/trino/spi/predicate/NullableValue.java @@ -15,6 +15,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.errorprone.annotations.DoNotCall; import io.trino.spi.block.Block; import io.trino.spi.type.Type; @@ -73,8 +74,8 @@ public static NullableValue asNull(Type type) return new NullableValue(type, null); } - // Jackson deserialization only @JsonCreator + @DoNotCall // For JSON deserialization only public static NullableValue fromSerializable(@JsonProperty("serializable") Serializable serializable) { Type type = serializable.getType(); diff --git a/core/trino-spi/src/main/java/io/trino/spi/predicate/SortedRangeSet.java b/core/trino-spi/src/main/java/io/trino/spi/predicate/SortedRangeSet.java index a14ce100e5fe..e88a78511cc8 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/predicate/SortedRangeSet.java +++ b/core/trino-spi/src/main/java/io/trino/spi/predicate/SortedRangeSet.java @@ -15,6 +15,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.errorprone.annotations.DoNotCall; import io.trino.spi.block.Block; import io.trino.spi.block.BlockBuilder; import io.trino.spi.block.DictionaryBlock; @@ -136,8 +137,9 @@ static SortedRangeSet all(Type type) .build()); } - @Deprecated // For JSON deserialization only @JsonCreator + @DoNotCall // For JSON deserialization only + @Deprecated // Discourage usages in SPI consumers public static SortedRangeSet fromJson( @JsonProperty("type") Type type, @JsonProperty("inclusive") boolean[] inclusive, diff --git a/core/trino-spi/src/main/java/io/trino/spi/predicate/TupleDomain.java b/core/trino-spi/src/main/java/io/trino/spi/predicate/TupleDomain.java index c7177eda8487..7be8cb97bb5d 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/predicate/TupleDomain.java +++ b/core/trino-spi/src/main/java/io/trino/spi/predicate/TupleDomain.java @@ -16,6 +16,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.errorprone.annotations.DoNotCall; import io.trino.spi.connector.ConnectorSession; import io.trino.spi.type.Type; @@ -167,12 +168,9 @@ public static TupleDomain fromFixedValues(Map fixedValu }))); } - /* - * This method is for JSON serialization only. Do not use. - * It's marked as @Deprecated to help avoid usage, and not because we plan to remove it. - */ - @Deprecated @JsonCreator + @DoNotCall // For JSON deserialization only + @Deprecated // Discourage usages in SPI consumers public static TupleDomain fromColumnDomains(@JsonProperty("columnDomains") Optional>> columnDomains) { if (columnDomains.isEmpty()) { @@ -182,12 +180,9 @@ public static TupleDomain fromColumnDomains(@JsonProperty("columnDomains" .collect(toLinkedMap(ColumnDomain::getColumn, ColumnDomain::getDomain))); } - /* - * This method is for JSON serialization only. Do not use. - * It's marked as @Deprecated to help avoid usage, and not because we plan to remove it. - */ - @Deprecated @JsonProperty + @DoNotCall // For JSON serialization only + @Deprecated // Discourage usages in SPI consumers public Optional>> getColumnDomains() { return domains.map(map -> map.entrySet().stream() diff --git a/core/trino-spi/src/main/java/io/trino/spi/statistics/ColumnStatisticMetadata.java b/core/trino-spi/src/main/java/io/trino/spi/statistics/ColumnStatisticMetadata.java index f4a1f209f267..ac5ab127b7dd 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/statistics/ColumnStatisticMetadata.java +++ b/core/trino-spi/src/main/java/io/trino/spi/statistics/ColumnStatisticMetadata.java @@ -16,6 +16,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.errorprone.annotations.DoNotCall; import io.trino.spi.Experimental; import io.trino.spi.expression.FunctionName; @@ -71,8 +72,8 @@ private ColumnStatisticMetadata( } } - @Deprecated // For JSON deserialization only @JsonCreator + @DoNotCall // For JSON deserialization only public static ColumnStatisticMetadata fromJson( @JsonProperty("columnName") String columnName, @JsonProperty("connectorAggregationId") String connectorAggregationId, diff --git a/plugin/trino-accumulo/src/main/java/io/trino/plugin/accumulo/AccumuloSplitManager.java b/plugin/trino-accumulo/src/main/java/io/trino/plugin/accumulo/AccumuloSplitManager.java index 77ecf0ad4df9..645fbd8b7631 100644 --- a/plugin/trino-accumulo/src/main/java/io/trino/plugin/accumulo/AccumuloSplitManager.java +++ b/plugin/trino-accumulo/src/main/java/io/trino/plugin/accumulo/AccumuloSplitManager.java @@ -33,9 +33,9 @@ import io.trino.spi.connector.FixedSplitSource; import io.trino.spi.predicate.Domain; import io.trino.spi.predicate.TupleDomain; -import io.trino.spi.predicate.TupleDomain.ColumnDomain; import java.util.List; +import java.util.Map.Entry; import java.util.Optional; import java.util.stream.Collectors; @@ -89,11 +89,11 @@ public ConnectorSplitSource getSplits( private static Optional getRangeDomain(String rowIdName, TupleDomain constraint) { - if (constraint.getColumnDomains().isPresent()) { - for (ColumnDomain cd : constraint.getColumnDomains().get()) { - AccumuloColumnHandle col = (AccumuloColumnHandle) cd.getColumn(); + if (constraint.getDomains().isPresent()) { + for (Entry columnDomain : constraint.getDomains().get().entrySet()) { + AccumuloColumnHandle col = (AccumuloColumnHandle) columnDomain.getKey(); if (col.getName().equals(rowIdName)) { - return Optional.of(cd.getDomain()); + return Optional.of(columnDomain.getValue()); } } } @@ -111,8 +111,8 @@ private static Optional getRangeDomain(String rowIdName, TupleDomain getColumnConstraints(String rowIdName, TupleDomain constraint) { ImmutableList.Builder constraintBuilder = ImmutableList.builder(); - for (ColumnDomain columnDomain : constraint.getColumnDomains().get()) { - AccumuloColumnHandle columnHandle = (AccumuloColumnHandle) columnDomain.getColumn(); + constraint.getDomains().orElseThrow().forEach((handle, domain) -> { + AccumuloColumnHandle columnHandle = (AccumuloColumnHandle) handle; if (!columnHandle.getName().equals(rowIdName)) { // Family and qualifier will exist for non-row ID columns @@ -120,10 +120,10 @@ private static List getColumnConstraints(String rowIdN columnHandle.getName(), columnHandle.getFamily().get(), columnHandle.getQualifier().get(), - Optional.of(columnDomain.getDomain()), + Optional.of(domain), columnHandle.isIndexed())); } - } + }); return constraintBuilder.build(); } diff --git a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/QueryParameter.java b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/QueryParameter.java index b2180e6eab3f..2324530d62ed 100644 --- a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/QueryParameter.java +++ b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/QueryParameter.java @@ -16,6 +16,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.errorprone.annotations.DoNotCall; import io.trino.spi.block.Block; import io.trino.spi.type.Type; @@ -51,6 +52,7 @@ private QueryParameter(Optional jdbcType, Type type, Optional jdbcType, Type type, Block valueBlock) { requireNonNull(type, "type is null"); diff --git a/plugin/trino-delta-lake/src/main/java/io/trino/plugin/deltalake/statistics/DeltaLakeColumnStatistics.java b/plugin/trino-delta-lake/src/main/java/io/trino/plugin/deltalake/statistics/DeltaLakeColumnStatistics.java index a7e49b2f9f0e..5ded4de91192 100644 --- a/plugin/trino-delta-lake/src/main/java/io/trino/plugin/deltalake/statistics/DeltaLakeColumnStatistics.java +++ b/plugin/trino-delta-lake/src/main/java/io/trino/plugin/deltalake/statistics/DeltaLakeColumnStatistics.java @@ -15,6 +15,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.errorprone.annotations.DoNotCall; import io.airlift.slice.Slices; import io.airlift.stats.cardinality.HyperLogLog; @@ -29,7 +30,8 @@ public class DeltaLakeColumnStatistics private final HyperLogLog ndvSummary; @JsonCreator - public static DeltaLakeColumnStatistics create( + @DoNotCall // For JSON deserialization only + public static DeltaLakeColumnStatistics fromJson( @JsonProperty("totalSizeInBytes") OptionalLong totalSizeInBytes, @JsonProperty("ndvSummary") String ndvSummaryBase64) { diff --git a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/HivePageSinkMetadata.java b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/HivePageSinkMetadata.java index ac1549705e65..44f9e7001a14 100644 --- a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/HivePageSinkMetadata.java +++ b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/HivePageSinkMetadata.java @@ -15,6 +15,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.errorprone.annotations.DoNotCall; import io.trino.spi.connector.SchemaTableName; import java.util.List; @@ -43,6 +44,7 @@ public HivePageSinkMetadata( } @JsonCreator + @DoNotCall // For JSON deserialization only public static HivePageSinkMetadata deserialize( @JsonProperty("schemaTableName") SchemaTableName schemaTableName, @JsonProperty("table") Optional table, diff --git a/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/IcebergMetadata.java b/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/IcebergMetadata.java index 9c3b1e34ec6e..41cd8c7bdd93 100644 --- a/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/IcebergMetadata.java +++ b/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/IcebergMetadata.java @@ -468,7 +468,7 @@ private IcebergTableHandle tableHandleForSnapshot( false, Optional.empty(), ImmutableSet.of(), - Optional.empty()); + Optional.of(false)); } private static long getSnapshotIdFromVersion(ConnectorSession session, Table table, ConnectorTableVersion version) @@ -713,7 +713,7 @@ public ColumnMetadata getColumnMetadata(ConnectorSession session, ConnectorTable public void validateScan(ConnectorSession session, ConnectorTableHandle handle) { IcebergTableHandle table = (IcebergTableHandle) handle; - if (isQueryPartitionFilterRequired(session) && table.getEnforcedPredicate().isAll() && table.getAnalyzeColumns().isEmpty()) { + if (isQueryPartitionFilterRequired(session) && table.getEnforcedPredicate().isAll() && !table.getForAnalyze().orElseThrow()) { Schema schema = SchemaParser.fromJson(table.getTableSchemaJson()); Optional partitionSpec = table.getPartitionSpecJson() .map(partitionSpecJson -> PartitionSpecParser.fromJson(schema, partitionSpecJson)); @@ -2105,7 +2105,7 @@ public ConnectorAnalyzeMetadata getStatisticsCollectionMetadata(ConnectorSession }); return new ConnectorAnalyzeMetadata( - handle.withAnalyzeColumns(analyzeColumnNames.or(() -> Optional.of(ImmutableSet.of()))), + handle.forAnalyze(), getStatisticsCollectionMetadata( tableMetadata, analyzeColumnNames, @@ -2461,7 +2461,7 @@ public Optional> applyLimit(Connect table.isRecordScannedFiles(), table.getMaxScannedFileSize(), table.getConstraintColumns(), - table.getAnalyzeColumns()); + table.getForAnalyze()); return Optional.of(new LimitApplicationResult<>(table, false, false)); } @@ -2562,7 +2562,7 @@ else if (isMetadataColumnId(columnHandle.getId())) { table.isRecordScannedFiles(), table.getMaxScannedFileSize(), Sets.union(table.getConstraintColumns(), newConstraintColumns), - table.getAnalyzeColumns()), + table.getForAnalyze()), remainingConstraint.transformKeys(ColumnHandle.class::cast), extractionResult.remainingExpression(), false)); @@ -2709,10 +2709,10 @@ public TableStatistics getTableStatistics(ConnectorSession session, ConnectorTab originalHandle.getNameMappingJson(), originalHandle.getTableLocation(), originalHandle.getStorageProperties(), - originalHandle.isRecordScannedFiles(), + false, // recordScannedFiles does not affect stats originalHandle.getMaxScannedFileSize(), - originalHandle.getConstraintColumns(), - originalHandle.getAnalyzeColumns()), + ImmutableSet.of(), // constraintColumns do not affect stats + Optional.empty()), // forAnalyze does not affect stats handle -> { Table icebergTable = catalog.loadTable(session, handle.getSchemaTableName()); return TableStatisticsReader.getTableStatistics(typeManager, session, handle, icebergTable); diff --git a/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/IcebergTableHandle.java b/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/IcebergTableHandle.java index b71cd5913da9..78d748063374 100644 --- a/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/IcebergTableHandle.java +++ b/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/IcebergTableHandle.java @@ -18,6 +18,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; +import com.google.errorprone.annotations.DoNotCall; import io.airlift.units.DataSize; import io.trino.spi.connector.CatalogHandle; import io.trino.spi.connector.ConnectorTableHandle; @@ -68,10 +69,11 @@ public class IcebergTableHandle private final boolean recordScannedFiles; private final Optional maxScannedFileSize; - // ANALYZE only - private final Optional> analyzeColumns; + // ANALYZE only. Coordinator-only + private final Optional forAnalyze; @JsonCreator + @DoNotCall // For JSON deserialization only public static IcebergTableHandle fromJsonForDeserializationOnly( @JsonProperty("catalog") CatalogHandle catalog, @JsonProperty("schemaName") String schemaName, @@ -130,7 +132,7 @@ public IcebergTableHandle( boolean recordScannedFiles, Optional maxScannedFileSize, Set constraintColumns, - Optional> analyzeColumns) + Optional forAnalyze) { this.catalog = requireNonNull(catalog, "catalog is null"); this.schemaName = requireNonNull(schemaName, "schemaName is null"); @@ -150,7 +152,7 @@ public IcebergTableHandle( this.recordScannedFiles = recordScannedFiles; this.maxScannedFileSize = requireNonNull(maxScannedFileSize, "maxScannedFileSize is null"); this.constraintColumns = ImmutableSet.copyOf(requireNonNull(constraintColumns, "constraintColumns is null")); - this.analyzeColumns = requireNonNull(analyzeColumns, "analyzeColumns is null"); + this.forAnalyze = requireNonNull(forAnalyze, "forAnalyze is null"); } @JsonProperty @@ -263,9 +265,9 @@ public Set getConstraintColumns() } @JsonIgnore - public Optional> getAnalyzeColumns() + public Optional getForAnalyze() { - return analyzeColumns; + return forAnalyze; } public SchemaTableName getSchemaTableName() @@ -299,10 +301,10 @@ public IcebergTableHandle withProjectedColumns(Set projecte recordScannedFiles, maxScannedFileSize, constraintColumns, - analyzeColumns); + forAnalyze); } - public IcebergTableHandle withAnalyzeColumns(Optional> analyzeColumns) + public IcebergTableHandle forAnalyze() { return new IcebergTableHandle( catalog, @@ -323,7 +325,7 @@ public IcebergTableHandle withAnalyzeColumns(Optional> analyzeColumn recordScannedFiles, maxScannedFileSize, constraintColumns, - analyzeColumns); + Optional.of(true)); } public IcebergTableHandle forOptimize(boolean recordScannedFiles, DataSize maxScannedFileSize) @@ -347,7 +349,7 @@ public IcebergTableHandle forOptimize(boolean recordScannedFiles, DataSize maxSc recordScannedFiles, Optional.of(maxScannedFileSize), constraintColumns, - analyzeColumns); + forAnalyze); } @Override @@ -379,7 +381,7 @@ public boolean equals(Object o) Objects.equals(storageProperties, that.storageProperties) && Objects.equals(maxScannedFileSize, that.maxScannedFileSize) && Objects.equals(constraintColumns, that.constraintColumns) && - Objects.equals(analyzeColumns, that.analyzeColumns); + Objects.equals(forAnalyze, that.forAnalyze); } @Override @@ -404,7 +406,7 @@ public int hashCode() recordScannedFiles, maxScannedFileSize, constraintColumns, - analyzeColumns); + forAnalyze); } @Override diff --git a/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/TestIcebergNodeLocalDynamicSplitPruning.java b/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/TestIcebergNodeLocalDynamicSplitPruning.java index 7733f28ffa62..686e76eed7b0 100644 --- a/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/TestIcebergNodeLocalDynamicSplitPruning.java +++ b/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/TestIcebergNodeLocalDynamicSplitPruning.java @@ -188,7 +188,7 @@ private static ConnectorPageSource createTestingPageSource(HiveTransactionHandle false, Optional.empty(), ImmutableSet.of(), - Optional.empty()), + Optional.of(false)), transaction); FileFormatDataSourceStats stats = new FileFormatDataSourceStats(); diff --git a/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/TestIcebergSplitSource.java b/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/TestIcebergSplitSource.java index 1de4b30b4420..0f54199c85e7 100644 --- a/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/TestIcebergSplitSource.java +++ b/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/TestIcebergSplitSource.java @@ -160,7 +160,7 @@ public void testIncompleteDynamicFilterTimeout() false, Optional.empty(), ImmutableSet.of(), - Optional.empty()); + Optional.of(false)); try (IcebergSplitSource splitSource = new IcebergSplitSource( fileSystemFactory, diff --git a/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/optimizer/TestConnectorPushdownRulesWithIceberg.java b/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/optimizer/TestConnectorPushdownRulesWithIceberg.java index 519b80444b39..900c649508e6 100644 --- a/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/optimizer/TestConnectorPushdownRulesWithIceberg.java +++ b/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/optimizer/TestConnectorPushdownRulesWithIceberg.java @@ -172,7 +172,7 @@ public void testProjectionPushdown() false, Optional.empty(), ImmutableSet.of(), - Optional.empty()); + Optional.of(false)); TableHandle table = new TableHandle(catalogHandle, icebergTable, new HiveTransactionHandle(false)); IcebergColumnHandle fullColumn = partialColumn.getBaseColumn(); @@ -256,7 +256,7 @@ public void testPredicatePushdown() false, Optional.empty(), ImmutableSet.of(), - Optional.empty()); + Optional.of(false)); TableHandle table = new TableHandle(catalogHandle, icebergTable, new HiveTransactionHandle(false)); IcebergColumnHandle column = new IcebergColumnHandle(primitiveColumnIdentity(1, "a"), INTEGER, ImmutableList.of(), INTEGER, Optional.empty()); @@ -307,7 +307,7 @@ public void testColumnPruningProjectionPushdown() false, Optional.empty(), ImmutableSet.of(), - Optional.empty()); + Optional.of(false)); TableHandle table = new TableHandle(catalogHandle, icebergTable, new HiveTransactionHandle(false)); IcebergColumnHandle columnA = new IcebergColumnHandle(primitiveColumnIdentity(0, "a"), INTEGER, ImmutableList.of(), INTEGER, Optional.empty()); @@ -369,7 +369,7 @@ public void testPushdownWithDuplicateExpressions() false, Optional.empty(), ImmutableSet.of(), - Optional.empty()); + Optional.of(false)); TableHandle table = new TableHandle(catalogHandle, icebergTable, new HiveTransactionHandle(false)); IcebergColumnHandle bigintColumn = new IcebergColumnHandle(primitiveColumnIdentity(1, "just_bigint"), BIGINT, ImmutableList.of(), BIGINT, Optional.empty()); diff --git a/plugin/trino-kudu/src/main/java/io/trino/plugin/kudu/KuduClientSession.java b/plugin/trino-kudu/src/main/java/io/trino/plugin/kudu/KuduClientSession.java index 452afc08e631..f3b2ae96c8e7 100644 --- a/plugin/trino-kudu/src/main/java/io/trino/plugin/kudu/KuduClientSession.java +++ b/plugin/trino-kudu/src/main/java/io/trino/plugin/kudu/KuduClientSession.java @@ -32,7 +32,6 @@ import io.trino.spi.connector.SchemaTableName; import io.trino.spi.connector.TableNotFoundException; import io.trino.spi.predicate.DiscreteValues; -import io.trino.spi.predicate.Domain; import io.trino.spi.predicate.EquatableValueSet; import io.trino.spi.predicate.Range; import io.trino.spi.predicate.Ranges; @@ -503,10 +502,9 @@ private void addConstraintPredicates(KuduTable table, KuduScanToken.KuduScanToke } Schema schema = table.getSchema(); - for (TupleDomain.ColumnDomain columnDomain : constraintSummary.getColumnDomains().get()) { - int position = ((KuduColumnHandle) columnDomain.getColumn()).getOrdinalPosition(); + constraintSummary.getDomains().orElseThrow().forEach((columnHandle, domain) -> { + int position = ((KuduColumnHandle) columnHandle).getOrdinalPosition(); ColumnSchema columnSchema = schema.getColumnByIndex(position); - Domain domain = columnDomain.getDomain(); verify(!domain.isNone(), "Domain is none"); if (domain.isAll()) { // no restriction @@ -560,7 +558,7 @@ else if (valueSet instanceof SortedRangeSet) { throw new IllegalStateException("Unexpected domain: " + domain); } } - } + }); } private KuduPredicate createInListPredicate(ColumnSchema columnSchema, DiscreteValues discreteValues)