diff --git a/presto-benchmark/src/main/java/com/facebook/presto/benchmark/CountAggregationBenchmark.java b/presto-benchmark/src/main/java/com/facebook/presto/benchmark/CountAggregationBenchmark.java index 6229a2b137edc..fe89ab8e139e7 100644 --- a/presto-benchmark/src/main/java/com/facebook/presto/benchmark/CountAggregationBenchmark.java +++ b/presto-benchmark/src/main/java/com/facebook/presto/benchmark/CountAggregationBenchmark.java @@ -13,10 +13,10 @@ */ package com.facebook.presto.benchmark; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.AggregationOperator.AggregationOperatorFactory; import com.facebook.presto.operator.OperatorFactory; import com.facebook.presto.operator.aggregation.InternalAggregationFunction; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.sql.planner.plan.AggregationNode.Step; import com.facebook.presto.sql.planner.plan.PlanNodeId; import com.facebook.presto.testing.LocalQueryRunner; @@ -26,7 +26,7 @@ import java.util.Optional; import static com.facebook.presto.benchmark.BenchmarkQueryRunner.createLocalQueryRunner; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.BigintType.BIGINT; public class CountAggregationBenchmark diff --git a/presto-benchmark/src/main/java/com/facebook/presto/benchmark/DoubleSumAggregationBenchmark.java b/presto-benchmark/src/main/java/com/facebook/presto/benchmark/DoubleSumAggregationBenchmark.java index 2bc1284c539df..65089444ef05f 100644 --- a/presto-benchmark/src/main/java/com/facebook/presto/benchmark/DoubleSumAggregationBenchmark.java +++ b/presto-benchmark/src/main/java/com/facebook/presto/benchmark/DoubleSumAggregationBenchmark.java @@ -14,10 +14,10 @@ package com.facebook.presto.benchmark; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.AggregationOperator.AggregationOperatorFactory; import com.facebook.presto.operator.OperatorFactory; import com.facebook.presto.operator.aggregation.InternalAggregationFunction; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.sql.planner.plan.AggregationNode.Step; import com.facebook.presto.sql.planner.plan.PlanNodeId; import com.facebook.presto.testing.LocalQueryRunner; @@ -27,7 +27,7 @@ import java.util.Optional; import static com.facebook.presto.benchmark.BenchmarkQueryRunner.createLocalQueryRunner; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.DoubleType.DOUBLE; public class DoubleSumAggregationBenchmark diff --git a/presto-benchmark/src/main/java/com/facebook/presto/benchmark/HandTpchQuery1.java b/presto-benchmark/src/main/java/com/facebook/presto/benchmark/HandTpchQuery1.java index 6b3b0029ca86d..9541b15ec1b53 100644 --- a/presto-benchmark/src/main/java/com/facebook/presto/benchmark/HandTpchQuery1.java +++ b/presto-benchmark/src/main/java/com/facebook/presto/benchmark/HandTpchQuery1.java @@ -14,7 +14,6 @@ package com.facebook.presto.benchmark; import com.facebook.presto.benchmark.HandTpchQuery1.TpchQuery1Operator.TpchQuery1OperatorFactory; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.DriverContext; import com.facebook.presto.operator.HashAggregationOperator.HashAggregationOperatorFactory; import com.facebook.presto.operator.Operator; @@ -24,6 +23,7 @@ import com.facebook.presto.spi.Page; import com.facebook.presto.spi.PageBuilder; import com.facebook.presto.spi.block.Block; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; import com.facebook.presto.sql.planner.plan.AggregationNode.Step; import com.facebook.presto.sql.planner.plan.PlanNodeId; @@ -37,7 +37,7 @@ import java.util.Optional; import static com.facebook.presto.benchmark.BenchmarkQueryRunner.createLocalQueryRunner; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.DateType.DATE; import static com.facebook.presto.spi.type.DoubleType.DOUBLE; diff --git a/presto-benchmark/src/main/java/com/facebook/presto/benchmark/HandTpchQuery6.java b/presto-benchmark/src/main/java/com/facebook/presto/benchmark/HandTpchQuery6.java index 867482b6c0b2c..dff2bd616d1aa 100644 --- a/presto-benchmark/src/main/java/com/facebook/presto/benchmark/HandTpchQuery6.java +++ b/presto-benchmark/src/main/java/com/facebook/presto/benchmark/HandTpchQuery6.java @@ -13,7 +13,6 @@ */ package com.facebook.presto.benchmark; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.AggregationOperator.AggregationOperatorFactory; import com.facebook.presto.operator.FilterAndProjectOperator; import com.facebook.presto.operator.OperatorFactory; @@ -26,6 +25,7 @@ import com.facebook.presto.spi.ConnectorSession; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.block.Block; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.sql.gen.PageFunctionCompiler; import com.facebook.presto.sql.planner.plan.AggregationNode.Step; import com.facebook.presto.sql.planner.plan.PlanNodeId; @@ -39,7 +39,7 @@ import java.util.function.Supplier; import static com.facebook.presto.benchmark.BenchmarkQueryRunner.createLocalQueryRunner; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.DateType.DATE; import static com.facebook.presto.spi.type.DoubleType.DOUBLE; diff --git a/presto-benchmark/src/main/java/com/facebook/presto/benchmark/HashAggregationBenchmark.java b/presto-benchmark/src/main/java/com/facebook/presto/benchmark/HashAggregationBenchmark.java index cd68617c2c1b3..e267bede741b9 100644 --- a/presto-benchmark/src/main/java/com/facebook/presto/benchmark/HashAggregationBenchmark.java +++ b/presto-benchmark/src/main/java/com/facebook/presto/benchmark/HashAggregationBenchmark.java @@ -13,10 +13,10 @@ */ package com.facebook.presto.benchmark; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.HashAggregationOperator.HashAggregationOperatorFactory; import com.facebook.presto.operator.OperatorFactory; import com.facebook.presto.operator.aggregation.InternalAggregationFunction; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; import com.facebook.presto.sql.planner.plan.AggregationNode.Step; import com.facebook.presto.sql.planner.plan.PlanNodeId; @@ -29,7 +29,7 @@ import java.util.Optional; import static com.facebook.presto.benchmark.BenchmarkQueryRunner.createLocalQueryRunner; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.DoubleType.DOUBLE; import static io.airlift.units.DataSize.Unit.MEGABYTE; diff --git a/presto-benchmark/src/main/java/com/facebook/presto/benchmark/PredicateFilterBenchmark.java b/presto-benchmark/src/main/java/com/facebook/presto/benchmark/PredicateFilterBenchmark.java index 0f16654011019..8962899f88d2a 100644 --- a/presto-benchmark/src/main/java/com/facebook/presto/benchmark/PredicateFilterBenchmark.java +++ b/presto-benchmark/src/main/java/com/facebook/presto/benchmark/PredicateFilterBenchmark.java @@ -16,10 +16,10 @@ import com.facebook.presto.operator.FilterAndProjectOperator; import com.facebook.presto.operator.OperatorFactory; import com.facebook.presto.operator.project.PageProcessor; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.sql.gen.ExpressionCompiler; import com.facebook.presto.sql.gen.PageFunctionCompiler; import com.facebook.presto.sql.planner.plan.PlanNodeId; -import com.facebook.presto.sql.relational.RowExpression; import com.facebook.presto.testing.LocalQueryRunner; import com.google.common.collect.ImmutableList; import io.airlift.units.DataSize; @@ -29,7 +29,7 @@ import java.util.function.Supplier; import static com.facebook.presto.benchmark.BenchmarkQueryRunner.createLocalQueryRunner; -import static com.facebook.presto.metadata.Signature.internalOperator; +import static com.facebook.presto.metadata.InternalFunction.internalOperator; import static com.facebook.presto.spi.function.OperatorType.GREATER_THAN_OR_EQUAL; import static com.facebook.presto.spi.type.BooleanType.BOOLEAN; import static com.facebook.presto.spi.type.DoubleType.DOUBLE; @@ -50,7 +50,7 @@ public PredicateFilterBenchmark(LocalQueryRunner localQueryRunner) protected List createOperatorFactories() { OperatorFactory tableScanOperator = createTableScanOperator(0, new PlanNodeId("test"), "orders", "totalprice"); - RowExpression filter = call( + ColumnExpression filter = call( internalOperator(GREATER_THAN_OR_EQUAL, BOOLEAN.getTypeSignature(), ImmutableList.of(DOUBLE.getTypeSignature(), DOUBLE.getTypeSignature())), BOOLEAN, field(0, DOUBLE), diff --git a/presto-geospatial/src/test/java/com/facebook/presto/plugin/geospatial/TestSpatialPartitioningInternalAggregation.java b/presto-geospatial/src/test/java/com/facebook/presto/plugin/geospatial/TestSpatialPartitioningInternalAggregation.java index 2a9761662851f..7544a49929da2 100644 --- a/presto-geospatial/src/test/java/com/facebook/presto/plugin/geospatial/TestSpatialPartitioningInternalAggregation.java +++ b/presto-geospatial/src/test/java/com/facebook/presto/plugin/geospatial/TestSpatialPartitioningInternalAggregation.java @@ -20,8 +20,6 @@ import com.facebook.presto.block.BlockAssertions; import com.facebook.presto.geospatial.KdbTreeUtils; import com.facebook.presto.geospatial.Rectangle; -import com.facebook.presto.metadata.FunctionKind; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.aggregation.Accumulator; import com.facebook.presto.operator.aggregation.AccumulatorFactory; import com.facebook.presto.operator.aggregation.GroupedAccumulator; @@ -30,6 +28,8 @@ import com.facebook.presto.spi.Page; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.TypeSignature; import com.google.common.collect.ImmutableList; import com.google.common.primitives.Ints; diff --git a/presto-geospatial/src/test/java/com/facebook/presto/plugin/geospatial/aggregation/AbstractTestGeoAggregationFunctions.java b/presto-geospatial/src/test/java/com/facebook/presto/plugin/geospatial/aggregation/AbstractTestGeoAggregationFunctions.java index 80a303d74512d..afa56f19159a6 100644 --- a/presto-geospatial/src/test/java/com/facebook/presto/plugin/geospatial/aggregation/AbstractTestGeoAggregationFunctions.java +++ b/presto-geospatial/src/test/java/com/facebook/presto/plugin/geospatial/aggregation/AbstractTestGeoAggregationFunctions.java @@ -16,13 +16,13 @@ import com.esri.core.geometry.ogc.OGCGeometry; import com.facebook.presto.block.BlockAssertions; import com.facebook.presto.geospatial.serde.GeometrySerde; -import com.facebook.presto.metadata.FunctionKind; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.aggregation.InternalAggregationFunction; import com.facebook.presto.operator.scalar.AbstractTestFunctions; import com.facebook.presto.plugin.geospatial.GeoPlugin; import com.facebook.presto.plugin.geospatial.GeometryType; import com.facebook.presto.spi.Page; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; import io.airlift.slice.Slice; import org.testng.annotations.BeforeClass; diff --git a/presto-hive/src/test/java/com/facebook/presto/hive/TestOrcPageSourceMemoryTracking.java b/presto-hive/src/test/java/com/facebook/presto/hive/TestOrcPageSourceMemoryTracking.java index d712b2a097ab2..0344c7027e2c2 100644 --- a/presto-hive/src/test/java/com/facebook/presto/hive/TestOrcPageSourceMemoryTracking.java +++ b/presto-hive/src/test/java/com/facebook/presto/hive/TestOrcPageSourceMemoryTracking.java @@ -31,11 +31,11 @@ import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.classloader.ThreadContextClassLoader; import com.facebook.presto.spi.predicate.TupleDomain; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.spi.type.Type; import com.facebook.presto.sql.gen.ExpressionCompiler; import com.facebook.presto.sql.gen.PageFunctionCompiler; import com.facebook.presto.sql.planner.plan.PlanNodeId; -import com.facebook.presto.sql.relational.RowExpression; import com.facebook.presto.testing.TestingConnectorSession; import com.facebook.presto.testing.TestingSplit; import com.facebook.presto.testing.TestingTransactionHandle; @@ -505,7 +505,7 @@ public SourceOperator newTableScanOperator(DriverContext driverContext) public SourceOperator newScanFilterAndProjectOperator(DriverContext driverContext) { ConnectorPageSource pageSource = newPageSource(); - ImmutableList.Builder projectionsBuilder = ImmutableList.builder(); + ImmutableList.Builder projectionsBuilder = ImmutableList.builder(); for (int i = 0; i < types.size(); i++) { projectionsBuilder.add(field(i, types.get(i))); } diff --git a/presto-main/src/main/java/com/facebook/presto/connector/ConnectorManager.java b/presto-main/src/main/java/com/facebook/presto/connector/ConnectorManager.java index e76862afed1cc..0fad6fd470fdb 100644 --- a/presto-main/src/main/java/com/facebook/presto/connector/ConnectorManager.java +++ b/presto-main/src/main/java/com/facebook/presto/connector/ConnectorManager.java @@ -39,6 +39,7 @@ import com.facebook.presto.spi.connector.ConnectorPageSinkProvider; import com.facebook.presto.spi.connector.ConnectorPageSourceProvider; import com.facebook.presto.spi.connector.ConnectorRecordSetProvider; +import com.facebook.presto.spi.connector.ConnectorRuleProvider; import com.facebook.presto.spi.connector.ConnectorSplitManager; import com.facebook.presto.spi.procedure.Procedure; import com.facebook.presto.spi.session.PropertyMetadata; @@ -85,6 +86,7 @@ public class ConnectorManager private final SplitManager splitManager; private final PageSourceManager pageSourceManager; private final IndexManager indexManager; + private final ConnectorOptimizationRuleManager optimizationRuleManager; private final NodePartitioningManager nodePartitioningManager; private final PageSinkManager pageSinkManager; @@ -112,7 +114,7 @@ public ConnectorManager( SplitManager splitManager, PageSourceManager pageSourceManager, IndexManager indexManager, - NodePartitioningManager nodePartitioningManager, + ConnectorOptimizationRuleManager optimizationRuleManager, NodePartitioningManager nodePartitioningManager, PageSinkManager pageSinkManager, HandleResolver handleResolver, InternalNodeManager nodeManager, @@ -128,6 +130,7 @@ public ConnectorManager( this.splitManager = splitManager; this.pageSourceManager = pageSourceManager; this.indexManager = indexManager; + this.optimizationRuleManager = optimizationRuleManager; this.nodePartitioningManager = nodePartitioningManager; this.pageSinkManager = pageSinkManager; this.handleResolver = handleResolver; @@ -256,6 +259,9 @@ private synchronized void addConnectorInternal(MaterializedConnector connector) connector.getIndexProvider() .ifPresent(indexProvider -> indexManager.addIndexProvider(connectorId, indexProvider)); + connector.getRuleProvider() + .ifPresent(ruleProvider -> optimizationRuleManager.addRuleProvider(connectorId, ruleProvider)); + connector.getPartitioningProvider() .ifPresent(partitioningProvider -> nodePartitioningManager.addPartitioningProvider(connectorId, partitioningProvider)); @@ -288,6 +294,7 @@ private synchronized void removeConnectorInternal(ConnectorId connectorId) splitManager.removeConnectorSplitManager(connectorId); pageSourceManager.removeConnectorPageSourceProvider(connectorId); pageSinkManager.removeConnectorPageSinkProvider(connectorId); + optimizationRuleManager.removeRuleProvider(connectorId); indexManager.removeIndexProvider(connectorId); nodePartitioningManager.removePartitioningProvider(connectorId); metadataManager.getProcedureRegistry().removeProcedures(connectorId); @@ -332,6 +339,7 @@ private static class MaterializedConnector private final ConnectorPageSourceProvider pageSourceProvider; private final Optional pageSinkProvider; private final Optional indexProvider; + private final Optional ruleProvider; private final Optional partitioningProvider; private final Optional accessControl; private final List> sessionProperties; @@ -395,6 +403,15 @@ public MaterializedConnector(ConnectorId connectorId, Connector connector) } this.indexProvider = Optional.ofNullable(indexProvider); + ConnectorRuleProvider ruleProvider = null; + try { + ruleProvider = connector.getConnectorRuleProvider(); + requireNonNull(ruleProvider, format("Connector %s returned a null rule provider", connectorId)); + } + catch (UnsupportedOperationException ignored) { + } + this.ruleProvider = Optional.ofNullable(ruleProvider); + ConnectorNodePartitioningProvider partitioningProvider = null; try { partitioningProvider = connector.getNodePartitioningProvider(); @@ -473,6 +490,11 @@ public Optional getIndexProvider() return indexProvider; } + public Optional getRuleProvider() + { + return ruleProvider; + } + public Optional getPartitioningProvider() { return partitioningProvider; diff --git a/presto-main/src/main/java/com/facebook/presto/connector/ConnectorOptimizationRuleManager.java b/presto-main/src/main/java/com/facebook/presto/connector/ConnectorOptimizationRuleManager.java new file mode 100644 index 0000000000000..605a74cebf124 --- /dev/null +++ b/presto-main/src/main/java/com/facebook/presto/connector/ConnectorOptimizationRuleManager.java @@ -0,0 +1,51 @@ +/* + * 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 com.facebook.presto.connector; + +import com.facebook.presto.spi.connector.ConnectorOptimizationRule; +import com.facebook.presto.spi.connector.ConnectorRuleProvider; +import com.google.common.collect.ImmutableSet; + +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +import static com.google.common.base.Preconditions.checkState; +import static java.util.Objects.requireNonNull; + +public class ConnectorOptimizationRuleManager +{ + private final ConcurrentMap providers = new ConcurrentHashMap<>(); + + public void addRuleProvider(ConnectorId connectorId, ConnectorRuleProvider ruleProvider) + { + requireNonNull(connectorId, "connectorId is null"); + requireNonNull(ruleProvider, "ruleProvider is null"); + checkState(providers.putIfAbsent(connectorId, ruleProvider) == null, "RuleProvider for connector '%s' is already registered", connectorId); + } + + public void removeRuleProvider(ConnectorId connectorId) + { + providers.remove(connectorId); + } + + public Set getRules(ConnectorId connectorId) + { + ConnectorRuleProvider provider = providers.get(connectorId); + if (provider == null) { + return ImmutableSet.of(); + } + return provider.getRules(); + } +} diff --git a/presto-main/src/main/java/com/facebook/presto/cost/StatsUtil.java b/presto-main/src/main/java/com/facebook/presto/cost/StatsUtil.java index 886e7766c16b3..984a255ebadb1 100644 --- a/presto-main/src/main/java/com/facebook/presto/cost/StatsUtil.java +++ b/presto-main/src/main/java/com/facebook/presto/cost/StatsUtil.java @@ -16,8 +16,8 @@ import com.facebook.presto.Session; import com.facebook.presto.metadata.FunctionRegistry; import com.facebook.presto.metadata.Metadata; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.spi.ConnectorSession; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.BigintType; import com.facebook.presto.spi.type.BooleanType; import com.facebook.presto.spi.type.DateType; diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/FunctionInvokerProvider.java b/presto-main/src/main/java/com/facebook/presto/metadata/FunctionInvokerProvider.java index 4ff7a5e209076..28619f267b5ec 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/FunctionInvokerProvider.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/FunctionInvokerProvider.java @@ -21,6 +21,7 @@ import com.facebook.presto.spi.function.InvocationConvention; import com.facebook.presto.spi.function.InvocationConvention.InvocationArgumentConvention; import com.facebook.presto.spi.function.InvocationConvention.InvocationReturnConvention; +import com.facebook.presto.spi.function.Signature; import com.google.common.annotations.VisibleForTesting; import java.util.List; diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/FunctionRegistry.java b/presto-main/src/main/java/com/facebook/presto/metadata/FunctionRegistry.java index 0d9b9ded21bd5..80585d04a11a3 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/FunctionRegistry.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/FunctionRegistry.java @@ -146,10 +146,13 @@ import com.facebook.presto.spi.PrestoException; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockEncodingSerde; +import com.facebook.presto.spi.function.FunctionKind; import com.facebook.presto.spi.function.OperatorType; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeManager; import com.facebook.presto.spi.type.TypeSignature; +import com.facebook.presto.spi.type.TypeSignatureParameter; import com.facebook.presto.spi.type.VarcharType; import com.facebook.presto.sql.analyzer.FeaturesConfig; import com.facebook.presto.sql.analyzer.TypeSignatureProvider; @@ -213,10 +216,7 @@ import java.util.Set; import java.util.stream.Collectors; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; -import static com.facebook.presto.metadata.FunctionKind.SCALAR; -import static com.facebook.presto.metadata.FunctionKind.WINDOW; -import static com.facebook.presto.metadata.Signature.internalOperator; +import static com.facebook.presto.metadata.InternalFunction.internalOperator; import static com.facebook.presto.metadata.SignatureBinder.applyBoundVariables; import static com.facebook.presto.operator.aggregation.ArbitraryAggregationFunction.ARBITRARY_AGGREGATION; import static com.facebook.presto.operator.aggregation.ChecksumAggregationFunction.CHECKSUM_AGGREGATION; @@ -295,6 +295,9 @@ import static com.facebook.presto.spi.StandardErrorCode.AMBIGUOUS_FUNCTION_CALL; import static com.facebook.presto.spi.StandardErrorCode.FUNCTION_IMPLEMENTATION_MISSING; import static com.facebook.presto.spi.StandardErrorCode.FUNCTION_NOT_FOUND; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; +import static com.facebook.presto.spi.function.FunctionKind.WINDOW; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.BooleanType.BOOLEAN; import static com.facebook.presto.spi.type.DoubleType.DOUBLE; @@ -694,6 +697,15 @@ public List list() .collect(toImmutableList()); } + public Set getFunctions(Signature signature) + { + // TODO Better function matching? + return functions.functions.entries().stream() + .filter(entry -> entry.getValue().getSignature().getName().equals(signature.getName())) + .map(entry -> entry.getKey()) + .collect(toImmutableSet()); + } + public boolean isAggregationFunction(QualifiedName name) { return Iterables.any(functions.get(name), function -> function.getSignature().getKind() == AGGREGATE); @@ -711,6 +723,22 @@ public Signature resolveFunction(QualifiedName name, List return match.get(); } + if (parameterTypes.size() == 1 && !parameterTypes.get(0).hasDependency()) { + match = exactCandidates.stream() + .map(SqlFunction::getSignature) + .filter(signature -> + signature.getKind() == AGGREGATE && + isSpecializedFunction(signature) && + getAggregateFunctionImplementation(signature) + .getIntermediateType() + .getTypeSignature() + .equals(parameterTypes.get(0).getTypeSignature())) + .findAny(); + if (match.isPresent()) { + return match.get(); + } + } + List genericCandidates = allCandidates.stream() .filter(function -> !function.getSignature().getTypeVariableConstraints().isEmpty()) .collect(Collectors.toList()); @@ -756,6 +784,19 @@ public Signature resolveFunction(QualifiedName name, List throw new PrestoException(FUNCTION_NOT_FOUND, message); } + private boolean isSpecializedFunction(Signature signature) + { + return isSpecializedType(signature.getReturnType()) && signature.getArgumentTypes().stream() + .anyMatch(this::isSpecializedType); + } + + private boolean isSpecializedType(TypeSignature typeSignature) + { + return !typeSignature.getParameters() + .stream() + .anyMatch(TypeSignatureParameter::isVariable); + } + private Optional matchFunctionExact(List candidates, List actualParameters) { return matchFunction(candidates, actualParameters, false); @@ -957,7 +998,7 @@ public InternalAggregationFunction getAggregateFunctionImplementation(Signature try { return specializedAggregationCache.getUnchecked(getSpecializedFunctionKey(signature)); } - catch (UncheckedExecutionException e) { + catch (Exception e) { throwIfInstanceOf(e.getCause(), PrestoException.class); throw e; } @@ -1180,6 +1221,11 @@ public static String mangleOperatorName(String operatorName) return OPERATOR_PREFIX + operatorName; } + public static boolean isOperator(String functionName) + { + return functionName.startsWith(OPERATOR_PREFIX); + } + @VisibleForTesting public static OperatorType unmangleOperator(String mangledName) { diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/InternalFunction.java b/presto-main/src/main/java/com/facebook/presto/metadata/InternalFunction.java new file mode 100644 index 0000000000000..3f8421e43ee2a --- /dev/null +++ b/presto-main/src/main/java/com/facebook/presto/metadata/InternalFunction.java @@ -0,0 +1,70 @@ +/* + * 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 com.facebook.presto.metadata; + +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.OperatorType; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.type.Type; +import com.facebook.presto.spi.type.TypeSignature; +import com.google.common.collect.ImmutableList; + +import java.util.List; + +public class InternalFunction +{ + private InternalFunction() + { + } + + public static Signature internalOperator(OperatorType operator, Type returnType, List argumentTypes) + { + return internalScalarFunction(FunctionRegistry.mangleOperatorName(operator.name()), returnType.getTypeSignature(), argumentTypes.stream().map(Type::getTypeSignature).collect(ImmutableList.toImmutableList())); + } + + public static Signature internalOperator(OperatorType operator, TypeSignature returnType, TypeSignature... argumentTypes) + { + return internalOperator(operator, returnType, ImmutableList.copyOf(argumentTypes)); + } + + public static Signature internalOperator(OperatorType operator, TypeSignature returnType, List argumentTypes) + { + return internalScalarFunction(FunctionRegistry.mangleOperatorName(operator.name()), returnType, argumentTypes); + } + + public static Signature internalOperator(String name, TypeSignature returnType, List argumentTypes) + { + return internalScalarFunction(FunctionRegistry.mangleOperatorName(name), returnType, argumentTypes); + } + + public static Signature internalOperator(String name, TypeSignature returnType, TypeSignature... argumentTypes) + { + return internalScalarFunction(FunctionRegistry.mangleOperatorName(name), returnType, ImmutableList.copyOf(argumentTypes)); + } + + public static Signature internalScalarFunction(String name, TypeSignature returnType, TypeSignature... argumentTypes) + { + return internalScalarFunction(name, returnType, ImmutableList.copyOf(argumentTypes)); + } + + public static Signature internalScalarFunction(String name, TypeSignature returnType, List argumentTypes) + { + return new Signature(name, FunctionKind.SCALAR, ImmutableList.of(), ImmutableList.of(), returnType, argumentTypes, false); + } + + public static SignatureBuilder builder() + { + return new SignatureBuilder(); + } +} diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/Metadata.java b/presto-main/src/main/java/com/facebook/presto/metadata/Metadata.java index bd1f866036089..48247f7e04bda 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/Metadata.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/Metadata.java @@ -24,6 +24,7 @@ import com.facebook.presto.spi.SystemTable; import com.facebook.presto.spi.block.BlockEncodingSerde; import com.facebook.presto.spi.connector.ConnectorOutputMetadata; +import com.facebook.presto.spi.connector.ConnectorTransactionHandle; import com.facebook.presto.spi.predicate.TupleDomain; import com.facebook.presto.spi.security.GrantInfo; import com.facebook.presto.spi.security.Privilege; @@ -332,4 +333,6 @@ public interface Metadata ColumnPropertyManager getColumnPropertyManager(); AnalyzePropertyManager getAnalyzePropertyManager(); + + ConnectorTransactionHandle getTransactionHandle(Session session, ConnectorId connectorId); } diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/MetadataManager.java b/presto-main/src/main/java/com/facebook/presto/metadata/MetadataManager.java index eaa7eb7e44d85..b7c91dc248632 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/MetadataManager.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/MetadataManager.java @@ -1026,6 +1026,12 @@ public AnalyzePropertyManager getAnalyzePropertyManager() return analyzePropertyManager; } + @Override + public ConnectorTransactionHandle getTransactionHandle(Session session, ConnectorId connectorId) + { + return getCatalogMetadata(session, connectorId).getTransactionHandleFor(connectorId); + } + private ViewDefinition deserializeView(String data) { try { diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/PolymorphicScalarFunction.java b/presto-main/src/main/java/com/facebook/presto/metadata/PolymorphicScalarFunction.java index 7e7dcd4d03d5c..8e39171dce78d 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/PolymorphicScalarFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/PolymorphicScalarFunction.java @@ -21,6 +21,7 @@ import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention; import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ReturnPlaceConvention; import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ScalarImplementationChoice; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeManager; import com.facebook.presto.spi.type.TypeSignature; diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/PolymorphicScalarFunctionBuilder.java b/presto-main/src/main/java/com/facebook/presto/metadata/PolymorphicScalarFunctionBuilder.java index e29e6bee2475d..3672135d67339 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/PolymorphicScalarFunctionBuilder.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/PolymorphicScalarFunctionBuilder.java @@ -17,6 +17,7 @@ import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty; import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ReturnPlaceConvention; import com.facebook.presto.spi.function.OperatorType; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeManager; import com.google.common.collect.ImmutableList; diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/SignatureBinder.java b/presto-main/src/main/java/com/facebook/presto/metadata/SignatureBinder.java index 19d6b249643d9..ebf18b1257f0d 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/SignatureBinder.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/SignatureBinder.java @@ -13,6 +13,10 @@ */ package com.facebook.presto.metadata; +import com.facebook.presto.spi.function.LongVariableConstraint; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.function.TypeVariableConstraint; +import com.facebook.presto.spi.type.FunctionType; import com.facebook.presto.spi.type.NamedTypeSignature; import com.facebook.presto.spi.type.ParameterKind; import com.facebook.presto.spi.type.Type; @@ -20,7 +24,6 @@ import com.facebook.presto.spi.type.TypeSignature; import com.facebook.presto.spi.type.TypeSignatureParameter; import com.facebook.presto.sql.analyzer.TypeSignatureProvider; -import com.facebook.presto.type.FunctionType; import com.google.common.base.VerifyException; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/SignatureBuilder.java b/presto-main/src/main/java/com/facebook/presto/metadata/SignatureBuilder.java index 227d579b906d1..b7830a3b9efbd 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/SignatureBuilder.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/SignatureBuilder.java @@ -13,14 +13,18 @@ */ package com.facebook.presto.metadata; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.LongVariableConstraint; import com.facebook.presto.spi.function.OperatorType; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.function.TypeVariableConstraint; import com.facebook.presto.spi.type.TypeSignature; import com.google.common.collect.ImmutableList; import java.util.List; -import static com.facebook.presto.metadata.FunctionKind.SCALAR; import static com.facebook.presto.metadata.FunctionRegistry.mangleOperatorName; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static java.util.Arrays.asList; import static java.util.Collections.emptyList; import static java.util.Objects.requireNonNull; diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/SqlAggregationFunction.java b/presto-main/src/main/java/com/facebook/presto/metadata/SqlAggregationFunction.java index 13ade2c68007f..26e2b555b1463 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/SqlAggregationFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/SqlAggregationFunction.java @@ -15,13 +15,17 @@ import com.facebook.presto.operator.aggregation.AggregationFromAnnotationsParser; import com.facebook.presto.operator.aggregation.InternalAggregationFunction; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.LongVariableConstraint; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.function.TypeVariableConstraint; import com.facebook.presto.spi.type.TypeManager; import com.facebook.presto.spi.type.TypeSignature; import com.google.common.collect.ImmutableList; import java.util.List; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.collect.ImmutableList.toImmutableList; import static java.util.Objects.requireNonNull; diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/SqlFunction.java b/presto-main/src/main/java/com/facebook/presto/metadata/SqlFunction.java index 04141ef664788..73542cb801c10 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/SqlFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/SqlFunction.java @@ -13,6 +13,8 @@ */ package com.facebook.presto.metadata; +import com.facebook.presto.spi.function.Signature; + public interface SqlFunction { Signature getSignature(); diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/SqlOperator.java b/presto-main/src/main/java/com/facebook/presto/metadata/SqlOperator.java index d20412399c764..a167c81f1d008 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/SqlOperator.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/SqlOperator.java @@ -13,7 +13,11 @@ */ package com.facebook.presto.metadata; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.LongVariableConstraint; import com.facebook.presto.spi.function.OperatorType; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.function.TypeVariableConstraint; import com.facebook.presto.spi.type.TypeSignature; import java.util.List; diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/SqlScalarFunction.java b/presto-main/src/main/java/com/facebook/presto/metadata/SqlScalarFunction.java index 656e9f120c665..b210bfdc32f69 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/SqlScalarFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/SqlScalarFunction.java @@ -14,9 +14,10 @@ package com.facebook.presto.metadata; import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.TypeManager; -import static com.facebook.presto.metadata.FunctionKind.SCALAR; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.google.common.base.Preconditions.checkArgument; import static java.util.Objects.requireNonNull; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/ParametricImplementation.java b/presto-main/src/main/java/com/facebook/presto/operator/ParametricImplementation.java index 9096469172c80..79a0b732cb50b 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/ParametricImplementation.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/ParametricImplementation.java @@ -13,7 +13,7 @@ */ package com.facebook.presto.operator; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; public interface ParametricImplementation { diff --git a/presto-main/src/main/java/com/facebook/presto/operator/ParametricImplementationsGroup.java b/presto-main/src/main/java/com/facebook/presto/operator/ParametricImplementationsGroup.java index 08cb36ad7435d..4809a99c6c34b 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/ParametricImplementationsGroup.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/ParametricImplementationsGroup.java @@ -13,7 +13,7 @@ */ package com.facebook.presto.operator; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.TypeSignature; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/ScanFilterAndProjectOperator.java b/presto-main/src/main/java/com/facebook/presto/operator/ScanFilterAndProjectOperator.java index 1181c1479d4e6..7eb255a9de593 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/ScanFilterAndProjectOperator.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/ScanFilterAndProjectOperator.java @@ -221,6 +221,7 @@ public Page getOutput() ConnectorPageSource source = pageSourceProvider.createPageSource(operatorContext.getSession(), split, columns); if (source instanceof RecordPageSource) { cursor = ((RecordPageSource) source).getCursor(); + pageSource = source; } else { pageSource = source; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/AbstractMinMaxAggregationFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/AbstractMinMaxAggregationFunction.java index c0ffcd824bcb1..f4e2ddc7dddfe 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/AbstractMinMaxAggregationFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/AbstractMinMaxAggregationFunction.java @@ -37,8 +37,7 @@ import java.lang.invoke.MethodHandle; import java.util.List; -import static com.facebook.presto.metadata.Signature.internalOperator; -import static com.facebook.presto.metadata.Signature.orderableTypeParameter; +import static com.facebook.presto.metadata.InternalFunction.internalOperator; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.BLOCK_INDEX; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.BLOCK_INPUT_CHANNEL; @@ -47,6 +46,7 @@ import static com.facebook.presto.operator.aggregation.AggregationUtils.generateAggregationName; import static com.facebook.presto.spi.function.OperatorType.GREATER_THAN; import static com.facebook.presto.spi.function.OperatorType.LESS_THAN; +import static com.facebook.presto.spi.function.Signature.orderableTypeParameter; import static com.facebook.presto.spi.type.BooleanType.BOOLEAN; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.Failures.internalError; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/AbstractMinMaxNAggregationFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/AbstractMinMaxNAggregationFunction.java index d904e56937b9e..327bb16d7d7c9 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/AbstractMinMaxNAggregationFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/AbstractMinMaxNAggregationFunction.java @@ -34,7 +34,6 @@ import java.util.List; import java.util.function.Function; -import static com.facebook.presto.metadata.Signature.orderableTypeParameter; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.BLOCK_INDEX; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.BLOCK_INPUT_CHANNEL; @@ -42,6 +41,7 @@ import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.STATE; import static com.facebook.presto.operator.aggregation.AggregationUtils.generateAggregationName; import static com.facebook.presto.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT; +import static com.facebook.presto.spi.function.Signature.orderableTypeParameter; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.Failures.checkCondition; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/AggregationImplementation.java b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/AggregationImplementation.java index 089527237f354..62124ee60a077 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/AggregationImplementation.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/AggregationImplementation.java @@ -14,11 +14,7 @@ package com.facebook.presto.operator.aggregation; import com.facebook.presto.metadata.BoundVariables; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.LongVariableConstraint; -import com.facebook.presto.metadata.Signature; -import com.facebook.presto.metadata.TypeVariableConstraint; import com.facebook.presto.operator.ParametricImplementation; import com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType; import com.facebook.presto.operator.annotations.FunctionsParserHelper; @@ -28,9 +24,13 @@ import com.facebook.presto.spi.function.AggregationState; import com.facebook.presto.spi.function.BlockIndex; import com.facebook.presto.spi.function.BlockPosition; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.LongVariableConstraint; import com.facebook.presto.spi.function.OutputFunction; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.function.SqlType; import com.facebook.presto.spi.function.TypeParameter; +import com.facebook.presto.spi.function.TypeVariableConstraint; import com.facebook.presto.spi.type.TypeManager; import com.facebook.presto.spi.type.TypeSignature; import com.google.common.collect.ImmutableList; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/ArbitraryAggregationFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/ArbitraryAggregationFunction.java index 6e81e343ff26d..2850df91f520d 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/ArbitraryAggregationFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/ArbitraryAggregationFunction.java @@ -35,12 +35,12 @@ import java.lang.invoke.MethodHandle; import java.util.List; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.BLOCK_INDEX; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.BLOCK_INPUT_CHANNEL; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.STATE; import static com.facebook.presto.operator.aggregation.AggregationUtils.generateAggregationName; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.Reflection.methodHandle; import static com.google.common.collect.ImmutableList.toImmutableList; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/ChecksumAggregationFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/ChecksumAggregationFunction.java index 69f5ff45dc5d5..1831702c5af06 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/ChecksumAggregationFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/ChecksumAggregationFunction.java @@ -31,12 +31,12 @@ import java.lang.invoke.MethodHandle; import java.util.List; -import static com.facebook.presto.metadata.Signature.comparableTypeParameter; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.BLOCK_INDEX; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.NULLABLE_BLOCK_INPUT_CHANNEL; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.STATE; import static com.facebook.presto.operator.aggregation.AggregationUtils.generateAggregationName; +import static com.facebook.presto.spi.function.Signature.comparableTypeParameter; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.spi.type.VarbinaryType.VARBINARY; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/CountColumn.java b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/CountColumn.java index 7f7e42feae9d3..9f9ca8299007c 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/CountColumn.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/CountColumn.java @@ -32,12 +32,12 @@ import java.lang.invoke.MethodHandle; import java.util.List; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.BLOCK_INDEX; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.BLOCK_INPUT_CHANNEL; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.STATE; import static com.facebook.presto.operator.aggregation.AggregationUtils.generateAggregationName; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.Reflection.methodHandle; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/DecimalSumAggregation.java b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/DecimalSumAggregation.java index 93e3b5cdc8b0d..45d8bea097c47 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/DecimalSumAggregation.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/DecimalSumAggregation.java @@ -14,7 +14,6 @@ package com.facebook.presto.operator.aggregation; import com.facebook.presto.metadata.BoundVariables; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.FunctionRegistry; import com.facebook.presto.metadata.SqlAggregationFunction; import com.facebook.presto.operator.aggregation.AggregationMetadata.AccumulatorStateDescriptor; @@ -25,6 +24,7 @@ import com.facebook.presto.spi.block.BlockBuilder; import com.facebook.presto.spi.function.AccumulatorState; import com.facebook.presto.spi.function.AccumulatorStateSerializer; +import com.facebook.presto.spi.function.FunctionKind; import com.facebook.presto.spi.type.DecimalType; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeManager; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/MapAggregationFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/MapAggregationFunction.java index 5736e4d46f8ae..894c08de9d998 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/MapAggregationFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/MapAggregationFunction.java @@ -33,14 +33,14 @@ import java.lang.invoke.MethodHandle; import java.util.List; -import static com.facebook.presto.metadata.Signature.comparableTypeParameter; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.BLOCK_INDEX; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.BLOCK_INPUT_CHANNEL; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.NULLABLE_BLOCK_INPUT_CHANNEL; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.STATE; import static com.facebook.presto.operator.aggregation.AggregationUtils.generateAggregationName; +import static com.facebook.presto.spi.function.Signature.comparableTypeParameter; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.Reflection.methodHandle; import static com.google.common.collect.ImmutableList.toImmutableList; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/MapUnionAggregation.java b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/MapUnionAggregation.java index 97395ee304688..9fde654c85734 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/MapUnionAggregation.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/MapUnionAggregation.java @@ -33,12 +33,12 @@ import java.lang.invoke.MethodHandle; import java.util.List; -import static com.facebook.presto.metadata.Signature.comparableTypeParameter; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.INPUT_CHANNEL; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.STATE; import static com.facebook.presto.operator.aggregation.AggregationUtils.generateAggregationName; +import static com.facebook.presto.spi.function.Signature.comparableTypeParameter; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.Reflection.methodHandle; import static com.google.common.collect.ImmutableList.toImmutableList; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/MergeQuantileDigestFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/MergeQuantileDigestFunction.java index 193204349c9c3..e376cb56aa64c 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/MergeQuantileDigestFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/MergeQuantileDigestFunction.java @@ -36,13 +36,13 @@ import java.lang.invoke.MethodHandle; import java.util.List; -import static com.facebook.presto.metadata.Signature.comparableTypeParameter; import static com.facebook.presto.operator.aggregation.AggregationMetadata.AccumulatorStateDescriptor; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.BLOCK_INDEX; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.BLOCK_INPUT_CHANNEL; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.STATE; import static com.facebook.presto.operator.aggregation.AggregationUtils.generateAggregationName; +import static com.facebook.presto.spi.function.Signature.comparableTypeParameter; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.MoreMath.nearlyEqual; import static com.facebook.presto.util.Reflection.methodHandle; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/ParametricAggregation.java b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/ParametricAggregation.java index 2f766698aec51..c5b6b99b5ece2 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/ParametricAggregation.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/ParametricAggregation.java @@ -15,7 +15,6 @@ import com.facebook.presto.metadata.BoundVariables; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlAggregationFunction; import com.facebook.presto.operator.ParametricImplementationsGroup; import com.facebook.presto.operator.aggregation.AggregationMetadata.AccumulatorStateDescriptor; @@ -25,6 +24,7 @@ import com.facebook.presto.spi.PrestoException; import com.facebook.presto.spi.function.AccumulatorStateFactory; import com.facebook.presto.spi.function.AccumulatorStateSerializer; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeManager; import com.facebook.presto.spi.type.TypeSignature; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/QuantileDigestAggregationFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/QuantileDigestAggregationFunction.java index 558ad10f8c8a3..44721a762b66f 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/QuantileDigestAggregationFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/QuantileDigestAggregationFunction.java @@ -34,7 +34,6 @@ import java.util.List; import java.util.stream.Collectors; -import static com.facebook.presto.metadata.Signature.comparableTypeParameter; import static com.facebook.presto.operator.aggregation.AggregationMetadata.AccumulatorStateDescriptor; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.INPUT_CHANNEL; @@ -46,6 +45,7 @@ import static com.facebook.presto.operator.scalar.QuantileDigestFunctions.DEFAULT_WEIGHT; import static com.facebook.presto.operator.scalar.QuantileDigestFunctions.verifyAccuracy; import static com.facebook.presto.operator.scalar.QuantileDigestFunctions.verifyWeight; +import static com.facebook.presto.spi.function.Signature.comparableTypeParameter; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.DoubleType.DOUBLE; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/ReduceAggregationFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/ReduceAggregationFunction.java index c5a3a6816be27..e75f40dbeacba 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/ReduceAggregationFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/ReduceAggregationFunction.java @@ -33,11 +33,11 @@ import java.lang.invoke.MethodHandle; import java.util.List; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.INPUT_CHANNEL; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.STATE; import static com.facebook.presto.operator.aggregation.AggregationUtils.generateAggregationName; import static com.facebook.presto.spi.StandardErrorCode.NOT_SUPPORTED; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.Reflection.methodHandle; import static java.lang.String.format; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/arrayagg/ArrayAggregationFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/arrayagg/ArrayAggregationFunction.java index ccfca03b937d8..9235cbda1092a 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/arrayagg/ArrayAggregationFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/arrayagg/ArrayAggregationFunction.java @@ -36,12 +36,12 @@ import java.lang.invoke.MethodHandle; import java.util.List; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.BLOCK_INDEX; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.BLOCK_INPUT_CHANNEL; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.NULLABLE_BLOCK_INPUT_CHANNEL; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.STATE; import static com.facebook.presto.operator.aggregation.AggregationUtils.generateAggregationName; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.Reflection.methodHandle; import static com.google.common.collect.ImmutableList.toImmutableList; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/histogram/Histogram.java b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/histogram/Histogram.java index 7245b01553d0c..dd4c43e1b794b 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/histogram/Histogram.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/histogram/Histogram.java @@ -33,12 +33,12 @@ import java.lang.invoke.MethodHandle; import java.util.List; -import static com.facebook.presto.metadata.Signature.comparableTypeParameter; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.BLOCK_INDEX; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.BLOCK_INPUT_CHANNEL; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.STATE; import static com.facebook.presto.operator.aggregation.AggregationUtils.generateAggregationName; +import static com.facebook.presto.spi.function.Signature.comparableTypeParameter; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.Reflection.methodHandle; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/minmaxby/AbstractMinMaxBy.java b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/minmaxby/AbstractMinMaxBy.java index 9a4e41c10b118..87105587e94a1 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/minmaxby/AbstractMinMaxBy.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/minmaxby/AbstractMinMaxBy.java @@ -47,8 +47,6 @@ import java.util.List; import java.util.Map; -import static com.facebook.presto.metadata.Signature.orderableTypeParameter; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.BLOCK_INDEX; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.BLOCK_INPUT_CHANNEL; @@ -59,6 +57,8 @@ import static com.facebook.presto.operator.aggregation.minmaxby.TwoNullableValueStateMapping.getStateSerializer; import static com.facebook.presto.spi.function.OperatorType.GREATER_THAN; import static com.facebook.presto.spi.function.OperatorType.LESS_THAN; +import static com.facebook.presto.spi.function.Signature.orderableTypeParameter; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.sql.gen.BytecodeUtils.loadConstant; import static com.facebook.presto.sql.gen.SqlTypeBytecodeExpression.constantType; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/minmaxby/AbstractMinMaxByNAggregationFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/minmaxby/AbstractMinMaxByNAggregationFunction.java index 181705d951302..1e2c1df417c11 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/minmaxby/AbstractMinMaxByNAggregationFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/minmaxby/AbstractMinMaxByNAggregationFunction.java @@ -38,8 +38,6 @@ import java.util.List; import java.util.function.Function; -import static com.facebook.presto.metadata.Signature.orderableTypeParameter; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.BLOCK_INDEX; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.BLOCK_INPUT_CHANNEL; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.INPUT_CHANNEL; @@ -47,6 +45,8 @@ import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.STATE; import static com.facebook.presto.operator.aggregation.AggregationUtils.generateAggregationName; import static com.facebook.presto.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT; +import static com.facebook.presto.spi.function.Signature.orderableTypeParameter; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.Failures.checkCondition; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/multimapagg/MultimapAggregationFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/multimapagg/MultimapAggregationFunction.java index 9630fa559555c..125eeb59eb5c2 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/multimapagg/MultimapAggregationFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/multimapagg/MultimapAggregationFunction.java @@ -36,14 +36,14 @@ import java.lang.invoke.MethodHandle; import java.util.List; -import static com.facebook.presto.metadata.Signature.comparableTypeParameter; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.BLOCK_INDEX; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.BLOCK_INPUT_CHANNEL; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.NULLABLE_BLOCK_INPUT_CHANNEL; import static com.facebook.presto.operator.aggregation.AggregationMetadata.ParameterMetadata.ParameterType.STATE; import static com.facebook.presto.operator.aggregation.AggregationUtils.generateAggregationName; +import static com.facebook.presto.spi.function.Signature.comparableTypeParameter; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.type.TypeUtils.expectedValueSize; import static com.facebook.presto.util.Reflection.methodHandle; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/annotations/FunctionImplementationDependency.java b/presto-main/src/main/java/com/facebook/presto/operator/annotations/FunctionImplementationDependency.java index 0ae06a61e2889..a5071fdfeb107 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/annotations/FunctionImplementationDependency.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/annotations/FunctionImplementationDependency.java @@ -19,7 +19,7 @@ import java.util.List; import java.util.Optional; -import static com.facebook.presto.metadata.Signature.internalScalarFunction; +import static com.facebook.presto.metadata.InternalFunction.internalScalarFunction; public final class FunctionImplementationDependency extends ScalarImplementationDependency diff --git a/presto-main/src/main/java/com/facebook/presto/operator/annotations/FunctionsParserHelper.java b/presto-main/src/main/java/com/facebook/presto/operator/annotations/FunctionsParserHelper.java index 1c670ef9f5974..a3382f034043c 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/annotations/FunctionsParserHelper.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/annotations/FunctionsParserHelper.java @@ -13,17 +13,17 @@ */ package com.facebook.presto.operator.annotations; -import com.facebook.presto.metadata.LongVariableConstraint; -import com.facebook.presto.metadata.Signature; -import com.facebook.presto.metadata.TypeVariableConstraint; import com.facebook.presto.spi.function.Description; import com.facebook.presto.spi.function.IsNull; import com.facebook.presto.spi.function.LiteralParameters; +import com.facebook.presto.spi.function.LongVariableConstraint; import com.facebook.presto.spi.function.OperatorType; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.function.SqlNullable; import com.facebook.presto.spi.function.SqlType; import com.facebook.presto.spi.function.TypeParameter; import com.facebook.presto.spi.function.TypeParameterSpecialization; +import com.facebook.presto.spi.function.TypeVariableConstraint; import com.facebook.presto.spi.type.TypeSignature; import com.facebook.presto.type.Constraint; import com.google.common.collect.ImmutableList; @@ -47,9 +47,6 @@ import java.util.function.Predicate; import java.util.stream.Stream; -import static com.facebook.presto.metadata.Signature.comparableTypeParameter; -import static com.facebook.presto.metadata.Signature.orderableTypeParameter; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.annotations.ImplementationDependency.isImplementationDependencyAnnotation; import static com.facebook.presto.spi.function.OperatorType.BETWEEN; import static com.facebook.presto.spi.function.OperatorType.CAST; @@ -60,6 +57,9 @@ import static com.facebook.presto.spi.function.OperatorType.LESS_THAN; import static com.facebook.presto.spi.function.OperatorType.LESS_THAN_OR_EQUAL; import static com.facebook.presto.spi.function.OperatorType.NOT_EQUAL; +import static com.facebook.presto.spi.function.Signature.comparableTypeParameter; +import static com.facebook.presto.spi.function.Signature.orderableTypeParameter; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.collect.ImmutableList.toImmutableList; import static com.google.common.collect.ImmutableSet.toImmutableSet; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/annotations/OperatorImplementationDependency.java b/presto-main/src/main/java/com/facebook/presto/operator/annotations/OperatorImplementationDependency.java index cf8b67cee7d11..9fab0695116af 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/annotations/OperatorImplementationDependency.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/annotations/OperatorImplementationDependency.java @@ -20,7 +20,7 @@ import java.util.List; import java.util.Optional; -import static com.facebook.presto.metadata.Signature.internalOperator; +import static com.facebook.presto.metadata.InternalFunction.internalOperator; import static java.util.Objects.requireNonNull; public final class OperatorImplementationDependency diff --git a/presto-main/src/main/java/com/facebook/presto/operator/annotations/ScalarImplementationDependency.java b/presto-main/src/main/java/com/facebook/presto/operator/annotations/ScalarImplementationDependency.java index f7644f9b15cab..b02bd4c4f2b10 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/annotations/ScalarImplementationDependency.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/annotations/ScalarImplementationDependency.java @@ -15,8 +15,8 @@ import com.facebook.presto.metadata.BoundVariables; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.spi.function.InvocationConvention; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.TypeManager; import java.lang.invoke.MethodHandle; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/index/FieldSetFilteringRecordSet.java b/presto-main/src/main/java/com/facebook/presto/operator/index/FieldSetFilteringRecordSet.java index 3477908c1dab1..4fe956d2cfd66 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/index/FieldSetFilteringRecordSet.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/index/FieldSetFilteringRecordSet.java @@ -28,7 +28,7 @@ import java.util.List; import java.util.Set; -import static com.facebook.presto.metadata.Signature.internalOperator; +import static com.facebook.presto.metadata.InternalFunction.internalOperator; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Throwables.throwIfUnchecked; import static java.lang.Boolean.TRUE; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/project/GeneratedPageProjection.java b/presto-main/src/main/java/com/facebook/presto/operator/project/GeneratedPageProjection.java index 516fc4dbedcb5..7a43a662af529 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/project/GeneratedPageProjection.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/project/GeneratedPageProjection.java @@ -19,8 +19,8 @@ import com.facebook.presto.spi.Page; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.spi.type.Type; -import com.facebook.presto.sql.relational.RowExpression; import java.lang.invoke.MethodHandle; @@ -30,14 +30,14 @@ public class GeneratedPageProjection implements PageProjection { - private final RowExpression projection; + private final ColumnExpression projection; private final boolean isDeterministic; private final InputChannels inputChannels; private final MethodHandle pageProjectionWorkFactory; private BlockBuilder blockBuilder; - public GeneratedPageProjection(RowExpression projection, boolean isDeterministic, InputChannels inputChannels, MethodHandle pageProjectionWorkFactory) + public GeneratedPageProjection(ColumnExpression projection, boolean isDeterministic, InputChannels inputChannels, MethodHandle pageProjectionWorkFactory) { this.projection = requireNonNull(projection, "projection is null"); this.isDeterministic = isDeterministic; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/project/PageFieldsToInputParametersRewriter.java b/presto-main/src/main/java/com/facebook/presto/operator/project/PageFieldsToInputParametersRewriter.java index 8b7da048b841a..fd125c48c5b23 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/project/PageFieldsToInputParametersRewriter.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/project/PageFieldsToInputParametersRewriter.java @@ -13,13 +13,14 @@ */ package com.facebook.presto.operator.project; -import com.facebook.presto.sql.relational.CallExpression; -import com.facebook.presto.sql.relational.ConstantExpression; -import com.facebook.presto.sql.relational.InputReferenceExpression; -import com.facebook.presto.sql.relational.LambdaDefinitionExpression; -import com.facebook.presto.sql.relational.RowExpression; -import com.facebook.presto.sql.relational.RowExpressionVisitor; -import com.facebook.presto.sql.relational.VariableReferenceExpression; +import com.facebook.presto.spi.relation.column.CallExpression; +import com.facebook.presto.spi.relation.column.ColumnExpression; +import com.facebook.presto.spi.relation.column.ColumnExpressionVisitor; +import com.facebook.presto.spi.relation.column.ColumnReferenceExpression; +import com.facebook.presto.spi.relation.column.ConstantExpression; +import com.facebook.presto.spi.relation.column.InputReferenceExpression; +import com.facebook.presto.spi.relation.column.LambdaDefinitionExpression; +import com.facebook.presto.spi.relation.column.VariableReferenceExpression; import com.google.common.collect.ImmutableList; import java.util.ArrayList; @@ -38,16 +39,16 @@ public final class PageFieldsToInputParametersRewriter { private PageFieldsToInputParametersRewriter() {} - public static Result rewritePageFieldsToInputParameters(RowExpression expression) + public static Result rewritePageFieldsToInputParameters(ColumnExpression expression) { Visitor visitor = new Visitor(); - RowExpression rewrittenProjection = expression.accept(visitor, null); + ColumnExpression rewrittenProjection = expression.accept(visitor, null); InputChannels inputChannels = new InputChannels(visitor.getInputChannels()); return new Result(rewrittenProjection, inputChannels); } private static class Visitor - implements RowExpressionVisitor + implements ColumnExpressionVisitor { private final Map fieldToParameter = new HashMap<>(); private final List inputChannels = new ArrayList<>(); @@ -59,7 +60,7 @@ public List getInputChannels() } @Override - public RowExpression visitInputReference(InputReferenceExpression reference, Void context) + public ColumnExpression visitInputReference(InputReferenceExpression reference, Void context) { int parameter = getParameterForField(reference); return field(parameter, reference.getType()); @@ -74,7 +75,7 @@ private Integer getParameterForField(InputReferenceExpression reference) } @Override - public RowExpression visitCall(CallExpression call, Void context) + public ColumnExpression visitCall(CallExpression call, Void context) { return new CallExpression( call.getSignature(), @@ -85,13 +86,13 @@ public RowExpression visitCall(CallExpression call, Void context) } @Override - public RowExpression visitConstant(ConstantExpression literal, Void context) + public ColumnExpression visitConstant(ConstantExpression literal, Void context) { return literal; } @Override - public RowExpression visitLambda(LambdaDefinitionExpression lambda, Void context) + public ColumnExpression visitLambda(LambdaDefinitionExpression lambda, Void context) { return new LambdaDefinitionExpression( lambda.getArgumentTypes(), @@ -100,7 +101,13 @@ public RowExpression visitLambda(LambdaDefinitionExpression lambda, Void context } @Override - public RowExpression visitVariableReference(VariableReferenceExpression reference, Void context) + public ColumnExpression visitVariableReference(VariableReferenceExpression reference, Void context) + { + return reference; + } + + @Override + public ColumnExpression visitColumnReference(ColumnReferenceExpression reference, Void context) { return reference; } @@ -108,16 +115,16 @@ public RowExpression visitVariableReference(VariableReferenceExpression referenc public static class Result { - private final RowExpression rewrittenExpression; + private final ColumnExpression rewrittenExpression; private final InputChannels inputChannels; - public Result(RowExpression rewrittenExpression, InputChannels inputChannels) + public Result(ColumnExpression rewrittenExpression, InputChannels inputChannels) { this.rewrittenExpression = rewrittenExpression; this.inputChannels = inputChannels; } - public RowExpression getRewrittenExpression() + public ColumnExpression getRewrittenExpression() { return rewrittenExpression; } diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/AbstractGreatestLeast.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/AbstractGreatestLeast.java index e9db53c692fc2..1d99684bea915 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/AbstractGreatestLeast.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/AbstractGreatestLeast.java @@ -15,12 +15,12 @@ import com.facebook.presto.annotation.UsedByGeneratedCode; import com.facebook.presto.metadata.BoundVariables; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.spi.PrestoException; +import com.facebook.presto.spi.function.FunctionKind; import com.facebook.presto.spi.function.OperatorType; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.StandardTypes; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeManager; @@ -39,12 +39,12 @@ import java.util.List; import java.util.stream.IntStream; -import static com.facebook.presto.metadata.Signature.internalOperator; -import static com.facebook.presto.metadata.Signature.orderableTypeParameter; +import static com.facebook.presto.metadata.InternalFunction.internalOperator; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT; import static com.facebook.presto.spi.StandardErrorCode.NOT_SUPPORTED; +import static com.facebook.presto.spi.function.Signature.orderableTypeParameter; import static com.facebook.presto.spi.type.BooleanType.BOOLEAN; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.sql.gen.BytecodeUtils.invoke; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ApplyFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ApplyFunction.java index 6189ac08d17ad..831d277a108ad 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ApplyFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ApplyFunction.java @@ -14,10 +14,10 @@ package com.facebook.presto.operator.scalar; import com.facebook.presto.metadata.BoundVariables; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlScalarFunction; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeManager; import com.facebook.presto.sql.gen.lambda.UnaryFunctionInterface; @@ -25,10 +25,10 @@ import java.lang.invoke.MethodHandle; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.USE_BOXED_TYPE; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.Reflection.methodHandle; import static com.google.common.primitives.Primitives.wrap; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayConcatFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayConcatFunction.java index c5fd211f9f673..96cbd2ee0bd20 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayConcatFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayConcatFunction.java @@ -15,14 +15,14 @@ import com.facebook.presto.annotation.UsedByGeneratedCode; import com.facebook.presto.metadata.BoundVariables; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.spi.PageBuilder; import com.facebook.presto.spi.PrestoException; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeManager; import com.facebook.presto.sql.gen.VarArgsToArrayAdapterGenerator; @@ -31,10 +31,10 @@ import java.lang.invoke.MethodHandle; import java.util.Optional; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.sql.gen.VarArgsToArrayAdapterGenerator.generateVarArgsToArrayAdapter; import static com.facebook.presto.util.Reflection.methodHandle; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayConstructor.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayConstructor.java index 067e5829d6409..72ec71e920688 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayConstructor.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayConstructor.java @@ -14,13 +14,13 @@ package com.facebook.presto.operator.scalar; import com.facebook.presto.metadata.BoundVariables; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; import com.facebook.presto.spi.block.BlockBuilderStatus; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeManager; import com.facebook.presto.sql.gen.CallSiteBinder; @@ -42,10 +42,10 @@ import java.util.List; import java.util.Map; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.USE_BOXED_TYPE; import static com.facebook.presto.spi.StandardErrorCode.NOT_SUPPORTED; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.sql.gen.SqlTypeBytecodeExpression.constantType; import static com.facebook.presto.util.CompilerUtils.defineClass; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayFlattenFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayFlattenFunction.java index a4b426d8b2307..6961426895593 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayFlattenFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayFlattenFunction.java @@ -14,12 +14,12 @@ package com.facebook.presto.operator.scalar; import com.facebook.presto.metadata.BoundVariables; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.StandardTypes; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeManager; @@ -28,9 +28,9 @@ import java.lang.invoke.MethodHandle; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.Reflection.methodHandle; import static java.lang.Math.toIntExact; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayJoin.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayJoin.java index c2813ade80ab4..c44316252639f 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayJoin.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayJoin.java @@ -15,9 +15,7 @@ import com.facebook.presto.annotation.UsedByGeneratedCode; import com.facebook.presto.metadata.BoundVariables; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty; import com.facebook.presto.spi.ConnectorSession; @@ -25,6 +23,8 @@ import com.facebook.presto.spi.PrestoException; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.StandardTypes; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeManager; @@ -40,14 +40,14 @@ import java.util.Map; import java.util.Optional; -import static com.facebook.presto.metadata.Signature.internalOperator; -import static com.facebook.presto.metadata.Signature.typeVariable; +import static com.facebook.presto.metadata.InternalFunction.internalOperator; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.USE_BOXED_TYPE; import static com.facebook.presto.spi.StandardErrorCode.GENERIC_INTERNAL_ERROR; import static com.facebook.presto.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT; import static com.facebook.presto.spi.function.OperatorType.CAST; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.spi.type.VarcharType.VARCHAR; import static com.facebook.presto.util.Reflection.methodHandle; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayReduceFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayReduceFunction.java index aaec87fa1ac64..b8f27e90eb963 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayReduceFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayReduceFunction.java @@ -14,11 +14,11 @@ package com.facebook.presto.operator.scalar; import com.facebook.presto.metadata.BoundVariables; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.spi.block.Block; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeManager; import com.facebook.presto.sql.gen.lambda.BinaryFunctionInterface; @@ -28,11 +28,11 @@ import java.lang.invoke.MethodHandle; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.USE_BOXED_TYPE; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.spi.type.TypeUtils.readNativeValue; import static com.facebook.presto.util.Reflection.methodHandle; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArraySubscriptOperator.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArraySubscriptOperator.java index 8de352cadb8cb..e749215263f8c 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArraySubscriptOperator.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArraySubscriptOperator.java @@ -26,11 +26,11 @@ import java.lang.invoke.MethodHandle; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT; import static com.facebook.presto.spi.function.OperatorType.SUBSCRIPT; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.Reflection.methodHandle; import static com.google.common.base.Preconditions.checkArgument; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayToArrayCast.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayToArrayCast.java index 2338afeea17ec..c8fc1667faafe 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayToArrayCast.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayToArrayCast.java @@ -15,10 +15,10 @@ import com.facebook.presto.metadata.BoundVariables; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlOperator; import com.facebook.presto.spi.ConnectorSession; import com.facebook.presto.spi.block.Block; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeManager; import com.facebook.presto.sql.gen.ArrayGeneratorUtils; @@ -36,11 +36,11 @@ import java.lang.invoke.MethodHandle; -import static com.facebook.presto.metadata.Signature.internalOperator; -import static com.facebook.presto.metadata.Signature.typeVariable; +import static com.facebook.presto.metadata.InternalFunction.internalOperator; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.OperatorType.CAST; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.CompilerUtils.defineClass; import static com.facebook.presto.util.CompilerUtils.makeClassName; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayToElementConcatFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayToElementConcatFunction.java index 74e774bf013e6..8c492cee6badb 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayToElementConcatFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayToElementConcatFunction.java @@ -14,11 +14,11 @@ package com.facebook.presto.operator.scalar; import com.facebook.presto.metadata.BoundVariables; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.spi.block.Block; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeManager; import com.google.common.collect.ImmutableList; @@ -26,9 +26,9 @@ import java.lang.invoke.MethodHandle; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.Reflection.methodHandle; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayToJsonCast.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayToJsonCast.java index 8206afc7a9013..40f009877bf43 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayToJsonCast.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayToJsonCast.java @@ -33,11 +33,11 @@ import java.io.IOException; import java.lang.invoke.MethodHandle; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.scalar.JsonOperators.JSON_FACTORY; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.StandardErrorCode.INVALID_CAST_ARGUMENT; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.Failures.checkCondition; import static com.facebook.presto.util.JsonUtil.canCastToJson; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayTransformFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayTransformFunction.java index 1baa0cd5530d7..c81bee31484ec 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayTransformFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayTransformFunction.java @@ -14,13 +14,13 @@ package com.facebook.presto.operator.scalar; import com.facebook.presto.metadata.BoundVariables; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.spi.PageBuilder; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.ArrayType; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeManager; @@ -41,10 +41,10 @@ import java.util.List; import java.util.Optional; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.sql.gen.SqlTypeBytecodeExpression.constantType; import static com.facebook.presto.type.UnknownType.UNKNOWN; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/CastFromUnknownOperator.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/CastFromUnknownOperator.java index fe9362e317c3e..5bf6cf5681d21 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/CastFromUnknownOperator.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/CastFromUnknownOperator.java @@ -23,10 +23,10 @@ import java.lang.invoke.MethodHandle; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.OperatorType.CAST; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.Reflection.methodHandle; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ConcatFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ConcatFunction.java index 7f2445a3d01e0..b7279e757ae33 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ConcatFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ConcatFunction.java @@ -15,11 +15,11 @@ import com.facebook.presto.annotation.UsedByGeneratedCode; import com.facebook.presto.metadata.BoundVariables; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.spi.PrestoException; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.TypeManager; import com.facebook.presto.spi.type.TypeSignature; import com.google.common.collect.ImmutableList; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ElementToArrayConcatFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ElementToArrayConcatFunction.java index 7e66c2bf3b985..48600771c1df7 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ElementToArrayConcatFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ElementToArrayConcatFunction.java @@ -14,11 +14,11 @@ package com.facebook.presto.operator.scalar; import com.facebook.presto.metadata.BoundVariables; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.spi.block.Block; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeManager; import com.google.common.collect.ImmutableList; @@ -26,9 +26,9 @@ import java.lang.invoke.MethodHandle; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.Reflection.methodHandle; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/IdentityCast.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/IdentityCast.java index bc4de8054ad12..8800e5fafd364 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/IdentityCast.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/IdentityCast.java @@ -24,9 +24,9 @@ import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.google.common.base.Preconditions.checkArgument; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/InvokeFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/InvokeFunction.java index 64a122d5cc6ba..acbd06e43c77f 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/InvokeFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/InvokeFunction.java @@ -15,10 +15,10 @@ package com.facebook.presto.operator.scalar; import com.facebook.presto.metadata.BoundVariables; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlScalarFunction; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeManager; import com.facebook.presto.sql.gen.lambda.LambdaFunctionInterface; @@ -26,8 +26,8 @@ import java.lang.invoke.MethodHandle; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.Reflection.methodHandle; import static com.google.common.primitives.Primitives.wrap; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonStringToArrayCast.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonStringToArrayCast.java index 115e665d88bff..da283456761cc 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonStringToArrayCast.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonStringToArrayCast.java @@ -15,15 +15,15 @@ import com.facebook.presto.metadata.BoundVariables; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlScalarFunction; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.StandardTypes; import com.facebook.presto.spi.type.TypeManager; import com.google.common.collect.ImmutableList; -import static com.facebook.presto.metadata.FunctionKind.SCALAR; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.scalar.JsonToArrayCast.JSON_TO_ARRAY; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; public final class JsonStringToArrayCast diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonStringToMapCast.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonStringToMapCast.java index 9ea49a0a9ca81..54b39ba85cbbe 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonStringToMapCast.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonStringToMapCast.java @@ -15,16 +15,16 @@ import com.facebook.presto.metadata.BoundVariables; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlScalarFunction; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.StandardTypes; import com.facebook.presto.spi.type.TypeManager; import com.google.common.collect.ImmutableList; -import static com.facebook.presto.metadata.FunctionKind.SCALAR; -import static com.facebook.presto.metadata.Signature.comparableTypeParameter; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.scalar.JsonToMapCast.JSON_TO_MAP; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; +import static com.facebook.presto.spi.function.Signature.comparableTypeParameter; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; public final class JsonStringToMapCast diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonStringToRowCast.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonStringToRowCast.java index bc785027ddbba..fab9b6a27b982 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonStringToRowCast.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonStringToRowCast.java @@ -15,15 +15,15 @@ import com.facebook.presto.metadata.BoundVariables; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlScalarFunction; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.StandardTypes; import com.facebook.presto.spi.type.TypeManager; import com.google.common.collect.ImmutableList; -import static com.facebook.presto.metadata.FunctionKind.SCALAR; -import static com.facebook.presto.metadata.Signature.withVariadicBound; import static com.facebook.presto.operator.scalar.JsonToRowCast.JSON_TO_ROW; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; +import static com.facebook.presto.spi.function.Signature.withVariadicBound; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; public final class JsonStringToRowCast diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonToArrayCast.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonToArrayCast.java index 5722bca1bc093..c9b40a84936a7 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonToArrayCast.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonToArrayCast.java @@ -36,10 +36,10 @@ import java.lang.invoke.MethodHandle; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.StandardErrorCode.INVALID_CAST_ARGUMENT; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.Failures.checkCondition; import static com.facebook.presto.util.JsonUtil.JSON_FACTORY; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonToMapCast.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonToMapCast.java index fb5c7755177db..20d9d54e34960 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonToMapCast.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonToMapCast.java @@ -36,11 +36,11 @@ import java.lang.invoke.MethodHandle; -import static com.facebook.presto.metadata.Signature.comparableTypeParameter; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.StandardErrorCode.INVALID_CAST_ARGUMENT; +import static com.facebook.presto.spi.function.Signature.comparableTypeParameter; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.Failures.checkCondition; import static com.facebook.presto.util.JsonUtil.BlockBuilderAppender.createBlockBuilderAppender; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonToRowCast.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonToRowCast.java index 76ab4e6873635..c9d07fe4fb2e9 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonToRowCast.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonToRowCast.java @@ -39,10 +39,10 @@ import java.util.Map; import java.util.Optional; -import static com.facebook.presto.metadata.Signature.withVariadicBound; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.StandardErrorCode.INVALID_CAST_ARGUMENT; +import static com.facebook.presto.spi.function.Signature.withVariadicBound; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.Failures.checkCondition; import static com.facebook.presto.util.JsonUtil.BlockBuilderAppender.createBlockBuilderAppender; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapConcatFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapConcatFunction.java index c02f296b42555..3d898b4d38665 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapConcatFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapConcatFunction.java @@ -15,15 +15,15 @@ import com.facebook.presto.annotation.UsedByGeneratedCode; import com.facebook.presto.metadata.BoundVariables; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.operator.aggregation.TypedSet; import com.facebook.presto.spi.PageBuilder; import com.facebook.presto.spi.PrestoException; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.MapType; import com.facebook.presto.spi.type.StandardTypes; import com.facebook.presto.spi.type.Type; @@ -35,10 +35,10 @@ import java.lang.invoke.MethodHandle; import java.util.Optional; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.sql.gen.VarArgsToArrayAdapterGenerator.generateVarArgsToArrayAdapter; import static com.facebook.presto.util.Reflection.methodHandle; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapConstructor.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapConstructor.java index ef6fe64b4f6e4..a5291c9b23d26 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapConstructor.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapConstructor.java @@ -15,9 +15,7 @@ import com.facebook.presto.annotation.UsedByGeneratedCode; import com.facebook.presto.metadata.BoundVariables; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.spi.ConnectorSession; import com.facebook.presto.spi.PageBuilder; @@ -26,7 +24,9 @@ import com.facebook.presto.spi.block.BlockBuilder; import com.facebook.presto.spi.block.DuplicateMapKeyException; import com.facebook.presto.spi.block.MapBlockBuilder; +import com.facebook.presto.spi.function.FunctionKind; import com.facebook.presto.spi.function.OperatorType; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.MapType; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeManager; @@ -37,13 +37,13 @@ import java.lang.invoke.MethodHandle; import java.util.Optional; -import static com.facebook.presto.metadata.Signature.comparableTypeParameter; -import static com.facebook.presto.metadata.Signature.internalOperator; -import static com.facebook.presto.metadata.Signature.typeVariable; +import static com.facebook.presto.metadata.InternalFunction.internalOperator; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT; import static com.facebook.presto.spi.function.OperatorType.INDETERMINATE; +import static com.facebook.presto.spi.function.Signature.comparableTypeParameter; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.BooleanType.BOOLEAN; import static com.facebook.presto.spi.type.StandardTypes.MAP; import static com.facebook.presto.spi.type.TypeUtils.readNativeValue; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapElementAtFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapElementAtFunction.java index 31c69be6cbc92..df3bfa6139a1d 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapElementAtFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapElementAtFunction.java @@ -15,13 +15,13 @@ import com.facebook.presto.annotation.UsedByGeneratedCode; import com.facebook.presto.metadata.BoundVariables; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.SingleMapBlock; +import com.facebook.presto.spi.function.FunctionKind; import com.facebook.presto.spi.function.OperatorType; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.BooleanType; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeManager; @@ -31,10 +31,10 @@ import java.lang.invoke.MethodHandle; -import static com.facebook.presto.metadata.Signature.internalOperator; -import static com.facebook.presto.metadata.Signature.typeVariable; +import static com.facebook.presto.metadata.InternalFunction.internalOperator; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.spi.type.TypeUtils.readNativeValue; import static com.facebook.presto.util.Reflection.methodHandle; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapFilterFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapFilterFunction.java index e3baa66b19502..5b694b08db4c4 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapFilterFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapFilterFunction.java @@ -15,13 +15,13 @@ import com.facebook.presto.annotation.UsedByGeneratedCode; import com.facebook.presto.metadata.BoundVariables; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.spi.PageBuilder; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.MapType; import com.facebook.presto.spi.type.StandardTypes; import com.facebook.presto.spi.type.Type; @@ -45,10 +45,10 @@ import java.lang.invoke.MethodHandle; import java.util.Optional; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.sql.gen.SqlTypeBytecodeExpression.constantType; import static com.facebook.presto.type.UnknownType.UNKNOWN; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapHashCodeOperator.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapHashCodeOperator.java index ce71c0124da49..789744dbc6218 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapHashCodeOperator.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapHashCodeOperator.java @@ -25,11 +25,11 @@ import java.lang.invoke.MethodHandle; -import static com.facebook.presto.metadata.Signature.comparableTypeParameter; -import static com.facebook.presto.metadata.Signature.internalOperator; +import static com.facebook.presto.metadata.InternalFunction.internalOperator; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.OperatorType.HASH_CODE; +import static com.facebook.presto.spi.function.Signature.comparableTypeParameter; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.type.TypeUtils.hashPosition; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapSubscriptOperator.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapSubscriptOperator.java index 526fd4bc8d206..cc4aa8ed08b7a 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapSubscriptOperator.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapSubscriptOperator.java @@ -32,11 +32,11 @@ import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT; import static com.facebook.presto.spi.function.OperatorType.SUBSCRIPT; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.spi.type.TypeUtils.readNativeValue; import static com.facebook.presto.sql.relational.Signatures.castSignature; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapToJsonCast.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapToJsonCast.java index aa3177b9e1d6a..dcd4b4d7a2f9c 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapToJsonCast.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapToJsonCast.java @@ -35,11 +35,11 @@ import java.util.Map; import java.util.TreeMap; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.scalar.JsonOperators.JSON_FACTORY; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.StandardErrorCode.INVALID_CAST_ARGUMENT; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.Failures.checkCondition; import static com.facebook.presto.util.JsonUtil.JsonGeneratorWriter; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapToMapCast.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapToMapCast.java index 95440d30dc7b1..b2fcea7fe301f 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapToMapCast.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapToMapCast.java @@ -31,7 +31,6 @@ import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.StandardErrorCode.INVALID_CAST_ARGUMENT; @@ -39,6 +38,7 @@ import static com.facebook.presto.spi.block.MethodHandleUtil.nativeValueGetter; import static com.facebook.presto.spi.block.MethodHandleUtil.nativeValueWriter; import static com.facebook.presto.spi.function.OperatorType.CAST; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.Failures.internalError; import static com.facebook.presto.util.Reflection.methodHandle; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapTransformKeyFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapTransformKeyFunction.java index 56b30440aa1e5..ff9f32d1a65f5 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapTransformKeyFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapTransformKeyFunction.java @@ -15,9 +15,7 @@ import com.facebook.presto.annotation.UsedByGeneratedCode; import com.facebook.presto.metadata.BoundVariables; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.operator.aggregation.TypedSet; import com.facebook.presto.spi.ConnectorSession; @@ -26,6 +24,8 @@ import com.facebook.presto.spi.PrestoException; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.MapType; import com.facebook.presto.spi.type.StandardTypes; import com.facebook.presto.spi.type.Type; @@ -49,11 +49,11 @@ import java.lang.invoke.MethodHandle; import java.util.Optional; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.sql.gen.SqlTypeBytecodeExpression.constantType; import static com.facebook.presto.type.UnknownType.UNKNOWN; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapTransformValueFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapTransformValueFunction.java index b52d5bf86575a..0a3aabefe36b4 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapTransformValueFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapTransformValueFunction.java @@ -15,15 +15,15 @@ import com.facebook.presto.annotation.UsedByGeneratedCode; import com.facebook.presto.metadata.BoundVariables; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.spi.ErrorCodeSupplier; import com.facebook.presto.spi.PageBuilder; import com.facebook.presto.spi.PrestoException; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.MapType; import com.facebook.presto.spi.type.StandardTypes; import com.facebook.presto.spi.type.Type; @@ -47,11 +47,11 @@ import java.lang.invoke.MethodHandle; import java.util.Optional; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.sql.gen.SqlTypeBytecodeExpression.constantType; import static com.facebook.presto.type.UnknownType.UNKNOWN; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapZipWithFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapZipWithFunction.java index 072d27e14ab78..ab0afe5b1adcc 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapZipWithFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapZipWithFunction.java @@ -14,14 +14,14 @@ package com.facebook.presto.operator.scalar; import com.facebook.presto.metadata.BoundVariables; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.spi.PageBuilder; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; import com.facebook.presto.spi.block.SingleMapBlock; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.MapType; import com.facebook.presto.spi.type.StandardTypes; import com.facebook.presto.spi.type.Type; @@ -33,10 +33,10 @@ import java.lang.invoke.MethodHandle; import java.util.Optional; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.spi.type.TypeUtils.readNativeValue; import static com.facebook.presto.spi.type.TypeUtils.writeNativeValue; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MathFunctions.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MathFunctions.java index a11916ba830bd..581be79537bd1 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MathFunctions.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MathFunctions.java @@ -13,7 +13,6 @@ */ package com.facebook.presto.operator.scalar; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.operator.aggregation.TypedSet; import com.facebook.presto.spi.PrestoException; @@ -21,6 +20,7 @@ import com.facebook.presto.spi.function.Description; import com.facebook.presto.spi.function.LiteralParameters; import com.facebook.presto.spi.function.ScalarFunction; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.function.SqlNullable; import com.facebook.presto.spi.function.SqlType; import com.facebook.presto.spi.type.Decimals; @@ -36,9 +36,9 @@ import java.math.BigInteger; import java.util.concurrent.ThreadLocalRandom; -import static com.facebook.presto.metadata.FunctionKind.SCALAR; import static com.facebook.presto.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT; import static com.facebook.presto.spi.StandardErrorCode.NUMERIC_VALUE_OUT_OF_RANGE; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.facebook.presto.spi.type.Decimals.longTenToNth; import static com.facebook.presto.spi.type.DoubleType.DOUBLE; import static com.facebook.presto.spi.type.UnscaledDecimal128Arithmetic.add; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ParametricScalar.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ParametricScalar.java index efe8da74de685..cbcf1d5e0f772 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ParametricScalar.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ParametricScalar.java @@ -15,11 +15,11 @@ import com.facebook.presto.metadata.BoundVariables; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.operator.ParametricImplementationsGroup; import com.facebook.presto.operator.scalar.annotations.ParametricScalarImplementation; import com.facebook.presto.spi.PrestoException; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.TypeManager; import com.google.common.annotations.VisibleForTesting; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowComparisonOperator.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowComparisonOperator.java index 0b3a6eaaa9767..59c857bbaf8e9 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowComparisonOperator.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowComparisonOperator.java @@ -14,10 +14,10 @@ */ import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlOperator; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.function.OperatorType; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.RowType; import com.facebook.presto.spi.type.StandardTypes; import com.facebook.presto.spi.type.Type; @@ -26,7 +26,7 @@ import java.lang.invoke.MethodHandle; import java.util.List; -import static com.facebook.presto.metadata.Signature.orderableWithVariadicBound; +import static com.facebook.presto.spi.function.Signature.orderableWithVariadicBound; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.spi.type.TypeUtils.readNativeValue; import static com.facebook.presto.type.TypeUtils.checkElementNotNull; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowDistinctFromOperator.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowDistinctFromOperator.java index bdcb6438b12b6..b82f067db7a74 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowDistinctFromOperator.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowDistinctFromOperator.java @@ -16,12 +16,12 @@ import com.facebook.presto.metadata.BoundVariables; import com.facebook.presto.metadata.FunctionInvoker; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlOperator; import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ReturnPlaceConvention; import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ScalarImplementationChoice; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.function.InvocationConvention; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.StandardTypes; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeManager; @@ -31,12 +31,12 @@ import java.util.List; import java.util.Optional; -import static com.facebook.presto.metadata.Signature.comparableWithVariadicBound; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.BLOCK_AND_POSITION; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.USE_NULL_FLAG; import static com.facebook.presto.spi.function.InvocationConvention.InvocationArgumentConvention.NULL_FLAG; import static com.facebook.presto.spi.function.OperatorType.IS_DISTINCT_FROM; +import static com.facebook.presto.spi.function.Signature.comparableWithVariadicBound; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.spi.type.TypeUtils.readNativeValue; import static com.facebook.presto.util.Failures.internalError; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowEqualOperator.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowEqualOperator.java index f54a16289bee6..2c7c5de8a7f5b 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowEqualOperator.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowEqualOperator.java @@ -15,9 +15,9 @@ import com.facebook.presto.metadata.BoundVariables; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlOperator; import com.facebook.presto.spi.block.Block; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.RowType; import com.facebook.presto.spi.type.StandardTypes; import com.facebook.presto.spi.type.Type; @@ -27,10 +27,10 @@ import java.lang.invoke.MethodHandle; import java.util.List; -import static com.facebook.presto.metadata.Signature.comparableWithVariadicBound; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.OperatorType.EQUAL; +import static com.facebook.presto.spi.function.Signature.comparableWithVariadicBound; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.spi.type.TypeUtils.readNativeValue; import static com.facebook.presto.util.Failures.internalError; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowHashCodeOperator.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowHashCodeOperator.java index 0b9aa4174b18e..12d7eb9ca47f0 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowHashCodeOperator.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowHashCodeOperator.java @@ -26,10 +26,10 @@ import java.lang.invoke.MethodHandle; -import static com.facebook.presto.metadata.Signature.comparableWithVariadicBound; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.OperatorType.HASH_CODE; +import static com.facebook.presto.spi.function.Signature.comparableWithVariadicBound; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.Reflection.methodHandle; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowIndeterminateOperator.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowIndeterminateOperator.java index 5da6562562dfe..2e567a5314b44 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowIndeterminateOperator.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowIndeterminateOperator.java @@ -15,8 +15,8 @@ import com.facebook.presto.metadata.BoundVariables; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlOperator; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeManager; import com.facebook.presto.sql.gen.CachedInstanceBinder; @@ -35,11 +35,11 @@ import java.lang.invoke.MethodHandle; import java.util.List; -import static com.facebook.presto.metadata.Signature.internalOperator; -import static com.facebook.presto.metadata.Signature.withVariadicBound; +import static com.facebook.presto.metadata.InternalFunction.internalOperator; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.USE_NULL_FLAG; import static com.facebook.presto.spi.function.OperatorType.INDETERMINATE; +import static com.facebook.presto.spi.function.Signature.withVariadicBound; import static com.facebook.presto.spi.type.BooleanType.BOOLEAN; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.sql.gen.InvokeFunctionBytecodeExpression.invokeFunction; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowNotEqualOperator.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowNotEqualOperator.java index 482d149b7bc6d..b486c9f67b66f 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowNotEqualOperator.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowNotEqualOperator.java @@ -26,10 +26,10 @@ import java.lang.invoke.MethodHandle; import java.util.List; -import static com.facebook.presto.metadata.Signature.comparableWithVariadicBound; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.OperatorType.NOT_EQUAL; +import static com.facebook.presto.spi.function.Signature.comparableWithVariadicBound; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.Reflection.methodHandle; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowToJsonCast.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowToJsonCast.java index 58161d4ac1c30..2b0305cf8b50a 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowToJsonCast.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowToJsonCast.java @@ -35,11 +35,11 @@ import java.util.ArrayList; import java.util.List; -import static com.facebook.presto.metadata.Signature.withVariadicBound; import static com.facebook.presto.operator.scalar.JsonOperators.JSON_FACTORY; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.StandardErrorCode.INVALID_CAST_ARGUMENT; +import static com.facebook.presto.spi.function.Signature.withVariadicBound; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.Failures.checkCondition; import static com.facebook.presto.util.JsonUtil.JsonGeneratorWriter.createJsonGeneratorWriter; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowToRowCast.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowToRowCast.java index f31e8f08bc982..8dccc023570fe 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowToRowCast.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowToRowCast.java @@ -15,7 +15,6 @@ import com.facebook.presto.metadata.BoundVariables; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlOperator; import com.facebook.presto.spi.ConnectorSession; import com.facebook.presto.spi.PrestoException; @@ -23,6 +22,7 @@ import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; import com.facebook.presto.spi.block.BlockBuilderStatus; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeManager; import com.facebook.presto.sql.gen.CachedInstanceBinder; @@ -43,11 +43,11 @@ import java.lang.invoke.MethodHandle; import java.util.List; -import static com.facebook.presto.metadata.Signature.internalOperator; -import static com.facebook.presto.metadata.Signature.withVariadicBound; +import static com.facebook.presto.metadata.InternalFunction.internalOperator; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.OperatorType.CAST; +import static com.facebook.presto.spi.function.Signature.withVariadicBound; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.sql.gen.InvokeFunctionBytecodeExpression.invokeFunction; import static com.facebook.presto.sql.gen.SqlTypeBytecodeExpression.constantType; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/TryCastFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/TryCastFunction.java index 4b18339fa0935..df3e9acaf2f6c 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/TryCastFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/TryCastFunction.java @@ -14,11 +14,11 @@ package com.facebook.presto.operator.scalar; import com.facebook.presto.metadata.BoundVariables; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeManager; import com.google.common.collect.ImmutableList; @@ -27,7 +27,7 @@ import java.lang.invoke.MethodHandle; import java.util.List; -import static com.facebook.presto.metadata.Signature.typeVariable; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static java.lang.invoke.MethodHandles.catchException; import static java.lang.invoke.MethodHandles.constant; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ZipFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ZipFunction.java index 51aa60001f7fd..f98673e7bd260 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ZipFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ZipFunction.java @@ -15,13 +15,13 @@ import com.facebook.presto.annotation.UsedByGeneratedCode; import com.facebook.presto.metadata.BoundVariables; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.RowType; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeManager; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ZipWithFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ZipWithFunction.java index 3ebd5d5e66985..304d16c97b136 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ZipWithFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ZipWithFunction.java @@ -14,13 +14,13 @@ package com.facebook.presto.operator.scalar; import com.facebook.presto.metadata.BoundVariables; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.spi.PageBuilder; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.ArrayType; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeManager; @@ -30,10 +30,10 @@ import java.lang.invoke.MethodHandle; import java.util.Optional; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.spi.type.TypeUtils.readNativeValue; import static com.facebook.presto.spi.type.TypeUtils.writeNativeValue; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/annotations/ParametricScalarImplementation.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/annotations/ParametricScalarImplementation.java index df69e4a663b44..6f784c4597214 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/annotations/ParametricScalarImplementation.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/annotations/ParametricScalarImplementation.java @@ -15,8 +15,6 @@ import com.facebook.presto.metadata.BoundVariables; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.LongVariableConstraint; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.ParametricImplementation; import com.facebook.presto.operator.annotations.FunctionsParserHelper; import com.facebook.presto.operator.annotations.ImplementationDependency; @@ -30,13 +28,15 @@ import com.facebook.presto.spi.function.BlockIndex; import com.facebook.presto.spi.function.BlockPosition; import com.facebook.presto.spi.function.IsNull; +import com.facebook.presto.spi.function.LongVariableConstraint; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.function.SqlNullable; import com.facebook.presto.spi.function.SqlType; import com.facebook.presto.spi.function.TypeParameter; +import com.facebook.presto.spi.type.FunctionType; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeManager; import com.facebook.presto.spi.type.TypeSignature; -import com.facebook.presto.type.FunctionType; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; @@ -59,7 +59,6 @@ import java.util.Set; import java.util.stream.Stream; -import static com.facebook.presto.metadata.FunctionKind.SCALAR; import static com.facebook.presto.operator.ParametricFunctionHelpers.bindDependencies; import static com.facebook.presto.operator.annotations.FunctionsParserHelper.containsImplementationDependencyAnnotation; import static com.facebook.presto.operator.annotations.FunctionsParserHelper.containsLegacyNullable; @@ -78,6 +77,7 @@ import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.USE_NULL_FLAG; import static com.facebook.presto.spi.StandardErrorCode.FUNCTION_IMPLEMENTATION_ERROR; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.Failures.checkCondition; import static com.facebook.presto.util.Reflection.constructorMethodHandle; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/annotations/ScalarFromAnnotationsParser.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/annotations/ScalarFromAnnotationsParser.java index 751ad049f39b4..bcdba2c62eace 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/annotations/ScalarFromAnnotationsParser.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/annotations/ScalarFromAnnotationsParser.java @@ -13,7 +13,6 @@ */ package com.facebook.presto.operator.scalar.annotations; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.operator.ParametricImplementationsGroup; import com.facebook.presto.operator.annotations.FunctionsParserHelper; @@ -21,6 +20,7 @@ import com.facebook.presto.operator.scalar.annotations.ParametricScalarImplementation.SpecializedSignature; import com.facebook.presto.spi.function.ScalarFunction; import com.facebook.presto.spi.function.ScalarOperator; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.function.SqlType; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/window/AbstractWindowFunctionSupplier.java b/presto-main/src/main/java/com/facebook/presto/operator/window/AbstractWindowFunctionSupplier.java index 2156aae115902..a97f0d0759593 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/window/AbstractWindowFunctionSupplier.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/window/AbstractWindowFunctionSupplier.java @@ -13,7 +13,7 @@ */ package com.facebook.presto.operator.window; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.function.WindowFunction; import java.util.List; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/window/AggregateWindowFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/window/AggregateWindowFunction.java index fa988513be38a..447a1ce53c15c 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/window/AggregateWindowFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/window/AggregateWindowFunction.java @@ -13,11 +13,11 @@ */ package com.facebook.presto.operator.window; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.aggregation.Accumulator; import com.facebook.presto.operator.aggregation.AccumulatorFactory; import com.facebook.presto.operator.aggregation.InternalAggregationFunction; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.function.WindowFunction; import com.facebook.presto.spi.function.WindowIndex; import com.google.common.collect.ImmutableList; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/window/ReflectionWindowFunctionSupplier.java b/presto-main/src/main/java/com/facebook/presto/operator/window/ReflectionWindowFunctionSupplier.java index 10acc8ebf44bf..7f81f05da38b1 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/window/ReflectionWindowFunctionSupplier.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/window/ReflectionWindowFunctionSupplier.java @@ -13,8 +13,8 @@ */ package com.facebook.presto.operator.window; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.spi.function.Description; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.function.WindowFunction; import com.facebook.presto.spi.type.Type; import com.google.common.collect.Lists; @@ -23,7 +23,7 @@ import java.lang.reflect.Constructor; import java.util.List; -import static com.facebook.presto.metadata.FunctionKind.WINDOW; +import static com.facebook.presto.spi.function.FunctionKind.WINDOW; import static java.util.Objects.requireNonNull; public class ReflectionWindowFunctionSupplier diff --git a/presto-main/src/main/java/com/facebook/presto/operator/window/SqlWindowFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/window/SqlWindowFunction.java index bd7f04a9deafb..80506f7a6f718 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/window/SqlWindowFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/window/SqlWindowFunction.java @@ -15,8 +15,8 @@ import com.facebook.presto.metadata.BoundVariables; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlFunction; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.TypeManager; import static java.util.Objects.requireNonNull; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/window/WindowAnnotationsParser.java b/presto-main/src/main/java/com/facebook/presto/operator/window/WindowAnnotationsParser.java index e23415a476a10..174662a0c4d45 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/window/WindowAnnotationsParser.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/window/WindowAnnotationsParser.java @@ -13,8 +13,8 @@ */ package com.facebook.presto.operator.window; -import com.facebook.presto.metadata.Signature; -import com.facebook.presto.metadata.TypeVariableConstraint; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.function.TypeVariableConstraint; import com.facebook.presto.spi.function.WindowFunction; import com.facebook.presto.spi.function.WindowFunctionSignature; import com.facebook.presto.spi.type.TypeSignature; @@ -23,8 +23,8 @@ import java.util.List; import java.util.stream.Stream; -import static com.facebook.presto.metadata.FunctionKind.WINDOW; -import static com.facebook.presto.metadata.Signature.typeVariable; +import static com.facebook.presto.spi.function.FunctionKind.WINDOW; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.collect.ImmutableList.toImmutableList; diff --git a/presto-main/src/main/java/com/facebook/presto/operator/window/WindowFunctionSupplier.java b/presto-main/src/main/java/com/facebook/presto/operator/window/WindowFunctionSupplier.java index aa824bcd1092c..4237415c010b1 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/window/WindowFunctionSupplier.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/window/WindowFunctionSupplier.java @@ -13,7 +13,7 @@ */ package com.facebook.presto.operator.window; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.function.WindowFunction; import java.util.List; diff --git a/presto-main/src/main/java/com/facebook/presto/server/ServerMainModule.java b/presto-main/src/main/java/com/facebook/presto/server/ServerMainModule.java index 3425159867a2c..b6cd749645933 100644 --- a/presto-main/src/main/java/com/facebook/presto/server/ServerMainModule.java +++ b/presto-main/src/main/java/com/facebook/presto/server/ServerMainModule.java @@ -21,6 +21,7 @@ import com.facebook.presto.client.NodeVersion; import com.facebook.presto.client.ServerInfo; import com.facebook.presto.connector.ConnectorManager; +import com.facebook.presto.connector.ConnectorOptimizationRuleManager; import com.facebook.presto.connector.system.SystemConnectorModule; import com.facebook.presto.event.SplitMonitor; import com.facebook.presto.execution.ExecutionFailureInfo; @@ -366,6 +367,8 @@ protected void setup(Binder binder) // index manager binder.bind(IndexManager.class).in(Scopes.SINGLETON); + binder.bind(ConnectorOptimizationRuleManager.class).in(Scopes.SINGLETON); + // handle resolver binder.install(new HandleJsonModule()); diff --git a/presto-main/src/main/java/com/facebook/presto/sql/InterpretedFunctionInvoker.java b/presto-main/src/main/java/com/facebook/presto/sql/InterpretedFunctionInvoker.java index 3e557f5314ef0..5da941697aa89 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/InterpretedFunctionInvoker.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/InterpretedFunctionInvoker.java @@ -14,10 +14,10 @@ package com.facebook.presto.sql; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty; import com.facebook.presto.spi.ConnectorSession; +import com.facebook.presto.spi.function.Signature; import com.google.common.base.Defaults; import java.lang.invoke.MethodHandle; diff --git a/presto-main/src/main/java/com/facebook/presto/sql/analyzer/Analysis.java b/presto-main/src/main/java/com/facebook/presto/sql/analyzer/Analysis.java index 5ca74f928b643..20c584d483dab 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/analyzer/Analysis.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/analyzer/Analysis.java @@ -14,10 +14,10 @@ package com.facebook.presto.sql.analyzer; import com.facebook.presto.metadata.QualifiedObjectName; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.TableHandle; import com.facebook.presto.security.AccessControl; import com.facebook.presto.spi.ColumnHandle; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.security.Identity; import com.facebook.presto.spi.type.Type; import com.facebook.presto.sql.tree.ExistsPredicate; diff --git a/presto-main/src/main/java/com/facebook/presto/sql/analyzer/ExpressionAnalyzer.java b/presto-main/src/main/java/com/facebook/presto/sql/analyzer/ExpressionAnalyzer.java index 4e868d0f6fff0..86d2e8a06e342 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/analyzer/ExpressionAnalyzer.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/analyzer/ExpressionAnalyzer.java @@ -20,15 +20,17 @@ import com.facebook.presto.metadata.Metadata; import com.facebook.presto.metadata.OperatorNotFoundException; import com.facebook.presto.metadata.QualifiedObjectName; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.security.AccessControl; import com.facebook.presto.security.DenyAllAccessControl; import com.facebook.presto.spi.PrestoException; import com.facebook.presto.spi.StandardErrorCode; +import com.facebook.presto.spi.function.FunctionKind; import com.facebook.presto.spi.function.OperatorType; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.CharType; import com.facebook.presto.spi.type.DecimalParseResult; import com.facebook.presto.spi.type.Decimals; +import com.facebook.presto.spi.type.FunctionType; import com.facebook.presto.spi.type.RowType; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeManager; @@ -96,7 +98,6 @@ import com.facebook.presto.sql.tree.TryExpression; import com.facebook.presto.sql.tree.WhenClause; import com.facebook.presto.sql.tree.WindowFrame; -import com.facebook.presto.type.FunctionType; import com.google.common.collect.HashMultimap; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; @@ -887,7 +888,7 @@ protected Type visitFunctionCall(FunctionCall node, StackableAstVisitorContext(context.getContext().expectingLambda(expectedFunctionType.getArgumentTypes()))); } - else { + else if (!matchIntermediateType(function, typeManager.getType(argumentTypes.get(i).getTypeSignature()))) { Type actualType = typeManager.getType(argumentTypes.get(i).getTypeSignature()); coerceType(expression, actualType, expectedType, format("Function %s argument %d", function, i)); } @@ -898,6 +899,14 @@ protected Type visitFunctionCall(FunctionCall node, StackableAstVisitorContext context) { diff --git a/presto-main/src/main/java/com/facebook/presto/sql/analyzer/StatementAnalyzer.java b/presto-main/src/main/java/com/facebook/presto/sql/analyzer/StatementAnalyzer.java index 9000fe7eb007a..851632eead97d 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/analyzer/StatementAnalyzer.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/analyzer/StatementAnalyzer.java @@ -17,7 +17,6 @@ import com.facebook.presto.SystemSessionProperties; import com.facebook.presto.connector.ConnectorId; import com.facebook.presto.execution.warnings.WarningCollector; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.Metadata; import com.facebook.presto.metadata.OperatorNotFoundException; import com.facebook.presto.metadata.QualifiedObjectName; @@ -31,6 +30,7 @@ import com.facebook.presto.spi.ColumnHandle; import com.facebook.presto.spi.ColumnMetadata; import com.facebook.presto.spi.PrestoException; +import com.facebook.presto.spi.function.FunctionKind; import com.facebook.presto.spi.function.OperatorType; import com.facebook.presto.spi.security.AccessDeniedException; import com.facebook.presto.spi.security.Identity; @@ -145,11 +145,11 @@ import java.util.stream.Collectors; import static com.facebook.presto.SystemSessionProperties.getMaxGroupingSets; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; -import static com.facebook.presto.metadata.FunctionKind.WINDOW; import static com.facebook.presto.metadata.MetadataUtil.createQualifiedObjectName; import static com.facebook.presto.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT; import static com.facebook.presto.spi.StandardErrorCode.NOT_FOUND; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; +import static com.facebook.presto.spi.function.FunctionKind.WINDOW; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.BooleanType.BOOLEAN; import static com.facebook.presto.spi.type.VarcharType.VARCHAR; diff --git a/presto-main/src/main/java/com/facebook/presto/sql/analyzer/WindowFunctionValidator.java b/presto-main/src/main/java/com/facebook/presto/sql/analyzer/WindowFunctionValidator.java index 3215a71f510ff..d9424138f8bc1 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/analyzer/WindowFunctionValidator.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/analyzer/WindowFunctionValidator.java @@ -13,11 +13,11 @@ */ package com.facebook.presto.sql.analyzer; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.sql.tree.DefaultExpressionTraversalVisitor; import com.facebook.presto.sql.tree.FunctionCall; -import static com.facebook.presto.metadata.FunctionKind.WINDOW; +import static com.facebook.presto.spi.function.FunctionKind.WINDOW; import static com.facebook.presto.sql.analyzer.SemanticErrorCode.WINDOW_REQUIRES_OVER; import static java.util.Objects.requireNonNull; diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/AndCodeGenerator.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/AndCodeGenerator.java index 8e90a2d53efe0..7f8d295ef26c4 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/AndCodeGenerator.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/AndCodeGenerator.java @@ -13,9 +13,9 @@ */ package com.facebook.presto.sql.gen; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.spi.type.Type; -import com.facebook.presto.sql.relational.RowExpression; import com.google.common.base.Preconditions; import io.airlift.bytecode.BytecodeBlock; import io.airlift.bytecode.BytecodeNode; @@ -33,7 +33,7 @@ public class AndCodeGenerator implements BytecodeGenerator { @Override - public BytecodeNode generateExpression(Signature signature, BytecodeGeneratorContext generator, Type returnType, List arguments, Optional outputBlockVariable) + public BytecodeNode generateExpression(Signature signature, BytecodeGeneratorContext generator, Type returnType, List arguments, Optional outputBlockVariable) { Preconditions.checkArgument(arguments.size() == 2); diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/BindCodeGenerator.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/BindCodeGenerator.java index f4c1b0a9f6b56..4d520b925db70 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/BindCodeGenerator.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/BindCodeGenerator.java @@ -14,11 +14,11 @@ package com.facebook.presto.sql.gen; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.ColumnExpression; +import com.facebook.presto.spi.relation.column.LambdaDefinitionExpression; import com.facebook.presto.spi.type.Type; import com.facebook.presto.sql.gen.LambdaBytecodeGenerator.CompiledLambda; -import com.facebook.presto.sql.relational.LambdaDefinitionExpression; -import com.facebook.presto.sql.relational.RowExpression; import io.airlift.bytecode.BytecodeNode; import io.airlift.bytecode.Variable; @@ -42,7 +42,7 @@ public BindCodeGenerator(Map compile } @Override - public BytecodeNode generateExpression(Signature signature, BytecodeGeneratorContext context, Type returnType, List arguments, Optional outputBlockVariable) + public BytecodeNode generateExpression(Signature signature, BytecodeGeneratorContext context, Type returnType, List arguments, Optional outputBlockVariable) { // Bind expression is used to generate captured lambda. // It takes the captured values and the uncaptured lambda, and produces captured lambda as the output. diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/BodyCompiler.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/BodyCompiler.java index 5346ee260d2f9..472f21d358034 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/BodyCompiler.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/BodyCompiler.java @@ -13,12 +13,12 @@ */ package com.facebook.presto.sql.gen; -import com.facebook.presto.sql.relational.RowExpression; +import com.facebook.presto.spi.relation.column.ColumnExpression; import io.airlift.bytecode.ClassDefinition; import java.util.List; public interface BodyCompiler { - void generateMethods(ClassDefinition classDefinition, CallSiteBinder callSiteBinder, RowExpression filter, List projections); + void generateMethods(ClassDefinition classDefinition, CallSiteBinder callSiteBinder, ColumnExpression filter, List projections); } diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/BytecodeGenerator.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/BytecodeGenerator.java index 588e6987ada00..1fcbfad2b3390 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/BytecodeGenerator.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/BytecodeGenerator.java @@ -13,9 +13,9 @@ */ package com.facebook.presto.sql.gen; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.spi.type.Type; -import com.facebook.presto.sql.relational.RowExpression; import io.airlift.bytecode.BytecodeNode; import io.airlift.bytecode.Variable; @@ -24,7 +24,7 @@ public interface BytecodeGenerator { - BytecodeNode generateExpression(Signature signature, BytecodeGeneratorContext context, Type returnType, List arguments, Optional outputBlockVariable); + BytecodeNode generateExpression(Signature signature, BytecodeGeneratorContext context, Type returnType, List arguments, Optional outputBlockVariable); static BytecodeNode generateWrite(BytecodeGeneratorContext context, Type returnType, Variable outputBlock) { diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/BytecodeGeneratorContext.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/BytecodeGeneratorContext.java index e96e348df8227..c518b5a417892 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/BytecodeGeneratorContext.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/BytecodeGeneratorContext.java @@ -15,8 +15,8 @@ import com.facebook.presto.metadata.FunctionRegistry; import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.sql.gen.BytecodeUtils.OutputBlockVariableAndType; -import com.facebook.presto.sql.relational.RowExpression; import io.airlift.bytecode.BytecodeNode; import io.airlift.bytecode.FieldDefinition; import io.airlift.bytecode.Scope; @@ -30,7 +30,7 @@ public class BytecodeGeneratorContext { - private final RowExpressionCompiler rowExpressionCompiler; + private final ColumnExpressionCompiler columnExpressionCompiler; private final Scope scope; private final CallSiteBinder callSiteBinder; private final CachedInstanceBinder cachedInstanceBinder; @@ -38,19 +38,19 @@ public class BytecodeGeneratorContext private final Variable wasNull; public BytecodeGeneratorContext( - RowExpressionCompiler rowExpressionCompiler, + ColumnExpressionCompiler columnExpressionCompiler, Scope scope, CallSiteBinder callSiteBinder, CachedInstanceBinder cachedInstanceBinder, FunctionRegistry registry) { - requireNonNull(rowExpressionCompiler, "bytecodeGenerator is null"); + requireNonNull(columnExpressionCompiler, "bytecodeGenerator is null"); requireNonNull(cachedInstanceBinder, "cachedInstanceBinder is null"); requireNonNull(scope, "scope is null"); requireNonNull(callSiteBinder, "callSiteBinder is null"); requireNonNull(registry, "registry is null"); - this.rowExpressionCompiler = rowExpressionCompiler; + this.columnExpressionCompiler = columnExpressionCompiler; this.scope = scope; this.callSiteBinder = callSiteBinder; this.cachedInstanceBinder = cachedInstanceBinder; @@ -68,14 +68,14 @@ public CallSiteBinder getCallSiteBinder() return callSiteBinder; } - public BytecodeNode generate(RowExpression expression, Optional outputBlockVariable) + public BytecodeNode generate(ColumnExpression expression, Optional outputBlockVariable) { return generate(expression, outputBlockVariable, Optional.empty()); } - public BytecodeNode generate(RowExpression expression, Optional outputBlockVariable, Optional lambdaInterface) + public BytecodeNode generate(ColumnExpression expression, Optional outputBlockVariable, Optional lambdaInterface) { - return rowExpressionCompiler.compile(expression, scope, outputBlockVariable, lambdaInterface); + return columnExpressionCompiler.compile(expression, scope, outputBlockVariable, lambdaInterface); } public FunctionRegistry getRegistry() diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/BytecodeUtils.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/BytecodeUtils.java index 8bd78ffa6c691..23b1a4b3f26bc 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/BytecodeUtils.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/BytecodeUtils.java @@ -13,13 +13,13 @@ */ package com.facebook.presto.sql.gen; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty; import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention; import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ScalarImplementationChoice; import com.facebook.presto.spi.ConnectorSession; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; import com.facebook.presto.sql.gen.InputReferenceCompiler.InputReferenceNode; import com.google.common.base.Joiner; diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/CastCodeGenerator.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/CastCodeGenerator.java index 990e2a00d68f0..e9ed1d1db0ee9 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/CastCodeGenerator.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/CastCodeGenerator.java @@ -13,9 +13,9 @@ */ package com.facebook.presto.sql.gen; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.spi.type.Type; -import com.facebook.presto.sql.relational.RowExpression; import com.google.common.collect.ImmutableList; import io.airlift.bytecode.BytecodeBlock; import io.airlift.bytecode.BytecodeNode; @@ -30,9 +30,9 @@ public class CastCodeGenerator implements BytecodeGenerator { @Override - public BytecodeNode generateExpression(Signature signature, BytecodeGeneratorContext generatorContext, Type returnType, List arguments, Optional outputBlockVariable) + public BytecodeNode generateExpression(Signature signature, BytecodeGeneratorContext generatorContext, Type returnType, List arguments, Optional outputBlockVariable) { - RowExpression argument = arguments.get(0); + ColumnExpression argument = arguments.get(0); Signature function = generatorContext .getRegistry() diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/CoalesceCodeGenerator.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/CoalesceCodeGenerator.java index 2ca48b7868816..e18a41ea1e23f 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/CoalesceCodeGenerator.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/CoalesceCodeGenerator.java @@ -13,9 +13,9 @@ */ package com.facebook.presto.sql.gen; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.spi.type.Type; -import com.facebook.presto.sql.relational.RowExpression; import com.google.common.collect.Lists; import io.airlift.bytecode.BytecodeBlock; import io.airlift.bytecode.BytecodeNode; @@ -34,10 +34,10 @@ public class CoalesceCodeGenerator implements BytecodeGenerator { @Override - public BytecodeNode generateExpression(Signature signature, BytecodeGeneratorContext generatorContext, Type returnType, List arguments, Optional outputBlockVariable) + public BytecodeNode generateExpression(Signature signature, BytecodeGeneratorContext generatorContext, Type returnType, List arguments, Optional outputBlockVariable) { List operands = new ArrayList<>(); - for (RowExpression expression : arguments) { + for (ColumnExpression expression : arguments) { operands.add(generatorContext.generate(expression, Optional.empty())); } diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/RowExpressionCompiler.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/ColumnExpressionCompiler.java similarity index 88% rename from presto-main/src/main/java/com/facebook/presto/sql/gen/RowExpressionCompiler.java rename to presto-main/src/main/java/com/facebook/presto/sql/gen/ColumnExpressionCompiler.java index 81e47036950d1..cbd0634fbb0f4 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/RowExpressionCompiler.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/ColumnExpressionCompiler.java @@ -14,14 +14,15 @@ package com.facebook.presto.sql.gen; import com.facebook.presto.metadata.FunctionRegistry; +import com.facebook.presto.spi.relation.column.CallExpression; +import com.facebook.presto.spi.relation.column.ColumnExpression; +import com.facebook.presto.spi.relation.column.ColumnExpressionVisitor; +import com.facebook.presto.spi.relation.column.ColumnReferenceExpression; +import com.facebook.presto.spi.relation.column.ConstantExpression; +import com.facebook.presto.spi.relation.column.InputReferenceExpression; +import com.facebook.presto.spi.relation.column.LambdaDefinitionExpression; +import com.facebook.presto.spi.relation.column.VariableReferenceExpression; import com.facebook.presto.sql.gen.LambdaBytecodeGenerator.CompiledLambda; -import com.facebook.presto.sql.relational.CallExpression; -import com.facebook.presto.sql.relational.ConstantExpression; -import com.facebook.presto.sql.relational.InputReferenceExpression; -import com.facebook.presto.sql.relational.LambdaDefinitionExpression; -import com.facebook.presto.sql.relational.RowExpression; -import com.facebook.presto.sql.relational.RowExpressionVisitor; -import com.facebook.presto.sql.relational.VariableReferenceExpression; import com.google.common.base.VerifyException; import com.google.common.collect.ImmutableList; import io.airlift.bytecode.BytecodeBlock; @@ -55,18 +56,18 @@ import static io.airlift.bytecode.instruction.Constant.loadLong; import static io.airlift.bytecode.instruction.Constant.loadString; -public class RowExpressionCompiler +public class ColumnExpressionCompiler { private final CallSiteBinder callSiteBinder; private final CachedInstanceBinder cachedInstanceBinder; - private final RowExpressionVisitor fieldReferenceCompiler; + private final ColumnExpressionVisitor fieldReferenceCompiler; private final FunctionRegistry registry; private final Map compiledLambdaMap; - RowExpressionCompiler( + ColumnExpressionCompiler( CallSiteBinder callSiteBinder, CachedInstanceBinder cachedInstanceBinder, - RowExpressionVisitor fieldReferenceCompiler, + ColumnExpressionVisitor fieldReferenceCompiler, FunctionRegistry registry, Map compiledLambdaMap) { @@ -77,20 +78,20 @@ public class RowExpressionCompiler this.compiledLambdaMap = compiledLambdaMap; } - public BytecodeNode compile(RowExpression rowExpression, Scope scope, Optional outputBlockVariable) + public BytecodeNode compile(ColumnExpression columnExpression, Scope scope, Optional outputBlockVariable) { - return compile(rowExpression, scope, outputBlockVariable, Optional.empty()); + return compile(columnExpression, scope, outputBlockVariable, Optional.empty()); } // When outputBlockVariable is presented, the generated bytecode will write the evaluated value into the outputBlockVariable, // otherwise the value will be left on stack. - public BytecodeNode compile(RowExpression rowExpression, Scope scope, Optional outputBlockVariable, Optional lambdaInterface) + public BytecodeNode compile(ColumnExpression columnExpression, Scope scope, Optional outputBlockVariable, Optional lambdaInterface) { - return rowExpression.accept(new Visitor(), new Context(scope, outputBlockVariable, lambdaInterface)); + return columnExpression.accept(new Visitor(), new Context(scope, outputBlockVariable, lambdaInterface)); } private class Visitor - implements RowExpressionVisitor + implements ColumnExpressionVisitor { @Override public BytecodeNode visitCall(CallExpression call, Context context) @@ -146,7 +147,7 @@ public BytecodeNode visitCall(CallExpression call, Context context) } BytecodeGeneratorContext generatorContext = new BytecodeGeneratorContext( - RowExpressionCompiler.this, + ColumnExpressionCompiler.this, context.getScope(), callSiteBinder, cachedInstanceBinder, @@ -240,7 +241,7 @@ public BytecodeNode visitLambda(LambdaDefinitionExpression lambda, Context conte } BytecodeGeneratorContext generatorContext = new BytecodeGeneratorContext( - RowExpressionCompiler.this, + ColumnExpressionCompiler.this, context.getScope(), callSiteBinder, cachedInstanceBinder, @@ -270,6 +271,12 @@ public BytecodeNode visitVariableReference(VariableReferenceExpression reference reference.getType(), context.getOutputBlockVariable().get())); } + + @Override + public BytecodeNode visitColumnReference(ColumnReferenceExpression columnReferenceExpression, Context context) + { + throw new UnsupportedOperationException(); + } } private static class Context diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/CursorProcessorCompiler.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/CursorProcessorCompiler.java index c4a18c9ffc7af..9413088764f10 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/CursorProcessorCompiler.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/CursorProcessorCompiler.java @@ -20,15 +20,16 @@ import com.facebook.presto.spi.PageBuilder; import com.facebook.presto.spi.RecordCursor; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.relation.column.CallExpression; +import com.facebook.presto.spi.relation.column.ColumnExpression; +import com.facebook.presto.spi.relation.column.ColumnExpressionVisitor; +import com.facebook.presto.spi.relation.column.ColumnReferenceExpression; +import com.facebook.presto.spi.relation.column.ConstantExpression; +import com.facebook.presto.spi.relation.column.InputReferenceExpression; +import com.facebook.presto.spi.relation.column.LambdaDefinitionExpression; +import com.facebook.presto.spi.relation.column.VariableReferenceExpression; import com.facebook.presto.spi.type.Type; import com.facebook.presto.sql.gen.LambdaBytecodeGenerator.CompiledLambda; -import com.facebook.presto.sql.relational.CallExpression; -import com.facebook.presto.sql.relational.ConstantExpression; -import com.facebook.presto.sql.relational.InputReferenceExpression; -import com.facebook.presto.sql.relational.LambdaDefinitionExpression; -import com.facebook.presto.sql.relational.RowExpression; -import com.facebook.presto.sql.relational.RowExpressionVisitor; -import com.facebook.presto.sql.relational.VariableReferenceExpression; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.primitives.Primitives; @@ -71,7 +72,7 @@ public CursorProcessorCompiler(Metadata metadata) } @Override - public void generateMethods(ClassDefinition classDefinition, CallSiteBinder callSiteBinder, RowExpression filter, List projections) + public void generateMethods(ClassDefinition classDefinition, CallSiteBinder callSiteBinder, ColumnExpression filter, List projections) { CachedInstanceBinder cachedInstanceBinder = new CachedInstanceBinder(classDefinition, callSiteBinder); @@ -194,7 +195,7 @@ private Map generateMethodsForLambda ClassDefinition containerClassDefinition, CallSiteBinder callSiteBinder, CachedInstanceBinder cachedInstanceBinder, - RowExpression projection, + ColumnExpression projection, String methodPrefix) { Set lambdaExpressions = ImmutableSet.copyOf(extractLambdaExpressions(projection)); @@ -224,7 +225,7 @@ private void generateFilterMethod( CallSiteBinder callSiteBinder, CachedInstanceBinder cachedInstanceBinder, Map compiledLambdaMap, - RowExpression filter) + ColumnExpression filter) { Parameter session = arg("session", ConnectorSession.class); Parameter cursor = arg("cursor", RecordCursor.class); @@ -235,7 +236,7 @@ private void generateFilterMethod( Scope scope = method.getScope(); Variable wasNullVariable = scope.declareVariable(type(boolean.class), "wasNull"); - RowExpressionCompiler compiler = new RowExpressionCompiler( + ColumnExpressionCompiler compiler = new ColumnExpressionCompiler( callSiteBinder, cachedInstanceBinder, fieldReferenceCompiler(cursor), @@ -263,7 +264,7 @@ private void generateProjectMethod( CachedInstanceBinder cachedInstanceBinder, Map compiledLambdaMap, String methodName, - RowExpression projection) + ColumnExpression projection) { Parameter session = arg("session", ConnectorSession.class); Parameter cursor = arg("cursor", RecordCursor.class); @@ -275,7 +276,7 @@ private void generateProjectMethod( Scope scope = method.getScope(); Variable wasNullVariable = scope.declareVariable(type(boolean.class), "wasNull"); - RowExpressionCompiler compiler = new RowExpressionCompiler( + ColumnExpressionCompiler compiler = new ColumnExpressionCompiler( callSiteBinder, cachedInstanceBinder, fieldReferenceCompiler(cursor), @@ -290,9 +291,9 @@ private void generateProjectMethod( .ret(); } - private static RowExpressionVisitor fieldReferenceCompiler(Variable cursorVariable) + private static ColumnExpressionVisitor fieldReferenceCompiler(Variable cursorVariable) { - return new RowExpressionVisitor() + return new ColumnExpressionVisitor() { @Override public BytecodeNode visitInputReference(InputReferenceExpression node, Scope scope) @@ -348,6 +349,12 @@ public BytecodeNode visitVariableReference(VariableReferenceExpression reference { throw new UnsupportedOperationException(); } + + @Override + public BytecodeNode visitColumnReference(ColumnReferenceExpression columnReferenceExpression, Scope context) + { + throw new UnsupportedOperationException(); + } }; } } diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/DereferenceCodeGenerator.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/DereferenceCodeGenerator.java index 236f5278527a2..63330752fcaf0 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/DereferenceCodeGenerator.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/DereferenceCodeGenerator.java @@ -13,11 +13,11 @@ */ package com.facebook.presto.sql.gen; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.spi.block.Block; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.ColumnExpression; +import com.facebook.presto.spi.relation.column.ConstantExpression; import com.facebook.presto.spi.type.Type; -import com.facebook.presto.sql.relational.ConstantExpression; -import com.facebook.presto.sql.relational.RowExpression; import io.airlift.bytecode.BytecodeBlock; import io.airlift.bytecode.BytecodeNode; import io.airlift.bytecode.Variable; @@ -37,7 +37,7 @@ public class DereferenceCodeGenerator implements BytecodeGenerator { @Override - public BytecodeNode generateExpression(Signature signature, BytecodeGeneratorContext generator, Type returnType, List arguments, Optional outputBlockVariable) + public BytecodeNode generateExpression(Signature signature, BytecodeGeneratorContext generator, Type returnType, List arguments, Optional outputBlockVariable) { checkArgument(arguments.size() == 2); CallSiteBinder callSiteBinder = generator.getCallSiteBinder(); diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/ExpressionCompiler.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/ExpressionCompiler.java index 0edad777a48dd..e572dd32af8af 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/ExpressionCompiler.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/ExpressionCompiler.java @@ -19,7 +19,7 @@ import com.facebook.presto.operator.project.PageProcessor; import com.facebook.presto.operator.project.PageProjection; import com.facebook.presto.spi.PrestoException; -import com.facebook.presto.sql.relational.RowExpression; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.google.common.annotations.VisibleForTesting; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; @@ -77,7 +77,7 @@ public CacheStatsMBean getCursorProcessorCache() return cacheStatsMBean; } - public Supplier compileCursorProcessor(Optional filter, List projections, Object uniqueKey) + public Supplier compileCursorProcessor(Optional filter, List projections, Object uniqueKey) { Class cursorProcessor = cursorProcessors.getUnchecked(new CacheKey(filter, projections, uniqueKey)); return () -> { @@ -90,14 +90,14 @@ public Supplier compileCursorProcessor(Optional }; } - public Supplier compilePageProcessor(Optional filter, List projections, Optional classNameSuffix) + public Supplier compilePageProcessor(Optional filter, List projections, Optional classNameSuffix) { return compilePageProcessor(filter, projections, classNameSuffix, OptionalInt.empty()); } private Supplier compilePageProcessor( - Optional filter, - List projections, + Optional filter, + List projections, Optional classNameSuffix, OptionalInt initialBatchSize) { @@ -115,18 +115,18 @@ private Supplier compilePageProcessor( }; } - public Supplier compilePageProcessor(Optional filter, List projections) + public Supplier compilePageProcessor(Optional filter, List projections) { return compilePageProcessor(filter, projections, Optional.empty()); } @VisibleForTesting - public Supplier compilePageProcessor(Optional filter, List projections, int initialBatchSize) + public Supplier compilePageProcessor(Optional filter, List projections, int initialBatchSize) { return compilePageProcessor(filter, projections, Optional.empty(), OptionalInt.of(initialBatchSize)); } - private Class compile(Optional filter, List projections, BodyCompiler bodyCompiler, Class superType) + private Class compile(Optional filter, List projections, BodyCompiler bodyCompiler, Class superType) { // create filter and project page iterator class try { @@ -138,8 +138,8 @@ private Class compile(Optional filter, List Class compileProcessor( - RowExpression filter, - List projections, + ColumnExpression filter, + List projections, BodyCompiler bodyCompiler, Class superType) { @@ -177,23 +177,23 @@ private static void generateToString(ClassDefinition classDefinition, CallSiteBi private static final class CacheKey { - private final Optional filter; - private final List projections; + private final Optional filter; + private final List projections; private final Object uniqueKey; - private CacheKey(Optional filter, List projections, Object uniqueKey) + private CacheKey(Optional filter, List projections, Object uniqueKey) { this.filter = filter; this.uniqueKey = uniqueKey; this.projections = ImmutableList.copyOf(projections); } - private Optional getFilter() + private Optional getFilter() { return filter; } - private List getProjections() + private List getProjections() { return projections; } diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/FunctionCallCodeGenerator.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/FunctionCallCodeGenerator.java index 5f70d12e8cbb6..b2f7b828eea98 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/FunctionCallCodeGenerator.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/FunctionCallCodeGenerator.java @@ -14,11 +14,11 @@ package com.facebook.presto.sql.gen; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.spi.type.Type; import com.facebook.presto.sql.gen.BytecodeUtils.OutputBlockVariableAndType; -import com.facebook.presto.sql.relational.RowExpression; import io.airlift.bytecode.BytecodeNode; import io.airlift.bytecode.Variable; @@ -32,7 +32,7 @@ public class FunctionCallCodeGenerator implements BytecodeGenerator { @Override - public BytecodeNode generateExpression(Signature signature, BytecodeGeneratorContext context, Type returnType, List arguments, Optional outputBlockVariable) + public BytecodeNode generateExpression(Signature signature, BytecodeGeneratorContext context, Type returnType, List arguments, Optional outputBlockVariable) { FunctionRegistry registry = context.getRegistry(); @@ -40,7 +40,7 @@ public BytecodeNode generateExpression(Signature signature, BytecodeGeneratorCon List argumentsBytecode = new ArrayList<>(); for (int i = 0; i < arguments.size(); i++) { - RowExpression argument = arguments.get(i); + ColumnExpression argument = arguments.get(i); ScalarFunctionImplementation.ArgumentProperty argumentProperty = function.getArgumentProperty(i); if (argumentProperty.getArgumentType() == VALUE_TYPE) { argumentsBytecode.add(context.generate(argument, Optional.empty())); diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/IfCodeGenerator.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/IfCodeGenerator.java index 740fc6e837d38..9f59486608789 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/IfCodeGenerator.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/IfCodeGenerator.java @@ -13,9 +13,9 @@ */ package com.facebook.presto.sql.gen; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.spi.type.Type; -import com.facebook.presto.sql.relational.RowExpression; import com.google.common.base.Preconditions; import io.airlift.bytecode.BytecodeBlock; import io.airlift.bytecode.BytecodeNode; @@ -31,7 +31,7 @@ public class IfCodeGenerator implements BytecodeGenerator { - public BytecodeNode generateExpression(Signature signature, BytecodeGeneratorContext context, Type returnType, List arguments, Optional outputBlockVariable) + public BytecodeNode generateExpression(Signature signature, BytecodeGeneratorContext context, Type returnType, List arguments, Optional outputBlockVariable) { Preconditions.checkArgument(arguments.size() == 3); diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/InCodeGenerator.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/InCodeGenerator.java index cee5106613355..bb9871403147f 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/InCodeGenerator.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/InCodeGenerator.java @@ -14,15 +14,15 @@ package com.facebook.presto.sql.gen; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; import com.facebook.presto.spi.function.OperatorType; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.ColumnExpression; +import com.facebook.presto.spi.relation.column.ConstantExpression; import com.facebook.presto.spi.type.BigintType; import com.facebook.presto.spi.type.DateType; import com.facebook.presto.spi.type.IntegerType; import com.facebook.presto.spi.type.Type; -import com.facebook.presto.sql.relational.ConstantExpression; -import com.facebook.presto.sql.relational.RowExpression; import com.facebook.presto.util.FastutilSetHelper; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableList; @@ -77,7 +77,7 @@ enum SwitchGenerationCase } @VisibleForTesting - static SwitchGenerationCase checkSwitchGenerationCase(Type type, List values) + static SwitchGenerationCase checkSwitchGenerationCase(Type type, List values) { if (values.size() > 32) { // 32 is chosen because @@ -89,7 +89,7 @@ static SwitchGenerationCase checkSwitchGenerationCase(Type type, List arguments, Optional outputBlockVariable) + public BytecodeNode generateExpression(Signature signature, BytecodeGeneratorContext generatorContext, Type returnType, List arguments, Optional outputBlockVariable) { - List values = arguments.subList(1, arguments.size()); + List values = arguments.subList(1, arguments.size()); // empty IN statements are not allowed by the standard, and not possible here // the implementation assumes this condition is always met checkArgument(values.size() > 0, "values must not be empty"); @@ -130,7 +130,7 @@ public BytecodeNode generateExpression(Signature signature, BytecodeGeneratorCon ImmutableList.Builder defaultBucket = ImmutableList.builder(); ImmutableSet.Builder constantValuesBuilder = ImmutableSet.builder(); - for (RowExpression testValue : values) { + for (ColumnExpression testValue : values) { BytecodeNode testBytecode = generatorContext.generate(testValue, Optional.empty()); if (isDeterminateConstant(testValue, isIndeterminateFunction.getMethodHandle())) { @@ -371,7 +371,7 @@ private static BytecodeBlock buildInCase( return caseBlock; } - private static boolean isDeterminateConstant(RowExpression expression, MethodHandle isIndeterminateFunction) + private static boolean isDeterminateConstant(ColumnExpression expression, MethodHandle isIndeterminateFunction) { if (!(expression instanceof ConstantExpression)) { return false; diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/InputReferenceCompiler.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/InputReferenceCompiler.java index 358b611ae4701..43cc05cd00768 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/InputReferenceCompiler.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/InputReferenceCompiler.java @@ -13,13 +13,14 @@ */ package com.facebook.presto.sql.gen; +import com.facebook.presto.spi.relation.column.CallExpression; +import com.facebook.presto.spi.relation.column.ColumnExpressionVisitor; +import com.facebook.presto.spi.relation.column.ColumnReferenceExpression; +import com.facebook.presto.spi.relation.column.ConstantExpression; +import com.facebook.presto.spi.relation.column.InputReferenceExpression; +import com.facebook.presto.spi.relation.column.LambdaDefinitionExpression; +import com.facebook.presto.spi.relation.column.VariableReferenceExpression; import com.facebook.presto.spi.type.Type; -import com.facebook.presto.sql.relational.CallExpression; -import com.facebook.presto.sql.relational.ConstantExpression; -import com.facebook.presto.sql.relational.InputReferenceExpression; -import com.facebook.presto.sql.relational.LambdaDefinitionExpression; -import com.facebook.presto.sql.relational.RowExpressionVisitor; -import com.facebook.presto.sql.relational.VariableReferenceExpression; import com.google.common.collect.ImmutableList; import com.google.common.primitives.Primitives; import io.airlift.bytecode.BytecodeBlock; @@ -40,7 +41,7 @@ import static java.util.Objects.requireNonNull; class InputReferenceCompiler - implements RowExpressionVisitor + implements ColumnExpressionVisitor { private final BiFunction blockResolver; private final BiFunction positionResolver; @@ -97,6 +98,12 @@ public BytecodeNode visitVariableReference(VariableReferenceExpression reference throw new UnsupportedOperationException(); } + @Override + public BytecodeNode visitColumnReference(ColumnReferenceExpression reference, Scope context) + { + throw new UnsupportedOperationException(); + } + static class InputReferenceNode implements BytecodeNode { diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/IsNullCodeGenerator.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/IsNullCodeGenerator.java index 631eff1a74c0c..394389c318b32 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/IsNullCodeGenerator.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/IsNullCodeGenerator.java @@ -13,9 +13,9 @@ */ package com.facebook.presto.sql.gen; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.spi.type.Type; -import com.facebook.presto.sql.relational.RowExpression; import com.google.common.base.Preconditions; import io.airlift.bytecode.BytecodeBlock; import io.airlift.bytecode.BytecodeNode; @@ -33,11 +33,11 @@ public class IsNullCodeGenerator implements BytecodeGenerator { @Override - public BytecodeNode generateExpression(Signature signature, BytecodeGeneratorContext generatorContext, Type returnType, List arguments, Optional outputBlockVariable) + public BytecodeNode generateExpression(Signature signature, BytecodeGeneratorContext generatorContext, Type returnType, List arguments, Optional outputBlockVariable) { Preconditions.checkArgument(arguments.size() == 1); - RowExpression argument = arguments.get(0); + ColumnExpression argument = arguments.get(0); if (argument.getType().equals(UNKNOWN)) { return loadBoolean(true); } diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/JoinFilterFunctionCompiler.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/JoinFilterFunctionCompiler.java index 317676b08cc61..bcbe790abcc48 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/JoinFilterFunctionCompiler.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/JoinFilterFunctionCompiler.java @@ -20,10 +20,10 @@ import com.facebook.presto.spi.ConnectorSession; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.block.Block; +import com.facebook.presto.spi.relation.column.ColumnExpression; +import com.facebook.presto.spi.relation.column.ColumnExpressionVisitor; +import com.facebook.presto.spi.relation.column.LambdaDefinitionExpression; import com.facebook.presto.sql.gen.LambdaBytecodeGenerator.CompiledLambda; -import com.facebook.presto.sql.relational.LambdaDefinitionExpression; -import com.facebook.presto.sql.relational.RowExpression; -import com.facebook.presto.sql.relational.RowExpressionVisitor; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; @@ -90,18 +90,18 @@ public CacheStatsMBean getJoinFilterFunctionFactoryStats() return new CacheStatsMBean(joinFilterFunctionFactories); } - public JoinFilterFunctionFactory compileJoinFilterFunction(RowExpression filter, int leftBlocksSize) + public JoinFilterFunctionFactory compileJoinFilterFunction(ColumnExpression filter, int leftBlocksSize) { return joinFilterFunctionFactories.getUnchecked(new JoinFilterCacheKey(filter, leftBlocksSize)); } - private JoinFilterFunctionFactory internalCompileFilterFunctionFactory(RowExpression filterExpression, int leftBlocksSize) + private JoinFilterFunctionFactory internalCompileFilterFunctionFactory(ColumnExpression filterExpression, int leftBlocksSize) { Class internalJoinFilterFunction = compileInternalJoinFilterFunction(filterExpression, leftBlocksSize); return new IsolatedJoinFilterFunctionFactory(internalJoinFilterFunction); } - private Class compileInternalJoinFilterFunction(RowExpression filterExpression, int leftBlocksSize) + private Class compileInternalJoinFilterFunction(ColumnExpression filterExpression, int leftBlocksSize) { ClassDefinition classDefinition = new ClassDefinition( a(PUBLIC, FINAL), @@ -127,7 +127,7 @@ private Class compileInternalJoinFilterFun return defineClass(classDefinition, InternalJoinFilterFunction.class, callSiteBinder.getBindings(), getClass().getClassLoader()); } - private void generateMethods(ClassDefinition classDefinition, CallSiteBinder callSiteBinder, RowExpression filter, int leftBlocksSize) + private void generateMethods(ClassDefinition classDefinition, CallSiteBinder callSiteBinder, ColumnExpression filter, int leftBlocksSize) { CachedInstanceBinder cachedInstanceBinder = new CachedInstanceBinder(classDefinition, callSiteBinder); @@ -164,7 +164,7 @@ private void generateFilterMethod( CallSiteBinder callSiteBinder, CachedInstanceBinder cachedInstanceBinder, Map compiledLambdaMap, - RowExpression filter, + ColumnExpression filter, int leftBlocksSize, FieldDefinition sessionField) { @@ -192,7 +192,7 @@ private void generateFilterMethod( Variable wasNullVariable = scope.declareVariable("wasNull", body, constantFalse()); scope.declareVariable("session", body, method.getThis().getField(sessionField)); - RowExpressionCompiler compiler = new RowExpressionCompiler( + ColumnExpressionCompiler compiler = new ColumnExpressionCompiler( callSiteBinder, cachedInstanceBinder, fieldReferenceCompiler(callSiteBinder, leftPosition, leftPage, rightPosition, rightPage, leftBlocksSize), @@ -215,7 +215,7 @@ private Map generateMethodsForLambda CallSiteBinder callSiteBinder, CachedInstanceBinder cachedInstanceBinder, int leftBlocksSize, - RowExpression filter) + ColumnExpression filter) { Set lambdaExpressions = ImmutableSet.copyOf(extractLambdaExpressions(filter)); ImmutableMap.Builder compiledLambdaMap = ImmutableMap.builder(); @@ -251,7 +251,7 @@ public interface JoinFilterFunctionFactory JoinFilterFunction create(ConnectorSession session, LongArrayList addresses, List pages); } - private static RowExpressionVisitor fieldReferenceCompiler( + private static ColumnExpressionVisitor fieldReferenceCompiler( final CallSiteBinder callSiteBinder, final Variable leftPosition, final Variable leftPage, @@ -272,16 +272,16 @@ private static RowExpressionVisitor fieldReferenceCompiler( private static final class JoinFilterCacheKey { - private final RowExpression filter; + private final ColumnExpression filter; private final int leftBlocksSize; - public JoinFilterCacheKey(RowExpression filter, int leftBlocksSize) + public JoinFilterCacheKey(ColumnExpression filter, int leftBlocksSize) { this.filter = requireNonNull(filter, "filter can not be null"); this.leftBlocksSize = leftBlocksSize; } - public RowExpression getFilter() + public ColumnExpression getFilter() { return filter; } diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/LambdaBytecodeGenerator.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/LambdaBytecodeGenerator.java index 378b8ed0e4691..051dcdc9aeaaa 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/LambdaBytecodeGenerator.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/LambdaBytecodeGenerator.java @@ -17,13 +17,14 @@ import com.facebook.presto.operator.aggregation.AccumulatorCompiler; import com.facebook.presto.operator.aggregation.LambdaProvider; import com.facebook.presto.spi.ConnectorSession; -import com.facebook.presto.sql.relational.CallExpression; -import com.facebook.presto.sql.relational.ConstantExpression; -import com.facebook.presto.sql.relational.InputReferenceExpression; -import com.facebook.presto.sql.relational.LambdaDefinitionExpression; -import com.facebook.presto.sql.relational.RowExpression; -import com.facebook.presto.sql.relational.RowExpressionVisitor; -import com.facebook.presto.sql.relational.VariableReferenceExpression; +import com.facebook.presto.spi.relation.column.CallExpression; +import com.facebook.presto.spi.relation.column.ColumnExpression; +import com.facebook.presto.spi.relation.column.ColumnExpressionVisitor; +import com.facebook.presto.spi.relation.column.ColumnReferenceExpression; +import com.facebook.presto.spi.relation.column.ConstantExpression; +import com.facebook.presto.spi.relation.column.InputReferenceExpression; +import com.facebook.presto.spi.relation.column.LambdaDefinitionExpression; +import com.facebook.presto.spi.relation.column.VariableReferenceExpression; import com.google.common.base.VerifyException; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; @@ -82,7 +83,7 @@ public static Map generateMethodsFor ClassDefinition containerClassDefinition, CallSiteBinder callSiteBinder, CachedInstanceBinder cachedInstanceBinder, - RowExpression expression, + ColumnExpression expression, FunctionRegistry functionRegistry) { Set lambdaExpressions = ImmutableSet.copyOf(extractLambdaExpressions(expression)); @@ -129,7 +130,7 @@ public static CompiledLambda preGenerateLambdaExpression( parameterMapBuilder.put(argumentName, new ParameterAndType(arg, type)); } - RowExpressionCompiler innerExpressionCompiler = new RowExpressionCompiler( + ColumnExpressionCompiler innerExpressionCompiler = new ColumnExpressionCompiler( callSiteBinder, cachedInstanceBinder, variableReferenceCompiler(parameterMapBuilder.build()), @@ -145,7 +146,7 @@ public static CompiledLambda preGenerateLambdaExpression( } private static CompiledLambda defineLambdaMethod( - RowExpressionCompiler innerExpressionCompiler, + ColumnExpressionCompiler innerExpressionCompiler, ClassDefinition classDefinition, String methodName, List inputParameters, @@ -179,7 +180,7 @@ private static CompiledLambda defineLambdaMethod( public static BytecodeNode generateLambda( BytecodeGeneratorContext context, - List captureExpressions, + List captureExpressions, CompiledLambda compiledLambda, Class lambdaInterface) { @@ -195,7 +196,7 @@ public static BytecodeNode generateLambda( // generate values to be captured ImmutableList.Builder captureVariableBuilder = ImmutableList.builder(); - for (RowExpression captureExpression : captureExpressions) { + for (ColumnExpression captureExpression : captureExpressions) { Class valueType = Primitives.wrap(captureExpression.getType().getJavaType()); Variable valueVariable = scope.createTempVariable(valueType); block.append(context.generate(captureExpression, Optional.empty())); @@ -261,7 +262,7 @@ public static Class compileLambdaProvider(LambdaDefini scope.declareVariable("wasNull", body, constantFalse()); scope.declareVariable("session", body, method.getThis().getField(sessionField)); - RowExpressionCompiler rowExpressionCompiler = new RowExpressionCompiler( + ColumnExpressionCompiler columnExpressionCompiler = new ColumnExpressionCompiler( callSiteBinder, cachedInstanceBinder, variableReferenceCompiler(ImmutableMap.of()), @@ -269,7 +270,7 @@ public static Class compileLambdaProvider(LambdaDefini compiledLambdaMap); BytecodeGeneratorContext generatorContext = new BytecodeGeneratorContext( - rowExpressionCompiler, + columnExpressionCompiler, scope, callSiteBinder, cachedInstanceBinder, @@ -313,9 +314,9 @@ private static Method getSingleApplyMethod(Class lambdaFunctionInterface) return applyMethods.get(0); } - private static RowExpressionVisitor variableReferenceCompiler(Map parameterMap) + private static ColumnExpressionVisitor variableReferenceCompiler(Map parameterMap) { - return new RowExpressionVisitor() + return new ColumnExpressionVisitor() { @Override public BytecodeNode visitInputReference(InputReferenceExpression node, Scope scope) @@ -351,6 +352,12 @@ public BytecodeNode visitVariableReference(VariableReferenceExpression reference .append(parameter) .append(unboxPrimitiveIfNecessary(context, type)); } + + @Override + public BytecodeNode visitColumnReference(ColumnReferenceExpression columnReferenceExpression, Scope context) + { + throw new UnsupportedOperationException(); + } }; } diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/LambdaExpressionExtractor.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/LambdaExpressionExtractor.java index 5a78f8d870691..af10e4b353ae8 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/LambdaExpressionExtractor.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/LambdaExpressionExtractor.java @@ -13,13 +13,14 @@ */ package com.facebook.presto.sql.gen; -import com.facebook.presto.sql.relational.CallExpression; -import com.facebook.presto.sql.relational.ConstantExpression; -import com.facebook.presto.sql.relational.InputReferenceExpression; -import com.facebook.presto.sql.relational.LambdaDefinitionExpression; -import com.facebook.presto.sql.relational.RowExpression; -import com.facebook.presto.sql.relational.RowExpressionVisitor; -import com.facebook.presto.sql.relational.VariableReferenceExpression; +import com.facebook.presto.spi.relation.column.CallExpression; +import com.facebook.presto.spi.relation.column.ColumnExpression; +import com.facebook.presto.spi.relation.column.ColumnExpressionVisitor; +import com.facebook.presto.spi.relation.column.ColumnReferenceExpression; +import com.facebook.presto.spi.relation.column.ConstantExpression; +import com.facebook.presto.spi.relation.column.InputReferenceExpression; +import com.facebook.presto.spi.relation.column.LambdaDefinitionExpression; +import com.facebook.presto.spi.relation.column.VariableReferenceExpression; import com.google.common.collect.ImmutableList; import java.util.List; @@ -30,7 +31,7 @@ private LambdaExpressionExtractor() { } - public static List extractLambdaExpressions(RowExpression expression) + public static List extractLambdaExpressions(ColumnExpression expression) { Visitor visitor = new Visitor(); expression.accept(visitor, new Context(false)); @@ -38,7 +39,7 @@ public static List extractLambdaExpressions(RowExpre } private static class Visitor - implements RowExpressionVisitor + implements ColumnExpressionVisitor { private final ImmutableList.Builder lambdaExpressions = ImmutableList.builder(); @@ -52,8 +53,8 @@ public Void visitInputReference(InputReferenceExpression node, Context context) @Override public Void visitCall(CallExpression call, Context context) { - for (RowExpression rowExpression : call.getArguments()) { - rowExpression.accept(this, context); + for (ColumnExpression columnExpression : call.getArguments()) { + columnExpression.accept(this, context); } return null; @@ -79,6 +80,12 @@ public Void visitVariableReference(VariableReferenceExpression reference, Contex return null; } + @Override + public Void visitColumnReference(ColumnReferenceExpression reference, Context context) + { + return null; + } + private List getLambdaExpressionsPostOrder() { return lambdaExpressions.build(); diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/NullIfCodeGenerator.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/NullIfCodeGenerator.java index 23d2a23f54922..cf270502c54d7 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/NullIfCodeGenerator.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/NullIfCodeGenerator.java @@ -13,12 +13,12 @@ */ package com.facebook.presto.sql.gen; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; import com.facebook.presto.spi.function.OperatorType; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeSignature; -import com.facebook.presto.sql.relational.RowExpression; import com.google.common.collect.ImmutableList; import io.airlift.bytecode.BytecodeBlock; import io.airlift.bytecode.BytecodeNode; @@ -38,12 +38,12 @@ public class NullIfCodeGenerator implements BytecodeGenerator { @Override - public BytecodeNode generateExpression(Signature signature, BytecodeGeneratorContext generatorContext, Type returnType, List arguments, Optional outputBlockVariable) + public BytecodeNode generateExpression(Signature signature, BytecodeGeneratorContext generatorContext, Type returnType, List arguments, Optional outputBlockVariable) { Scope scope = generatorContext.getScope(); - RowExpression first = arguments.get(0); - RowExpression second = arguments.get(1); + ColumnExpression first = arguments.get(0); + ColumnExpression second = arguments.get(1); LabelNode notMatch = new LabelNode("notMatch"); diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/OrCodeGenerator.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/OrCodeGenerator.java index d7dd173ce61e7..7cd99efb62547 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/OrCodeGenerator.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/OrCodeGenerator.java @@ -13,9 +13,9 @@ */ package com.facebook.presto.sql.gen; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.spi.type.Type; -import com.facebook.presto.sql.relational.RowExpression; import com.google.common.base.Preconditions; import io.airlift.bytecode.BytecodeBlock; import io.airlift.bytecode.BytecodeNode; @@ -33,7 +33,7 @@ public class OrCodeGenerator implements BytecodeGenerator { @Override - public BytecodeNode generateExpression(Signature signature, BytecodeGeneratorContext generator, Type returnType, List arguments, Optional outputBlockVariable) + public BytecodeNode generateExpression(Signature signature, BytecodeGeneratorContext generator, Type returnType, List arguments, Optional outputBlockVariable) { Preconditions.checkArgument(arguments.size() == 2); diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/PageFunctionCompiler.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/PageFunctionCompiler.java index d3a277e65690a..f2045b7659e85 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/PageFunctionCompiler.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/PageFunctionCompiler.java @@ -28,15 +28,15 @@ import com.facebook.presto.spi.PrestoException; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.relation.column.ColumnExpression; +import com.facebook.presto.spi.relation.column.ColumnExpressionVisitor; +import com.facebook.presto.spi.relation.column.ConstantExpression; +import com.facebook.presto.spi.relation.column.InputReferenceExpression; +import com.facebook.presto.spi.relation.column.LambdaDefinitionExpression; import com.facebook.presto.sql.gen.LambdaBytecodeGenerator.CompiledLambda; import com.facebook.presto.sql.planner.CompilerConfig; -import com.facebook.presto.sql.relational.ConstantExpression; import com.facebook.presto.sql.relational.DeterminismEvaluator; import com.facebook.presto.sql.relational.Expressions; -import com.facebook.presto.sql.relational.InputReferenceExpression; -import com.facebook.presto.sql.relational.LambdaDefinitionExpression; -import com.facebook.presto.sql.relational.RowExpression; -import com.facebook.presto.sql.relational.RowExpressionVisitor; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; @@ -99,8 +99,8 @@ public class PageFunctionCompiler private final Metadata metadata; private final DeterminismEvaluator determinismEvaluator; - private final LoadingCache> projectionCache; - private final LoadingCache> filterCache; + private final LoadingCache> projectionCache; + private final LoadingCache> filterCache; private final CacheStatsMBean projectionCacheStats; private final CacheStatsMBean filterCacheStats; @@ -157,7 +157,7 @@ public CacheStatsMBean getFilterCache() return filterCacheStats; } - public Supplier compileProjection(RowExpression projection, Optional classNameSuffix) + public Supplier compileProjection(ColumnExpression projection, Optional classNameSuffix) { if (projectionCache == null) { return compileProjectionInternal(projection, classNameSuffix); @@ -165,7 +165,7 @@ public Supplier compileProjection(RowExpression projection, Opti return projectionCache.getUnchecked(projection); } - private Supplier compileProjectionInternal(RowExpression projection, Optional classNameSuffix) + private Supplier compileProjectionInternal(ColumnExpression projection, Optional classNameSuffix) { requireNonNull(projection, "projection is null"); @@ -208,7 +208,7 @@ private static ParameterizedType generateProjectionWorkClassName(Optional classNameSuffix) + private ClassDefinition definePageProjectWorkClass(ColumnExpression projection, CallSiteBinder callSiteBinder, Optional classNameSuffix) { ClassDefinition classDefinition = new ClassDefinition( a(PUBLIC, FINAL), @@ -316,7 +316,7 @@ private MethodDefinition generateEvaluateMethod( CallSiteBinder callSiteBinder, CachedInstanceBinder cachedInstanceBinder, Map compiledLambdaMap, - RowExpression projection, + ColumnExpression projection, FieldDefinition blockBuilder) { Parameter session = arg("session", ConnectorSession.class); @@ -342,7 +342,7 @@ private MethodDefinition generateEvaluateMethod( declareBlockVariables(projection, page, scope, body); scope.declareVariable("wasNull", body, constantFalse()); - RowExpressionCompiler compiler = new RowExpressionCompiler( + ColumnExpressionCompiler compiler = new ColumnExpressionCompiler( callSiteBinder, cachedInstanceBinder, fieldReferenceCompiler(callSiteBinder), @@ -356,7 +356,7 @@ private MethodDefinition generateEvaluateMethod( return method; } - public Supplier compileFilter(RowExpression filter, Optional classNameSuffix) + public Supplier compileFilter(ColumnExpression filter, Optional classNameSuffix) { if (filterCache == null) { return compileFilterInternal(filter, classNameSuffix); @@ -364,7 +364,7 @@ public Supplier compileFilter(RowExpression filter, Optional return filterCache.getUnchecked(filter); } - private Supplier compileFilterInternal(RowExpression filter, Optional classNameSuffix) + private Supplier compileFilterInternal(ColumnExpression filter, Optional classNameSuffix) { requireNonNull(filter, "filter is null"); @@ -396,7 +396,7 @@ private static ParameterizedType generateFilterClassName(Optional classN return makeClassName(PageFilter.class.getSimpleName(), classNameSuffix); } - private ClassDefinition defineFilterClass(RowExpression filter, InputChannels inputChannels, CallSiteBinder callSiteBinder, Optional classNameSuffix) + private ClassDefinition defineFilterClass(ColumnExpression filter, InputChannels inputChannels, CallSiteBinder callSiteBinder, Optional classNameSuffix) { ClassDefinition classDefinition = new ClassDefinition( a(PUBLIC, FINAL), @@ -492,7 +492,7 @@ private MethodDefinition generateFilterMethod( CallSiteBinder callSiteBinder, CachedInstanceBinder cachedInstanceBinder, Map compiledLambdaMap, - RowExpression filter) + ColumnExpression filter) { Parameter session = arg("session", ConnectorSession.class); Parameter page = arg("page", Page.class); @@ -516,7 +516,7 @@ private MethodDefinition generateFilterMethod( declareBlockVariables(filter, page, scope, body); Variable wasNullVariable = scope.declareVariable("wasNull", body, constantFalse()); - RowExpressionCompiler compiler = new RowExpressionCompiler( + ColumnExpressionCompiler compiler = new ColumnExpressionCompiler( callSiteBinder, cachedInstanceBinder, fieldReferenceCompiler(callSiteBinder), @@ -535,7 +535,7 @@ private Map generateMethodsForLambda ClassDefinition containerClassDefinition, CallSiteBinder callSiteBinder, CachedInstanceBinder cachedInstanceBinder, - RowExpression expression) + ColumnExpression expression) { Set lambdaExpressions = ImmutableSet.copyOf(extractLambdaExpressions(expression)); ImmutableMap.Builder compiledLambdaMap = ImmutableMap.builder(); @@ -578,17 +578,17 @@ private static void generateConstructor( body.ret(); } - private static void declareBlockVariables(RowExpression expression, Parameter page, Scope scope, BytecodeBlock body) + private static void declareBlockVariables(ColumnExpression expression, Parameter page, Scope scope, BytecodeBlock body) { for (int channel : getInputChannels(expression)) { scope.declareVariable("block_" + channel, body, page.invoke("getBlock", Block.class, constantInt(channel))); } } - private static List getInputChannels(Iterable expressions) + private static List getInputChannels(Iterable expressions) { TreeSet channels = new TreeSet<>(); - for (RowExpression expression : Expressions.subExpressions(expressions)) { + for (ColumnExpression expression : Expressions.subExpressions(expressions)) { if (expression instanceof InputReferenceExpression) { channels.add(((InputReferenceExpression) expression).getField()); } @@ -596,7 +596,7 @@ private static List getInputChannels(Iterable expression return ImmutableList.copyOf(channels); } - private static List getInputChannels(RowExpression expression) + private static List getInputChannels(ColumnExpression expression) { return getInputChannels(ImmutableList.of(expression)); } @@ -610,7 +610,7 @@ private static List toBlockParameters(List inputChannels) return parameters.build(); } - private static RowExpressionVisitor fieldReferenceCompiler(CallSiteBinder callSiteBinder) + private static ColumnExpressionVisitor fieldReferenceCompiler(CallSiteBinder callSiteBinder) { return new InputReferenceCompiler( (scope, field) -> scope.getVariable("block_" + field), diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/RowConstructorCodeGenerator.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/RowConstructorCodeGenerator.java index 756e4e7085021..166004f02f3c9 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/RowConstructorCodeGenerator.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/RowConstructorCodeGenerator.java @@ -13,12 +13,12 @@ */ package com.facebook.presto.sql.gen; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; import com.facebook.presto.spi.block.BlockBuilderStatus; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.spi.type.Type; -import com.facebook.presto.sql.relational.RowExpression; import io.airlift.bytecode.BytecodeBlock; import io.airlift.bytecode.BytecodeNode; import io.airlift.bytecode.Scope; @@ -38,7 +38,7 @@ public class RowConstructorCodeGenerator implements BytecodeGenerator { @Override - public BytecodeNode generateExpression(Signature signature, BytecodeGeneratorContext context, Type rowType, List arguments, Optional outputBlockVariable) + public BytecodeNode generateExpression(Signature signature, BytecodeGeneratorContext context, Type rowType, List arguments, Optional outputBlockVariable) { BytecodeBlock block = new BytecodeBlock().setDescription("Constructor for " + rowType.toString()); CallSiteBinder binder = context.getCallSiteBinder(); diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/SwitchCodeGenerator.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/SwitchCodeGenerator.java index 175bbdfe14edd..a0e1666e63f48 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/SwitchCodeGenerator.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/SwitchCodeGenerator.java @@ -13,11 +13,11 @@ */ package com.facebook.presto.sql.gen; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.spi.function.OperatorType; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.CallExpression; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.spi.type.Type; -import com.facebook.presto.sql.relational.CallExpression; -import com.facebook.presto.sql.relational.RowExpression; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; @@ -40,7 +40,7 @@ public class SwitchCodeGenerator implements BytecodeGenerator { @Override - public BytecodeNode generateExpression(Signature signature, BytecodeGeneratorContext generatorContext, Type returnType, List arguments, Optional outputBlockVariable) + public BytecodeNode generateExpression(Signature signature, BytecodeGeneratorContext generatorContext, Type returnType, List arguments, Optional outputBlockVariable) { // TODO: compile as /* @@ -75,12 +75,12 @@ else if ( == ) { Scope scope = generatorContext.getScope(); // process value, else, and all when clauses - RowExpression value = arguments.get(0); + ColumnExpression value = arguments.get(0); BytecodeNode valueBytecode = generatorContext.generate(value, Optional.empty()); BytecodeNode elseValue; - List whenClauses; - RowExpression last = arguments.get(arguments.size() - 1); + List whenClauses; + ColumnExpression last = arguments.get(arguments.size() - 1); if (last instanceof CallExpression && ((CallExpression) last).getSignature().getName().equals("WHEN")) { whenClauses = arguments.subList(1, arguments.size()); elseValue = new BytecodeBlock() @@ -108,11 +108,11 @@ else if ( == ) { // build the statements elseValue = new BytecodeBlock().visitLabel(nullValue).append(elseValue); // reverse list because current if statement builder doesn't support if/else so we need to build the if statements bottom up - for (RowExpression clause : Lists.reverse(whenClauses)) { + for (ColumnExpression clause : Lists.reverse(whenClauses)) { Preconditions.checkArgument(clause instanceof CallExpression && ((CallExpression) clause).getSignature().getName().equals("WHEN")); - RowExpression operand = ((CallExpression) clause).getArguments().get(0); - RowExpression result = ((CallExpression) clause).getArguments().get(1); + ColumnExpression operand = ((CallExpression) clause).getArguments().get(0); + ColumnExpression result = ((CallExpression) clause).getArguments().get(1); // call equals(value, operand) Signature equalsFunction = generatorContext.getRegistry().resolveOperator(OperatorType.EQUAL, ImmutableList.of(value.getType(), operand.getType())); diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/DomainTranslator.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/DomainTranslator.java index 1ec6adf4924a8..7c5ae51d7a780 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/DomainTranslator.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/DomainTranslator.java @@ -16,8 +16,8 @@ import com.facebook.presto.Session; import com.facebook.presto.execution.warnings.WarningCollector; import com.facebook.presto.metadata.Metadata; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.spi.block.Block; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.predicate.DiscreteValues; import com.facebook.presto.spi.predicate.Domain; import com.facebook.presto.spi.predicate.Marker; @@ -59,7 +59,7 @@ import java.util.Map; import java.util.Optional; -import static com.facebook.presto.metadata.Signature.internalOperator; +import static com.facebook.presto.metadata.InternalFunction.internalOperator; import static com.facebook.presto.spi.function.OperatorType.SATURATED_FLOOR_CAST; import static com.facebook.presto.sql.ExpressionUtils.and; import static com.facebook.presto.sql.ExpressionUtils.combineConjuncts; diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/ExpressionInterpreter.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/ExpressionInterpreter.java index d9a5c34e18a69..bc240d8d73893 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/ExpressionInterpreter.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/ExpressionInterpreter.java @@ -18,7 +18,6 @@ import com.facebook.presto.execution.warnings.WarningCollector; import com.facebook.presto.metadata.FunctionRegistry; import com.facebook.presto.metadata.Metadata; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.scalar.ArraySubscriptOperator; import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; import com.facebook.presto.spi.ConnectorSession; @@ -28,8 +27,10 @@ import com.facebook.presto.spi.block.BlockBuilder; import com.facebook.presto.spi.block.RowBlockBuilder; import com.facebook.presto.spi.function.OperatorType; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.ArrayType; import com.facebook.presto.spi.type.CharType; +import com.facebook.presto.spi.type.FunctionType; import com.facebook.presto.spi.type.RowType; import com.facebook.presto.spi.type.RowType.Field; import com.facebook.presto.spi.type.StandardTypes; @@ -87,7 +88,6 @@ import com.facebook.presto.sql.tree.SubscriptExpression; import com.facebook.presto.sql.tree.SymbolReference; import com.facebook.presto.sql.tree.WhenClause; -import com.facebook.presto.type.FunctionType; import com.facebook.presto.type.LikeFunctions; import com.facebook.presto.util.Failures; import com.facebook.presto.util.FastutilSetHelper; diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/LiteralEncoder.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/LiteralEncoder.java index c172d6abdcef7..e3f2effeb414e 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/LiteralEncoder.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/LiteralEncoder.java @@ -15,10 +15,10 @@ import com.facebook.presto.block.BlockSerdeUtil; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.scalar.VarbinaryFunctions; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockEncodingSerde; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.CharType; import com.facebook.presto.spi.type.DecimalType; import com.facebook.presto.spi.type.Decimals; diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/LiteralInterpreter.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/LiteralInterpreter.java index 15df0d0f3228a..b5f4e373a9679 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/LiteralInterpreter.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/LiteralInterpreter.java @@ -14,8 +14,8 @@ package com.facebook.presto.sql.planner; import com.facebook.presto.metadata.Metadata; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.spi.ConnectorSession; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Decimals; import com.facebook.presto.spi.type.Type; import com.facebook.presto.sql.InterpretedFunctionInvoker; @@ -38,7 +38,7 @@ import com.google.common.collect.ImmutableList; import io.airlift.slice.Slice; -import static com.facebook.presto.metadata.FunctionKind.SCALAR; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.spi.type.VarcharType.VARCHAR; import static com.facebook.presto.sql.analyzer.SemanticErrorCode.INVALID_LITERAL; diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/LocalExecutionPlanner.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/LocalExecutionPlanner.java index 882ba5f22f8b8..e73eb75c65c6c 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/LocalExecutionPlanner.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/LocalExecutionPlanner.java @@ -22,7 +22,6 @@ import com.facebook.presto.execution.buffer.PagesSerdeFactory; import com.facebook.presto.index.IndexManager; import com.facebook.presto.metadata.Metadata; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.AggregationOperator.AggregationOperatorFactory; import com.facebook.presto.operator.AssignUniqueIdOperator; import com.facebook.presto.operator.DeleteOperator.DeleteOperatorFactory; @@ -105,7 +104,11 @@ import com.facebook.presto.spi.RecordSet; import com.facebook.presto.spi.block.BlockEncodingSerde; import com.facebook.presto.spi.block.SortOrder; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.predicate.NullableValue; +import com.facebook.presto.spi.relation.column.ColumnExpression; +import com.facebook.presto.spi.relation.column.LambdaDefinitionExpression; +import com.facebook.presto.spi.type.FunctionType; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spiller.PartitioningSpillerFactory; import com.facebook.presto.spiller.SingleStreamSpillerFactory; @@ -163,9 +166,7 @@ import com.facebook.presto.sql.planner.plan.ValuesNode; import com.facebook.presto.sql.planner.plan.WindowNode; import com.facebook.presto.sql.planner.plan.WindowNode.Frame; -import com.facebook.presto.sql.relational.LambdaDefinitionExpression; -import com.facebook.presto.sql.relational.RowExpression; -import com.facebook.presto.sql.relational.SqlToRowExpressionTranslator; +import com.facebook.presto.sql.relational.SqlToColumnExpressionTranslator; import com.facebook.presto.sql.tree.ComparisonExpression; import com.facebook.presto.sql.tree.Expression; import com.facebook.presto.sql.tree.FieldReference; @@ -176,7 +177,6 @@ import com.facebook.presto.sql.tree.OrderBy; import com.facebook.presto.sql.tree.SortItem; import com.facebook.presto.sql.tree.SymbolReference; -import com.facebook.presto.type.FunctionType; import com.google.common.base.VerifyException; import com.google.common.collect.ContiguousSet; import com.google.common.collect.HashMultimap; @@ -221,7 +221,6 @@ import static com.facebook.presto.SystemSessionProperties.isExchangeCompressionEnabled; import static com.facebook.presto.SystemSessionProperties.isSpillEnabled; import static com.facebook.presto.execution.warnings.WarningCollector.NOOP; -import static com.facebook.presto.metadata.FunctionKind.SCALAR; import static com.facebook.presto.operator.DistinctLimitOperator.DistinctLimitOperatorFactory; import static com.facebook.presto.operator.NestedLoopBuildOperator.NestedLoopBuildOperatorFactory; import static com.facebook.presto.operator.NestedLoopJoinOperator.NestedLoopJoinOperatorFactory; @@ -236,6 +235,7 @@ import static com.facebook.presto.operator.UnnestOperator.UnnestOperatorFactory; import static com.facebook.presto.operator.WindowFunctionDefinition.window; import static com.facebook.presto.spi.StandardErrorCode.COMPILER_ERROR; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.TypeUtils.writeNativeValue; import static com.facebook.presto.sql.analyzer.ExpressionAnalyzer.getExpressionTypes; @@ -1219,8 +1219,8 @@ private PhysicalOperation visitScanFilterAndProject( emptyList(), NOOP); - Optional translatedFilter = rewrittenFilter.map(filter -> toRowExpression(filter, expressionTypes)); - List translatedProjections = rewrittenProjections.stream() + Optional translatedFilter = rewrittenFilter.map(filter -> toRowExpression(filter, expressionTypes)); + List translatedProjections = rewrittenProjections.stream() .map(expression -> toRowExpression(expression, expressionTypes)) .collect(toImmutableList()); @@ -1262,9 +1262,9 @@ private PhysicalOperation visitScanFilterAndProject( } } - private RowExpression toRowExpression(Expression expression, Map, Type> types) + private ColumnExpression toRowExpression(Expression expression, Map, Type> types) { - return SqlToRowExpressionTranslator.translate(expression, SCALAR, types, metadata.getFunctionRegistry(), metadata.getTypeManager(), session, true); + return SqlToColumnExpressionTranslator.translate(expression, SCALAR, types, metadata.getFunctionRegistry(), metadata.getTypeManager(), session, true); } private Map getInputTypes(Map layout, List types) @@ -2051,7 +2051,7 @@ private JoinFilterFunctionFactory compileJoinFilterFunction( emptyList(), /* parameters have already been replaced */ NOOP); - RowExpression translatedFilter = toRowExpression(rewrittenFilter, expressionTypes); + ColumnExpression translatedFilter = toRowExpression(rewrittenFilter, expressionTypes); return joinFilterFunctionCompiler.compileJoinFilterFunction(translatedFilter, buildLayout.size()); } diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/PlanOptimizers.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/PlanOptimizers.java index 52358acf117b3..2ce66a07892f5 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/PlanOptimizers.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/PlanOptimizers.java @@ -13,6 +13,7 @@ */ package com.facebook.presto.sql.planner; +import com.facebook.presto.connector.ConnectorOptimizationRuleManager; import com.facebook.presto.cost.CostCalculator; import com.facebook.presto.cost.CostCalculator.EstimatedExchanges; import com.facebook.presto.cost.CostComparator; @@ -23,6 +24,7 @@ import com.facebook.presto.split.SplitManager; import com.facebook.presto.sql.analyzer.FeaturesConfig; import com.facebook.presto.sql.parser.SqlParser; +import com.facebook.presto.sql.planner.iterative.ConnectorOptimizer; import com.facebook.presto.sql.planner.iterative.IterativeOptimizer; import com.facebook.presto.sql.planner.iterative.Rule; import com.facebook.presto.sql.planner.iterative.rule.AddIntermediateAggregations; @@ -149,7 +151,8 @@ public PlanOptimizers( CostCalculator costCalculator, @EstimatedExchanges CostCalculator estimatedExchangesCostCalculator, CostComparator costComparator, - TaskCountEstimator taskCountEstimator) + TaskCountEstimator taskCountEstimator, + ConnectorOptimizationRuleManager connectorOptimizationRuleManager) { this(metadata, sqlParser, @@ -162,7 +165,8 @@ public PlanOptimizers( costCalculator, estimatedExchangesCostCalculator, costComparator, - taskCountEstimator); + taskCountEstimator, + connectorOptimizationRuleManager); } @PostConstruct @@ -191,7 +195,8 @@ public PlanOptimizers( CostCalculator costCalculator, CostCalculator estimatedExchangesCostCalculator, CostComparator costComparator, - TaskCountEstimator taskCountEstimator) + TaskCountEstimator taskCountEstimator, + ConnectorOptimizationRuleManager connectorOptimizationRuleManager) { this.exporter = exporter; ImmutableList.Builder builder = ImmutableList.builder(); @@ -432,6 +437,7 @@ public PlanOptimizers( .addAll(new ExtractSpatialJoins(metadata, splitManager, pageSourceManager, sqlParser).rules()) .add(new InlineProjections()) .build())); + builder.add(new ConnectorOptimizer(metadata, sqlParser, connectorOptimizationRuleManager, new LiteralEncoder(metadata.getBlockEncodingSerde()))); if (!forceSingleNode) { builder.add(new ReplicateSemiJoinInDelete()); // Must run before AddExchanges diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/StatisticsAggregationPlanner.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/StatisticsAggregationPlanner.java index f84ee76cc0719..a622cc13cbbea 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/StatisticsAggregationPlanner.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/StatisticsAggregationPlanner.java @@ -15,10 +15,10 @@ import com.facebook.presto.metadata.FunctionRegistry; import com.facebook.presto.metadata.Metadata; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.aggregation.MaxDataSizeForStats; import com.facebook.presto.operator.aggregation.SumDataSizeForStats; import com.facebook.presto.spi.PrestoException; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.statistics.ColumnStatisticMetadata; import com.facebook.presto.spi.statistics.ColumnStatisticType; import com.facebook.presto.spi.statistics.TableStatisticType; diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/ConnectorOptimizer.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/ConnectorOptimizer.java new file mode 100644 index 0000000000000..91936e84ce7e4 --- /dev/null +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/ConnectorOptimizer.java @@ -0,0 +1,207 @@ +/* + * 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 com.facebook.presto.sql.planner.iterative; + +import com.facebook.presto.Session; +import com.facebook.presto.SystemSessionProperties; +import com.facebook.presto.connector.ConnectorId; +import com.facebook.presto.connector.ConnectorOptimizationRuleManager; +import com.facebook.presto.execution.warnings.WarningCollector; +import com.facebook.presto.metadata.Metadata; +import com.facebook.presto.spi.ConnectorSession; +import com.facebook.presto.spi.PrestoException; +import com.facebook.presto.spi.connector.ConnectorOptimizationRule; +import com.facebook.presto.spi.relation.TableExpression; +import com.facebook.presto.sql.parser.SqlParser; +import com.facebook.presto.sql.planner.LiteralEncoder; +import com.facebook.presto.sql.planner.PlanNodeIdAllocator; +import com.facebook.presto.sql.planner.SymbolAllocator; +import com.facebook.presto.sql.planner.TypeProvider; +import com.facebook.presto.sql.planner.iterative.connector.PlanNodeToTableExpressionTranslator; +import com.facebook.presto.sql.planner.iterative.connector.TableExpressionToPlanNodeTranslator; +import com.facebook.presto.sql.planner.optimizations.PlanOptimizer; +import com.facebook.presto.sql.planner.plan.PlanNode; +import com.facebook.presto.sql.planner.plan.TableScanNode; +import com.google.common.collect.ImmutableSet; +import io.airlift.units.Duration; + +import java.util.Optional; +import java.util.Set; +import java.util.stream.Stream; + +import static com.facebook.presto.spi.StandardErrorCode.OPTIMIZER_TIMEOUT; +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkState; +import static com.google.common.collect.Iterables.getOnlyElement; +import static java.lang.String.format; +import static java.util.concurrent.TimeUnit.NANOSECONDS; + +public class ConnectorOptimizer + implements PlanOptimizer +{ + private final Metadata metadata; + private final SqlParser parser; + private final ConnectorOptimizationRuleManager ruleManager; + private final LiteralEncoder literalEncoder; + + public ConnectorOptimizer(Metadata metadata, SqlParser parser, ConnectorOptimizationRuleManager ruleManager, LiteralEncoder literalEncoder) + { + this.metadata = metadata; + this.parser = parser; + this.ruleManager = ruleManager; + this.literalEncoder = literalEncoder; + } + + @Override + public PlanNode optimize(PlanNode plan, Session session, TypeProvider types, SymbolAllocator symbolAllocator, PlanNodeIdAllocator idAllocator, WarningCollector warningCollector) + { + Memo memo = new Memo(idAllocator, plan, ImmutableSet.of(new ConnectorTraitCollector())); + + Lookup lookup = Lookup.from(planNode -> Stream.of(memo.resolve(planNode))); + Duration timeout = SystemSessionProperties.getOptimizerTimeout(session); + PlanNodeToTableExpressionTranslator planNodeToTableExpressionTranslator = new PlanNodeToTableExpressionTranslator(metadata, symbolAllocator.getTypes(), session, parser, lookup); + TableExpressionToPlanNodeTranslator tableExpressionToPlanNodeTranslator = new TableExpressionToPlanNodeTranslator(idAllocator, symbolAllocator, literalEncoder, metadata); + Context context = new Context(memo, System.nanoTime(), timeout.toMillis(), session, planNodeToTableExpressionTranslator, tableExpressionToPlanNodeTranslator); + exploreGroup(memo.getRootGroup(), context); + + return memo.extract(); + } + + private boolean exploreGroup(int group, Context context) + { + boolean progress = false; + boolean done = false; + + while (!done) { + done = true; + context.checkTimeoutNotExhausted(); + // apply root to bottom of tree first + while (exploreChildren(group, context)) { + done = false; + progress = true; + } + if (exploreNode(group, context)) { + done = false; + progress = true; + } + } + + return progress; + } + + private boolean exploreChildren(int group, Context context) + { + boolean progress = false; + + PlanNode expression = context.memo.getNode(group); + for (PlanNode child : expression.getSources()) { + checkState(child instanceof GroupReference, "Expected child to be a group reference. Found: " + child.getClass().getName()); + + if (exploreGroup(((GroupReference) child).getGroupId(), context)) { + progress = true; + } + } + + return progress; + } + + private boolean exploreNode(int group, Context context) + { + PlanNode node = context.memo.getNode(group); + Set connectors = context.memo.getTraitGroup(group).getTraitSet(ConnectorId.class); + if (connectors.size() != 1) { + return false; + } + ConnectorId connectorId = getOnlyElement(connectors); + Optional tableExpression = context.planNodeToTableExpressionTranslator.translate(node); + if (!tableExpression.isPresent()) { + return false; + } + ConnectorSession connectorSession = context.session.toConnectorSession(connectorId); + boolean progress = false; + boolean done = false; + + while (!done) { + done = true; + for (ConnectorOptimizationRule rule : ruleManager.getRules(connectorId)) { + context.checkTimeoutNotExhausted(); + if (rule.enabled(connectorSession) && rule.match(connectorSession, tableExpression.get())) { + Optional rewritten = rule.optimize(connectorSession, tableExpression.get()); + if (rewritten.isPresent()) { + Optional rewrittenPlanNode = context.tableExpressionToPlanNodeTranslator.translate(context.session, connectorId, rewritten.get(), node.getOutputSymbols()); + checkArgument(rewrittenPlanNode.isPresent(), "Rewrite rule should return something that can be converted back to plan"); + node = context.memo.replace(group, rewrittenPlanNode.get(), format("%s - %s", connectorId, rule.getClass().getName())); + tableExpression = rewritten; + done = false; + progress = true; + } + } + } + } + + return progress; + } + + private static class Context + { + private final Memo memo; + private final long startTimeInNanos; + private final long timeoutInMilliseconds; + private final Session session; + private final PlanNodeToTableExpressionTranslator planNodeToTableExpressionTranslator; + private final TableExpressionToPlanNodeTranslator tableExpressionToPlanNodeTranslator; + + public Context( + Memo memo, + long startTimeInNanos, + long timeoutInMilliseconds, + Session session, + PlanNodeToTableExpressionTranslator planNodeToTableExpressionTranslator, + TableExpressionToPlanNodeTranslator tableExpressionToPlanNodeTranslator) + { + this.planNodeToTableExpressionTranslator = planNodeToTableExpressionTranslator; + this.tableExpressionToPlanNodeTranslator = tableExpressionToPlanNodeTranslator; + checkArgument(timeoutInMilliseconds >= 0, "Timeout has to be a non-negative number [milliseconds]"); + + this.memo = memo; + this.startTimeInNanos = startTimeInNanos; + this.timeoutInMilliseconds = timeoutInMilliseconds; + this.session = session; + } + + public void checkTimeoutNotExhausted() + { + if ((NANOSECONDS.toMillis(System.nanoTime() - startTimeInNanos)) >= timeoutInMilliseconds) { + throw new PrestoException(OPTIMIZER_TIMEOUT, format("The optimizer exhausted the time limit of %d ms", timeoutInMilliseconds)); + } + } + } + + private static class ConnectorTraitCollector + implements Memo.TraitCollector + { + @Override + public boolean canApplyTo(PlanNode node) + { + return node instanceof TableScanNode; + } + + @Override + public Memo.TraitGroup exploreTraits(PlanNode node) + { + return Memo.TraitGroup.emptyTraitGroup() + .addTrait(((TableScanNode) node).getTable().getConnectorId()); + } + } +} diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/Memo.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/Memo.java index 0d764e914fc1f..694a7c1cff0fa 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/Memo.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/Memo.java @@ -18,6 +18,7 @@ import com.facebook.presto.sql.planner.PlanNodeIdAllocator; import com.facebook.presto.sql.planner.plan.PlanNode; import com.google.common.collect.HashMultiset; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.Multiset; import javax.annotation.Nullable; @@ -34,6 +35,7 @@ import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; import static java.util.Objects.requireNonNull; +import static java.util.stream.Collectors.toSet; /** * Stores a plan in a form that's efficient to mutate locally (i.e. without @@ -67,18 +69,25 @@ public class Memo private final PlanNodeIdAllocator idAllocator; private final int rootGroup; + private final Set traitCollectors; private final Map groups = new HashMap<>(); private int nextGroupId = ROOT_GROUP_REF + 1; - public Memo(PlanNodeIdAllocator idAllocator, PlanNode plan) + public Memo(PlanNodeIdAllocator idAllocator, PlanNode plan, Set traitCollectors) { this.idAllocator = idAllocator; + this.traitCollectors = traitCollectors; rootGroup = insertRecursive(plan); groups.get(rootGroup).incomingReferences.add(ROOT_GROUP_REF); } + public Memo(PlanNodeIdAllocator idAllocator, PlanNode plan) + { + this(idAllocator, plan, ImmutableSet.of()); + } + public int getRootGroup() { return rootGroup; @@ -95,6 +104,11 @@ public PlanNode getNode(int group) return getGroup(group).membership; } + public TraitGroup getTraitGroup(int group) + { + return getGroup(group).traitGroup; + } + public PlanNode resolve(GroupReference groupReference) { return getNode(groupReference.getGroupId()); @@ -129,6 +143,7 @@ public PlanNode replace(int group, PlanNode node, String reason) incrementReferenceCounts(node, group); getGroup(group).membership = node; + getGroup(group).traitGroup = mergeTraitGroup(node); decrementReferenceCounts(old, group); evictStatisticsAndCost(group); @@ -198,7 +213,7 @@ private Set getAllReferences(PlanNode node) return node.getSources().stream() .map(GroupReference.class::cast) .map(GroupReference::getGroupId) - .collect(Collectors.toSet()); + .collect(toSet()); } private void deleteGroup(int group) @@ -226,14 +241,32 @@ private int insertRecursive(PlanNode node) } int group = nextGroupId(); + PlanNode rewritten = insertChildrenAndRewrite(node); groups.put(group, Group.withMember(rewritten)); + getGroup(group).traitGroup = mergeTraitGroup(rewritten); + incrementReferenceCounts(rewritten, group); return group; } + private TraitGroup mergeTraitGroup(PlanNode node) + { + requireNonNull(node, "node is null"); + TraitGroup merged = TraitGroup.emptyTraitGroup(); + node.getSources().stream() + .filter(GroupReference.class::isInstance) + .map(GroupReference.class::cast) + .forEach(groupReference -> merged.addAll(getGroup(groupReference.getGroupId()).traitGroup)); + traitCollectors.stream() + .filter(traitCollector -> traitCollector.canApplyTo(node)) + .map(traitCollector -> traitCollector.exploreTraits(node)) + .forEach(traitGroup -> merged.addAll(traitGroup)); + return merged; + } + private int nextGroupId() { return nextGroupId++; @@ -254,6 +287,8 @@ static Group withMember(PlanNode member) private PlanNode membership; private final Multiset incomingReferences = HashMultiset.create(); @Nullable + private TraitGroup traitGroup; + @Nullable private PlanNodeStatsEstimate stats; @Nullable private PlanNodeCostEstimate cumulativeCost; @@ -263,4 +298,80 @@ private Group(PlanNode member) this.membership = requireNonNull(member, "member is null"); } } + + public static class TraitGroup + { + private final Map, TraitSet> traitGroups; + + private TraitGroup() + { + this.traitGroups = new HashMap<>(); + } + + public static TraitGroup emptyTraitGroup() + { + return new TraitGroup(); + } + + public TraitGroup addTrait(T value) + { + addTrait(value.getClass(), value); + return this; + } + + private TraitGroup addTrait(Class type, Object value) + { + if (!traitGroups.containsKey(type)) { + traitGroups.put(type, new TraitSet()); + } + TraitSet traitSet = (TraitSet) traitGroups.get(type); + traitSet.addTrait(type.cast(value)); + return this; + } + + public Set getTraitSet(Class type) + { + if (!traitGroups.containsKey(type)) { + return ImmutableSet.of(); + } + return (Set) traitGroups.get(type).getValues(); + } + + public void addAll(TraitGroup other) + { + other.traitGroups.entrySet().stream() + .forEach(entry -> entry.getValue().getValues().stream().forEach( + value -> addTrait(entry.getKey(), value))); + } + + public TraitGroup merge(TraitGroup other) + { + TraitGroup newTraitGroup = emptyTraitGroup(); + newTraitGroup.addAll(this); + newTraitGroup.addAll(other); + return newTraitGroup; + } + } + + public static class TraitSet + { + private final Set values = new HashSet<>(); + + public void addTrait(T value) + { + values.add(value); + } + + public Set getValues() + { + return values; + } + } + + public interface TraitCollector + { + boolean canApplyTo(PlanNode node); + + TraitGroup exploreTraits(PlanNode node); + } } diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/connector/PlanNodeToTableExpressionTranslator.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/connector/PlanNodeToTableExpressionTranslator.java new file mode 100644 index 0000000000000..5eb73f8a10276 --- /dev/null +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/connector/PlanNodeToTableExpressionTranslator.java @@ -0,0 +1,238 @@ +/* + * 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 com.facebook.presto.sql.planner.iterative.connector; + +import com.facebook.presto.Session; +import com.facebook.presto.execution.warnings.WarningCollector; +import com.facebook.presto.metadata.Metadata; +import com.facebook.presto.metadata.TableLayoutHandle; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.relation.AggregateExpression; +import com.facebook.presto.spi.relation.FilterExpression; +import com.facebook.presto.spi.relation.ProjectExpression; +import com.facebook.presto.spi.relation.TableExpression; +import com.facebook.presto.spi.relation.TableScanExpression; +import com.facebook.presto.spi.relation.column.ColumnExpression; +import com.facebook.presto.spi.relation.column.ColumnReferenceExpression; +import com.facebook.presto.spi.relation.column.InputReferenceExpression; +import com.facebook.presto.spi.relation.column.VariableReferenceExpression; +import com.facebook.presto.spi.type.Type; +import com.facebook.presto.sql.parser.SqlParser; +import com.facebook.presto.sql.planner.Symbol; +import com.facebook.presto.sql.planner.TypeProvider; +import com.facebook.presto.sql.planner.iterative.GroupReference; +import com.facebook.presto.sql.planner.iterative.Lookup; +import com.facebook.presto.sql.planner.plan.AggregationNode; +import com.facebook.presto.sql.planner.plan.FilterNode; +import com.facebook.presto.sql.planner.plan.GroupIdNode; +import com.facebook.presto.sql.planner.plan.PlanNode; +import com.facebook.presto.sql.planner.plan.PlanVisitor; +import com.facebook.presto.sql.planner.plan.ProjectNode; +import com.facebook.presto.sql.planner.plan.TableScanNode; +import com.facebook.presto.sql.relational.SqlToColumnExpressionTranslator; +import com.facebook.presto.sql.tree.Expression; +import com.facebook.presto.sql.tree.NodeRef; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; + +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; +import static com.facebook.presto.spi.type.BigintType.BIGINT; +import static com.facebook.presto.sql.analyzer.ExpressionAnalyzer.getExpressionTypes; +import static com.facebook.presto.sql.planner.optimizations.ExpressionEquivalence.canonicalizeColumnExpression; +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.collect.ImmutableList.toImmutableList; +import static java.util.Objects.requireNonNull; +import static java.util.stream.Collectors.toMap; + +public class PlanNodeToTableExpressionTranslator +{ + private final Metadata metadata; + private final TypeProvider types; + private final Session session; + private final SqlParser parser; + private final Lookup lookup; + + public PlanNodeToTableExpressionTranslator(Metadata metadata, TypeProvider types, Session session, SqlParser parser, Lookup lookup) + { + this.metadata = requireNonNull(metadata, "metadata is null"); + this.types = requireNonNull(types, "types is null"); + this.session = requireNonNull(session, "session is null"); + this.parser = requireNonNull(parser, "parser is null"); + this.lookup = requireNonNull(lookup, "lookup is null"); + } + + public Optional translate(PlanNode plan) + { + return plan.accept(new PlanRewriter(), null); + } + + private class PlanRewriter + extends PlanVisitor, Void> + { + @Override + protected Optional visitPlan(PlanNode node, Void context) + { + return Optional.empty(); + } + + @Override + public Optional visitFilter(FilterNode node, Void context) + { + PlanNode source = node.getSource(); + ColumnExpression predicate = toColumnExpression(node.getPredicate(), source.getOutputSymbols(), SCALAR); + Optional sourceTableExpression = source instanceof GroupReference ? + lookup.resolveGroup(source).findAny().flatMap(planNode -> planNode.accept(this, context)) + : source.accept(this, context); + if (sourceTableExpression.isPresent()) { + return Optional.of(new FilterExpression(predicate, sourceTableExpression.get())); + } + return Optional.empty(); + } + + @Override + public Optional visitProject(ProjectNode node, Void context) + { + PlanNode source = node.getSource(); + List inputs = source.getOutputSymbols(); + Map assignmentColumnExpressions = node.getAssignments() + .getMap() + .entrySet() + .stream() + .collect(toMap(Map.Entry::getKey, entry -> toColumnExpression(entry.getValue(), inputs, SCALAR))); + + Optional child = source instanceof GroupReference ? + lookup.resolveGroup(source).findAny().flatMap(planNode -> planNode.accept(this, context)) + : source.accept(this, context); + if (!child.isPresent()) { + return Optional.empty(); + } + return Optional.of(new ProjectExpression(node.getOutputSymbols().stream().map(symbol -> assignmentColumnExpressions.get(symbol)).collect(Collectors.toList()), child.get())); + } + + @Override + public Optional visitTableScan(TableScanNode node, Void context) + { + return Optional.of(new TableScanExpression( + node.getTable().getConnectorHandle(), + node.getOutputSymbols().stream() + .map(symbol -> new ColumnReferenceExpression(node.getAssignments().get(symbol), types.get(symbol))) + .collect(Collectors.toList()), + node.getLayout().map(TableLayoutHandle::getConnectorHandle))); + } + + @Override + public Optional visitAggregation(AggregationNode node, Void context) + { + if (node.getStep() != AggregationNode.Step.SINGLE) { + return Optional.empty(); + } + Optional source = node.getSource() instanceof GroupReference ? lookup.resolveGroup(node.getSource()).findAny() + : Optional.of(node.getSource()); + if (!source.isPresent()) { + return Optional.empty(); + } + List> groupingSets; + Map groupingKeyInputSymbol; + + if (source.get() instanceof GroupIdNode) { + // grouping sets columns on aggregation Node has |groupKey1$gid|groupKey2$gid|groupId| + // GroupId has |groupKey1$gid -> groupKeyInput1, groupKey2$gid -> groupKeyInput 2, ...| aggregation columns | groupId| + GroupIdNode groupIdNode = (GroupIdNode) source.get(); + source = groupIdNode.getSource() instanceof GroupReference ? lookup.resolveGroup(groupIdNode.getSource()).findAny() : Optional.of(groupIdNode.getSource()); + groupingSets = groupIdNode.getGroupingSets(); + groupingKeyInputSymbol = groupIdNode.getGroupingColumns(); + } + else { + groupingSets = ImmutableList.of(node.getGroupingKeys()); + groupingKeyInputSymbol = node.getGroupingKeys().stream().collect(toMap(k -> k, v -> v)); + } + + if (!source.isPresent()) { + return Optional.empty(); + } + Optional sourceTableExpression = source.get().accept(this, context); + if (!sourceTableExpression.isPresent()) { + return Optional.empty(); + } + List inputs = source.get().getOutputSymbols(); + + List> groupingSetSpec = groupingSets + .stream() + .map(set -> set + .stream() + .map(groupingKeyInputSymbol::get) + .map(inputs::indexOf) + .collect(toImmutableList()) + ).collect(toImmutableList()); + if (groupingSetSpec.stream() + .flatMap(List::stream) + .anyMatch(i -> i < 0)) { + // Failed to convert grouping set to input channels + return Optional.empty(); + } + + // TODO support function decorator in ColumnExpression + if (node.getAggregations().values() + .stream() + .map(AggregationNode.Aggregation::getCall) + .anyMatch(aggregation -> aggregation.isDistinct() == true || aggregation.getWindow().isPresent() || + aggregation.getFilter().isPresent() || aggregation.getOrderBy().isPresent())) { + return Optional.empty(); + } + + Map aggregations = node.getAggregations().entrySet() + .stream() + .collect(toMap(Map.Entry::getKey, entry -> toColumnExpression(entry.getValue().getCall(), inputs, AGGREGATE))); + + List aggregationColumns = node.getOutputSymbols().stream() + .filter(symbol -> aggregations.containsKey(symbol)) + .map(symbol -> aggregations.get(symbol)) + .collect(toImmutableList()); + + checkArgument(aggregationColumns.size() == aggregations.size(), "aggregation of %s size not equals %s", aggregationColumns, node.getAggregations().size()); + + List groupingColumns = Stream.concat( + node.getOutputSymbols().stream() + .filter(groupingKeyInputSymbol::containsKey) + .map(groupingKeyInputSymbol::get) + .map(symbol -> new InputReferenceExpression(inputs.indexOf(symbol), types.get(symbol))) + .filter(input -> input.getField() >= 0), + groupingSets.size() > 1 ? Stream.of(new VariableReferenceExpression("groupId", BIGINT)) : Stream.empty()) + .collect(toImmutableList()); + checkArgument(groupingColumns.size() == node.getGroupingKeys().size(), "grouping key %s size not equals that of %s", groupingColumns, node.getGroupingKeys()); + + return Optional.of( + new AggregateExpression( + aggregationColumns, + groupingColumns, + groupingSetSpec, + sourceTableExpression.get())); + } + + private ColumnExpression toColumnExpression(Expression expression, List inputs, FunctionKind type) + { + Map, Type> expressionTypes = + getExpressionTypes(session, metadata, parser, types, expression, ImmutableList.of(), WarningCollector.NOOP, false); + return canonicalizeColumnExpression(SqlToColumnExpressionTranslator.translate(expression, type, expressionTypes, + ImmutableMap.of(), inputs.stream().map(Symbol::getName).collect(toImmutableList()), metadata.getFunctionRegistry(), metadata.getTypeManager(), session, false)); + } + } +} diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/connector/TableExpressionToPlanNodeTranslator.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/connector/TableExpressionToPlanNodeTranslator.java new file mode 100644 index 0000000000000..1845f5dd2d470 --- /dev/null +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/connector/TableExpressionToPlanNodeTranslator.java @@ -0,0 +1,350 @@ +/* + * 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 com.facebook.presto.sql.planner.iterative.connector; + +import com.facebook.presto.Session; +import com.facebook.presto.connector.ConnectorId; +import com.facebook.presto.metadata.FunctionRegistry; +import com.facebook.presto.metadata.Metadata; +import com.facebook.presto.metadata.TableHandle; +import com.facebook.presto.metadata.TableLayoutHandle; +import com.facebook.presto.spi.ColumnHandle; +import com.facebook.presto.spi.predicate.TupleDomain; +import com.facebook.presto.spi.relation.AggregateExpression; +import com.facebook.presto.spi.relation.FilterExpression; +import com.facebook.presto.spi.relation.ProjectExpression; +import com.facebook.presto.spi.relation.TableExpression; +import com.facebook.presto.spi.relation.TableScanExpression; +import com.facebook.presto.spi.relation.UnaryTableExpression; +import com.facebook.presto.spi.relation.column.CallExpression; +import com.facebook.presto.spi.relation.column.ColumnExpression; +import com.facebook.presto.spi.relation.column.ColumnReferenceExpression; +import com.facebook.presto.spi.relation.column.InputReferenceExpression; +import com.facebook.presto.sql.planner.LiteralEncoder; +import com.facebook.presto.sql.planner.PlanNodeIdAllocator; +import com.facebook.presto.sql.planner.Symbol; +import com.facebook.presto.sql.planner.SymbolAllocator; +import com.facebook.presto.sql.planner.iterative.connector.rewriter.TableExpressionRewriter; +import com.facebook.presto.sql.planner.plan.AggregationNode; +import com.facebook.presto.sql.planner.plan.Assignments; +import com.facebook.presto.sql.planner.plan.FilterNode; +import com.facebook.presto.sql.planner.plan.GroupIdNode; +import com.facebook.presto.sql.planner.plan.PlanNode; +import com.facebook.presto.sql.planner.plan.ProjectNode; +import com.facebook.presto.sql.planner.plan.TableScanNode; +import com.facebook.presto.sql.relational.ColumnExpressionToSqlTranslator; +import com.facebook.presto.sql.tree.Expression; +import com.facebook.presto.sql.tree.FunctionCall; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; + +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +import static com.facebook.presto.sql.relational.SqlToColumnExpressionTranslator.InputCollector.listColumnHandles; +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.collect.ImmutableList.toImmutableList; +import static java.util.Objects.requireNonNull; +import static java.util.stream.Collectors.toMap; + +public class TableExpressionToPlanNodeTranslator +{ + private final PlanNodeIdAllocator idAllocator; + private final SymbolAllocator symbolAllocator; + private final LiteralEncoder literalEncoder; + private final FunctionRegistry functionRegistry; + private final Metadata metadata; + + public TableExpressionToPlanNodeTranslator(PlanNodeIdAllocator idAllocator, SymbolAllocator symbolAllocator, LiteralEncoder literalEncoder, Metadata metadata) + { + requireNonNull(metadata, "metadata is null"); + this.idAllocator = requireNonNull(idAllocator, "idAllocator is null"); + this.symbolAllocator = requireNonNull(symbolAllocator, "symbolAllocator is null"); + this.literalEncoder = requireNonNull(literalEncoder, "literalEncoder is null"); + this.functionRegistry = requireNonNull(metadata.getFunctionRegistry(), "functionRegistry is null"); + this.metadata = metadata; + } + + public Optional translate(Session session, ConnectorId connectorId, TableExpression tableExpression, List outputSymbols) + { + return new Visitor(session, connectorId).accept(tableExpression, new Context(outputSymbols)); + } + + private static class Context + { + private final List outputChannels; + + public Context(List outputChannels) + { + this.outputChannels = requireNonNull(outputChannels, "outputChannels is null"); + } + + public List getOutput() + { + return outputChannels; + } + } + + private class Visitor + { + private final Session session; + private final ConnectorId connectorId; + private final TableExpressionRewriter, Context> rewriter; + + public Visitor(Session session, ConnectorId connectorId) + { + this.session = requireNonNull(session, "session is null"); + this.connectorId = requireNonNull(connectorId, "session is null"); + this.rewriter = new TableExpressionRewriter, Context>() + .addRule(ProjectExpression.class, this::visitProject) + .addRule(FilterExpression.class, this::visitFilter) + .addRule(AggregateExpression.class, this::visitAggregate) + .addRule(TableScanExpression.class, this::visitTableScan); + } + + public Optional accept(TableExpression node, Context context) + { + return rewriter.accept(node, context); + } + + private Optional visitProject(TableExpressionRewriter, Context> currentRewriter, ProjectExpression project, Context context) + { + checkNoColumnInputs(project); + List outputChannelNames = context.getOutput(); + List inputChannelNames = getInputChannels(project); + checkArgument(outputChannelNames.size() == project.getOutput().size(), "project does not have expected size as output"); + + Optional source = currentRewriter.accept(project.getSource(), new Context(inputChannelNames)); + + if (source.isPresent()) { + List assignmentExpressions = project.getOutput().stream() + .map(rowExpression -> translate(rowExpression, inputChannelNames)) + .filter(Optional::isPresent) + .map(Optional::get) + .collect(toImmutableList()); + + if (assignmentExpressions.size() != project.getOutput().size()) { + return Optional.empty(); + } + Assignments.Builder assignments = Assignments.builder(); + for (int i = 0; i < assignmentExpressions.size(); i++) { + assignments.put(outputChannelNames.get(i), assignmentExpressions.get(i)); + } + return Optional.of(new ProjectNode(idAllocator.getNextId(), source.get(), assignments.build())); + } + return Optional.empty(); + } + + private Optional visitFilter(TableExpressionRewriter, Context> currentRewriter, FilterExpression filter, Context context) + { + checkArgument(listColumnHandles(filter.getPredicate()).size() == 0, "Filter node predicate has column reference"); + Optional source = currentRewriter.accept(filter.getSource(), context); + if (source.isPresent()) { + Optional predicate = translate(filter.getPredicate(), source.get().getOutputSymbols()); + if (predicate.isPresent()) { + return Optional.of(new FilterNode(idAllocator.getNextId(), source.get(), predicate.get())); + } + } + return Optional.empty(); + } + + private Optional visitAggregate(TableExpressionRewriter, Context> currentRewriter, AggregateExpression aggregate, Context context) + { + checkNoColumnInputs(aggregate); + int numGroups = aggregate.getGroups().size(); + List outputChannelNames = context.getOutput(); + checkArgument(outputChannelNames.size() == aggregate.getOutput().size(), "aggregate %s does not have expected size as output", aggregate.getOutput()); + // grouping column name won't change and it will always be the first columns of output + Map groupingSymbol = new HashMap<>(); + for (int i = 0; i < aggregate.getGroups().size(); i++) { + ColumnExpression column = aggregate.getGroups().get(i); + if (column instanceof InputReferenceExpression) { + groupingSymbol.put(((InputReferenceExpression) column).getField(), outputChannelNames.get(i)); + } + } + List inputChannelNames = aggregate.getGroupSets().size() > 1 ? getInputChannels(aggregate) : getInputChannels(aggregate, groupingSymbol); + + Optional source = currentRewriter.accept(aggregate.getSource(), new Context(inputChannelNames)); + if (!source.isPresent()) { + return Optional.empty(); + } + AggregationNode.GroupingSetDescriptor groupingSetDescriptor; + Optional groupIdSymbol = Optional.empty(); + if (aggregate.getGroupSets().size() > 1) { + groupIdSymbol = Optional.of(outputChannelNames.get(numGroups - 1)); + List> groupingSets = aggregate.getGroupSets() + .stream() + .map(set -> set.stream() + .map(i -> outputChannelNames.get(i)) + .collect(toImmutableList())) + .collect(toImmutableList()); + + List aggregateArguments = IntStream.range(numGroups, outputChannelNames.size()) + .boxed() + .map(i -> aggregate.getOutput().get(i)) + .filter(CallExpression.class::isInstance) + .map(CallExpression.class::cast) + .map(CallExpression::getArguments) + .flatMap(List::stream) + .filter(InputReferenceExpression.class::isInstance) + .map(InputReferenceExpression.class::cast) + .map(InputReferenceExpression::getField) + .map(i -> inputChannelNames.get(i)) + .collect(toImmutableList()); + + Map groupingColumnNames = IntStream.range(0, numGroups - 1) + .boxed() + .collect(toMap(i -> outputChannelNames.get(i), i -> inputChannelNames.get(((InputReferenceExpression) (aggregate.getGroups().get(i))).getField()))); + + source = Optional.of( + new GroupIdNode( + idAllocator.getNextId(), + source.get(), + groupingSets, + groupingColumnNames, + aggregateArguments, + groupIdSymbol.get())); + groupingSetDescriptor = new AggregationNode.GroupingSetDescriptor( + Stream.concat( + aggregate.getGroups().stream() + .filter(InputReferenceExpression.class::isInstance) + .map(InputReferenceExpression.class::cast) + .map(InputReferenceExpression::getField) + .map(i -> outputChannelNames.get(i)), + Stream.of(groupIdSymbol.get()) + ).collect(toImmutableList()), + aggregate.getGroupSets().size(), + ImmutableSet.of()); + } + else { + groupingSetDescriptor = new AggregationNode.GroupingSetDescriptor( + aggregate.getGroups().stream() + .filter(InputReferenceExpression.class::isInstance) + .map(InputReferenceExpression.class::cast) + .map(InputReferenceExpression::getField) + .map(i -> inputChannelNames.get(i)) + .collect(toImmutableList()), + aggregate.getGroupSets().size(), + ImmutableSet.of()); + } + + // Need to keeps the key order same as output + Map aggregations = new LinkedHashMap<>(); + for (int i = 0; i < aggregate.getAggregations().size(); i++) { + aggregations.put( + outputChannelNames.get(i + numGroups), + new AggregationNode.Aggregation( + (FunctionCall) translate(aggregate.getAggregations().get(i), inputChannelNames).get(), + ((CallExpression) aggregate.getAggregations().get(i)).getSignature(), + Optional.empty())); + } + + return Optional.of( + new AggregationNode( + idAllocator.getNextId(), + source.get(), + aggregations, + groupingSetDescriptor, + ImmutableList.of(), + AggregationNode.Step.SINGLE, + Optional.empty(), + groupIdSymbol)); + } + + private Optional visitTableScan(TableScanExpression tableScan, Context context) + { + List outputChannelNames = context.getOutput(); + List columnHandles = tableScan.getOutput().stream() + .filter(ColumnReferenceExpression.class::isInstance) + .map(ColumnReferenceExpression.class::cast) + .map(ColumnReferenceExpression::getColumnHandle) + .collect(toImmutableList()); + checkArgument(columnHandles.size() == tableScan.getOutput().size(), "tableScan must contains all columnHandle"); + + ImmutableMap.Builder columnHandleMap = new ImmutableMap.Builder(); + for (int i = 0; i < columnHandles.size(); i++) { + columnHandleMap.put(outputChannelNames.get(i), columnHandles.get(i)); + } + + Optional tableLayoutHandle = Optional.empty(); + if (tableScan.getConnectorTableLayoutHandle().isPresent()) { + tableLayoutHandle = Optional.of( + new TableLayoutHandle( + connectorId, + metadata.getTransactionHandle(session, connectorId), + tableScan.getConnectorTableLayoutHandle().get())); + } + + return Optional.of( + new TableScanNode( + idAllocator.getNextId(), + new TableHandle(connectorId, tableScan.getTableHandle()), + outputChannelNames, + columnHandleMap.build(), + tableLayoutHandle, + TupleDomain.all(), + TupleDomain.all())); + } + + private String getNameHint(ColumnExpression rowExpression) + { + //TODO name hit for NamedColumnHandle (which provides getName) + if (rowExpression instanceof CallExpression) { + return ((CallExpression) rowExpression).getSignature().getName(); + } + else if (rowExpression instanceof ColumnReferenceExpression) { + return "col"; + } + return "expr"; + } + + private List getInputChannels(UnaryTableExpression node) + { + return getInputChannels(node, ImmutableMap.of()); + } + + private List getInputChannels(UnaryTableExpression node, Map knownInput) + { + // If expression is InputReference just re-use output name + return IntStream.range(0, node.getSource().getOutput().size()) + .boxed() + .map(i -> + knownInput.containsKey(i) ? + knownInput.get(i) : + symbolAllocator.newSymbol( + getNameHint(node.getSource().getOutput().get(i)), + node.getSource().getOutput().get(i).getType())) + .collect(toImmutableList()); + } + + private Optional translate(ColumnExpression rowExpression, List inputChannelNames) + { + return ColumnExpressionToSqlTranslator.translate(rowExpression, inputChannelNames, ImmutableMap.of(), literalEncoder, functionRegistry); + } + + private void checkNoColumnInputs(UnaryTableExpression node) + { + int numColumnReferences = node.getOutput().stream() + .mapToInt(column -> listColumnHandles(column).size()) + .sum(); + checkArgument(numColumnReferences == 0, "Unary node %s has uncleaned column reference", node); + } + } +} diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/connector/rewriter/RewriteRule.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/connector/rewriter/RewriteRule.java new file mode 100644 index 0000000000000..66a3abcc69cf9 --- /dev/null +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/connector/rewriter/RewriteRule.java @@ -0,0 +1,40 @@ +/* + * 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 com.facebook.presto.sql.planner.iterative.connector.rewriter; + +import com.facebook.presto.spi.relation.TableExpression; + +import static java.util.Objects.requireNonNull; + +public class RewriteRule +{ + private final Class clazz; + private final TriFunction, T, C, R> function; + + public RewriteRule(Class clazz, TriFunction, T, C, R> function) + { + this.clazz = requireNonNull(clazz, "clazz is null"); + this.function = requireNonNull(function, "function is null"); + } + + public boolean match(TableExpression node) + { + return clazz.isInstance(node); + } + + public R apply(TableExpressionRewriter rewriter, TableExpression tableExpression, C context) + { + return function.apply(rewriter, clazz.cast(tableExpression), context); + } +} diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/connector/rewriter/TableExpressionRewriter.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/connector/rewriter/TableExpressionRewriter.java new file mode 100644 index 0000000000000..4441026a211bf --- /dev/null +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/connector/rewriter/TableExpressionRewriter.java @@ -0,0 +1,68 @@ +/* + * 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 com.facebook.presto.sql.planner.iterative.connector.rewriter; + +import com.facebook.presto.spi.relation.TableExpression; + +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.BiFunction; + +import static java.lang.String.format; + +public class TableExpressionRewriter +{ + private List> baseRules = new ArrayList<>(); + private Map, RewriteRule> finalRules = new HashMap<>(); + + public TableExpressionRewriter addRule(Class clazz, TriFunction, T, C, R> function) + { + if (Modifier.isFinal(clazz.getModifiers())) { + finalRules.put(clazz, new RewriteRule<>(clazz, function)); + } + else { + baseRules.add(new RewriteRule<>(clazz, function)); + } + return this; + } + + public TableExpressionRewriter addRule(Class clazz, BiFunction function) + { + if (Modifier.isFinal(clazz.getModifiers())) { + finalRules.put(clazz, new RewriteRule<>(clazz, (rewriter, node, context) -> function.apply(node, context))); + } + else { + baseRules.add(new RewriteRule<>(clazz, (rewriter, node, context) -> function.apply(node, context))); + } + return this; + } + + public R accept(TableExpression node, C context) + { + if (finalRules.containsKey(node.getClass())) { + return finalRules.get(node.getClass()).apply(this, node, context); + } + Optional> rule = baseRules.stream() + .filter(x -> x.match(node)) + .findFirst(); + if (rule.isPresent()) { + return rule.get().apply(this, node, context); + } + throw new UnsupportedOperationException(format("No rules provided to visit node type %s", node.getClass().getName())); + } +} diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/connector/rewriter/TriFunction.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/connector/rewriter/TriFunction.java new file mode 100644 index 0000000000000..d1da05ea5bd87 --- /dev/null +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/connector/rewriter/TriFunction.java @@ -0,0 +1,20 @@ +/* + * 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 com.facebook.presto.sql.planner.iterative.connector.rewriter; + +@FunctionalInterface +public interface TriFunction +{ + R apply(S s, T t, U u); +} diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/rule/PruneCountAggregationOverScalar.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/rule/PruneCountAggregationOverScalar.java index 40ca3b32ea1de..5f52b2d144c8b 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/rule/PruneCountAggregationOverScalar.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/rule/PruneCountAggregationOverScalar.java @@ -15,7 +15,7 @@ import com.facebook.presto.matching.Captures; import com.facebook.presto.matching.Pattern; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.sql.planner.Symbol; import com.facebook.presto.sql.planner.iterative.Rule; import com.facebook.presto.sql.planner.plan.AggregationNode; diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/rule/PushPartialAggregationThroughExchange.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/rule/PushPartialAggregationThroughExchange.java index 102f43f332843..e8378b93f0d77 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/rule/PushPartialAggregationThroughExchange.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/rule/PushPartialAggregationThroughExchange.java @@ -17,8 +17,9 @@ import com.facebook.presto.matching.Captures; import com.facebook.presto.matching.Pattern; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.aggregation.InternalAggregationFunction; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.type.Type; import com.facebook.presto.sql.planner.Partitioning; import com.facebook.presto.sql.planner.PartitioningScheme; import com.facebook.presto.sql.planner.Symbol; @@ -33,6 +34,7 @@ import com.facebook.presto.sql.tree.FunctionCall; import com.facebook.presto.sql.tree.LambdaExpression; import com.facebook.presto.sql.tree.QualifiedName; +import com.facebook.presto.sql.tree.SymbolReference; import com.google.common.collect.ImmutableList; import java.util.ArrayList; @@ -45,6 +47,7 @@ import static com.facebook.presto.SystemSessionProperties.preferPartialAggregation; import static com.facebook.presto.sql.planner.plan.AggregationNode.Step.FINAL; +import static com.facebook.presto.sql.planner.plan.AggregationNode.Step.INTERMEDIATE; import static com.facebook.presto.sql.planner.plan.AggregationNode.Step.PARTIAL; import static com.facebook.presto.sql.planner.plan.AggregationNode.Step.SINGLE; import static com.facebook.presto.sql.planner.plan.ExchangeNode.Type.GATHER; @@ -148,6 +151,11 @@ public Result apply(AggregationNode aggregationNode, Captures captures, Context private PlanNode pushPartial(AggregationNode aggregation, ExchangeNode exchange, Context context) { List partials = new ArrayList<>(); + + if (inputAreIntermediateTypes(aggregation, context)) { + aggregation = aggregation.withStep(INTERMEDIATE, context.getIdAllocator().getNextId()); + } + for (int i = 0; i < exchange.getSources().size(); i++) { PlanNode source = exchange.getSources().get(i); @@ -195,6 +203,27 @@ private PlanNode pushPartial(AggregationNode aggregation, ExchangeNode exchange, Optional.empty()); } + private boolean inputAreIntermediateTypes(AggregationNode aggregationNode, Context context) + { + for (AggregationNode.Aggregation aggregation : aggregationNode.getAggregations().values()) { + if (aggregation.getCall().getArguments().size() != 1 || !(aggregation.getCall().getArguments().get(0) instanceof SymbolReference)) { + return false; + } + try { + Type intermediateType = functionRegistry.getAggregateFunctionImplementation(aggregation.getSignature()).getIntermediateType(); + String inputSymbol = ((SymbolReference) aggregation.getCall().getArguments().get(0)).getName(); + Type inputType = context.getSymbolAllocator().getTypes().get(new Symbol(inputSymbol)); + if (!intermediateType.equals(inputType)) { + return false; + } + } + catch (Throwable ignored) { + return false; + } + } + return true; + } + private PlanNode split(AggregationNode node, Context context) { // otherwise, add a partial and final with an exchange in between diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/rule/RewriteSpatialPartitioningAggregation.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/rule/RewriteSpatialPartitioningAggregation.java index 83c81c0e7e8c5..a4e35a1aebe3c 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/rule/RewriteSpatialPartitioningAggregation.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/rule/RewriteSpatialPartitioningAggregation.java @@ -16,7 +16,7 @@ import com.facebook.presto.matching.Captures; import com.facebook.presto.matching.Pattern; import com.facebook.presto.metadata.Metadata; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.TypeSignature; import com.facebook.presto.sql.planner.Symbol; import com.facebook.presto.sql.planner.iterative.Rule; @@ -34,7 +34,7 @@ import java.util.Map; import static com.facebook.presto.SystemSessionProperties.getHashPartitionCount; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.IntegerType.INTEGER; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.spi.type.VarcharType.VARCHAR; diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/rule/SimplifyCountOverConstant.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/rule/SimplifyCountOverConstant.java index 90ae926dfc791..678b6e8f03262 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/rule/SimplifyCountOverConstant.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/rule/SimplifyCountOverConstant.java @@ -16,7 +16,7 @@ import com.facebook.presto.matching.Capture; import com.facebook.presto.matching.Captures; import com.facebook.presto.matching.Pattern; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.StandardTypes; import com.facebook.presto.sql.planner.Symbol; import com.facebook.presto.sql.planner.iterative.Rule; @@ -36,7 +36,7 @@ import java.util.Map.Entry; import static com.facebook.presto.matching.Capture.newCapture; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.sql.planner.plan.Patterns.aggregation; import static com.facebook.presto.sql.planner.plan.Patterns.project; diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/rule/TransformCorrelatedInPredicateToJoin.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/rule/TransformCorrelatedInPredicateToJoin.java index 290963979bf30..6c5ea8a85f59b 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/rule/TransformCorrelatedInPredicateToJoin.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/rule/TransformCorrelatedInPredicateToJoin.java @@ -15,8 +15,8 @@ import com.facebook.presto.matching.Captures; import com.facebook.presto.matching.Pattern; -import com.facebook.presto.metadata.FunctionKind; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.sql.planner.PlanNodeIdAllocator; import com.facebook.presto.sql.planner.Symbol; import com.facebook.presto.sql.planner.SymbolAllocator; diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/rule/TransformExistsApplyToLateralNode.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/rule/TransformExistsApplyToLateralNode.java index 5e53be7159c44..9f0822f7f962d 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/rule/TransformExistsApplyToLateralNode.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/rule/TransformExistsApplyToLateralNode.java @@ -16,7 +16,7 @@ import com.facebook.presto.matching.Captures; import com.facebook.presto.matching.Pattern; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.sql.planner.Symbol; import com.facebook.presto.sql.planner.iterative.Rule; import com.facebook.presto.sql.planner.optimizations.PlanNodeDecorrelator; diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/AddExchanges.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/AddExchanges.java index f42ec7ecccbee..aea11e8a230c5 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/AddExchanges.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/AddExchanges.java @@ -87,6 +87,7 @@ import java.util.Optional; import java.util.Set; import java.util.function.Function; +import java.util.stream.Stream; import static com.facebook.presto.SystemSessionProperties.isColocatedJoinEnabled; import static com.facebook.presto.SystemSessionProperties.isDistributedSortEnabled; @@ -541,7 +542,7 @@ else if (redistributeWrites) { private PlanWithProperties planTableScan(TableScanNode node, Expression predicate, PreferredProperties preferredProperties) { List possiblePlans = PickTableLayout.listTableLayouts(node, predicate, true, session, types, idAllocator, metadata, parser, domainTranslator); - List possiblePlansWithProperties = possiblePlans.stream() + List possiblePlansWithProperties = Stream.concat(node.getLayout().isPresent() ? Stream.of(node) : Stream.empty(), possiblePlans.stream()) .map(planNode -> new PlanWithProperties(planNode, derivePropertiesRecursively(planNode))) .collect(toImmutableList()); return pickPlan(possiblePlansWithProperties, preferredProperties); diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/ExpressionEquivalence.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/ExpressionEquivalence.java index 0e67c84a4a7f1..a76fce577f982 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/ExpressionEquivalence.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/ExpressionEquivalence.java @@ -16,19 +16,20 @@ import com.facebook.presto.Session; import com.facebook.presto.execution.warnings.WarningCollector; import com.facebook.presto.metadata.Metadata; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.CallExpression; +import com.facebook.presto.spi.relation.column.ColumnExpression; +import com.facebook.presto.spi.relation.column.ColumnExpressionVisitor; +import com.facebook.presto.spi.relation.column.ColumnReferenceExpression; +import com.facebook.presto.spi.relation.column.ConstantExpression; +import com.facebook.presto.spi.relation.column.InputReferenceExpression; +import com.facebook.presto.spi.relation.column.LambdaDefinitionExpression; +import com.facebook.presto.spi.relation.column.VariableReferenceExpression; import com.facebook.presto.spi.type.Type; import com.facebook.presto.sql.parser.SqlParser; import com.facebook.presto.sql.planner.Symbol; import com.facebook.presto.sql.planner.SymbolToInputRewriter; import com.facebook.presto.sql.planner.TypeProvider; -import com.facebook.presto.sql.relational.CallExpression; -import com.facebook.presto.sql.relational.ConstantExpression; -import com.facebook.presto.sql.relational.InputReferenceExpression; -import com.facebook.presto.sql.relational.LambdaDefinitionExpression; -import com.facebook.presto.sql.relational.RowExpression; -import com.facebook.presto.sql.relational.RowExpressionVisitor; -import com.facebook.presto.sql.relational.VariableReferenceExpression; import com.facebook.presto.sql.tree.Expression; import com.facebook.presto.sql.tree.NodeRef; import com.google.common.collect.ComparisonChain; @@ -37,7 +38,9 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Ordering; import io.airlift.slice.Slice; +import io.airlift.slice.Slices; +import java.util.Base64; import java.util.Comparator; import java.util.HashMap; import java.util.List; @@ -45,9 +48,9 @@ import java.util.Map.Entry; import java.util.Set; -import static com.facebook.presto.metadata.FunctionKind.SCALAR; import static com.facebook.presto.metadata.FunctionRegistry.mangleOperatorName; -import static com.facebook.presto.metadata.Signature.internalScalarFunction; +import static com.facebook.presto.metadata.InternalFunction.internalScalarFunction; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.facebook.presto.spi.function.OperatorType.EQUAL; import static com.facebook.presto.spi.function.OperatorType.GREATER_THAN; import static com.facebook.presto.spi.function.OperatorType.GREATER_THAN_OR_EQUAL; @@ -56,8 +59,11 @@ import static com.facebook.presto.spi.function.OperatorType.LESS_THAN_OR_EQUAL; import static com.facebook.presto.spi.function.OperatorType.NOT_EQUAL; import static com.facebook.presto.spi.type.BooleanType.BOOLEAN; +import static com.facebook.presto.spi.type.TimestampType.TIMESTAMP; +import static com.facebook.presto.spi.type.VarbinaryType.VARBINARY; import static com.facebook.presto.sql.analyzer.ExpressionAnalyzer.getExpressionTypesFromInput; -import static com.facebook.presto.sql.relational.SqlToRowExpressionTranslator.translate; +import static com.facebook.presto.sql.relational.Signatures.CAST; +import static com.facebook.presto.sql.relational.SqlToColumnExpressionTranslator.translate; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.collect.ImmutableList.toImmutableList; import static java.lang.Integer.min; @@ -66,7 +72,7 @@ public class ExpressionEquivalence { - private static final Ordering ROW_EXPRESSION_ORDERING = Ordering.from(new RowExpressionComparator()); + private static final Ordering COLUMN_EXPRESSION_ORDERING = Ordering.from(new ColumnExpressionComparator()); private static final CanonicalizationVisitor CANONICALIZATION_VISITOR = new CanonicalizationVisitor(); private final Metadata metadata; private final SqlParser sqlParser; @@ -87,16 +93,21 @@ public boolean areExpressionsEquivalent(Session session, Expression leftExpressi inputTypes.put(inputId, entry.getValue()); inputId++; } - RowExpression leftRowExpression = toRowExpression(session, leftExpression, symbolInput, inputTypes); - RowExpression rightRowExpression = toRowExpression(session, rightExpression, symbolInput, inputTypes); + ColumnExpression leftColumnExpression = toColumnExpression(session, leftExpression, symbolInput, inputTypes); + ColumnExpression rightColumnExpression = toColumnExpression(session, rightExpression, symbolInput, inputTypes); - RowExpression canonicalizedLeft = leftRowExpression.accept(CANONICALIZATION_VISITOR, null); - RowExpression canonicalizedRight = rightRowExpression.accept(CANONICALIZATION_VISITOR, null); + ColumnExpression canonicalizedLeft = leftColumnExpression.accept(CANONICALIZATION_VISITOR, null); + ColumnExpression canonicalizedRight = rightColumnExpression.accept(CANONICALIZATION_VISITOR, null); return canonicalizedLeft.equals(canonicalizedRight); } - private RowExpression toRowExpression(Session session, Expression expression, Map symbolInput, Map inputTypes) + public static ColumnExpression canonicalizeColumnExpression(ColumnExpression columnExpression) + { + return columnExpression.accept(CANONICALIZATION_VISITOR, null); + } + + private ColumnExpression toColumnExpression(Session session, Expression expression, Map symbolInput, Map inputTypes) { // replace qualified names with input references since row expressions do not support these Expression expressionWithInputReferences = new SymbolToInputRewriter(symbolInput).rewrite(expression); @@ -116,10 +127,10 @@ private RowExpression toRowExpression(Session session, Expression expression, Ma } private static class CanonicalizationVisitor - implements RowExpressionVisitor + implements ColumnExpressionVisitor { @Override - public RowExpression visitCall(CallExpression call, Void context) + public ColumnExpression visitCall(CallExpression call, Void context) { call = new CallExpression( call.getSignature(), @@ -132,35 +143,43 @@ public RowExpression visitCall(CallExpression call, Void context) if (callName.equals("AND") || callName.equals("OR")) { // if we have nested calls (of the same type) flatten them - List flattenedArguments = flattenNestedCallArgs(call); + List flattenedArguments = flattenNestedCallArgs(call); // only consider distinct arguments - Set distinctArguments = ImmutableSet.copyOf(flattenedArguments); + Set distinctArguments = ImmutableSet.copyOf(flattenedArguments); if (distinctArguments.size() == 1) { return Iterables.getOnlyElement(distinctArguments); } // canonicalize the argument order (i.e., sort them) - List sortedArguments = ROW_EXPRESSION_ORDERING.sortedCopy(distinctArguments); + List sortedArguments = COLUMN_EXPRESSION_ORDERING.sortedCopy(distinctArguments); return new CallExpression( internalScalarFunction( callName, BOOLEAN.getTypeSignature(), distinctArguments.stream() - .map(RowExpression::getType) + .map(ColumnExpression::getType) .map(Type::getTypeSignature) .collect(toImmutableList())), BOOLEAN, sortedArguments); } + if (callName.equals(CAST)) { + // remove unnecessary cast + checkArgument(call.getArguments().size() == 1, "CAST must only have 1 argument"); + if (call.getArguments().get(0).getType().equals(call.getType())) { + return call.getArguments().get(0); + } + } + if (callName.equals(mangleOperatorName(EQUAL)) || callName.equals(mangleOperatorName(NOT_EQUAL)) || callName.equals(mangleOperatorName(IS_DISTINCT_FROM))) { // sort arguments return new CallExpression( call.getSignature(), call.getType(), - ROW_EXPRESSION_ORDERING.sortedCopy(call.getArguments())); + COLUMN_EXPRESSION_ORDERING.sortedCopy(call.getArguments())); } if (callName.equals(mangleOperatorName(GREATER_THAN)) || callName.equals(mangleOperatorName(GREATER_THAN_OR_EQUAL))) { @@ -178,14 +197,28 @@ public RowExpression visitCall(CallExpression call, Void context) swapPair(call.getArguments())); } + if (callName.equalsIgnoreCase("$literal$timestamp")) { + return new ConstantExpression(((ConstantExpression) call.getArguments().get(0)).getValue(), TIMESTAMP); + } + else if (callName.equalsIgnoreCase("$literal$varbinary")) { + ColumnExpression castedConstant = call.getArguments().get(0); + if (castedConstant instanceof CallExpression && ((CallExpression) castedConstant).getSignature().getName().equalsIgnoreCase("from_base64") + && ((CallExpression) castedConstant).getArguments().get(0) instanceof ConstantExpression) { + Object value = ((ConstantExpression) ((CallExpression) castedConstant).getArguments().get(0)).getValue(); + if (value instanceof Slice) { + return new ConstantExpression(Slices.wrappedBuffer(Base64.getDecoder().decode((((Slice) value).getBytes()))), VARBINARY); + } + } + } + return call; } - public static List flattenNestedCallArgs(CallExpression call) + public static List flattenNestedCallArgs(CallExpression call) { String callName = call.getSignature().getName(); - ImmutableList.Builder newArguments = ImmutableList.builder(); - for (RowExpression argument : call.getArguments()) { + ImmutableList.Builder newArguments = ImmutableList.builder(); + for (ColumnExpression argument : call.getArguments()) { if (argument instanceof CallExpression && callName.equals(((CallExpression) argument).getSignature().getName())) { // same call type, so flatten the args newArguments.addAll(flattenNestedCallArgs((CallExpression) argument)); @@ -198,38 +231,44 @@ public static List flattenNestedCallArgs(CallExpression call) } @Override - public RowExpression visitConstant(ConstantExpression constant, Void context) + public ColumnExpression visitConstant(ConstantExpression constant, Void context) { return constant; } @Override - public RowExpression visitInputReference(InputReferenceExpression node, Void context) + public ColumnExpression visitInputReference(InputReferenceExpression node, Void context) { return node; } @Override - public RowExpression visitLambda(LambdaDefinitionExpression lambda, Void context) + public ColumnExpression visitLambda(LambdaDefinitionExpression lambda, Void context) { return new LambdaDefinitionExpression(lambda.getArgumentTypes(), lambda.getArguments(), lambda.getBody().accept(this, context)); } @Override - public RowExpression visitVariableReference(VariableReferenceExpression reference, Void context) + public ColumnExpression visitVariableReference(VariableReferenceExpression reference, Void context) { return reference; } + + @Override + public ColumnExpression visitColumnReference(ColumnReferenceExpression columnReferenceExpression, Void context) + { + return columnReferenceExpression; + } } - private static class RowExpressionComparator - implements Comparator + private static class ColumnExpressionComparator + implements Comparator { private final Comparator classComparator = Ordering.arbitrary(); - private final ListComparator argumentComparator = new ListComparator<>(this); + private final ListComparator argumentComparator = new ListComparator<>(this); @Override - public int compare(RowExpression left, RowExpression right) + public int compare(ColumnExpression left, ColumnExpression right) { int result = classComparator.compare(left.getClass(), right.getClass()); if (result != 0) { diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/HashGenerationOptimizer.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/HashGenerationOptimizer.java index a8ccac5013bdd..a2ef54adc06f4 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/HashGenerationOptimizer.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/HashGenerationOptimizer.java @@ -17,7 +17,7 @@ import com.facebook.presto.SystemSessionProperties; import com.facebook.presto.execution.warnings.WarningCollector; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.StandardTypes; import com.facebook.presto.sql.planner.Partitioning.ArgumentBinding; import com.facebook.presto.sql.planner.PartitioningScheme; @@ -72,7 +72,7 @@ import java.util.Set; import java.util.function.Function; -import static com.facebook.presto.metadata.FunctionKind.SCALAR; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.sql.planner.SystemPartitioningHandle.FIXED_HASH_DISTRIBUTION; import static com.facebook.presto.sql.planner.plan.ChildReplacer.replaceChildren; diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/ImplementIntersectAndExceptAsUnion.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/ImplementIntersectAndExceptAsUnion.java index fef7cc07ba8f0..4713288c683d2 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/ImplementIntersectAndExceptAsUnion.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/ImplementIntersectAndExceptAsUnion.java @@ -15,7 +15,7 @@ import com.facebook.presto.Session; import com.facebook.presto.execution.warnings.WarningCollector; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.StandardTypes; import com.facebook.presto.spi.type.Type; import com.facebook.presto.sql.ExpressionUtils; @@ -50,7 +50,7 @@ import java.util.Map; import java.util.Optional; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.BooleanType.BOOLEAN; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/OptimizeMixedDistinctAggregations.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/OptimizeMixedDistinctAggregations.java index 04aa9593b34c7..93c973a4897b3 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/OptimizeMixedDistinctAggregations.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/OptimizeMixedDistinctAggregations.java @@ -16,7 +16,7 @@ import com.facebook.presto.Session; import com.facebook.presto.execution.warnings.WarningCollector; import com.facebook.presto.metadata.Metadata; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.BigintType; import com.facebook.presto.spi.type.Type; import com.facebook.presto.sql.analyzer.TypeSignatureProvider; diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/UnaliasSymbolReferences.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/UnaliasSymbolReferences.java index 1e82d82564a95..b9a93be2c298c 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/UnaliasSymbolReferences.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/UnaliasSymbolReferences.java @@ -15,8 +15,8 @@ import com.facebook.presto.Session; import com.facebook.presto.execution.warnings.WarningCollector; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.spi.block.SortOrder; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.sql.planner.DeterminismEvaluator; import com.facebook.presto.sql.planner.OrderingScheme; import com.facebook.presto.sql.planner.PartitioningScheme; diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/WindowFilterPushDown.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/WindowFilterPushDown.java index bc2d3a291fed9..1197956f5f437 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/WindowFilterPushDown.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/WindowFilterPushDown.java @@ -16,7 +16,7 @@ import com.facebook.presto.Session; import com.facebook.presto.execution.warnings.WarningCollector; import com.facebook.presto.metadata.Metadata; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.predicate.Domain; import com.facebook.presto.spi.predicate.Range; import com.facebook.presto.spi.predicate.TupleDomain; @@ -45,7 +45,7 @@ import java.util.OptionalInt; import static com.facebook.presto.SystemSessionProperties.isOptimizeTopNRowNumber; -import static com.facebook.presto.metadata.FunctionKind.WINDOW; +import static com.facebook.presto.spi.function.FunctionKind.WINDOW; import static com.facebook.presto.spi.predicate.Marker.Bound.BELOW; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/plan/AggregationNode.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/plan/AggregationNode.java index aa739ff6f3095..ff7a8afadc25f 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/plan/AggregationNode.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/plan/AggregationNode.java @@ -14,8 +14,8 @@ package com.facebook.presto.sql.planner.plan; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.aggregation.InternalAggregationFunction; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.sql.planner.Symbol; import com.facebook.presto.sql.tree.FunctionCall; import com.fasterxml.jackson.annotation.JsonCreator; @@ -92,6 +92,11 @@ public AggregationNode( this.outputs = outputs.build(); } + public AggregationNode withStep(Step step, PlanNodeId newId) + { + return new AggregationNode(newId, this.source, this.aggregations, this.groupingSets, this.preGroupedSymbols, step, this.hashSymbol, this.groupIdSymbol); + } + public List getGroupingKeys() { return groupingSets.getGroupingKeys(); diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/plan/StatisticAggregations.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/plan/StatisticAggregations.java index 71b1ec0f64969..01fafd753b55c 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/plan/StatisticAggregations.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/plan/StatisticAggregations.java @@ -14,8 +14,8 @@ package com.facebook.presto.sql.planner.plan; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.aggregation.InternalAggregationFunction; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.sql.planner.Symbol; import com.facebook.presto.sql.planner.SymbolAllocator; import com.facebook.presto.sql.planner.plan.AggregationNode.Aggregation; diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/plan/WindowNode.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/plan/WindowNode.java index f62c14caec6de..a0c4e2d4f4124 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/plan/WindowNode.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/plan/WindowNode.java @@ -13,7 +13,7 @@ */ package com.facebook.presto.sql.planner.plan; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.sql.planner.OrderingScheme; import com.facebook.presto.sql.planner.Symbol; import com.facebook.presto.sql.tree.Expression; diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/planPrinter/PlanPrinter.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/planPrinter/PlanPrinter.java index 3aad8bcc49709..4be74488d959b 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/planPrinter/PlanPrinter.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/planPrinter/PlanPrinter.java @@ -22,11 +22,11 @@ import com.facebook.presto.execution.StageStats; import com.facebook.presto.metadata.FunctionRegistry; import com.facebook.presto.metadata.OperatorNotFoundException; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.TableHandle; import com.facebook.presto.operator.StageExecutionDescriptor; import com.facebook.presto.spi.ColumnHandle; import com.facebook.presto.spi.ConnectorTableLayoutHandle; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.predicate.Domain; import com.facebook.presto.spi.predicate.Marker; import com.facebook.presto.spi.predicate.NullableValue; diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/sanity/TypeValidator.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/sanity/TypeValidator.java index 3c0f05162eed0..735dbf69c4bfa 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/sanity/TypeValidator.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/sanity/TypeValidator.java @@ -16,7 +16,7 @@ import com.facebook.presto.Session; import com.facebook.presto.execution.warnings.WarningCollector; import com.facebook.presto.metadata.Metadata; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeManager; import com.facebook.presto.spi.type.TypeSignature; diff --git a/presto-main/src/main/java/com/facebook/presto/sql/relational/ColumnExpressionToSqlTranslator.java b/presto-main/src/main/java/com/facebook/presto/sql/relational/ColumnExpressionToSqlTranslator.java new file mode 100644 index 0000000000000..3d501fa526089 --- /dev/null +++ b/presto-main/src/main/java/com/facebook/presto/sql/relational/ColumnExpressionToSqlTranslator.java @@ -0,0 +1,306 @@ +/* + * 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 com.facebook.presto.sql.relational; + +import com.facebook.presto.metadata.FunctionRegistry; +import com.facebook.presto.spi.ColumnHandle; +import com.facebook.presto.spi.relation.column.CallExpression; +import com.facebook.presto.spi.relation.column.ColumnExpression; +import com.facebook.presto.spi.relation.column.ColumnExpressionVisitor; +import com.facebook.presto.spi.relation.column.ColumnReferenceExpression; +import com.facebook.presto.spi.relation.column.ConstantExpression; +import com.facebook.presto.spi.relation.column.InputReferenceExpression; +import com.facebook.presto.spi.relation.column.LambdaDefinitionExpression; +import com.facebook.presto.spi.relation.column.VariableReferenceExpression; +import com.facebook.presto.spi.type.RowType; +import com.facebook.presto.sql.planner.LiteralEncoder; +import com.facebook.presto.sql.planner.Symbol; +import com.facebook.presto.sql.tree.ArithmeticBinaryExpression; +import com.facebook.presto.sql.tree.ArithmeticUnaryExpression; +import com.facebook.presto.sql.tree.ArrayConstructor; +import com.facebook.presto.sql.tree.Cast; +import com.facebook.presto.sql.tree.CoalesceExpression; +import com.facebook.presto.sql.tree.ComparisonExpression; +import com.facebook.presto.sql.tree.DereferenceExpression; +import com.facebook.presto.sql.tree.Expression; +import com.facebook.presto.sql.tree.FieldReference; +import com.facebook.presto.sql.tree.FunctionCall; +import com.facebook.presto.sql.tree.Identifier; +import com.facebook.presto.sql.tree.IfExpression; +import com.facebook.presto.sql.tree.InListExpression; +import com.facebook.presto.sql.tree.InPredicate; +import com.facebook.presto.sql.tree.IsNullPredicate; +import com.facebook.presto.sql.tree.LambdaArgumentDeclaration; +import com.facebook.presto.sql.tree.LambdaExpression; +import com.facebook.presto.sql.tree.LikePredicate; +import com.facebook.presto.sql.tree.LogicalBinaryExpression; +import com.facebook.presto.sql.tree.QualifiedName; +import com.facebook.presto.sql.tree.Row; +import com.facebook.presto.sql.tree.SubscriptExpression; +import com.facebook.presto.sql.tree.SymbolReference; +import com.facebook.presto.sql.tree.TryExpression; +import com.google.common.collect.Iterables; + +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +import static com.facebook.presto.metadata.FunctionRegistry.isOperator; +import static com.facebook.presto.metadata.FunctionRegistry.unmangleOperator; +import static com.facebook.presto.sql.relational.Signatures.CAST; +import static com.facebook.presto.sql.relational.Signatures.likePatternSignature; +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.collect.ImmutableList.toImmutableList; + +public class ColumnExpressionToSqlTranslator +{ + private ColumnExpressionToSqlTranslator() + { + } + + public static Optional translate(ColumnExpression columnExpression, List inputs, Map columns, LiteralEncoder literalEncoder, + FunctionRegistry functionRegistry) + { + return columnExpression.accept(new Visitor(inputs, columns, literalEncoder, functionRegistry), null); + } + + public static class Visitor + implements ColumnExpressionVisitor, Void> + { + private final List inputs; + private final Map columns; + private final LiteralEncoder literalEncoder; + private final FunctionRegistry functionRegistry; + + public Visitor(List inputs, Map columns, LiteralEncoder literalEncoder, FunctionRegistry functionRegistry) + { + this.inputs = inputs; + this.columns = columns; + this.literalEncoder = literalEncoder; + this.functionRegistry = functionRegistry; + } + + @Override + public Optional visitCall(CallExpression call, Void context) + { + String functionName = call.getSignature().getName(); + List arguments = call.getArguments() + .stream() + .map(rowExpression -> rowExpression.accept(this, context)) + .filter(Optional::isPresent) + .map(Optional::get) + .collect(Collectors.toList()); + + // LIKE_PATTERN cannot be converted to expression + if (functionName.equalsIgnoreCase("LIKE")) { + checkBinaryExpression(call); + ColumnExpression pattern = call.getArguments().get(1); + if (pattern instanceof CallExpression) { + if (((CallExpression) pattern).getSignature().getName().equalsIgnoreCase(CAST)) { + Optional patternString = ((CallExpression) pattern).getArguments().get(0).accept(this, context); + if (patternString.isPresent()) { + return Optional.of(new LikePredicate(arguments.get(0), patternString.get(), Optional.empty())); + } + } + else if (((CallExpression) pattern).getSignature().equals(likePatternSignature())) { + CallExpression likePatternWithEscape = (CallExpression) pattern; + checkBinaryExpression(likePatternWithEscape); + Optional patternExpression = likePatternWithEscape.getArguments().get(0).accept(this, context); + Optional escapeExpression = likePatternWithEscape.getArguments().get(1).accept(this, context); + if (patternExpression.isPresent() && escapeExpression.isPresent()) { + return Optional.of(new LikePredicate(arguments.get(0), patternExpression.get(), escapeExpression)); + } + } + } + } + + if (arguments.size() != call.getArguments().size()) { + return Optional.empty(); + } + + if (functionName.equalsIgnoreCase("AND")) { + checkBinaryExpression(call); + return Optional.of(new LogicalBinaryExpression(LogicalBinaryExpression.Operator.AND, arguments.get(0), arguments.get(1))); + } + else if (functionName.equalsIgnoreCase("OR")) { + checkBinaryExpression(call); + return Optional.of(new LogicalBinaryExpression(LogicalBinaryExpression.Operator.OR, arguments.get(0), arguments.get(1))); + } + else if (functionName.equalsIgnoreCase("IN")) { + return Optional.of(new InPredicate(arguments.get(0), new InListExpression(arguments.subList(1, arguments.size())))); + } + else if (functionName.equalsIgnoreCase("IF")) { + checkTernaryExpression(call); + return Optional.of(new IfExpression(arguments.get(0), arguments.get(1), arguments.get(2))); + } + else if (functionName.equalsIgnoreCase("ARRAY_CONSTRUCTOR")) { + return Optional.of(new ArrayConstructor(arguments)); + } + else if (functionName.equalsIgnoreCase("ROW_CONSTRUCTOR")) { + return Optional.of(new Row(arguments)); + } + else if (functionName.equalsIgnoreCase("COALESCE")) { + return Optional.of(new CoalesceExpression(arguments)); + } + else if (functionName.equalsIgnoreCase("IS_NULL")) { + checkUnaryExpression(call); + return Optional.of(new IsNullPredicate(arguments.get(0))); + } + else if (functionName.equalsIgnoreCase("DEREFERENCE")) { + checkBinaryExpression(call); + RowType rowType = (RowType) call.getArguments().get(0).getType(); + int field = (Integer) (((ConstantExpression) call.getArguments().get(1)).getValue()); + return Optional.of(new DereferenceExpression(arguments.get(0), new Identifier(rowType.getFields().get(field).getName().get()))); + } + else if (functionName.equalsIgnoreCase("TRY")) { + checkUnaryExpression(call); + return Optional.of(new TryExpression(arguments.get(0))); + } + else if (functionName.equalsIgnoreCase("TRY_CAST")) { + checkUnaryExpression(call); + return Optional.of(new Cast(arguments.get(0), call.getType().getTypeSignature().toString(), true)); + } + + if (isOperator(functionName)) { + switch (unmangleOperator(functionName)) { + case ADD: + checkBinaryExpression(call); + return Optional.of(new ArithmeticBinaryExpression(ArithmeticBinaryExpression.Operator.ADD, arguments.get(0), arguments.get(1))); + case SUBTRACT: + checkBinaryExpression(call); + return Optional.of(new ArithmeticBinaryExpression(ArithmeticBinaryExpression.Operator.SUBTRACT, arguments.get(0), arguments.get(1))); + case DIVIDE: + checkBinaryExpression(call); + return Optional.of(new ArithmeticBinaryExpression(ArithmeticBinaryExpression.Operator.DIVIDE, arguments.get(0), arguments.get(1))); + case MULTIPLY: + checkBinaryExpression(call); + return Optional.of(new ArithmeticBinaryExpression(ArithmeticBinaryExpression.Operator.MULTIPLY, arguments.get(0), arguments.get(1))); + case MODULUS: + checkBinaryExpression(call); + return Optional.of(new ArithmeticBinaryExpression(ArithmeticBinaryExpression.Operator.MODULUS, arguments.get(0), arguments.get(1))); + case NEGATION: + checkUnaryExpression(call); + return Optional.of(new ArithmeticUnaryExpression(ArithmeticUnaryExpression.Sign.MINUS, arguments.get(0))); + case EQUAL: + checkBinaryExpression(call); + return Optional.of(new ComparisonExpression(ComparisonExpression.Operator.EQUAL, arguments.get(0), arguments.get(1))); + case NOT_EQUAL: + checkBinaryExpression(call); + return Optional.of(new ComparisonExpression(ComparisonExpression.Operator.NOT_EQUAL, arguments.get(0), arguments.get(1))); + case LESS_THAN: + checkBinaryExpression(call); + return Optional.of(new ComparisonExpression(ComparisonExpression.Operator.LESS_THAN, arguments.get(0), arguments.get(1))); + case LESS_THAN_OR_EQUAL: + checkBinaryExpression(call); + return Optional.of(new ComparisonExpression(ComparisonExpression.Operator.LESS_THAN_OR_EQUAL, arguments.get(0), arguments.get(1))); + case GREATER_THAN: + checkBinaryExpression(call); + return Optional.of(new ComparisonExpression(ComparisonExpression.Operator.GREATER_THAN, arguments.get(0), arguments.get(1))); + case GREATER_THAN_OR_EQUAL: + checkBinaryExpression(call); + return Optional.of(new ComparisonExpression(ComparisonExpression.Operator.GREATER_THAN_OR_EQUAL, arguments.get(0), arguments.get(1))); + case BETWEEN: + checkTernaryExpression(call); + return Optional.of(new LogicalBinaryExpression( + LogicalBinaryExpression.Operator.AND, + new ComparisonExpression(ComparisonExpression.Operator.GREATER_THAN_OR_EQUAL, arguments.get(0), arguments.get(1)), + new ComparisonExpression(ComparisonExpression.Operator.LESS_THAN_OR_EQUAL, arguments.get(0), arguments.get(2)))); + case CAST: + // TODO better way to convert back type to SQL? + checkUnaryExpression(call); + return Optional.of(new Cast(arguments.get(0), call.getType().getTypeSignature().toString())); + case SUBSCRIPT: + checkBinaryExpression(call); + return Optional.of(new SubscriptExpression(arguments.get(0), arguments.get(1))); + default: + return Optional.empty(); + } + } + + // TODO change to functionHandle once FunctionManager is available + Set functions = functionRegistry.getFunctions(call.getSignature()); + if (functions.isEmpty()) { + return Optional.empty(); + } + checkArgument(functions.size() == 1, "Resolved multiple functions %s for %s", functions, call.getSignature()); + return Optional.of(new FunctionCall(Iterables.get(functions, 0), arguments)); + } + + @Override + public Optional visitInputReference(InputReferenceExpression reference, Void context) + { + if (inputs.isEmpty()) { + return Optional.of(new FieldReference(reference.getField())); + } + checkArgument(reference.getField() < inputs.size(), "field not found."); + return Optional.of(inputs.get(reference.getField()).toSymbolReference()); + } + + @Override + public Optional visitConstant(ConstantExpression literal, Void context) + { + return Optional.of(literalEncoder.toExpression(literal.getValue(), literal.getType())); + } + + @Override + public Optional visitLambda(LambdaDefinitionExpression lambda, Void context) + { + Optional body = lambda.getBody() + .accept(this, context); + if (body.isPresent()) { + return Optional.of( + new LambdaExpression( + lambda + .getArguments() + .stream() + .map( + name -> new LambdaArgumentDeclaration( + new Identifier(name))) + .collect(toImmutableList()), + body.get())); + } + return Optional.empty(); + } + + @Override + public Optional visitVariableReference(VariableReferenceExpression reference, Void context) + { + return Optional.of(new SymbolReference(reference.getName())); + } + + @Override + public Optional visitColumnReference(ColumnReferenceExpression columnReferenceExpression, Void context) + { + checkArgument(columns.containsKey(columnReferenceExpression.getColumnHandle()), "columnHandle not found."); + return Optional.of(new SymbolReference(columns.get(columnReferenceExpression.getColumnHandle()))); + } + + private void checkUnaryExpression(CallExpression call) + { + checkArgument(call.getArguments().size() == 1, "Call %s must has exactly 1 argument but got %s", call.getSignature(), call.getArguments()); + } + + private void checkBinaryExpression(CallExpression call) + { + checkArgument(call.getArguments().size() == 2, "Call %s must has exactly 2 argument but got %s", call.getSignature(), call.getArguments()); + } + + private void checkTernaryExpression(CallExpression call) + { + checkArgument(call.getArguments().size() == 3, "Call %s must has exactly 2 argument but got %s", call.getSignature(), call.getArguments()); + } + } +} diff --git a/presto-main/src/main/java/com/facebook/presto/sql/relational/DeterminismEvaluator.java b/presto-main/src/main/java/com/facebook/presto/sql/relational/DeterminismEvaluator.java index e1f9534b55e2d..695912957958c 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/relational/DeterminismEvaluator.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/relational/DeterminismEvaluator.java @@ -14,7 +14,15 @@ package com.facebook.presto.sql.relational; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.CallExpression; +import com.facebook.presto.spi.relation.column.ColumnExpression; +import com.facebook.presto.spi.relation.column.ColumnExpressionVisitor; +import com.facebook.presto.spi.relation.column.ColumnReferenceExpression; +import com.facebook.presto.spi.relation.column.ConstantExpression; +import com.facebook.presto.spi.relation.column.InputReferenceExpression; +import com.facebook.presto.spi.relation.column.LambdaDefinitionExpression; +import com.facebook.presto.spi.relation.column.VariableReferenceExpression; import static java.util.Objects.requireNonNull; @@ -27,13 +35,13 @@ public DeterminismEvaluator(FunctionRegistry registry) this.registry = requireNonNull(registry, "registry is null"); } - public boolean isDeterministic(RowExpression expression) + public boolean isDeterministic(ColumnExpression expression) { return expression.accept(new Visitor(registry), null); } private static class Visitor - implements RowExpressionVisitor + implements ColumnExpressionVisitor { private final FunctionRegistry registry; @@ -77,5 +85,11 @@ public Boolean visitVariableReference(VariableReferenceExpression reference, Voi { return true; } + + @Override + public Boolean visitColumnReference(ColumnReferenceExpression columnReferenceExpression, Void context) + { + return true; + } } } diff --git a/presto-main/src/main/java/com/facebook/presto/sql/relational/Expressions.java b/presto-main/src/main/java/com/facebook/presto/sql/relational/Expressions.java index 81283e4ee46dd..c1b57b95754ab 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/relational/Expressions.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/relational/Expressions.java @@ -13,7 +13,15 @@ */ package com.facebook.presto.sql.relational; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.CallExpression; +import com.facebook.presto.spi.relation.column.ColumnExpression; +import com.facebook.presto.spi.relation.column.ColumnExpressionVisitor; +import com.facebook.presto.spi.relation.column.ColumnReferenceExpression; +import com.facebook.presto.spi.relation.column.ConstantExpression; +import com.facebook.presto.spi.relation.column.InputReferenceExpression; +import com.facebook.presto.spi.relation.column.LambdaDefinitionExpression; +import com.facebook.presto.spi.relation.column.VariableReferenceExpression; import com.facebook.presto.spi.type.Type; import com.google.common.collect.ImmutableList; @@ -36,12 +44,12 @@ public static ConstantExpression constantNull(Type type) return new ConstantExpression(null, type); } - public static CallExpression call(Signature signature, Type returnType, RowExpression... arguments) + public static CallExpression call(Signature signature, Type returnType, ColumnExpression... arguments) { return new CallExpression(signature, returnType, Arrays.asList(arguments)); } - public static CallExpression call(Signature signature, Type returnType, List arguments) + public static CallExpression call(Signature signature, Type returnType, List arguments) { return new CallExpression(signature, returnType, arguments); } @@ -51,18 +59,18 @@ public static InputReferenceExpression field(int field, Type type) return new InputReferenceExpression(field, type); } - public static List subExpressions(Iterable expressions) + public static List subExpressions(Iterable expressions) { - final ImmutableList.Builder builder = ImmutableList.builder(); + final ImmutableList.Builder builder = ImmutableList.builder(); - for (RowExpression expression : expressions) { - expression.accept(new RowExpressionVisitor() + for (ColumnExpression expression : expressions) { + expression.accept(new ColumnExpressionVisitor() { @Override public Void visitCall(CallExpression call, Void context) { builder.add(call); - for (RowExpression argument : call.getArguments()) { + for (ColumnExpression argument : call.getArguments()) { argument.accept(this, context); } return null; @@ -96,6 +104,13 @@ public Void visitVariableReference(VariableReferenceExpression reference, Void c builder.add(reference); return null; } + + @Override + public Void visitColumnReference(ColumnReferenceExpression columnReferenceExpression, Void context) + { + builder.add(columnReferenceExpression); + return null; + } }, null); } diff --git a/presto-main/src/main/java/com/facebook/presto/sql/relational/Signatures.java b/presto-main/src/main/java/com/facebook/presto/sql/relational/Signatures.java index 337520411a48c..f868ed85547d0 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/relational/Signatures.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/relational/Signatures.java @@ -13,8 +13,8 @@ */ package com.facebook.presto.sql.relational; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.spi.function.OperatorType; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.BigintType; import com.facebook.presto.spi.type.CharType; import com.facebook.presto.spi.type.RowType; @@ -30,10 +30,10 @@ import java.util.List; -import static com.facebook.presto.metadata.FunctionKind.SCALAR; import static com.facebook.presto.metadata.FunctionRegistry.mangleOperatorName; -import static com.facebook.presto.metadata.Signature.internalOperator; -import static com.facebook.presto.metadata.Signature.internalScalarFunction; +import static com.facebook.presto.metadata.InternalFunction.internalOperator; +import static com.facebook.presto.metadata.InternalFunction.internalScalarFunction; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.facebook.presto.spi.function.OperatorType.SUBSCRIPT; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.sql.tree.ArrayConstructor.ARRAY_CONSTRUCTOR; diff --git a/presto-main/src/main/java/com/facebook/presto/sql/relational/SqlToRowExpressionTranslator.java b/presto-main/src/main/java/com/facebook/presto/sql/relational/SqlToColumnExpressionTranslator.java similarity index 58% rename from presto-main/src/main/java/com/facebook/presto/sql/relational/SqlToRowExpressionTranslator.java rename to presto-main/src/main/java/com/facebook/presto/sql/relational/SqlToColumnExpressionTranslator.java index 8dc676cb8ca65..3b184854349e6 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/relational/SqlToRowExpressionTranslator.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/relational/SqlToColumnExpressionTranslator.java @@ -15,9 +15,18 @@ import com.facebook.presto.Session; import com.facebook.presto.SystemSessionProperties; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.ColumnHandle; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.CallExpression; +import com.facebook.presto.spi.relation.column.ColumnExpression; +import com.facebook.presto.spi.relation.column.ColumnExpressionVisitor; +import com.facebook.presto.spi.relation.column.ColumnReferenceExpression; +import com.facebook.presto.spi.relation.column.ConstantExpression; +import com.facebook.presto.spi.relation.column.InputReferenceExpression; +import com.facebook.presto.spi.relation.column.LambdaDefinitionExpression; +import com.facebook.presto.spi.relation.column.VariableReferenceExpression; import com.facebook.presto.spi.type.CharType; import com.facebook.presto.spi.type.DecimalParseResult; import com.facebook.presto.spi.type.Decimals; @@ -77,14 +86,17 @@ import com.facebook.presto.type.UnknownType; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; import java.util.List; import java.util.Map; import java.util.OptionalInt; +import java.util.Set; +import java.util.stream.IntStream; import static com.facebook.presto.SystemSessionProperties.isLegacyRowFieldOrdinalAccessEnabled; -import static com.facebook.presto.metadata.FunctionKind.SCALAR; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.BooleanType.BOOLEAN; import static com.facebook.presto.spi.type.CharType.createCharType; @@ -129,15 +141,17 @@ import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; import static com.google.common.collect.ImmutableList.toImmutableList; +import static com.google.common.collect.ImmutableSet.toImmutableSet; import static io.airlift.slice.SliceUtf8.countCodePoints; import static io.airlift.slice.Slices.utf8Slice; import static java.util.Objects.requireNonNull; +import static java.util.stream.Collectors.toMap; -public final class SqlToRowExpressionTranslator +public final class SqlToColumnExpressionTranslator { - private SqlToRowExpressionTranslator() {} + private SqlToColumnExpressionTranslator() {} - public static RowExpression translate( + public static ColumnExpression translate( Expression expression, FunctionKind functionKind, Map, Type> types, @@ -145,15 +159,44 @@ public static RowExpression translate( TypeManager typeManager, Session session, boolean optimize) + { + return translate(expression, functionKind, types, ImmutableMap.of(), functionRegistry, typeManager, session, optimize); + } + + public static ColumnExpression translate( + Expression expression, + FunctionKind functionKind, + Map, Type> types, + Map columnHandles, + FunctionRegistry functionRegistry, + TypeManager typeManager, + Session session, + boolean optimize) + { + return translate(expression, functionKind, types, columnHandles, ImmutableList.of(), functionRegistry, typeManager, session, optimize); + } + + public static ColumnExpression translate( + Expression expression, + FunctionKind functionKind, + Map, Type> types, + Map columnHandles, + List inputChannelNames, + FunctionRegistry functionRegistry, + TypeManager typeManager, + Session session, + boolean optimize) { Visitor visitor = new Visitor( functionKind, types, + columnHandles, + inputChannelNames, typeManager, session.getTimeZoneKey(), isLegacyRowFieldOrdinalAccessEnabled(session), SystemSessionProperties.isLegacyTimestamp(session)); - RowExpression result = visitor.process(expression, null); + ColumnExpression result = visitor.process(expression, null); requireNonNull(result, "translated expression is null"); @@ -165,8 +208,13 @@ public static RowExpression translate( return result; } + public static ColumnExpression optimize(FunctionRegistry functionRegistry, TypeManager typeManager, Session session, ColumnExpression columnExpression) + { + return new ExpressionOptimizer(functionRegistry, typeManager, session).optimize(columnExpression); + } + private static class Visitor - extends AstVisitor + extends AstVisitor { private final FunctionKind functionKind; private final Map, Type> types; @@ -175,17 +223,26 @@ private static class Visitor private final boolean legacyRowFieldOrdinalAccess; @Deprecated private final boolean isLegacyTimestamp; + private final Map columnHandles; + private final Map inputChannels; private Visitor( FunctionKind functionKind, Map, Type> types, + Map columnHandles, + List inputChannelNames, TypeManager typeManager, TimeZoneKey timeZoneKey, boolean legacyRowFieldOrdinalAccess, boolean isLegacyTimestamp) { + requireNonNull(inputChannelNames, "inputChannelNames is null"); this.functionKind = functionKind; this.types = ImmutableMap.copyOf(requireNonNull(types, "types is null")); + this.columnHandles = ImmutableMap.copyOf(requireNonNull(columnHandles, "columnHandleMap is null")); + this.inputChannels = IntStream.range(0, inputChannelNames.size()) + .boxed() + .collect(toMap(i -> inputChannelNames.get(i), i -> i)); this.typeManager = typeManager; this.timeZoneKey = timeZoneKey; this.legacyRowFieldOrdinalAccess = legacyRowFieldOrdinalAccess; @@ -198,31 +255,31 @@ private Type getType(Expression node) } @Override - protected RowExpression visitExpression(Expression node, Void context) + protected ColumnExpression visitExpression(Expression node, Void context) { throw new UnsupportedOperationException("not yet implemented: expression translator for " + node.getClass().getName()); } @Override - protected RowExpression visitFieldReference(FieldReference node, Void context) + protected ColumnExpression visitFieldReference(FieldReference node, Void context) { return field(node.getFieldIndex(), getType(node)); } @Override - protected RowExpression visitNullLiteral(NullLiteral node, Void context) + protected ColumnExpression visitNullLiteral(NullLiteral node, Void context) { return constantNull(UnknownType.UNKNOWN); } @Override - protected RowExpression visitBooleanLiteral(BooleanLiteral node, Void context) + protected ColumnExpression visitBooleanLiteral(BooleanLiteral node, Void context) { return constant(node.getValue(), BOOLEAN); } @Override - protected RowExpression visitLongLiteral(LongLiteral node, Void context) + protected ColumnExpression visitLongLiteral(LongLiteral node, Void context) { if (node.getValue() >= Integer.MIN_VALUE && node.getValue() <= Integer.MAX_VALUE) { return constant(node.getValue(), INTEGER); @@ -231,38 +288,38 @@ protected RowExpression visitLongLiteral(LongLiteral node, Void context) } @Override - protected RowExpression visitDoubleLiteral(DoubleLiteral node, Void context) + protected ColumnExpression visitDoubleLiteral(DoubleLiteral node, Void context) { return constant(node.getValue(), DOUBLE); } @Override - protected RowExpression visitDecimalLiteral(DecimalLiteral node, Void context) + protected ColumnExpression visitDecimalLiteral(DecimalLiteral node, Void context) { DecimalParseResult parseResult = Decimals.parse(node.getValue()); return constant(parseResult.getObject(), parseResult.getType()); } @Override - protected RowExpression visitStringLiteral(StringLiteral node, Void context) + protected ColumnExpression visitStringLiteral(StringLiteral node, Void context) { return constant(node.getSlice(), createVarcharType(countCodePoints(node.getSlice()))); } @Override - protected RowExpression visitCharLiteral(CharLiteral node, Void context) + protected ColumnExpression visitCharLiteral(CharLiteral node, Void context) { return constant(node.getSlice(), createCharType(node.getValue().length())); } @Override - protected RowExpression visitBinaryLiteral(BinaryLiteral node, Void context) + protected ColumnExpression visitBinaryLiteral(BinaryLiteral node, Void context) { return constant(node.getValue(), VARBINARY); } @Override - protected RowExpression visitGenericLiteral(GenericLiteral node, Void context) + protected ColumnExpression visitGenericLiteral(GenericLiteral node, Void context) { Type type; try { @@ -286,7 +343,7 @@ protected RowExpression visitGenericLiteral(GenericLiteral node, Void context) } @Override - protected RowExpression visitTimeLiteral(TimeLiteral node, Void context) + protected ColumnExpression visitTimeLiteral(TimeLiteral node, Void context) { long value; if (getType(node).equals(TIME_WITH_TIME_ZONE)) { @@ -305,7 +362,7 @@ protected RowExpression visitTimeLiteral(TimeLiteral node, Void context) } @Override - protected RowExpression visitTimestampLiteral(TimestampLiteral node, Void context) + protected ColumnExpression visitTimestampLiteral(TimestampLiteral node, Void context) { long value; if (isLegacyTimestamp) { @@ -318,7 +375,7 @@ protected RowExpression visitTimestampLiteral(TimestampLiteral node, Void contex } @Override - protected RowExpression visitIntervalLiteral(IntervalLiteral node, Void context) + protected ColumnExpression visitIntervalLiteral(IntervalLiteral node, Void context) { long value; if (node.isYearToMonth()) { @@ -331,10 +388,10 @@ protected RowExpression visitIntervalLiteral(IntervalLiteral node, Void context) } @Override - protected RowExpression visitComparisonExpression(ComparisonExpression node, Void context) + protected ColumnExpression visitComparisonExpression(ComparisonExpression node, Void context) { - RowExpression left = process(node.getLeft(), context); - RowExpression right = process(node.getRight(), context); + ColumnExpression left = process(node.getLeft(), context); + ColumnExpression right = process(node.getRight(), context); return call( comparisonExpressionSignature(node.getOperator(), left.getType(), right.getType()), @@ -344,14 +401,14 @@ protected RowExpression visitComparisonExpression(ComparisonExpression node, Voi } @Override - protected RowExpression visitFunctionCall(FunctionCall node, Void context) + protected ColumnExpression visitFunctionCall(FunctionCall node, Void context) { - List arguments = node.getArguments().stream() + List arguments = node.getArguments().stream() .map(value -> process(value, context)) .collect(toImmutableList()); List argumentTypes = arguments.stream() - .map(RowExpression::getType) + .map(ColumnExpression::getType) .map(Type::getTypeSignature) .collect(toImmutableList()); @@ -361,15 +418,21 @@ protected RowExpression visitFunctionCall(FunctionCall node, Void context) } @Override - protected RowExpression visitSymbolReference(SymbolReference node, Void context) + protected ColumnExpression visitSymbolReference(SymbolReference node, Void context) { + if (columnHandles.containsKey(node.getName())) { + return new ColumnReferenceExpression(columnHandles.get(node.getName()), getType(node)); + } + else if (inputChannels.containsKey(node.getName())) { + return new InputReferenceExpression(inputChannels.get(node.getName()), getType(node)); + } return new VariableReferenceExpression(node.getName(), getType(node)); } @Override - protected RowExpression visitLambdaExpression(LambdaExpression node, Void context) + protected ColumnExpression visitLambdaExpression(LambdaExpression node, Void context) { - RowExpression body = process(node.getBody(), context); + ColumnExpression body = process(node.getBody(), context); Type type = getType(node); List typeParameters = type.getTypeParameters(); @@ -383,16 +446,16 @@ protected RowExpression visitLambdaExpression(LambdaExpression node, Void contex } @Override - protected RowExpression visitBindExpression(BindExpression node, Void context) + protected ColumnExpression visitBindExpression(BindExpression node, Void context) { ImmutableList.Builder valueTypesBuilder = ImmutableList.builder(); - ImmutableList.Builder argumentsBuilder = ImmutableList.builder(); + ImmutableList.Builder argumentsBuilder = ImmutableList.builder(); for (Expression value : node.getValues()) { - RowExpression valueRowExpression = process(value, context); - valueTypesBuilder.add(valueRowExpression.getType()); - argumentsBuilder.add(valueRowExpression); + ColumnExpression valueColumnExpression = process(value, context); + valueTypesBuilder.add(valueColumnExpression.getType()); + argumentsBuilder.add(valueColumnExpression); } - RowExpression function = process(node.getFunction(), context); + ColumnExpression function = process(node.getFunction(), context); argumentsBuilder.add(function); return call( @@ -402,10 +465,10 @@ protected RowExpression visitBindExpression(BindExpression node, Void context) } @Override - protected RowExpression visitArithmeticBinary(ArithmeticBinaryExpression node, Void context) + protected ColumnExpression visitArithmeticBinary(ArithmeticBinaryExpression node, Void context) { - RowExpression left = process(node.getLeft(), context); - RowExpression right = process(node.getRight(), context); + ColumnExpression left = process(node.getLeft(), context); + ColumnExpression right = process(node.getRight(), context); return call( arithmeticExpressionSignature(node.getOperator(), getType(node), left.getType(), right.getType()), @@ -415,9 +478,9 @@ protected RowExpression visitArithmeticBinary(ArithmeticBinaryExpression node, V } @Override - protected RowExpression visitArithmeticUnary(ArithmeticUnaryExpression node, Void context) + protected ColumnExpression visitArithmeticUnary(ArithmeticUnaryExpression node, Void context) { - RowExpression expression = process(node.getValue(), context); + ColumnExpression expression = process(node.getValue(), context); switch (node.getSign()) { case PLUS: @@ -433,7 +496,7 @@ protected RowExpression visitArithmeticUnary(ArithmeticUnaryExpression node, Voi } @Override - protected RowExpression visitLogicalBinaryExpression(LogicalBinaryExpression node, Void context) + protected ColumnExpression visitLogicalBinaryExpression(LogicalBinaryExpression node, Void context) { return call( logicalExpressionSignature(node.getOperator()), @@ -443,9 +506,9 @@ protected RowExpression visitLogicalBinaryExpression(LogicalBinaryExpression nod } @Override - protected RowExpression visitCast(Cast node, Void context) + protected ColumnExpression visitCast(Cast node, Void context) { - RowExpression value = process(node.getExpression(), context); + ColumnExpression value = process(node.getExpression(), context); if (node.isTypeOnly()) { return changeType(value, getType(node)); @@ -458,14 +521,14 @@ protected RowExpression visitCast(Cast node, Void context) return call(castSignature(getType(node), value.getType()), getType(node), value); } - private static RowExpression changeType(RowExpression value, Type targetType) + private static ColumnExpression changeType(ColumnExpression value, Type targetType) { ChangeTypeVisitor visitor = new ChangeTypeVisitor(targetType); return value.accept(visitor, null); } private static class ChangeTypeVisitor - implements RowExpressionVisitor + implements ColumnExpressionVisitor { private final Type targetType; @@ -475,51 +538,57 @@ private ChangeTypeVisitor(Type targetType) } @Override - public RowExpression visitCall(CallExpression call, Void context) + public ColumnExpression visitCall(CallExpression call, Void context) { return new CallExpression(call.getSignature(), targetType, call.getArguments()); } @Override - public RowExpression visitInputReference(InputReferenceExpression reference, Void context) + public ColumnExpression visitInputReference(InputReferenceExpression reference, Void context) { return field(reference.getField(), targetType); } @Override - public RowExpression visitConstant(ConstantExpression literal, Void context) + public ColumnExpression visitConstant(ConstantExpression literal, Void context) { return constant(literal.getValue(), targetType); } @Override - public RowExpression visitLambda(LambdaDefinitionExpression lambda, Void context) + public ColumnExpression visitLambda(LambdaDefinitionExpression lambda, Void context) { throw new UnsupportedOperationException(); } @Override - public RowExpression visitVariableReference(VariableReferenceExpression reference, Void context) + public ColumnExpression visitVariableReference(VariableReferenceExpression reference, Void context) { return new VariableReferenceExpression(reference.getName(), targetType); } + + @Override + public ColumnExpression visitColumnReference(ColumnReferenceExpression reference, Void context) + { + return new ColumnReferenceExpression(reference.getColumnHandle(), targetType); + } } @Override - protected RowExpression visitCoalesceExpression(CoalesceExpression node, Void context) + protected ColumnExpression visitCoalesceExpression(CoalesceExpression node, Void context) { - List arguments = node.getOperands().stream() + List arguments = node.getOperands().stream() .map(value -> process(value, context)) .collect(toImmutableList()); - List argumentTypes = arguments.stream().map(RowExpression::getType).collect(toImmutableList()); + List argumentTypes = arguments.stream().map(ColumnExpression::getType).collect(toImmutableList()); return call(coalesceSignature(getType(node), argumentTypes), getType(node), arguments); } @Override - protected RowExpression visitSimpleCaseExpression(SimpleCaseExpression node, Void context) + protected ColumnExpression visitSimpleCaseExpression(SimpleCaseExpression node, Void context) { - ImmutableList.Builder arguments = ImmutableList.builder(); + ImmutableList.Builder arguments = ImmutableList.builder(); arguments.add(process(node.getOperand(), context)); @@ -540,7 +609,7 @@ protected RowExpression visitSimpleCaseExpression(SimpleCaseExpression node, Voi } @Override - protected RowExpression visitSearchedCaseExpression(SearchedCaseExpression node, Void context) + protected ColumnExpression visitSearchedCaseExpression(SearchedCaseExpression node, Void context) { /* Translates an expression like: @@ -562,7 +631,7 @@ protected RowExpression visitSearchedCaseExpression(SearchedCaseExpression node, value4))) */ - RowExpression expression = node.getDefaultValue() + ColumnExpression expression = node.getDefaultValue() .map((value) -> process(value, context)) .orElse(constantNull(getType(node))); @@ -579,7 +648,7 @@ protected RowExpression visitSearchedCaseExpression(SearchedCaseExpression node, } @Override - protected RowExpression visitDereferenceExpression(DereferenceExpression node, Void context) + protected ColumnExpression visitDereferenceExpression(DereferenceExpression node, Void context) { RowType rowType = (RowType) getType(node.getBase()); String fieldName = node.getField().getValue(); @@ -606,9 +675,9 @@ protected RowExpression visitDereferenceExpression(DereferenceExpression node, V } @Override - protected RowExpression visitIfExpression(IfExpression node, Void context) + protected ColumnExpression visitIfExpression(IfExpression node, Void context) { - ImmutableList.Builder arguments = ImmutableList.builder(); + ImmutableList.Builder arguments = ImmutableList.builder(); arguments.add(process(node.getCondition(), context)) .add(process(node.getTrueValue(), context)); @@ -624,15 +693,15 @@ protected RowExpression visitIfExpression(IfExpression node, Void context) } @Override - protected RowExpression visitTryExpression(TryExpression node, Void context) + protected ColumnExpression visitTryExpression(TryExpression node, Void context) { return call(Signatures.trySignature(getType(node)), getType(node), process(node.getInnerExpression(), context)); } @Override - protected RowExpression visitInPredicate(InPredicate node, Void context) + protected ColumnExpression visitInPredicate(InPredicate node, Void context) { - ImmutableList.Builder arguments = ImmutableList.builder(); + ImmutableList.Builder arguments = ImmutableList.builder(); arguments.add(process(node.getValue(), context)); InListExpression values = (InListExpression) node.getValueList(); for (Expression value : values.getValues()) { @@ -643,9 +712,9 @@ protected RowExpression visitInPredicate(InPredicate node, Void context) } @Override - protected RowExpression visitIsNotNullPredicate(IsNotNullPredicate node, Void context) + protected ColumnExpression visitIsNotNullPredicate(IsNotNullPredicate node, Void context) { - RowExpression expression = process(node.getValue(), context); + ColumnExpression expression = process(node.getValue(), context); return call( Signatures.notSignature(), @@ -654,24 +723,24 @@ protected RowExpression visitIsNotNullPredicate(IsNotNullPredicate node, Void co } @Override - protected RowExpression visitIsNullPredicate(IsNullPredicate node, Void context) + protected ColumnExpression visitIsNullPredicate(IsNullPredicate node, Void context) { - RowExpression expression = process(node.getValue(), context); + ColumnExpression expression = process(node.getValue(), context); return call(Signatures.isNullSignature(expression.getType()), BOOLEAN, expression); } @Override - protected RowExpression visitNotExpression(NotExpression node, Void context) + protected ColumnExpression visitNotExpression(NotExpression node, Void context) { return call(Signatures.notSignature(), BOOLEAN, process(node.getValue(), context)); } @Override - protected RowExpression visitNullIfExpression(NullIfExpression node, Void context) + protected ColumnExpression visitNullIfExpression(NullIfExpression node, Void context) { - RowExpression first = process(node.getFirst(), context); - RowExpression second = process(node.getSecond(), context); + ColumnExpression first = process(node.getFirst(), context); + ColumnExpression second = process(node.getSecond(), context); return call( nullIfSignature(getType(node), first.getType(), second.getType()), @@ -681,11 +750,11 @@ protected RowExpression visitNullIfExpression(NullIfExpression node, Void contex } @Override - protected RowExpression visitBetweenPredicate(BetweenPredicate node, Void context) + protected ColumnExpression visitBetweenPredicate(BetweenPredicate node, Void context) { - RowExpression value = process(node.getValue(), context); - RowExpression min = process(node.getMin(), context); - RowExpression max = process(node.getMax(), context); + ColumnExpression value = process(node.getValue(), context); + ColumnExpression min = process(node.getMin(), context); + ColumnExpression max = process(node.getMax(), context); return call( betweenSignature(value.getType(), min.getType(), max.getType()), @@ -696,20 +765,20 @@ protected RowExpression visitBetweenPredicate(BetweenPredicate node, Void contex } @Override - protected RowExpression visitLikePredicate(LikePredicate node, Void context) + protected ColumnExpression visitLikePredicate(LikePredicate node, Void context) { - RowExpression value = process(node.getValue(), context); - RowExpression pattern = process(node.getPattern(), context); + ColumnExpression value = process(node.getValue(), context); + ColumnExpression pattern = process(node.getPattern(), context); if (node.getEscape().isPresent()) { - RowExpression escape = process(node.getEscape().get(), context); + ColumnExpression escape = process(node.getEscape().get(), context); return likeFunctionCall(value, call(likePatternSignature(), LIKE_PATTERN, pattern, escape)); } return likeFunctionCall(value, call(castSignature(LIKE_PATTERN, VARCHAR), LIKE_PATTERN, pattern)); } - private RowExpression likeFunctionCall(RowExpression value, RowExpression pattern) + private ColumnExpression likeFunctionCall(ColumnExpression value, ColumnExpression pattern) { if (value.getType() instanceof VarcharType) { return call(likeVarcharSignature(), BOOLEAN, value, pattern); @@ -720,10 +789,10 @@ private RowExpression likeFunctionCall(RowExpression value, RowExpression patter } @Override - protected RowExpression visitSubscriptExpression(SubscriptExpression node, Void context) + protected ColumnExpression visitSubscriptExpression(SubscriptExpression node, Void context) { - RowExpression base = process(node.getBase(), context); - RowExpression index = process(node.getIndex(), context); + ColumnExpression base = process(node.getBase(), context); + ColumnExpression index = process(node.getIndex(), context); return call( subscriptSignature(getType(node), base.getType(), index.getType()), @@ -733,21 +802,21 @@ protected RowExpression visitSubscriptExpression(SubscriptExpression node, Void } @Override - protected RowExpression visitArrayConstructor(ArrayConstructor node, Void context) + protected ColumnExpression visitArrayConstructor(ArrayConstructor node, Void context) { - List arguments = node.getValues().stream() + List arguments = node.getValues().stream() .map(value -> process(value, context)) .collect(toImmutableList()); List argumentTypes = arguments.stream() - .map(RowExpression::getType) + .map(ColumnExpression::getType) .collect(toImmutableList()); return call(arrayConstructorSignature(getType(node), argumentTypes), getType(node), arguments); } @Override - protected RowExpression visitRow(Row node, Void context) + protected ColumnExpression visitRow(Row node, Void context) { - List arguments = node.getItems().stream() + List arguments = node.getItems().stream() .map(value -> process(value, context)) .collect(toImmutableList()); Type returnType = getType(node); @@ -757,4 +826,178 @@ protected RowExpression visitRow(Row node, Void context) return call(rowConstructorSignature(returnType, argumentTypes), returnType, arguments); } } + + public static class InlineInputChannelVisitor + implements ColumnExpressionVisitor + { + private final List inputs; + + private InlineInputChannelVisitor(List inputs) + { + this.inputs = requireNonNull(inputs, "input is null"); + } + + public static ColumnExpression inlineInputs(ColumnExpression columnExpression, List inputs) + { + return columnExpression.accept(new InlineInputChannelVisitor(inputs.stream().map(ColumnExpression.class::cast).collect(toImmutableList())), null); + } + + @Override + public ColumnExpression visitCall(CallExpression call, Void context) + { + return call.replaceChildren(call.getArguments().stream() + .map(argument -> argument.accept(this, context)).collect(toImmutableList())); + } + + @Override + public ColumnExpression visitInputReference(InputReferenceExpression reference, Void context) + { + int field = reference.getField(); + checkArgument(field >= 0 && field < inputs.size(), "Unknown input field"); + return inputs.get(field); + } + + @Override + public ColumnExpression visitConstant(ConstantExpression literal, Void context) + { + return literal; + } + + @Override + public ColumnExpression visitLambda(LambdaDefinitionExpression lambda, Void context) + { + ColumnExpression children = lambda.getBody().accept(this, context); + return lambda.replaceChildren(ImmutableList.of(children)); + } + + @Override + public ColumnExpression visitVariableReference(VariableReferenceExpression reference, Void context) + { + return reference; + } + + @Override + public ColumnExpression visitColumnReference(ColumnReferenceExpression columnReferenceExpression, Void context) + { + return columnReferenceExpression; + } + } + + public static class ChangeColumnReferencetoInputReferenceVisitor + implements ColumnExpressionVisitor + { + private final List inputColumns; + + private ChangeColumnReferencetoInputReferenceVisitor(List inputColumns) + { + this.inputColumns = inputColumns; + } + + public static ColumnExpression rewriteColumnReferenceToInputReference(ColumnExpression columnExpression, List inputColumns) + { + return columnExpression.accept(new ChangeColumnReferencetoInputReferenceVisitor(inputColumns), null); + } + + @Override + public ColumnExpression visitCall(CallExpression call, Void context) + { + return call.replaceChildren(call.getArguments().stream() + .map(argument -> argument.accept(this, context)).collect(toImmutableList())); + } + + @Override + public ColumnExpression visitInputReference(InputReferenceExpression reference, Void context) + { + return reference; + } + + @Override + public ColumnExpression visitConstant(ConstantExpression literal, Void context) + { + return literal; + } + + @Override + public ColumnExpression visitLambda(LambdaDefinitionExpression lambda, Void context) + { + ColumnExpression children = lambda.getBody().accept(this, context); + return lambda.replaceChildren(ImmutableList.of(children)); + } + + @Override + public ColumnExpression visitVariableReference(VariableReferenceExpression reference, Void context) + { + return reference; + } + + @Override + public ColumnExpression visitColumnReference(ColumnReferenceExpression columnReferenceExpression, Void context) + { + int i = inputColumns.indexOf(columnReferenceExpression); + checkArgument(i >= 0, "Column %s does not exists in input", columnReferenceExpression); + return new InputReferenceExpression(i, columnReferenceExpression.getType()); + } + } + + public static class InputCollector + implements ColumnExpressionVisitor, Void> + { + private InputCollector() + { + } + + public static Set listInputs(ColumnExpression columnExpression) + { + return columnExpression.accept(new InputCollector(), null); + } + + public static Set listColumnHandles(ColumnExpression columnExpression) + { + return columnExpression.accept(new InputCollector(), null) + .stream() + .filter(ColumnReferenceExpression.class::isInstance) + .map(ColumnReferenceExpression.class::cast) + .map(ColumnReferenceExpression::getColumnHandle) + .collect(toImmutableSet()); + } + + @Override + public Set visitCall(CallExpression call, Void context) + { + return call.getArguments().stream() + .map(argument -> argument.accept(this, context)) + .flatMap(Set::stream) + .collect(toImmutableSet()); + } + + @Override + public Set visitInputReference(InputReferenceExpression reference, Void context) + { + return ImmutableSet.of(reference); + } + + @Override + public Set visitConstant(ConstantExpression literal, Void context) + { + return ImmutableSet.of(); + } + + @Override + public Set visitLambda(LambdaDefinitionExpression lambda, Void context) + { + return lambda.getBody().accept(this, context); + } + + @Override + public Set visitVariableReference(VariableReferenceExpression reference, Void context) + { + return ImmutableSet.of(); + } + + @Override + public Set visitColumnReference(ColumnReferenceExpression columnReferenceExpression, Void context) + { + return ImmutableSet.of(columnReferenceExpression); + } + } } diff --git a/presto-main/src/main/java/com/facebook/presto/sql/relational/optimizer/ExpressionOptimizer.java b/presto-main/src/main/java/com/facebook/presto/sql/relational/optimizer/ExpressionOptimizer.java index af9d8454e8d0a..7de07a8d27579 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/relational/optimizer/ExpressionOptimizer.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/relational/optimizer/ExpressionOptimizer.java @@ -15,18 +15,19 @@ import com.facebook.presto.Session; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; import com.facebook.presto.spi.ConnectorSession; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.CallExpression; +import com.facebook.presto.spi.relation.column.ColumnExpression; +import com.facebook.presto.spi.relation.column.ColumnExpressionVisitor; +import com.facebook.presto.spi.relation.column.ColumnReferenceExpression; +import com.facebook.presto.spi.relation.column.ConstantExpression; +import com.facebook.presto.spi.relation.column.InputReferenceExpression; +import com.facebook.presto.spi.relation.column.LambdaDefinitionExpression; +import com.facebook.presto.spi.relation.column.VariableReferenceExpression; import com.facebook.presto.spi.type.TypeManager; import com.facebook.presto.spi.type.TypeSignature; -import com.facebook.presto.sql.relational.CallExpression; -import com.facebook.presto.sql.relational.ConstantExpression; -import com.facebook.presto.sql.relational.InputReferenceExpression; -import com.facebook.presto.sql.relational.LambdaDefinitionExpression; -import com.facebook.presto.sql.relational.RowExpression; -import com.facebook.presto.sql.relational.RowExpressionVisitor; -import com.facebook.presto.sql.relational.VariableReferenceExpression; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; @@ -34,7 +35,7 @@ import java.util.ArrayList; import java.util.List; -import static com.facebook.presto.metadata.Signature.internalScalarFunction; +import static com.facebook.presto.metadata.InternalFunction.internalScalarFunction; import static com.facebook.presto.operator.scalar.JsonStringToArrayCast.JSON_STRING_TO_ARRAY_NAME; import static com.facebook.presto.operator.scalar.JsonStringToMapCast.JSON_STRING_TO_MAP_NAME; import static com.facebook.presto.operator.scalar.JsonStringToRowCast.JSON_STRING_TO_ROW_NAME; @@ -78,28 +79,28 @@ public ExpressionOptimizer(FunctionRegistry registry, TypeManager typeManager, S this.session = session.toConnectorSession(); } - public RowExpression optimize(RowExpression expression) + public ColumnExpression optimize(ColumnExpression expression) { return expression.accept(new Visitor(), null); } private class Visitor - implements RowExpressionVisitor + implements ColumnExpressionVisitor { @Override - public RowExpression visitInputReference(InputReferenceExpression reference, Void context) + public ColumnExpression visitInputReference(InputReferenceExpression reference, Void context) { return reference; } @Override - public RowExpression visitConstant(ConstantExpression literal, Void context) + public ColumnExpression visitConstant(ConstantExpression literal, Void context) { return literal; } @Override - public RowExpression visitCall(CallExpression call, Void context) + public ColumnExpression visitCall(CallExpression call, Void context) { if (call.getSignature().getName().equals(CAST)) { call = rewriteCast(call); @@ -110,7 +111,7 @@ public RowExpression visitCall(CallExpression call, Void context) // TODO: optimize these special forms case IF: { checkState(call.getArguments().size() == 3, "IF function should have 3 arguments. Get " + call.getArguments().size()); - RowExpression optimizedOperand = call.getArguments().get(0).accept(this, context); + ColumnExpression optimizedOperand = call.getArguments().get(0).accept(this, context); if (optimizedOperand instanceof ConstantExpression) { ConstantExpression constantOperand = (ConstantExpression) optimizedOperand; checkState(constantOperand.getType().equals(BOOLEAN), "Operand of IF function should be BOOLEAN type. Get type " + constantOperand.getType().getDisplayName()); @@ -122,7 +123,7 @@ public RowExpression visitCall(CallExpression call, Void context) return call.getArguments().get(2).accept(this, context); } } - List arguments = call.getArguments().stream() + List arguments = call.getArguments().stream() .map(argument -> argument.accept(this, null)) .collect(toImmutableList()); return call(signature, call.getType(), arguments); @@ -131,9 +132,9 @@ public RowExpression visitCall(CallExpression call, Void context) checkState(call.getArguments().size() >= 1, BIND + " function should have at least 1 argument. Got " + call.getArguments().size()); boolean allConstantExpression = true; - ImmutableList.Builder optimizedArgumentsBuilder = ImmutableList.builder(); - for (RowExpression argument : call.getArguments()) { - RowExpression optimizedArgument = argument.accept(this, context); + ImmutableList.Builder optimizedArgumentsBuilder = ImmutableList.builder(); + for (ColumnExpression argument : call.getArguments()) { + ColumnExpression optimizedArgument = argument.accept(this, context); if (!(optimizedArgument instanceof ConstantExpression)) { allConstantExpression = false; } @@ -157,7 +158,7 @@ public RowExpression visitCall(CallExpression call, Void context) case IN: case DEREFERENCE: case ROW_CONSTRUCTOR: { - List arguments = call.getArguments().stream() + List arguments = call.getArguments().stream() .map(argument -> argument.accept(this, null)) .collect(toImmutableList()); return call(signature, call.getType(), arguments); @@ -165,7 +166,7 @@ public RowExpression visitCall(CallExpression call, Void context) } ScalarFunctionImplementation function = registry.getScalarFunctionImplementation(signature); - List arguments = call.getArguments().stream() + List arguments = call.getArguments().stream() .map(argument -> argument.accept(this, context)) .collect(toImmutableList()); @@ -179,7 +180,7 @@ public RowExpression visitCall(CallExpression call, Void context) int index = 0; List constantArguments = new ArrayList<>(); - for (RowExpression argument : arguments) { + for (ColumnExpression argument : arguments) { Object value = ((ConstantExpression) argument).getValue(); // if any argument is null, return null if (value == null && function.getArgumentProperty(index).getNullConvention() == RETURN_NULL_ON_NULL) { @@ -204,17 +205,23 @@ public RowExpression visitCall(CallExpression call, Void context) } @Override - public RowExpression visitLambda(LambdaDefinitionExpression lambda, Void context) + public ColumnExpression visitLambda(LambdaDefinitionExpression lambda, Void context) { return new LambdaDefinitionExpression(lambda.getArgumentTypes(), lambda.getArguments(), lambda.getBody().accept(this, context)); } @Override - public RowExpression visitVariableReference(VariableReferenceExpression reference, Void context) + public ColumnExpression visitVariableReference(VariableReferenceExpression reference, Void context) { return reference; } + @Override + public ColumnExpression visitColumnReference(ColumnReferenceExpression columnReferenceExpression, Void context) + { + return columnReferenceExpression; + } + private CallExpression rewriteCast(CallExpression call) { if (call.getArguments().get(0) instanceof CallExpression) { diff --git a/presto-main/src/main/java/com/facebook/presto/sql/rewrite/ShowQueriesRewrite.java b/presto-main/src/main/java/com/facebook/presto/sql/rewrite/ShowQueriesRewrite.java index 9361995ddce95..2411a0f43fe0a 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/rewrite/ShowQueriesRewrite.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/rewrite/ShowQueriesRewrite.java @@ -16,7 +16,6 @@ import com.facebook.presto.Session; import com.facebook.presto.connector.ConnectorId; import com.facebook.presto.execution.warnings.WarningCollector; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.Metadata; import com.facebook.presto.metadata.QualifiedObjectName; import com.facebook.presto.metadata.SessionPropertyManager.SessionPropertyValue; @@ -29,6 +28,7 @@ import com.facebook.presto.spi.PrestoException; import com.facebook.presto.spi.SchemaTableName; import com.facebook.presto.spi.StandardErrorCode; +import com.facebook.presto.spi.function.FunctionKind; import com.facebook.presto.spi.session.PropertyMetadata; import com.facebook.presto.sql.analyzer.QueryExplainer; import com.facebook.presto.sql.analyzer.SemanticException; diff --git a/presto-main/src/main/java/com/facebook/presto/testing/LocalQueryRunner.java b/presto-main/src/main/java/com/facebook/presto/testing/LocalQueryRunner.java index 4e5773f870a77..89cf88636801d 100644 --- a/presto-main/src/main/java/com/facebook/presto/testing/LocalQueryRunner.java +++ b/presto-main/src/main/java/com/facebook/presto/testing/LocalQueryRunner.java @@ -22,6 +22,7 @@ import com.facebook.presto.block.BlockEncodingManager; import com.facebook.presto.connector.ConnectorId; import com.facebook.presto.connector.ConnectorManager; +import com.facebook.presto.connector.ConnectorOptimizationRuleManager; import com.facebook.presto.connector.system.CatalogSystemTable; import com.facebook.presto.connector.system.ColumnPropertiesSystemTable; import com.facebook.presto.connector.system.GlobalSystemConnector; @@ -226,6 +227,7 @@ public class LocalQueryRunner private final BlockEncodingManager blockEncodingManager; private final PageSourceManager pageSourceManager; private final IndexManager indexManager; + private final ConnectorOptimizationRuleManager optimizationRuleManager; private final NodePartitioningManager nodePartitioningManager; private final PageSinkManager pageSinkManager; private final TransactionManager transactionManager; @@ -280,6 +282,7 @@ private LocalQueryRunner(Session defaultSession, FeaturesConfig featuresConfig, this.typeRegistry = new TypeRegistry(); this.pageSorter = new PagesIndexPageSorter(new PagesIndex.TestingFactory(false)); this.indexManager = new IndexManager(); + this.optimizationRuleManager = new ConnectorOptimizationRuleManager(); this.nodeSchedulerConfig = new NodeSchedulerConfig().setIncludeCoordinator(true); NodeScheduler nodeScheduler = new NodeScheduler( new LegacyNetworkTopology(), @@ -329,6 +332,7 @@ private LocalQueryRunner(Session defaultSession, FeaturesConfig featuresConfig, splitManager, pageSourceManager, indexManager, + optimizationRuleManager, nodePartitioningManager, pageSinkManager, new HandleResolver(), @@ -816,7 +820,8 @@ public List getPlanOptimizers(boolean forceSingleNode) costCalculator, estimatedExchangesCostCalculator, new CostComparator(featuresConfig), - taskCountEstimator).get(); + taskCountEstimator, + optimizationRuleManager).get(); } public Plan createPlan(Session session, @Language("SQL") String sql, List optimizers, WarningCollector warningCollector) diff --git a/presto-main/src/main/java/com/facebook/presto/type/DecimalCasts.java b/presto-main/src/main/java/com/facebook/presto/type/DecimalCasts.java index 615811434dfc8..ac9ff14f6c909 100644 --- a/presto-main/src/main/java/com/facebook/presto/type/DecimalCasts.java +++ b/presto-main/src/main/java/com/facebook/presto/type/DecimalCasts.java @@ -14,9 +14,10 @@ package com.facebook.presto.type; import com.facebook.presto.annotation.UsedByGeneratedCode; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.metadata.InternalFunction; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.spi.PrestoException; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.DecimalType; import com.facebook.presto.spi.type.Decimals; import com.facebook.presto.spi.type.StandardTypes; @@ -37,9 +38,9 @@ import java.math.BigDecimal; import java.math.BigInteger; -import static com.facebook.presto.metadata.FunctionKind.SCALAR; import static com.facebook.presto.operator.scalar.JsonOperators.JSON_FACTORY; import static com.facebook.presto.spi.StandardErrorCode.INVALID_CAST_ARGUMENT; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.facebook.presto.spi.function.OperatorType.CAST; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.BooleanType.BOOLEAN; @@ -125,7 +126,7 @@ public final class DecimalCasts private static SqlScalarFunction castFunctionFromDecimalTo(TypeSignature to, String... methodNames) { - Signature signature = Signature.builder() + Signature signature = InternalFunction.builder() .kind(SCALAR) .operatorType(CAST) .argumentTypes(parseTypeSignature("decimal(precision,scale)", ImmutableSet.of("precision", "scale"))) @@ -159,7 +160,7 @@ private static SqlScalarFunction castFunctionToDecimalFrom(TypeSignature from, S private static SqlScalarFunction castFunctionToDecimalFromBuilder(TypeSignature from, boolean nullableResult, String... methodNames) { - Signature signature = Signature.builder() + Signature signature = InternalFunction.builder() .kind(SCALAR) .operatorType(CAST) .argumentTypes(from) diff --git a/presto-main/src/main/java/com/facebook/presto/type/DecimalInequalityOperators.java b/presto-main/src/main/java/com/facebook/presto/type/DecimalInequalityOperators.java index 3e28582039d44..be5f9278916b9 100644 --- a/presto-main/src/main/java/com/facebook/presto/type/DecimalInequalityOperators.java +++ b/presto-main/src/main/java/com/facebook/presto/type/DecimalInequalityOperators.java @@ -14,12 +14,13 @@ package com.facebook.presto.type; import com.facebook.presto.annotation.UsedByGeneratedCode; +import com.facebook.presto.metadata.InternalFunction; import com.facebook.presto.metadata.PolymorphicScalarFunctionBuilder; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.spi.PrestoException; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.function.OperatorType; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.TypeSignature; import com.facebook.presto.spi.type.UnscaledDecimal128Arithmetic; import com.google.common.collect.ImmutableSet; @@ -28,12 +29,12 @@ import java.lang.invoke.MethodHandle; import java.util.Optional; -import static com.facebook.presto.metadata.FunctionKind.SCALAR; import static com.facebook.presto.metadata.PolymorphicScalarFunctionBuilder.constant; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.BLOCK_AND_POSITION; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.USE_NULL_FLAG; import static com.facebook.presto.spi.StandardErrorCode.GENERIC_INTERNAL_ERROR; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.facebook.presto.spi.function.OperatorType.BETWEEN; import static com.facebook.presto.spi.function.OperatorType.EQUAL; import static com.facebook.presto.spi.function.OperatorType.GREATER_THAN; @@ -110,7 +111,7 @@ public static boolean isResultGreaterThanOrEqual(int comparisonResult) private static PolymorphicScalarFunctionBuilder makeBinaryOperatorFunctionBuilder(OperatorType operatorType) { - Signature signature = Signature.builder() + Signature signature = InternalFunction.builder() .kind(SCALAR) .operatorType(operatorType) .argumentTypes(DECIMAL_SIGNATURE, DECIMAL_SIGNATURE) @@ -259,7 +260,7 @@ private static boolean invokeGetResult(MethodHandle getResultMethodHandle, int c private static SqlScalarFunction betweenOperator() { - Signature signature = Signature.builder() + Signature signature = InternalFunction.builder() .kind(SCALAR) .operatorType(BETWEEN) .argumentTypes(DECIMAL_SIGNATURE, DECIMAL_SIGNATURE, DECIMAL_SIGNATURE) diff --git a/presto-main/src/main/java/com/facebook/presto/type/DecimalOperators.java b/presto-main/src/main/java/com/facebook/presto/type/DecimalOperators.java index 29d94c36a8338..f68135f7cb8ae 100644 --- a/presto-main/src/main/java/com/facebook/presto/type/DecimalOperators.java +++ b/presto-main/src/main/java/com/facebook/presto/type/DecimalOperators.java @@ -14,15 +14,16 @@ package com.facebook.presto.type; import com.facebook.presto.annotation.UsedByGeneratedCode; +import com.facebook.presto.metadata.InternalFunction; import com.facebook.presto.metadata.PolymorphicScalarFunctionBuilder; import com.facebook.presto.metadata.PolymorphicScalarFunctionBuilder.SpecializeContext; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SignatureBuilder; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.spi.PrestoException; import com.facebook.presto.spi.function.IsNull; import com.facebook.presto.spi.function.LiteralParameters; import com.facebook.presto.spi.function.ScalarOperator; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.function.SqlType; import com.facebook.presto.spi.type.DecimalType; import com.facebook.presto.spi.type.Decimals; @@ -37,10 +38,9 @@ import java.math.BigInteger; import java.util.List; -import static com.facebook.presto.metadata.FunctionKind.SCALAR; -import static com.facebook.presto.metadata.Signature.longVariableExpression; import static com.facebook.presto.spi.StandardErrorCode.DIVISION_BY_ZERO; import static com.facebook.presto.spi.StandardErrorCode.NUMERIC_VALUE_OUT_OF_RANGE; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.facebook.presto.spi.function.OperatorType.ADD; import static com.facebook.presto.spi.function.OperatorType.DIVIDE; import static com.facebook.presto.spi.function.OperatorType.HASH_CODE; @@ -50,6 +50,7 @@ import static com.facebook.presto.spi.function.OperatorType.NEGATION; import static com.facebook.presto.spi.function.OperatorType.SUBTRACT; import static com.facebook.presto.spi.function.OperatorType.XX_HASH_64; +import static com.facebook.presto.spi.function.Signature.longVariableExpression; import static com.facebook.presto.spi.type.Decimals.encodeUnscaledValue; import static com.facebook.presto.spi.type.Decimals.longTenToNth; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; @@ -84,7 +85,7 @@ private static SqlScalarFunction decimalAddOperator() TypeSignature decimalRightSignature = parseTypeSignature("decimal(b_precision, b_scale)", ImmutableSet.of("b_precision", "b_scale")); TypeSignature decimalResultSignature = parseTypeSignature("decimal(r_precision, r_scale)", ImmutableSet.of("r_precision", "r_scale")); - Signature signature = Signature.builder() + Signature signature = InternalFunction.builder() .kind(SCALAR) .operatorType(ADD) .longVariableConstraints( @@ -166,7 +167,7 @@ private static SqlScalarFunction decimalSubtractOperator() TypeSignature decimalRightSignature = parseTypeSignature("decimal(b_precision, b_scale)", ImmutableSet.of("b_precision", "b_scale")); TypeSignature decimalResultSignature = parseTypeSignature("decimal(r_precision, r_scale)", ImmutableSet.of("r_precision", "r_scale")); - Signature signature = Signature.builder() + Signature signature = InternalFunction.builder() .kind(SCALAR) .operatorType(SUBTRACT) .longVariableConstraints( @@ -244,7 +245,7 @@ private static SqlScalarFunction decimalMultiplyOperator() TypeSignature decimalRightSignature = parseTypeSignature("decimal(b_precision, b_scale)", ImmutableSet.of("b_precision", "b_scale")); TypeSignature decimalResultSignature = parseTypeSignature("decimal(r_precision, r_scale)", ImmutableSet.of("r_precision", "r_scale")); - Signature signature = Signature.builder() + Signature signature = InternalFunction.builder() .kind(SCALAR) .operatorType(MULTIPLY) .longVariableConstraints( @@ -309,7 +310,7 @@ private static SqlScalarFunction decimalDivideOperator() // pessimistic case is a / 0.0000001 // if scale of divisor is greater than scale of dividend we extend scale further as we // want result scale to be maximum of scales of divisor and dividend. - Signature signature = Signature.builder() + Signature signature = InternalFunction.builder() .kind(SCALAR) .operatorType(DIVIDE) .longVariableConstraints( @@ -475,7 +476,7 @@ public static SignatureBuilder modulusSignatureBuilder() TypeSignature decimalRightSignature = parseTypeSignature("decimal(b_precision, b_scale)", ImmutableSet.of("b_precision", "b_scale")); TypeSignature decimalResultSignature = parseTypeSignature("decimal(r_precision, r_scale)", ImmutableSet.of("r_precision", "r_scale")); - return Signature.builder() + return InternalFunction.builder() .longVariableConstraints( longVariableExpression("r_precision", "min(b_precision - b_scale, a_precision - a_scale) + max(a_scale, b_scale)"), longVariableExpression("r_scale", "max(a_scale, b_scale)")) diff --git a/presto-main/src/main/java/com/facebook/presto/type/DecimalSaturatedFloorCasts.java b/presto-main/src/main/java/com/facebook/presto/type/DecimalSaturatedFloorCasts.java index 0b42f876345c0..8b0bb509164b0 100644 --- a/presto-main/src/main/java/com/facebook/presto/type/DecimalSaturatedFloorCasts.java +++ b/presto-main/src/main/java/com/facebook/presto/type/DecimalSaturatedFloorCasts.java @@ -14,7 +14,7 @@ package com.facebook.presto.type; import com.facebook.presto.annotation.UsedByGeneratedCode; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.metadata.InternalFunction; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.spi.type.Type; import com.google.common.collect.ImmutableList; @@ -24,7 +24,7 @@ import java.math.BigDecimal; import java.math.BigInteger; -import static com.facebook.presto.metadata.FunctionKind.SCALAR; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.facebook.presto.spi.function.OperatorType.SATURATED_FLOOR_CAST; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.Decimals.bigIntegerTenToNth; @@ -43,7 +43,7 @@ public final class DecimalSaturatedFloorCasts private DecimalSaturatedFloorCasts() {} public static final SqlScalarFunction DECIMAL_TO_DECIMAL_SATURATED_FLOOR_CAST = SqlScalarFunction.builder(DecimalSaturatedFloorCasts.class) - .signature(Signature.builder() + .signature(InternalFunction.builder() .kind(SCALAR) .operatorType(SATURATED_FLOOR_CAST) .argumentTypes(parseTypeSignature("decimal(source_precision,source_scale)", ImmutableSet.of("source_precision", "source_scale"))) @@ -114,7 +114,7 @@ private static BigInteger bigDecimalToBigintFloorSaturatedCast(BigDecimal bigDec private static SqlScalarFunction decimalToGenericIntegerTypeSaturatedFloorCast(Type type, long minValue, long maxValue) { return SqlScalarFunction.builder(DecimalSaturatedFloorCasts.class) - .signature(Signature.builder() + .signature(InternalFunction.builder() .kind(SCALAR) .operatorType(SATURATED_FLOOR_CAST) .argumentTypes(parseTypeSignature("decimal(source_precision,source_scale)", ImmutableSet.of("source_precision", "source_scale"))) @@ -164,7 +164,7 @@ private static long bigIntegerDecimalToGenericIntegerType(BigInteger bigInteger, private static SqlScalarFunction genericIntegerTypeToDecimalSaturatedFloorCast(Type integerType) { return SqlScalarFunction.builder(DecimalSaturatedFloorCasts.class) - .signature(Signature.builder() + .signature(InternalFunction.builder() .kind(SCALAR) .operatorType(SATURATED_FLOOR_CAST) .argumentTypes(integerType.getTypeSignature()) diff --git a/presto-main/src/main/java/com/facebook/presto/type/DecimalToDecimalCasts.java b/presto-main/src/main/java/com/facebook/presto/type/DecimalToDecimalCasts.java index 5fd832c67db93..76ccea8c6707f 100644 --- a/presto-main/src/main/java/com/facebook/presto/type/DecimalToDecimalCasts.java +++ b/presto-main/src/main/java/com/facebook/presto/type/DecimalToDecimalCasts.java @@ -14,9 +14,10 @@ package com.facebook.presto.type; import com.facebook.presto.annotation.UsedByGeneratedCode; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.metadata.InternalFunction; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.spi.PrestoException; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.DecimalType; import com.facebook.presto.spi.type.Decimals; import com.google.common.collect.ImmutableList; @@ -24,10 +25,10 @@ import java.math.BigInteger; -import static com.facebook.presto.metadata.FunctionKind.SCALAR; -import static com.facebook.presto.metadata.Signature.withVariadicBound; import static com.facebook.presto.spi.StandardErrorCode.INVALID_CAST_ARGUMENT; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.facebook.presto.spi.function.OperatorType.CAST; +import static com.facebook.presto.spi.function.Signature.withVariadicBound; import static com.facebook.presto.spi.type.Decimals.longTenToNth; import static com.facebook.presto.spi.type.Decimals.overflows; import static com.facebook.presto.spi.type.StandardTypes.DECIMAL; @@ -41,7 +42,7 @@ public final class DecimalToDecimalCasts { - public static final Signature SIGNATURE = Signature.builder() + public static final Signature SIGNATURE = InternalFunction.builder() .kind(SCALAR) .operatorType(CAST) .typeVariableConstraints(withVariadicBound("F", DECIMAL), withVariadicBound("T", DECIMAL)) diff --git a/presto-main/src/main/java/com/facebook/presto/type/FunctionParametricType.java b/presto-main/src/main/java/com/facebook/presto/type/FunctionParametricType.java index 125deaa711fc8..2786191eaff3b 100644 --- a/presto-main/src/main/java/com/facebook/presto/type/FunctionParametricType.java +++ b/presto-main/src/main/java/com/facebook/presto/type/FunctionParametricType.java @@ -13,6 +13,7 @@ */ package com.facebook.presto.type; +import com.facebook.presto.spi.type.FunctionType; import com.facebook.presto.spi.type.ParameterKind; import com.facebook.presto.spi.type.ParametricType; import com.facebook.presto.spi.type.Type; @@ -21,7 +22,7 @@ import java.util.List; -import static com.facebook.presto.type.FunctionType.NAME; +import static com.facebook.presto.spi.type.FunctionType.NAME; import static com.google.common.base.Preconditions.checkArgument; import static java.util.stream.Collectors.toList; diff --git a/presto-main/src/test/java/com/facebook/presto/cost/TestCostCalculator.java b/presto-main/src/test/java/com/facebook/presto/cost/TestCostCalculator.java index 0f0e12e856338..0426e9ac59199 100644 --- a/presto-main/src/test/java/com/facebook/presto/cost/TestCostCalculator.java +++ b/presto-main/src/test/java/com/facebook/presto/cost/TestCostCalculator.java @@ -24,11 +24,11 @@ import com.facebook.presto.metadata.CatalogManager; import com.facebook.presto.metadata.InMemoryNodeManager; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.TableHandle; import com.facebook.presto.metadata.TableLayoutHandle; import com.facebook.presto.security.AllowAllAccessControl; import com.facebook.presto.spi.ColumnHandle; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.predicate.TupleDomain; import com.facebook.presto.spi.type.StandardTypes; import com.facebook.presto.spi.type.Type; @@ -74,8 +74,8 @@ import java.util.function.Function; import static com.facebook.presto.cost.PlanNodeCostEstimate.cpuCost; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; import static com.facebook.presto.metadata.MetadataManager.createTestMetadataManager; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.spi.type.VarcharType.VARCHAR; diff --git a/presto-main/src/test/java/com/facebook/presto/metadata/AbstractMockMetadata.java b/presto-main/src/test/java/com/facebook/presto/metadata/AbstractMockMetadata.java index f277b83f81744..6aa37fc1ac4a7 100644 --- a/presto-main/src/test/java/com/facebook/presto/metadata/AbstractMockMetadata.java +++ b/presto-main/src/test/java/com/facebook/presto/metadata/AbstractMockMetadata.java @@ -23,6 +23,7 @@ import com.facebook.presto.spi.SystemTable; import com.facebook.presto.spi.block.BlockEncodingSerde; import com.facebook.presto.spi.connector.ConnectorOutputMetadata; +import com.facebook.presto.spi.connector.ConnectorTransactionHandle; import com.facebook.presto.spi.predicate.TupleDomain; import com.facebook.presto.spi.security.GrantInfo; import com.facebook.presto.spi.security.Privilege; @@ -447,6 +448,12 @@ public AnalyzePropertyManager getAnalyzePropertyManager() throw new UnsupportedOperationException(); } + @Override + public ConnectorTransactionHandle getTransactionHandle(Session session, ConnectorId connectorId) + { + throw new UnsupportedOperationException(); + } + @Override public void dropColumn(Session session, TableHandle tableHandle, ColumnHandle column) { diff --git a/presto-main/src/test/java/com/facebook/presto/metadata/TestFunctionRegistry.java b/presto-main/src/test/java/com/facebook/presto/metadata/TestFunctionRegistry.java index cebb39dcd597c..bb47f85f3e418 100644 --- a/presto-main/src/test/java/com/facebook/presto/metadata/TestFunctionRegistry.java +++ b/presto-main/src/test/java/com/facebook/presto/metadata/TestFunctionRegistry.java @@ -19,7 +19,9 @@ import com.facebook.presto.spi.block.BlockEncodingSerde; import com.facebook.presto.spi.function.OperatorType; import com.facebook.presto.spi.function.ScalarFunction; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.function.SqlType; +import com.facebook.presto.spi.function.TypeVariableConstraint; import com.facebook.presto.spi.type.StandardTypes; import com.facebook.presto.spi.type.TypeManager; import com.facebook.presto.spi.type.TypeSignature; @@ -34,13 +36,13 @@ import java.lang.invoke.MethodHandles; import java.util.List; -import static com.facebook.presto.metadata.FunctionKind.SCALAR; import static com.facebook.presto.metadata.FunctionRegistry.getMagicLiteralFunctionSignature; import static com.facebook.presto.metadata.FunctionRegistry.mangleOperatorName; import static com.facebook.presto.metadata.FunctionRegistry.unmangleOperator; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.HyperLogLogType.HYPER_LOG_LOG; import static com.facebook.presto.spi.type.TimestampWithTimeZoneType.TIMESTAMP_WITH_TIME_ZONE; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; diff --git a/presto-main/src/test/java/com/facebook/presto/metadata/TestPolymorphicScalarFunction.java b/presto-main/src/test/java/com/facebook/presto/metadata/TestPolymorphicScalarFunction.java index 60c25194bf4d9..5b6b98da8ddd9 100644 --- a/presto-main/src/test/java/com/facebook/presto/metadata/TestPolymorphicScalarFunction.java +++ b/presto-main/src/test/java/com/facebook/presto/metadata/TestPolymorphicScalarFunction.java @@ -17,6 +17,7 @@ import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.LongArrayBlock; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.StandardTypes; import com.facebook.presto.spi.type.TypeSignature; import com.facebook.presto.sql.analyzer.FeaturesConfig; @@ -31,15 +32,15 @@ import java.util.Collections; import java.util.Optional; -import static com.facebook.presto.metadata.FunctionKind.SCALAR; -import static com.facebook.presto.metadata.Signature.comparableWithVariadicBound; import static com.facebook.presto.metadata.TestPolymorphicScalarFunction.TestMethods.VARCHAR_TO_BIGINT_RETURN_VALUE; import static com.facebook.presto.metadata.TestPolymorphicScalarFunction.TestMethods.VARCHAR_TO_VARCHAR_RETURN_VALUE; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.BLOCK_AND_POSITION; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.USE_NULL_FLAG; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.facebook.presto.spi.function.OperatorType.ADD; import static com.facebook.presto.spi.function.OperatorType.IS_DISTINCT_FROM; +import static com.facebook.presto.spi.function.Signature.comparableWithVariadicBound; import static com.facebook.presto.spi.type.Decimals.MAX_SHORT_PRECISION; import static com.facebook.presto.spi.type.StandardTypes.BOOLEAN; import static com.facebook.presto.spi.type.StandardTypes.VARCHAR; @@ -54,7 +55,7 @@ public class TestPolymorphicScalarFunction { private static final TypeRegistry TYPE_REGISTRY = new TypeRegistry(); private static final FunctionRegistry REGISTRY = new FunctionRegistry(TYPE_REGISTRY, new BlockEncodingManager(TYPE_REGISTRY), new FeaturesConfig()); - private static final Signature SIGNATURE = Signature.builder() + private static final Signature SIGNATURE = InternalFunction.builder() .name("foo") .kind(SCALAR) .returnType(parseTypeSignature(StandardTypes.BIGINT)) @@ -80,7 +81,7 @@ public class TestPolymorphicScalarFunction public void testSelectsMultipleChoiceWithBlockPosition() throws Throwable { - Signature signature = Signature.builder() + Signature signature = InternalFunction.builder() .kind(SCALAR) .operatorType(IS_DISTINCT_FROM) .argumentTypes(DECIMAL_SIGNATURE, DECIMAL_SIGNATURE) @@ -160,7 +161,7 @@ public void testSelectsMethodBasedOnReturnType() public void testSameLiteralInArgumentsAndReturnValue() throws Throwable { - Signature signature = Signature.builder() + Signature signature = InternalFunction.builder() .name("foo") .kind(SCALAR) .returnType(parseTypeSignature("varchar(x)", ImmutableSet.of("x"))) @@ -183,7 +184,7 @@ public void testSameLiteralInArgumentsAndReturnValue() public void testTypeParameters() throws Throwable { - Signature signature = Signature.builder() + Signature signature = InternalFunction.builder() .name("foo") .kind(SCALAR) .typeVariableConstraints(comparableWithVariadicBound("V", VARCHAR)) @@ -206,7 +207,7 @@ public void testTypeParameters() @Test public void testSetsHiddenToTrueForOperators() { - Signature signature = Signature.builder() + Signature signature = InternalFunction.builder() .operatorType(ADD) .kind(SCALAR) .returnType(parseTypeSignature("varchar(x)", ImmutableSet.of("x"))) diff --git a/presto-main/src/test/java/com/facebook/presto/metadata/TestSignature.java b/presto-main/src/test/java/com/facebook/presto/metadata/TestSignature.java index 847ad5f1b1caf..8fb95345113b7 100644 --- a/presto-main/src/test/java/com/facebook/presto/metadata/TestSignature.java +++ b/presto-main/src/test/java/com/facebook/presto/metadata/TestSignature.java @@ -13,6 +13,7 @@ */ package com.facebook.presto.metadata; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.StandardTypes; import com.facebook.presto.spi.type.Type; import com.facebook.presto.type.TypeDeserializer; @@ -24,7 +25,7 @@ import io.airlift.json.ObjectMapperProvider; import org.testng.annotations.Test; -import static com.facebook.presto.metadata.FunctionKind.SCALAR; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static org.testng.Assert.assertEquals; diff --git a/presto-main/src/test/java/com/facebook/presto/metadata/TestSignatureBinder.java b/presto-main/src/test/java/com/facebook/presto/metadata/TestSignatureBinder.java index 2250e507419b7..309abc8b762c0 100644 --- a/presto-main/src/test/java/com/facebook/presto/metadata/TestSignatureBinder.java +++ b/presto-main/src/test/java/com/facebook/presto/metadata/TestSignatureBinder.java @@ -14,14 +14,16 @@ package com.facebook.presto.metadata; import com.facebook.presto.block.BlockEncodingManager; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.function.TypeVariableConstraint; import com.facebook.presto.spi.type.DecimalType; +import com.facebook.presto.spi.type.FunctionType; import com.facebook.presto.spi.type.StandardTypes; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeManager; import com.facebook.presto.spi.type.TypeSignature; import com.facebook.presto.sql.analyzer.FeaturesConfig; import com.facebook.presto.sql.analyzer.TypeSignatureProvider; -import com.facebook.presto.type.FunctionType; import com.facebook.presto.type.TypeRegistry; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; @@ -32,11 +34,11 @@ import java.util.Optional; import java.util.Set; -import static com.facebook.presto.metadata.FunctionKind.SCALAR; -import static com.facebook.presto.metadata.Signature.comparableTypeParameter; -import static com.facebook.presto.metadata.Signature.orderableTypeParameter; -import static com.facebook.presto.metadata.Signature.typeVariable; -import static com.facebook.presto.metadata.Signature.withVariadicBound; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; +import static com.facebook.presto.spi.function.Signature.comparableTypeParameter; +import static com.facebook.presto.spi.function.Signature.orderableTypeParameter; +import static com.facebook.presto.spi.function.Signature.typeVariable; +import static com.facebook.presto.spi.function.Signature.withVariadicBound; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.BooleanType.BOOLEAN; import static com.facebook.presto.spi.type.DoubleType.DOUBLE; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/BenchmarkHashAndStreamingAggregationOperators.java b/presto-main/src/test/java/com/facebook/presto/operator/BenchmarkHashAndStreamingAggregationOperators.java index 5d7a1fd726151..793b9d539eb69 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/BenchmarkHashAndStreamingAggregationOperators.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/BenchmarkHashAndStreamingAggregationOperators.java @@ -15,12 +15,12 @@ import com.facebook.presto.RowPagesBuilder; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.HashAggregationOperator.HashAggregationOperatorFactory; import com.facebook.presto.operator.StreamingAggregationOperator.StreamingAggregationOperatorFactory; import com.facebook.presto.operator.aggregation.InternalAggregationFunction; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spiller.SpillerFactory; import com.facebook.presto.sql.analyzer.FeaturesConfig; import com.facebook.presto.sql.gen.JoinCompiler; @@ -53,9 +53,9 @@ import static com.facebook.presto.SessionTestUtils.TEST_SESSION; import static com.facebook.presto.block.BlockAssertions.createLongSequenceBlock; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; import static com.facebook.presto.operator.BenchmarkHashAndStreamingAggregationOperators.Context.ROWS_PER_PAGE; import static com.facebook.presto.operator.BenchmarkHashAndStreamingAggregationOperators.Context.TOTAL_PAGES; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.VarcharType.VARCHAR; import static io.airlift.concurrent.Threads.daemonThreadsNamed; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/GenericLongFunction.java b/presto-main/src/test/java/com/facebook/presto/operator/GenericLongFunction.java index b8acd835e474f..7d6cb4830b359 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/GenericLongFunction.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/GenericLongFunction.java @@ -23,7 +23,7 @@ import java.lang.invoke.MethodHandle; import java.util.function.LongUnaryOperator; -import static com.facebook.presto.metadata.Signature.internalScalarFunction; +import static com.facebook.presto.metadata.InternalFunction.internalScalarFunction; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.type.StandardTypes.BIGINT; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/TestAggregationOperator.java b/presto-main/src/test/java/com/facebook/presto/operator/TestAggregationOperator.java index 9727fca3fcdbe..6a7e6c318f209 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/TestAggregationOperator.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/TestAggregationOperator.java @@ -14,10 +14,10 @@ package com.facebook.presto.operator; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.AggregationOperator.AggregationOperatorFactory; import com.facebook.presto.operator.aggregation.InternalAggregationFunction; import com.facebook.presto.spi.Page; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.StandardTypes; import com.facebook.presto.sql.planner.plan.AggregationNode.Step; import com.facebook.presto.sql.planner.plan.PlanNodeId; @@ -34,9 +34,9 @@ import static com.facebook.presto.RowPagesBuilder.rowPagesBuilder; import static com.facebook.presto.SessionTestUtils.TEST_SESSION; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; import static com.facebook.presto.operator.OperatorAssertion.assertOperatorEquals; import static com.facebook.presto.operator.OperatorAssertion.toPages; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.DoubleType.DOUBLE; import static com.facebook.presto.spi.type.RealType.REAL; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/TestAnnotationEngineForAggregates.java b/presto-main/src/test/java/com/facebook/presto/operator/TestAnnotationEngineForAggregates.java index c56a3e340ee2e..d381882485302 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/TestAnnotationEngineForAggregates.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/TestAnnotationEngineForAggregates.java @@ -15,10 +15,7 @@ import com.facebook.presto.block.BlockEncodingManager; import com.facebook.presto.metadata.BoundVariables; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.LongVariableConstraint; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.aggregation.AggregationImplementation; import com.facebook.presto.operator.aggregation.AggregationMetadata; import com.facebook.presto.operator.aggregation.InternalAggregationFunction; @@ -41,10 +38,13 @@ import com.facebook.presto.spi.function.BlockPosition; import com.facebook.presto.spi.function.CombineFunction; import com.facebook.presto.spi.function.Description; +import com.facebook.presto.spi.function.FunctionKind; import com.facebook.presto.spi.function.InputFunction; import com.facebook.presto.spi.function.LiteralParameters; +import com.facebook.presto.spi.function.LongVariableConstraint; import com.facebook.presto.spi.function.OperatorDependency; import com.facebook.presto.spi.function.OutputFunction; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.function.SqlType; import com.facebook.presto.spi.function.TypeParameter; import com.facebook.presto.spi.function.TypeParameterSpecialization; @@ -67,10 +67,10 @@ import java.lang.invoke.MethodHandle; import java.util.List; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.aggregation.AggregationFromAnnotationsParser.parseFunctionDefinition; import static com.facebook.presto.operator.aggregation.AggregationFromAnnotationsParser.parseFunctionDefinitions; import static com.facebook.presto.spi.function.OperatorType.LESS_THAN; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.StandardTypes.ARRAY; import static com.facebook.presto.spi.type.StandardTypes.DOUBLE; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/TestAnnotationEngineForScalars.java b/presto-main/src/test/java/com/facebook/presto/operator/TestAnnotationEngineForScalars.java index 391d4f75d0725..c80847a1fa2c6 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/TestAnnotationEngineForScalars.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/TestAnnotationEngineForScalars.java @@ -14,8 +14,6 @@ package com.facebook.presto.operator; import com.facebook.presto.metadata.BoundVariables; -import com.facebook.presto.metadata.FunctionKind; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.operator.annotations.ImplementationDependency; import com.facebook.presto.operator.annotations.LiteralImplementationDependency; @@ -26,9 +24,11 @@ import com.facebook.presto.operator.scalar.annotations.ScalarFromAnnotationsParser; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.function.Description; +import com.facebook.presto.spi.function.FunctionKind; import com.facebook.presto.spi.function.IsNull; import com.facebook.presto.spi.function.LiteralParameters; import com.facebook.presto.spi.function.ScalarFunction; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.function.SqlNullable; import com.facebook.presto.spi.function.SqlType; import com.facebook.presto.spi.function.TypeParameter; @@ -43,11 +43,11 @@ import java.util.List; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.USE_BOXED_TYPE; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.USE_NULL_FLAG; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.BooleanType.BOOLEAN; import static com.facebook.presto.spi.type.DoubleType.DOUBLE; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/TestFilterAndProjectOperator.java b/presto-main/src/test/java/com/facebook/presto/operator/TestFilterAndProjectOperator.java index 49b8107f437eb..46c53358d0a7c 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/TestFilterAndProjectOperator.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/TestFilterAndProjectOperator.java @@ -13,14 +13,14 @@ */ package com.facebook.presto.operator; +import com.facebook.presto.metadata.InternalFunction; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.project.PageProcessor; import com.facebook.presto.spi.Page; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.sql.gen.ExpressionCompiler; import com.facebook.presto.sql.gen.PageFunctionCompiler; import com.facebook.presto.sql.planner.plan.PlanNodeId; -import com.facebook.presto.sql.relational.RowExpression; import com.facebook.presto.testing.MaterializedResult; import com.google.common.collect.ImmutableList; import io.airlift.units.DataSize; @@ -86,16 +86,16 @@ public void test() .addSequencePage(100, 0, 0) .build(); - RowExpression filter = call( - Signature.internalOperator(BETWEEN, BOOLEAN.getTypeSignature(), ImmutableList.of(BIGINT.getTypeSignature(), BIGINT.getTypeSignature(), BIGINT.getTypeSignature())), + ColumnExpression filter = call( + InternalFunction.internalOperator(BETWEEN, BOOLEAN.getTypeSignature(), ImmutableList.of(BIGINT.getTypeSignature(), BIGINT.getTypeSignature(), BIGINT.getTypeSignature())), BOOLEAN, field(1, BIGINT), constant(10L, BIGINT), constant(19L, BIGINT)); - RowExpression field0 = field(0, VARCHAR); - RowExpression add5 = call( - Signature.internalOperator(ADD, BIGINT.getTypeSignature(), ImmutableList.of(BIGINT.getTypeSignature(), BIGINT.getTypeSignature())), + ColumnExpression field0 = field(0, VARCHAR); + ColumnExpression add5 = call( + InternalFunction.internalOperator(ADD, BIGINT.getTypeSignature(), ImmutableList.of(BIGINT.getTypeSignature(), BIGINT.getTypeSignature())), BIGINT, field(1, BIGINT), constant(5L, BIGINT)); @@ -138,8 +138,8 @@ public void testMergeOutput() .addSequencePage(100, 0, 0) .build(); - RowExpression filter = call( - Signature.internalOperator(EQUAL, BOOLEAN.getTypeSignature(), ImmutableList.of(BIGINT.getTypeSignature(), BIGINT.getTypeSignature())), + ColumnExpression filter = call( + InternalFunction.internalOperator(EQUAL, BOOLEAN.getTypeSignature(), ImmutableList.of(BIGINT.getTypeSignature(), BIGINT.getTypeSignature())), BOOLEAN, field(1, BIGINT), constant(10L, BIGINT)); diff --git a/presto-main/src/test/java/com/facebook/presto/operator/TestHashAggregationOperator.java b/presto-main/src/test/java/com/facebook/presto/operator/TestHashAggregationOperator.java index b101c7889b7ad..2b0932e3f8b36 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/TestHashAggregationOperator.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/TestHashAggregationOperator.java @@ -17,7 +17,6 @@ import com.facebook.presto.RowPagesBuilder; import com.facebook.presto.memory.context.AggregatedMemoryContext; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.HashAggregationOperator.HashAggregationOperatorFactory; import com.facebook.presto.operator.aggregation.InternalAggregationFunction; import com.facebook.presto.operator.aggregation.builder.HashAggregationBuilder; @@ -25,6 +24,7 @@ import com.facebook.presto.spi.Page; import com.facebook.presto.spi.block.BlockBuilder; import com.facebook.presto.spi.block.PageBuilderStatus; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.StandardTypes; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spiller.Spiller; @@ -56,7 +56,6 @@ import static com.facebook.presto.RowPagesBuilder.rowPagesBuilder; import static com.facebook.presto.SessionTestUtils.TEST_SESSION; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; import static com.facebook.presto.operator.GroupByHashYieldAssertion.GroupByHashYieldResult; import static com.facebook.presto.operator.GroupByHashYieldAssertion.createPagesWithDistinctHashKeys; import static com.facebook.presto.operator.GroupByHashYieldAssertion.finishOperatorWithYieldingGroupByHash; @@ -64,6 +63,7 @@ import static com.facebook.presto.operator.OperatorAssertion.dropChannel; import static com.facebook.presto.operator.OperatorAssertion.toMaterializedResult; import static com.facebook.presto.operator.OperatorAssertion.toPages; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.BooleanType.BOOLEAN; import static com.facebook.presto.spi.type.DoubleType.DOUBLE; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/TestRealAverageAggregation.java b/presto-main/src/test/java/com/facebook/presto/operator/TestRealAverageAggregation.java index 79965f807bfcd..41d6f6b201c71 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/TestRealAverageAggregation.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/TestRealAverageAggregation.java @@ -13,13 +13,13 @@ */ package com.facebook.presto.operator; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.aggregation.AbstractTestAggregationFunction; import com.facebook.presto.operator.aggregation.InternalAggregationFunction; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.StandardTypes; import com.google.common.collect.ImmutableList; import org.testng.annotations.BeforeClass; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/TestScanFilterAndProjectOperator.java b/presto-main/src/test/java/com/facebook/presto/operator/TestScanFilterAndProjectOperator.java index 8104407021cae..f424c1e7c027c 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/TestScanFilterAndProjectOperator.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/TestScanFilterAndProjectOperator.java @@ -16,9 +16,9 @@ import com.facebook.presto.SequencePageBuilder; import com.facebook.presto.block.BlockAssertions; import com.facebook.presto.connector.ConnectorId; +import com.facebook.presto.metadata.InternalFunction; import com.facebook.presto.metadata.Metadata; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.Split; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.operator.index.PageRecordSet; @@ -33,10 +33,10 @@ import com.facebook.presto.spi.RecordPageSource; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.LazyBlock; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.sql.gen.ExpressionCompiler; import com.facebook.presto.sql.gen.PageFunctionCompiler; import com.facebook.presto.sql.planner.plan.PlanNodeId; -import com.facebook.presto.sql.relational.RowExpression; import com.facebook.presto.testing.MaterializedResult; import com.facebook.presto.testing.TestingSplit; import com.facebook.presto.testing.TestingTransactionHandle; @@ -53,8 +53,8 @@ import static com.facebook.presto.RowPagesBuilder.rowPagesBuilder; import static com.facebook.presto.SessionTestUtils.TEST_SESSION; import static com.facebook.presto.block.BlockAssertions.toValues; +import static com.facebook.presto.metadata.InternalFunction.internalScalarFunction; import static com.facebook.presto.metadata.MetadataManager.createTestMetadataManager; -import static com.facebook.presto.metadata.Signature.internalScalarFunction; import static com.facebook.presto.operator.OperatorAssertion.toMaterializedResult; import static com.facebook.presto.operator.PageAssertions.assertPageEquals; import static com.facebook.presto.operator.project.PageProcessor.MAX_BATCH_SIZE; @@ -97,7 +97,7 @@ public void testPageSource() final Page input = SequencePageBuilder.createSequencePage(ImmutableList.of(VARCHAR), 10_000, 0); DriverContext driverContext = newDriverContext(); - List projections = ImmutableList.of(field(0, VARCHAR)); + List projections = ImmutableList.of(field(0, VARCHAR)); Supplier cursorProcessor = expressionCompiler.compileCursorProcessor(Optional.empty(), projections, "key"); Supplier pageProcessor = expressionCompiler.compilePageProcessor(Optional.empty(), projections); @@ -134,12 +134,12 @@ public void testPageSourceMergeOutput() .addSequencePage(100, 0) .build(); - RowExpression filter = call( - Signature.internalOperator(EQUAL, BOOLEAN.getTypeSignature(), ImmutableList.of(BIGINT.getTypeSignature(), BIGINT.getTypeSignature())), + ColumnExpression filter = call( + InternalFunction.internalOperator(EQUAL, BOOLEAN.getTypeSignature(), ImmutableList.of(BIGINT.getTypeSignature(), BIGINT.getTypeSignature())), BOOLEAN, field(0, BIGINT), constant(10L, BIGINT)); - List projections = ImmutableList.of(field(0, BIGINT)); + List projections = ImmutableList.of(field(0, BIGINT)); Supplier cursorProcessor = expressionCompiler.compileCursorProcessor(Optional.of(filter), projections, "key"); Supplier pageProcessor = expressionCompiler.compilePageProcessor(Optional.of(filter), projections); @@ -182,7 +182,7 @@ public void testPageSourceLazyLoad() })); DriverContext driverContext = newDriverContext(); - List projections = ImmutableList.of(field(0, VARCHAR)); + List projections = ImmutableList.of(field(0, VARCHAR)); Supplier cursorProcessor = expressionCompiler.compileCursorProcessor(Optional.empty(), projections, "key"); PageProcessor pageProcessor = new PageProcessor(Optional.of(new SelectAllFilter()), ImmutableList.of(new LazyPagePageProjection())); @@ -215,7 +215,7 @@ public void testRecordCursorSource() final Page input = SequencePageBuilder.createSequencePage(ImmutableList.of(VARCHAR), 10_000, 0); DriverContext driverContext = newDriverContext(); - List projections = ImmutableList.of(field(0, VARCHAR)); + List projections = ImmutableList.of(field(0, VARCHAR)); Supplier cursorProcessor = expressionCompiler.compileCursorProcessor(Optional.empty(), projections, "key"); Supplier pageProcessor = expressionCompiler.compilePageProcessor(Optional.empty(), projections); @@ -263,7 +263,7 @@ public void testPageYield() // match each column with a projection ExpressionCompiler expressionCompiler = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)); - ImmutableList.Builder projections = ImmutableList.builder(); + ImmutableList.Builder projections = ImmutableList.builder(); for (int i = 0; i < totalColumns; i++) { projections.add(call(internalScalarFunction("generic_long_page_col" + i, BIGINT.getTypeSignature(), ImmutableList.of(BIGINT.getTypeSignature())), BIGINT, field(0, BIGINT))); } @@ -327,8 +327,8 @@ public void testRecordCursorYield() }))); ExpressionCompiler expressionCompiler = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)); - List projections = ImmutableList.of(call( - Signature.internalScalarFunction("generic_long_record_cursor", BIGINT.getTypeSignature(), ImmutableList.of(BIGINT.getTypeSignature())), + List projections = ImmutableList.of(call( + InternalFunction.internalScalarFunction("generic_long_record_cursor", BIGINT.getTypeSignature(), ImmutableList.of(BIGINT.getTypeSignature())), BIGINT, field(0, BIGINT))); Supplier cursorProcessor = expressionCompiler.compileCursorProcessor(Optional.empty(), projections, "key"); diff --git a/presto-main/src/test/java/com/facebook/presto/operator/TestStreamingAggregationOperator.java b/presto-main/src/test/java/com/facebook/presto/operator/TestStreamingAggregationOperator.java index 6b688234ff5a1..d3dec5a705576 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/TestStreamingAggregationOperator.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/TestStreamingAggregationOperator.java @@ -15,10 +15,10 @@ import com.facebook.presto.RowPagesBuilder; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.StreamingAggregationOperator.StreamingAggregationOperatorFactory; import com.facebook.presto.operator.aggregation.InternalAggregationFunction; import com.facebook.presto.spi.Page; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.sql.analyzer.FeaturesConfig; import com.facebook.presto.sql.gen.JoinCompiler; import com.facebook.presto.sql.planner.plan.AggregationNode; @@ -35,8 +35,8 @@ import java.util.concurrent.ScheduledExecutorService; import static com.facebook.presto.SessionTestUtils.TEST_SESSION; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; import static com.facebook.presto.operator.OperatorAssertion.assertOperatorEquals; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.BooleanType.BOOLEAN; import static com.facebook.presto.spi.type.VarcharType.VARCHAR; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/TestTableFinishOperator.java b/presto-main/src/test/java/com/facebook/presto/operator/TestTableFinishOperator.java index b9cda84928013..679ada144823a 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/TestTableFinishOperator.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/TestTableFinishOperator.java @@ -14,13 +14,13 @@ package com.facebook.presto.operator; import com.facebook.presto.Session; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.TableFinishOperator.TableFinishOperatorFactory; import com.facebook.presto.operator.TableFinishOperator.TableFinisher; import com.facebook.presto.operator.aggregation.InternalAggregationFunction; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.LongArrayBlockBuilder; import com.facebook.presto.spi.connector.ConnectorOutputMetadata; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.statistics.ColumnStatisticMetadata; import com.facebook.presto.spi.statistics.ComputedStatistics; import com.facebook.presto.spi.type.Type; @@ -42,9 +42,9 @@ import static com.facebook.presto.RowPagesBuilder.rowPagesBuilder; import static com.facebook.presto.block.BlockAssertions.assertBlockEquals; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; import static com.facebook.presto.metadata.MetadataManager.createTestMetadataManager; import static com.facebook.presto.operator.PageAssertions.assertPageEquals; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.statistics.ColumnStatisticType.MAX_VALUE; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.VarbinaryType.VARBINARY; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/TestTableWriterOperator.java b/presto-main/src/test/java/com/facebook/presto/operator/TestTableWriterOperator.java index 94f2dd2b0cbeb..aff24236ed344 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/TestTableWriterOperator.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/TestTableWriterOperator.java @@ -18,7 +18,6 @@ import com.facebook.presto.connector.ConnectorId; import com.facebook.presto.memory.context.MemoryTrackingContext; import com.facebook.presto.metadata.OutputTableHandle; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.AggregationOperator.AggregationOperatorFactory; import com.facebook.presto.operator.DevNullOperator.DevNullOperatorFactory; import com.facebook.presto.operator.TableWriterOperator.TableWriterInfo; @@ -32,6 +31,7 @@ import com.facebook.presto.spi.SchemaTableName; import com.facebook.presto.spi.connector.ConnectorPageSinkProvider; import com.facebook.presto.spi.connector.ConnectorTransactionHandle; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; import com.facebook.presto.split.PageSinkManager; import com.facebook.presto.sql.planner.plan.AggregationNode; @@ -53,9 +53,9 @@ import static com.facebook.presto.RowPagesBuilder.rowPagesBuilder; import static com.facebook.presto.SessionTestUtils.TEST_SESSION; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; import static com.facebook.presto.metadata.MetadataManager.createTestMetadataManager; import static com.facebook.presto.operator.PageAssertions.assertPageEquals; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.VarbinaryType.VARBINARY; import static com.facebook.presto.testing.TestingSession.testSessionBuilder; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/AbstractTestAggregationFunction.java b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/AbstractTestAggregationFunction.java index 6c8fd6e12f7a9..64e510699cc62 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/AbstractTestAggregationFunction.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/AbstractTestAggregationFunction.java @@ -15,11 +15,11 @@ import com.facebook.presto.block.BlockEncodingManager; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.spi.Plugin; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; import com.facebook.presto.spi.block.RunLengthEncodedBlock; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeSignature; import com.facebook.presto.sql.analyzer.FeaturesConfig; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/BenchmarkArrayAggregation.java b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/BenchmarkArrayAggregation.java index 37b42500e8e10..5cbcd4c4d394c 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/BenchmarkArrayAggregation.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/BenchmarkArrayAggregation.java @@ -14,10 +14,10 @@ package com.facebook.presto.operator.aggregation; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.ArrayType; import com.facebook.presto.spi.type.Type; import com.google.common.collect.ImmutableList; @@ -44,7 +44,7 @@ import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.TimeUnit; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.BooleanType.BOOLEAN; import static com.facebook.presto.spi.type.DoubleType.DOUBLE; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/BenchmarkGroupedTypedHistogram.java b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/BenchmarkGroupedTypedHistogram.java index f4aac9375db11..47ee1cb3c35ae 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/BenchmarkGroupedTypedHistogram.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/BenchmarkGroupedTypedHistogram.java @@ -14,12 +14,12 @@ package com.facebook.presto.operator.aggregation; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.GroupByIdBlock; import com.facebook.presto.operator.aggregation.groupByAggregations.GroupByAggregationTestUtils; import com.facebook.presto.operator.aggregation.histogram.HistogramGroupImplementation; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.block.Block; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.MapType; import com.facebook.presto.spi.type.StandardTypes; import com.facebook.presto.sql.analyzer.FeaturesConfig; @@ -49,8 +49,8 @@ import java.util.stream.IntStream; import static com.facebook.presto.block.BlockAssertions.createStringsBlock; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; import static com.facebook.presto.operator.aggregation.histogram.Histogram.NAME; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.spi.type.VarcharType.VARCHAR; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctBoolean.java b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctBoolean.java index 0fac31ed68b21..20b0dc71ae5f4 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctBoolean.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctBoolean.java @@ -13,7 +13,7 @@ */ package com.facebook.presto.operator.aggregation; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; @@ -24,7 +24,7 @@ import java.util.List; import java.util.concurrent.ThreadLocalRandom; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.BooleanType.BOOLEAN; import static com.facebook.presto.spi.type.DoubleType.DOUBLE; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctDouble.java b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctDouble.java index 918eeb120abeb..081c383d0ac8b 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctDouble.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctDouble.java @@ -13,12 +13,12 @@ */ package com.facebook.presto.operator.aggregation; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; import java.util.concurrent.ThreadLocalRandom; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.DoubleType.DOUBLE; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctInteger.java b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctInteger.java index 887fb630035b8..c290e62e16fa8 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctInteger.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctInteger.java @@ -13,12 +13,12 @@ */ package com.facebook.presto.operator.aggregation; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; import java.util.concurrent.ThreadLocalRandom; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.DoubleType.DOUBLE; import static com.facebook.presto.spi.type.IntegerType.INTEGER; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctIpAddress.java b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctIpAddress.java index aa8e296cdfe7c..21a1a9535f4d6 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctIpAddress.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctIpAddress.java @@ -13,13 +13,13 @@ */ package com.facebook.presto.operator.aggregation; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; import io.airlift.slice.Slices; import java.util.concurrent.ThreadLocalRandom; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.DoubleType.DOUBLE; import static com.facebook.presto.type.IpAddressType.IPADDRESS; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctLong.java b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctLong.java index f6644a75a1f33..394c739b15972 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctLong.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctLong.java @@ -13,12 +13,12 @@ */ package com.facebook.presto.operator.aggregation; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; import java.util.concurrent.ThreadLocalRandom; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.DoubleType.DOUBLE; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctLongDecimal.java b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctLongDecimal.java index d6dab24c15290..0719ab5c24004 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctLongDecimal.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctLongDecimal.java @@ -13,13 +13,13 @@ */ package com.facebook.presto.operator.aggregation; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; import io.airlift.slice.Slices; import java.util.concurrent.ThreadLocalRandom; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.DecimalType.createDecimalType; import static com.facebook.presto.spi.type.Decimals.MAX_PRECISION; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctSmallint.java b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctSmallint.java index a00225a83f27b..4460310553b26 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctSmallint.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctSmallint.java @@ -13,12 +13,12 @@ */ package com.facebook.presto.operator.aggregation; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; import java.util.concurrent.ThreadLocalRandom; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.DoubleType.DOUBLE; import static com.facebook.presto.spi.type.SmallintType.SMALLINT; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctTinyint.java b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctTinyint.java index 466b5a03de48f..38af48750fc62 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctTinyint.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctTinyint.java @@ -13,12 +13,12 @@ */ package com.facebook.presto.operator.aggregation; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; import java.util.concurrent.ThreadLocalRandom; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.DoubleType.DOUBLE; import static com.facebook.presto.spi.type.TinyintType.TINYINT; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctVarBinary.java b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctVarBinary.java index 58dc923d4fb98..65c3ba44e82f1 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctVarBinary.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximateCountDistinctVarBinary.java @@ -13,14 +13,14 @@ */ package com.facebook.presto.operator.aggregation; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.VarcharType; import io.airlift.slice.Slices; import java.util.concurrent.ThreadLocalRandom; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.DoubleType.DOUBLE; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximatePercentileAggregation.java b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximatePercentileAggregation.java index 11eff43c83a3f..ca3af0aeef46a 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximatePercentileAggregation.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximatePercentileAggregation.java @@ -14,9 +14,9 @@ package com.facebook.presto.operator.aggregation; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.spi.block.BlockBuilder; import com.facebook.presto.spi.block.RunLengthEncodedBlock; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.ArrayType; import com.google.common.collect.ImmutableList; import org.testng.annotations.Test; @@ -28,8 +28,8 @@ import static com.facebook.presto.block.BlockAssertions.createLongSequenceBlock; import static com.facebook.presto.block.BlockAssertions.createLongsBlock; import static com.facebook.presto.block.BlockAssertions.createSequenceBlockOfReal; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; import static com.facebook.presto.operator.aggregation.AggregationTestUtils.assertAggregation; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.DoubleType.DOUBLE; import static com.facebook.presto.spi.type.RealType.REAL; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestArbitraryAggregation.java b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestArbitraryAggregation.java index c72ade107e852..7eb4e59ca8978 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestArbitraryAggregation.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestArbitraryAggregation.java @@ -14,7 +14,7 @@ package com.facebook.presto.operator.aggregation; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.StandardTypes; import com.facebook.presto.spi.type.Type; import com.google.common.collect.ImmutableList; @@ -29,8 +29,8 @@ import static com.facebook.presto.block.BlockAssertions.createIntsBlock; import static com.facebook.presto.block.BlockAssertions.createLongsBlock; import static com.facebook.presto.block.BlockAssertions.createStringsBlock; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; import static com.facebook.presto.operator.aggregation.AggregationTestUtils.assertAggregation; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.google.common.collect.ImmutableSet.toImmutableSet; import static org.testng.Assert.assertNotNull; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestArrayAggregation.java b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestArrayAggregation.java index 7a47fa256112e..412605f0562e0 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestArrayAggregation.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestArrayAggregation.java @@ -14,13 +14,13 @@ package com.facebook.presto.operator.aggregation; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.aggregation.groupByAggregations.AggregationTestInput; import com.facebook.presto.operator.aggregation.groupByAggregations.AggregationTestInputBuilder; import com.facebook.presto.operator.aggregation.groupByAggregations.AggregationTestOutput; import com.facebook.presto.operator.aggregation.groupByAggregations.GroupByAggregationTestUtils; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.SqlDate; import com.facebook.presto.spi.type.StandardTypes; import com.google.common.collect.ImmutableList; @@ -38,8 +38,8 @@ import static com.facebook.presto.block.BlockAssertions.createLongsBlock; import static com.facebook.presto.block.BlockAssertions.createStringsBlock; import static com.facebook.presto.block.BlockAssertions.createTypedLongsBlock; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; import static com.facebook.presto.operator.aggregation.AggregationTestUtils.assertAggregation; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.DateType.DATE; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static org.testng.Assert.assertTrue; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestChecksumAggregation.java b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestChecksumAggregation.java index b5812f89e6d56..f2af5884c5a83 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestChecksumAggregation.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestChecksumAggregation.java @@ -14,8 +14,8 @@ package com.facebook.presto.operator.aggregation; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.spi.block.Block; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.ArrayType; import com.facebook.presto.spi.type.BigintType; import com.facebook.presto.spi.type.BooleanType; @@ -34,9 +34,9 @@ import static com.facebook.presto.block.BlockAssertions.createLongsBlock; import static com.facebook.presto.block.BlockAssertions.createShortDecimalsBlock; import static com.facebook.presto.block.BlockAssertions.createStringsBlock; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; import static com.facebook.presto.operator.aggregation.AggregationTestUtils.assertAggregation; import static com.facebook.presto.operator.aggregation.ChecksumAggregationFunction.PRIME64; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.StandardTypes.BIGINT; import static com.facebook.presto.spi.type.StandardTypes.BOOLEAN; import static com.facebook.presto.spi.type.StandardTypes.DOUBLE; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestDoubleHistogramAggregation.java b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestDoubleHistogramAggregation.java index f1511add8bcd0..925bfd38f927a 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestDoubleHistogramAggregation.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestDoubleHistogramAggregation.java @@ -15,11 +15,11 @@ import com.facebook.presto.block.BlockEncodingManager; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.PageBuilder; import com.facebook.presto.spi.PrestoException; import com.facebook.presto.spi.block.Block; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.MapType; import com.facebook.presto.spi.type.StandardTypes; import com.facebook.presto.sql.analyzer.FeaturesConfig; @@ -31,9 +31,9 @@ import java.util.Map; import java.util.Optional; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; import static com.facebook.presto.operator.aggregation.AggregationTestUtils.getFinalBlock; import static com.facebook.presto.operator.aggregation.AggregationTestUtils.getIntermediateBlock; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.DoubleType.DOUBLE; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestHistogram.java b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestHistogram.java index c294b08d2d609..72ba95bed87e0 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestHistogram.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestHistogram.java @@ -15,7 +15,6 @@ package com.facebook.presto.operator.aggregation; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.aggregation.groupByAggregations.AggregationTestInput; import com.facebook.presto.operator.aggregation.groupByAggregations.AggregationTestInputBuilder; import com.facebook.presto.operator.aggregation.groupByAggregations.AggregationTestOutput; @@ -23,6 +22,7 @@ import com.facebook.presto.operator.aggregation.histogram.HistogramGroupImplementation; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.ArrayType; import com.facebook.presto.spi.type.MapType; import com.facebook.presto.spi.type.RowType; @@ -53,11 +53,11 @@ import static com.facebook.presto.block.BlockAssertions.createLongsBlock; import static com.facebook.presto.block.BlockAssertions.createStringArraysBlock; import static com.facebook.presto.block.BlockAssertions.createStringsBlock; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; import static com.facebook.presto.operator.OperatorAssertion.toRow; import static com.facebook.presto.operator.aggregation.AggregationTestUtils.assertAggregation; import static com.facebook.presto.operator.aggregation.histogram.Histogram.NAME; import static com.facebook.presto.operator.aggregation.histogram.HistogramGroupImplementation.NEW; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.BooleanType.BOOLEAN; import static com.facebook.presto.spi.type.DateTimeEncoding.packDateTimeWithZone; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestMapAggAggregation.java b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestMapAggAggregation.java index ba261aaf3af85..ddd6844bc4ca8 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestMapAggAggregation.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestMapAggAggregation.java @@ -14,8 +14,8 @@ package com.facebook.presto.operator.aggregation; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.ArrayType; import com.facebook.presto.spi.type.MapType; import com.facebook.presto.spi.type.RowType; @@ -32,10 +32,10 @@ import static com.facebook.presto.block.BlockAssertions.createStringArraysBlock; import static com.facebook.presto.block.BlockAssertions.createStringsBlock; import static com.facebook.presto.block.BlockAssertions.createTypedLongsBlock; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; import static com.facebook.presto.operator.OperatorAssertion.toRow; import static com.facebook.presto.operator.aggregation.AggregationTestUtils.assertAggregation; import static com.facebook.presto.operator.aggregation.MapAggregationFunction.NAME; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.BooleanType.BOOLEAN; import static com.facebook.presto.spi.type.DoubleType.DOUBLE; import static com.facebook.presto.spi.type.IntegerType.INTEGER; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestMapUnionAggregation.java b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestMapUnionAggregation.java index ec56c2e321213..5219eb5770d52 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestMapUnionAggregation.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestMapUnionAggregation.java @@ -14,7 +14,7 @@ package com.facebook.presto.operator.aggregation; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.ArrayType; import com.facebook.presto.spi.type.MapType; import com.google.common.collect.ImmutableList; @@ -24,9 +24,9 @@ import java.util.HashMap; import java.util.Map; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; import static com.facebook.presto.operator.aggregation.AggregationTestUtils.assertAggregation; import static com.facebook.presto.operator.aggregation.MapUnionAggregation.NAME; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.BooleanType.BOOLEAN; import static com.facebook.presto.spi.type.DoubleType.DOUBLE; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestMultimapAggAggregation.java b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestMultimapAggAggregation.java index 56a5772393f9f..1136aa89430dc 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestMultimapAggAggregation.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestMultimapAggAggregation.java @@ -15,7 +15,6 @@ import com.facebook.presto.RowPageBuilder; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.aggregation.groupByAggregations.AggregationTestInput; import com.facebook.presto.operator.aggregation.groupByAggregations.AggregationTestInputBuilder; import com.facebook.presto.operator.aggregation.groupByAggregations.AggregationTestOutput; @@ -23,6 +22,7 @@ import com.facebook.presto.spi.Page; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.ArrayType; import com.facebook.presto.spi.type.MapType; import com.facebook.presto.spi.type.RowType; @@ -40,10 +40,10 @@ import java.util.Optional; import java.util.Random; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; import static com.facebook.presto.metadata.MetadataManager.createTestMetadataManager; import static com.facebook.presto.operator.aggregation.AggregationTestUtils.assertAggregation; import static com.facebook.presto.operator.aggregation.multimapagg.MultimapAggregationFunction.NAME; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.DoubleType.DOUBLE; import static com.facebook.presto.spi.type.VarcharType.VARCHAR; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestQuantileDigestAggregationFunction.java b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestQuantileDigestAggregationFunction.java index 29c71f04e1a40..2f25df624b8b1 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestQuantileDigestAggregationFunction.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestQuantileDigestAggregationFunction.java @@ -14,10 +14,10 @@ package com.facebook.presto.operator.aggregation; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.scalar.AbstractTestFunctions; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.block.Block; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.SqlVarbinary; import com.facebook.presto.spi.type.StandardTypes; import com.facebook.presto.spi.type.TypeSignature; @@ -39,11 +39,11 @@ import static com.facebook.presto.block.BlockAssertions.createLongsBlock; import static com.facebook.presto.block.BlockAssertions.createRLEBlock; import static com.facebook.presto.block.BlockAssertions.createSequenceBlockOfReal; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; import static com.facebook.presto.operator.aggregation.AggregationTestUtils.assertAggregation; import static com.facebook.presto.operator.aggregation.FloatingPointBitsConverterUtil.doubleToSortableLong; import static com.facebook.presto.operator.aggregation.FloatingPointBitsConverterUtil.floatToSortableInt; import static com.facebook.presto.operator.aggregation.TestMergeQuantileDigestFunction.QDIGEST_EQUALITY; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.BooleanType.BOOLEAN; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.google.common.collect.ImmutableList.toImmutableList; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestRealHistogramAggregation.java b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestRealHistogramAggregation.java index 16948930547bd..88801c8b2d5e9 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestRealHistogramAggregation.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestRealHistogramAggregation.java @@ -15,11 +15,11 @@ import com.facebook.presto.block.BlockEncodingManager; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.PageBuilder; import com.facebook.presto.spi.PrestoException; import com.facebook.presto.spi.block.Block; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.MapType; import com.facebook.presto.spi.type.StandardTypes; import com.facebook.presto.sql.analyzer.FeaturesConfig; @@ -31,9 +31,9 @@ import java.util.Map; import java.util.Optional; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; import static com.facebook.presto.operator.aggregation.AggregationTestUtils.getFinalBlock; import static com.facebook.presto.operator.aggregation.AggregationTestUtils.getIntermediateBlock; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.DoubleType.DOUBLE; import static com.facebook.presto.spi.type.RealType.REAL; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/minmaxby/TestMinMaxByAggregation.java b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/minmaxby/TestMinMaxByAggregation.java index 7707008ccb643..e0244f24b853f 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/minmaxby/TestMinMaxByAggregation.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/minmaxby/TestMinMaxByAggregation.java @@ -14,9 +14,9 @@ package com.facebook.presto.operator.aggregation.minmaxby; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.aggregation.InternalAggregationFunction; import com.facebook.presto.operator.aggregation.state.StateCompiler; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.DecimalType; import com.facebook.presto.spi.type.RowType; import com.facebook.presto.spi.type.SqlDecimal; @@ -37,8 +37,8 @@ import static com.facebook.presto.block.BlockAssertions.createLongsBlock; import static com.facebook.presto.block.BlockAssertions.createShortDecimalsBlock; import static com.facebook.presto.block.BlockAssertions.createStringsBlock; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; import static com.facebook.presto.operator.aggregation.AggregationTestUtils.assertAggregation; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.DoubleType.DOUBLE; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/minmaxby/TestMinMaxByNAggregation.java b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/minmaxby/TestMinMaxByNAggregation.java index 1b215ed510bd4..2377259d067f9 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/minmaxby/TestMinMaxByNAggregation.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/minmaxby/TestMinMaxByNAggregation.java @@ -14,10 +14,10 @@ package com.facebook.presto.operator.aggregation.minmaxby; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.aggregation.InternalAggregationFunction; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.PrestoException; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.StandardTypes; import com.google.common.collect.ImmutableList; import org.testng.annotations.Test; @@ -29,9 +29,9 @@ import static com.facebook.presto.block.BlockAssertions.createLongsBlock; import static com.facebook.presto.block.BlockAssertions.createRLEBlock; import static com.facebook.presto.block.BlockAssertions.createStringsBlock; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; import static com.facebook.presto.operator.aggregation.AggregationTestUtils.assertAggregation; import static com.facebook.presto.operator.aggregation.AggregationTestUtils.groupedAggregation; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static org.testng.Assert.assertEquals; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/project/TestPageProcessor.java b/presto-main/src/test/java/com/facebook/presto/operator/project/TestPageProcessor.java index de0395e44f2c4..f8ca0a73cdd59 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/project/TestPageProcessor.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/project/TestPageProcessor.java @@ -23,10 +23,10 @@ import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.LazyBlock; import com.facebook.presto.spi.block.VariableWidthBlock; +import com.facebook.presto.spi.relation.column.CallExpression; import com.facebook.presto.spi.type.Type; import com.facebook.presto.sql.gen.ExpressionProfiler; import com.facebook.presto.sql.gen.PageFunctionCompiler; -import com.facebook.presto.sql.relational.CallExpression; import com.google.common.collect.ImmutableList; import io.airlift.slice.Slice; import io.airlift.slice.Slices; @@ -49,8 +49,8 @@ import static com.facebook.presto.block.BlockAssertions.createStringsBlock; import static com.facebook.presto.execution.executor.PrioritizedSplitRunner.SPLIT_RUN_QUANTA; import static com.facebook.presto.memory.context.AggregatedMemoryContext.newSimpleAggregatedMemoryContext; +import static com.facebook.presto.metadata.InternalFunction.internalOperator; import static com.facebook.presto.metadata.MetadataManager.createTestMetadataManager; -import static com.facebook.presto.metadata.Signature.internalOperator; import static com.facebook.presto.operator.PageAssertions.assertPageEquals; import static com.facebook.presto.operator.project.PageProcessor.MAX_BATCH_SIZE; import static com.facebook.presto.operator.project.PageProcessor.MAX_PAGE_SIZE_IN_BYTES; diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayDistinct.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayDistinct.java index c8e146c2ad3a9..f8be2be3919a4 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayDistinct.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayDistinct.java @@ -13,23 +13,23 @@ */ package com.facebook.presto.operator.scalar; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.DriverYieldSignal; import com.facebook.presto.operator.aggregation.TypedSet; import com.facebook.presto.operator.project.PageProcessor; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.FunctionKind; import com.facebook.presto.spi.function.ScalarFunction; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.function.SqlType; +import com.facebook.presto.spi.relation.column.CallExpression; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.spi.type.ArrayType; import com.facebook.presto.spi.type.Type; import com.facebook.presto.sql.gen.ExpressionCompiler; import com.facebook.presto.sql.gen.PageFunctionCompiler; -import com.facebook.presto.sql.relational.CallExpression; -import com.facebook.presto.sql.relational.RowExpression; import com.google.common.base.Verify; import com.google.common.collect.ImmutableList; import io.airlift.slice.Slices; @@ -107,7 +107,7 @@ public void setup() MetadataManager metadata = MetadataManager.createTestMetadataManager(); metadata.addFunctions(extractFunctions(BenchmarkArrayDistinct.class)); ExpressionCompiler compiler = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)); - ImmutableList.Builder projectionsBuilder = ImmutableList.builder(); + ImmutableList.Builder projectionsBuilder = ImmutableList.builder(); Block[] blocks = new Block[TYPES.size()]; for (int i = 0; i < TYPES.size(); i++) { Type elementType = TYPES.get(i); @@ -117,7 +117,7 @@ public void setup() blocks[i] = createChannel(POSITIONS, ARRAY_SIZE, arrayType); } - ImmutableList projections = projectionsBuilder.build(); + ImmutableList projections = projectionsBuilder.build(); pageProcessor = compiler.compilePageProcessor(Optional.empty(), projections).get(); page = new Page(blocks); } diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayFilter.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayFilter.java index b1712215423dd..33ab06d7a6808 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayFilter.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayFilter.java @@ -14,26 +14,26 @@ package com.facebook.presto.operator.scalar; import com.facebook.presto.metadata.BoundVariables; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.FunctionListBuilder; import com.facebook.presto.metadata.FunctionRegistry; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.operator.DriverYieldSignal; import com.facebook.presto.operator.project.PageProcessor; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.CallExpression; +import com.facebook.presto.spi.relation.column.ColumnExpression; +import com.facebook.presto.spi.relation.column.LambdaDefinitionExpression; +import com.facebook.presto.spi.relation.column.VariableReferenceExpression; import com.facebook.presto.spi.type.ArrayType; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeManager; import com.facebook.presto.sql.gen.ExpressionCompiler; import com.facebook.presto.sql.gen.PageFunctionCompiler; -import com.facebook.presto.sql.relational.CallExpression; -import com.facebook.presto.sql.relational.LambdaDefinitionExpression; -import com.facebook.presto.sql.relational.RowExpression; -import com.facebook.presto.sql.relational.VariableReferenceExpression; import com.google.common.base.Verify; import com.google.common.collect.ImmutableList; import org.openjdk.jmh.annotations.Benchmark; @@ -60,11 +60,11 @@ import java.util.concurrent.TimeUnit; import static com.facebook.presto.memory.context.AggregatedMemoryContext.newSimpleAggregatedMemoryContext; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.scalar.BenchmarkArrayFilter.ExactArrayFilterFunction.EXACT_ARRAY_FILTER_FUNCTION; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.OperatorType.GREATER_THAN; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.BooleanType.BOOLEAN; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; @@ -122,7 +122,7 @@ public void setup() MetadataManager metadata = MetadataManager.createTestMetadataManager(); metadata.addFunctions(new FunctionListBuilder().function(EXACT_ARRAY_FILTER_FUNCTION).getFunctions()); ExpressionCompiler compiler = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)); - ImmutableList.Builder projectionsBuilder = ImmutableList.builder(); + ImmutableList.Builder projectionsBuilder = ImmutableList.builder(); Block[] blocks = new Block[TYPES.size()]; for (int i = 0; i < TYPES.size(); i++) { Type elementType = TYPES.get(i); @@ -138,7 +138,7 @@ public void setup() blocks[i] = createChannel(POSITIONS, ARRAY_SIZE, arrayType); } - ImmutableList projections = projectionsBuilder.build(); + ImmutableList projections = projectionsBuilder.build(); pageProcessor = compiler.compilePageProcessor(Optional.empty(), projections).get(); page = new Page(blocks); } diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayHashCodeOperator.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayHashCodeOperator.java index 9fa026e7fb714..89cdccbf04225 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayHashCodeOperator.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayHashCodeOperator.java @@ -13,28 +13,28 @@ */ package com.facebook.presto.operator.scalar; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.FunctionListBuilder; import com.facebook.presto.metadata.FunctionRegistry; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.DriverYieldSignal; import com.facebook.presto.operator.project.PageProcessor; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; import com.facebook.presto.spi.function.Description; +import com.facebook.presto.spi.function.FunctionKind; import com.facebook.presto.spi.function.OperatorDependency; import com.facebook.presto.spi.function.ScalarFunction; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.function.SqlType; import com.facebook.presto.spi.function.TypeParameter; +import com.facebook.presto.spi.relation.column.CallExpression; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.spi.type.ArrayType; import com.facebook.presto.spi.type.StandardTypes; import com.facebook.presto.spi.type.Type; import com.facebook.presto.sql.gen.ExpressionCompiler; import com.facebook.presto.sql.gen.PageFunctionCompiler; -import com.facebook.presto.sql.relational.CallExpression; -import com.facebook.presto.sql.relational.RowExpression; import com.google.common.collect.ImmutableList; import io.airlift.slice.Slices; import org.openjdk.jmh.annotations.Benchmark; @@ -119,7 +119,7 @@ public void setup() metadata.addFunctions(new FunctionListBuilder().scalar(BenchmarkOldArrayHash.class).getFunctions()); metadata.addFunctions(new FunctionListBuilder().scalar(BenchmarkAnotherArrayHash.class).getFunctions()); ExpressionCompiler compiler = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)); - ImmutableList.Builder projectionsBuilder = ImmutableList.builder(); + ImmutableList.Builder projectionsBuilder = ImmutableList.builder(); Block[] blocks = new Block[1]; Type elementType; switch (type) { @@ -143,7 +143,7 @@ public void setup() projectionsBuilder.add(new CallExpression(signature, BIGINT, ImmutableList.of(field(0, arrayType)))); blocks[0] = createChannel(POSITIONS, ARRAY_SIZE, arrayType); - ImmutableList projections = projectionsBuilder.build(); + ImmutableList projections = projectionsBuilder.build(); pageProcessor = compiler.compilePageProcessor(Optional.empty(), projections).get(); page = new Page(blocks); } diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayIntersect.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayIntersect.java index f7e73e0544f58..3112b88fe6af2 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayIntersect.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayIntersect.java @@ -13,20 +13,20 @@ */ package com.facebook.presto.operator.scalar; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.DriverYieldSignal; import com.facebook.presto.operator.project.PageProcessor; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.CallExpression; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.spi.type.ArrayType; import com.facebook.presto.spi.type.Type; import com.facebook.presto.sql.gen.ExpressionCompiler; import com.facebook.presto.sql.gen.PageFunctionCompiler; -import com.facebook.presto.sql.relational.CallExpression; -import com.facebook.presto.sql.relational.RowExpression; import com.google.common.collect.ImmutableList; import io.airlift.slice.Slices; import org.openjdk.jmh.annotations.Benchmark; @@ -120,7 +120,7 @@ public void setup() ArrayType arrayType = new ArrayType(elementType); Signature signature = new Signature(name, FunctionKind.SCALAR, arrayType.getTypeSignature(), arrayType.getTypeSignature(), arrayType.getTypeSignature()); - ImmutableList projections = ImmutableList.of( + ImmutableList projections = ImmutableList.of( new CallExpression(signature, arrayType, ImmutableList.of(field(0, arrayType), field(1, arrayType)))); MetadataManager metadata = MetadataManager.createTestMetadataManager(); diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayJoin.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayJoin.java index 499bdc7501f65..c582d2ad69609 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayJoin.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayJoin.java @@ -13,19 +13,19 @@ */ package com.facebook.presto.operator.scalar; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.DriverYieldSignal; import com.facebook.presto.operator.project.PageProcessor; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.CallExpression; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.spi.type.ArrayType; import com.facebook.presto.sql.gen.ExpressionCompiler; import com.facebook.presto.sql.gen.PageFunctionCompiler; -import com.facebook.presto.sql.relational.CallExpression; -import com.facebook.presto.sql.relational.RowExpression; import com.google.common.collect.ImmutableList; import io.airlift.slice.Slices; import org.openjdk.jmh.annotations.Benchmark; @@ -90,7 +90,7 @@ public void setup() { Signature signature = new Signature("array_join", FunctionKind.SCALAR, VARCHAR.getTypeSignature(), new ArrayType(BIGINT).getTypeSignature(), VARCHAR.getTypeSignature()); - List projections = ImmutableList.of( + List projections = ImmutableList.of( new CallExpression(signature, VARCHAR, ImmutableList.of( field(0, new ArrayType(BIGINT)), constant(Slices.wrappedBuffer(",".getBytes(UTF_8)), VARCHAR)))); diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArraySort.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArraySort.java index 758c5ed602cee..a6f343f938e13 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArraySort.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArraySort.java @@ -13,22 +13,22 @@ */ package com.facebook.presto.operator.scalar; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.DriverYieldSignal; import com.facebook.presto.operator.project.PageProcessor; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.FunctionKind; import com.facebook.presto.spi.function.ScalarFunction; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.function.SqlType; +import com.facebook.presto.spi.relation.column.CallExpression; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.spi.type.ArrayType; import com.facebook.presto.spi.type.Type; import com.facebook.presto.sql.gen.ExpressionCompiler; import com.facebook.presto.sql.gen.PageFunctionCompiler; -import com.facebook.presto.sql.relational.CallExpression; -import com.facebook.presto.sql.relational.RowExpression; import com.google.common.base.Verify; import com.google.common.collect.ImmutableList; import com.google.common.primitives.Ints; @@ -107,7 +107,7 @@ public void setup() MetadataManager metadata = MetadataManager.createTestMetadataManager(); metadata.addFunctions(extractFunctions(BenchmarkArraySort.class)); ExpressionCompiler compiler = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)); - ImmutableList.Builder projectionsBuilder = ImmutableList.builder(); + ImmutableList.Builder projectionsBuilder = ImmutableList.builder(); Block[] blocks = new Block[TYPES.size()]; for (int i = 0; i < TYPES.size(); i++) { Type elementType = TYPES.get(i); @@ -117,7 +117,7 @@ public void setup() blocks[i] = createChannel(POSITIONS, ARRAY_SIZE, arrayType); } - ImmutableList projections = projectionsBuilder.build(); + ImmutableList projections = projectionsBuilder.build(); pageProcessor = compiler.compilePageProcessor(Optional.empty(), projections).get(); page = new Page(blocks); } diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArraySubscript.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArraySubscript.java index d5b99b5604168..dc00bb656e650 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArraySubscript.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArraySubscript.java @@ -13,9 +13,7 @@ */ package com.facebook.presto.operator.scalar; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.DriverYieldSignal; import com.facebook.presto.operator.project.PageProcessor; import com.facebook.presto.spi.Page; @@ -23,12 +21,14 @@ import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; import com.facebook.presto.spi.block.DictionaryBlock; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.CallExpression; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.spi.type.ArrayType; import com.facebook.presto.spi.type.Type; import com.facebook.presto.sql.gen.ExpressionCompiler; import com.facebook.presto.sql.gen.PageFunctionCompiler; -import com.facebook.presto.sql.relational.CallExpression; -import com.facebook.presto.sql.relational.RowExpression; import com.google.common.collect.ImmutableList; import io.airlift.slice.Slice; import org.openjdk.jmh.annotations.Benchmark; @@ -133,7 +133,7 @@ public void setup() Block block = createArrayBlock(POSITIONS, elementsBlock); - ImmutableList.Builder projectionsBuilder = ImmutableList.builder(); + ImmutableList.Builder projectionsBuilder = ImmutableList.builder(); Signature signature = new Signature( "$operator$" + SUBSCRIPT.name(), @@ -148,7 +148,7 @@ public void setup() ImmutableList.of(field(0, arrayType), constant((long) i + 1, BIGINT)))); } - ImmutableList projections = projectionsBuilder.build(); + ImmutableList projections = projectionsBuilder.build(); pageProcessor = compiler.compilePageProcessor(Optional.empty(), projections).get(); page = new Page(block); } diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayTransform.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayTransform.java index fef09642f3b6f..7ca77002e356e 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayTransform.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayTransform.java @@ -13,25 +13,25 @@ */ package com.facebook.presto.operator.scalar; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.DriverYieldSignal; import com.facebook.presto.operator.project.PageProcessor; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.PageBuilder; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.CallExpression; +import com.facebook.presto.spi.relation.column.ColumnExpression; +import com.facebook.presto.spi.relation.column.ConstantExpression; +import com.facebook.presto.spi.relation.column.InputReferenceExpression; +import com.facebook.presto.spi.relation.column.LambdaDefinitionExpression; +import com.facebook.presto.spi.relation.column.VariableReferenceExpression; import com.facebook.presto.spi.type.ArrayType; import com.facebook.presto.spi.type.Type; import com.facebook.presto.sql.gen.ExpressionCompiler; import com.facebook.presto.sql.gen.PageFunctionCompiler; -import com.facebook.presto.sql.relational.CallExpression; -import com.facebook.presto.sql.relational.ConstantExpression; -import com.facebook.presto.sql.relational.InputReferenceExpression; -import com.facebook.presto.sql.relational.LambdaDefinitionExpression; -import com.facebook.presto.sql.relational.RowExpression; -import com.facebook.presto.sql.relational.VariableReferenceExpression; import com.google.common.base.Verify; import com.google.common.collect.ImmutableList; import org.openjdk.jmh.annotations.Benchmark; @@ -106,7 +106,7 @@ public void setup() { MetadataManager metadata = MetadataManager.createTestMetadataManager(); ExpressionCompiler compiler = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)); - ImmutableList.Builder projectionsBuilder = ImmutableList.builder(); + ImmutableList.Builder projectionsBuilder = ImmutableList.builder(); Block[] blocks = new Block[TYPES.size()]; Type returnType = new ArrayType(BOOLEAN); for (int i = 0; i < TYPES.size(); i++) { @@ -123,9 +123,9 @@ public void setup() blocks[i] = createChannel(POSITIONS, ARRAY_SIZE, arrayType); } - ImmutableList projections = projectionsBuilder.build(); + ImmutableList projections = projectionsBuilder.build(); pageProcessor = compiler.compilePageProcessor(Optional.empty(), projections).get(); - pageBuilder = new PageBuilder(projections.stream().map(RowExpression::getType).collect(Collectors.toList())); + pageBuilder = new PageBuilder(projections.stream().map(ColumnExpression::getType).collect(Collectors.toList())); page = new Page(blocks); } diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkEqualsOperator.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkEqualsOperator.java index 6c25ecf035e4e..cb7eaddf424cc 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkEqualsOperator.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkEqualsOperator.java @@ -21,10 +21,10 @@ import com.facebook.presto.spi.PageBuilder; import com.facebook.presto.spi.block.BlockBuilder; import com.facebook.presto.spi.function.OperatorType; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.spi.type.Type; import com.facebook.presto.sql.gen.ExpressionCompiler; import com.facebook.presto.sql.gen.PageFunctionCompiler; -import com.facebook.presto.sql.relational.RowExpression; import com.google.common.collect.ImmutableList; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; @@ -51,8 +51,8 @@ import static com.facebook.presto.SessionTestUtils.TEST_SESSION; import static com.facebook.presto.memory.context.AggregatedMemoryContext.newSimpleAggregatedMemoryContext; -import static com.facebook.presto.metadata.Signature.internalOperator; -import static com.facebook.presto.metadata.Signature.internalScalarFunction; +import static com.facebook.presto.metadata.InternalFunction.internalOperator; +import static com.facebook.presto.metadata.InternalFunction.internalScalarFunction; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.BooleanType.BOOLEAN; import static com.facebook.presto.sql.relational.Expressions.call; @@ -85,11 +85,11 @@ public void setup() ExpressionCompiler expressionCompiler = new ExpressionCompiler( metadata, new PageFunctionCompiler(metadata, 0)); - RowExpression projection = generateComplexComparisonProjection(FIELDS_COUNT, COMPARISONS_COUNT); + ColumnExpression projection = generateComplexComparisonProjection(FIELDS_COUNT, COMPARISONS_COUNT); compiledProcessor = expressionCompiler.compilePageProcessor(Optional.empty(), ImmutableList.of(projection)).get(); } - private static RowExpression generateComplexComparisonProjection(int fieldsCount, int comparisonsCount) + private static ColumnExpression generateComplexComparisonProjection(int fieldsCount, int comparisonsCount) { checkArgument(fieldsCount > 0, "fieldsCount must be greater than zero"); checkArgument(comparisonsCount > 0, "comparisonsCount must be greater than zero"); @@ -103,7 +103,7 @@ private static RowExpression generateComplexComparisonProjection(int fieldsCount generateComplexComparisonProjection(fieldsCount, comparisonsCount - 1)); } - private static RowExpression createConjunction(RowExpression left, RowExpression right) + private static ColumnExpression createConjunction(ColumnExpression left, ColumnExpression right) { return call( internalScalarFunction("OR", BOOLEAN.getTypeSignature(), BOOLEAN.getTypeSignature(), BOOLEAN.getTypeSignature()), @@ -112,7 +112,7 @@ private static RowExpression createConjunction(RowExpression left, RowExpression right); } - private static RowExpression createComparison(int leftField, int rightField) + private static ColumnExpression createComparison(int leftField, int rightField) { return call( internalOperator(OperatorType.EQUAL, BOOLEAN.getTypeSignature(), BIGINT.getTypeSignature(), BIGINT.getTypeSignature()), diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkJsonToArrayCast.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkJsonToArrayCast.java index 25a58115fbcc2..30b7d0607e6e2 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkJsonToArrayCast.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkJsonToArrayCast.java @@ -13,20 +13,20 @@ */ package com.facebook.presto.operator.scalar; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.DriverYieldSignal; import com.facebook.presto.operator.project.PageProcessor; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.CallExpression; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.spi.type.ArrayType; import com.facebook.presto.spi.type.Type; import com.facebook.presto.sql.gen.ExpressionCompiler; import com.facebook.presto.sql.gen.PageFunctionCompiler; -import com.facebook.presto.sql.relational.CallExpression; -import com.facebook.presto.sql.relational.RowExpression; import com.google.common.collect.ImmutableList; import io.airlift.slice.DynamicSliceOutput; import io.airlift.slice.SliceOutput; @@ -112,7 +112,7 @@ public void setup() Signature signature = new Signature("$operator$CAST", FunctionKind.SCALAR, new ArrayType(elementType).getTypeSignature(), JSON.getTypeSignature()); - List projections = ImmutableList.of( + List projections = ImmutableList.of( new CallExpression(signature, new ArrayType(elementType), ImmutableList.of(field(0, JSON)))); MetadataManager metadata = MetadataManager.createTestMetadataManager(); diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkJsonToMapCast.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkJsonToMapCast.java index 73bb1226c597a..1ad5dc87ac409 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkJsonToMapCast.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkJsonToMapCast.java @@ -13,19 +13,19 @@ */ package com.facebook.presto.operator.scalar; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.DriverYieldSignal; import com.facebook.presto.operator.project.PageProcessor; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.CallExpression; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.spi.type.Type; import com.facebook.presto.sql.gen.ExpressionCompiler; import com.facebook.presto.sql.gen.PageFunctionCompiler; -import com.facebook.presto.sql.relational.CallExpression; -import com.facebook.presto.sql.relational.RowExpression; import com.google.common.collect.ImmutableList; import io.airlift.slice.DynamicSliceOutput; import io.airlift.slice.SliceOutput; @@ -112,7 +112,7 @@ public void setup() throw new UnsupportedOperationException(); } - List projections = ImmutableList.of( + List projections = ImmutableList.of( new CallExpression(signature, mapType(VARCHAR, valueType), ImmutableList.of(field(0, JSON)))); MetadataManager metadata = MetadataManager.createTestMetadataManager(); diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkMapConcat.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkMapConcat.java index 5f301b68ad57f..08cd71f2c5ca1 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkMapConcat.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkMapConcat.java @@ -13,20 +13,20 @@ */ package com.facebook.presto.operator.scalar; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.DriverYieldSignal; import com.facebook.presto.operator.project.PageProcessor; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; import com.facebook.presto.spi.block.DictionaryBlock; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.CallExpression; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.spi.type.MapType; import com.facebook.presto.sql.gen.ExpressionCompiler; import com.facebook.presto.sql.gen.PageFunctionCompiler; -import com.facebook.presto.sql.relational.CallExpression; -import com.facebook.presto.sql.relational.RowExpression; import com.google.common.collect.ImmutableList; import io.airlift.slice.Slice; import org.openjdk.jmh.annotations.Benchmark; @@ -135,7 +135,7 @@ public void setup() Block rightValueBlock = createValueBlock(POSITIONS, rightKeys.size()); Block rightBlock = createMapBlock(mapType, POSITIONS, rightKeyBlock, rightValueBlock); - ImmutableList.Builder projectionsBuilder = ImmutableList.builder(); + ImmutableList.Builder projectionsBuilder = ImmutableList.builder(); Signature signature = new Signature( name, @@ -148,7 +148,7 @@ public void setup() mapType, ImmutableList.of(field(0, mapType), field(1, mapType)))); - ImmutableList projections = projectionsBuilder.build(); + ImmutableList projections = projectionsBuilder.build(); pageProcessor = compiler.compilePageProcessor(Optional.empty(), projections).get(); page = new Page(leftBlock, rightBlock); } diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkMapSubscript.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkMapSubscript.java index ac299b6a691bc..a530e78a3f951 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkMapSubscript.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkMapSubscript.java @@ -13,21 +13,21 @@ */ package com.facebook.presto.operator.scalar; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.DriverYieldSignal; import com.facebook.presto.operator.project.PageProcessor; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; import com.facebook.presto.spi.block.DictionaryBlock; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.CallExpression; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.spi.type.MapType; import com.facebook.presto.spi.type.Type; import com.facebook.presto.sql.gen.ExpressionCompiler; import com.facebook.presto.sql.gen.PageFunctionCompiler; -import com.facebook.presto.sql.relational.CallExpression; -import com.facebook.presto.sql.relational.RowExpression; import com.google.common.collect.ImmutableList; import io.airlift.slice.Slice; import org.openjdk.jmh.annotations.Benchmark; @@ -144,7 +144,7 @@ public void setup() Block keyBlock = createKeyBlock(POSITIONS, keys); Block block = createMapBlock(mapType, POSITIONS, keyBlock, valueBlock); - ImmutableList.Builder projectionsBuilder = ImmutableList.builder(); + ImmutableList.Builder projectionsBuilder = ImmutableList.builder(); Signature signature = new Signature( "$operator$" + SUBSCRIPT.name(), @@ -159,7 +159,7 @@ public void setup() ImmutableList.of(field(0, mapType), constant(utf8Slice(keys.get(i)), createUnboundedVarcharType())))); } - ImmutableList projections = projectionsBuilder.build(); + ImmutableList projections = projectionsBuilder.build(); pageProcessor = compiler.compilePageProcessor(Optional.empty(), projections).get(); page = new Page(block); } diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkMapToMapCast.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkMapToMapCast.java index e541f389a1113..819f8338fdbf1 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkMapToMapCast.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkMapToMapCast.java @@ -13,19 +13,19 @@ */ package com.facebook.presto.operator.scalar; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.DriverYieldSignal; import com.facebook.presto.operator.project.PageProcessor; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.CallExpression; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.spi.type.MapType; import com.facebook.presto.sql.gen.ExpressionCompiler; import com.facebook.presto.sql.gen.PageFunctionCompiler; -import com.facebook.presto.sql.relational.CallExpression; -import com.facebook.presto.sql.relational.RowExpression; import com.google.common.collect.ImmutableList; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; @@ -93,7 +93,7 @@ public void setup() { Signature signature = new Signature("$operator$CAST", FunctionKind.SCALAR, mapType(BIGINT, DOUBLE).getTypeSignature(), mapType(DOUBLE, BIGINT).getTypeSignature()); - List projections = ImmutableList.of( + List projections = ImmutableList.of( new CallExpression(signature, mapType(BIGINT, DOUBLE), ImmutableList.of(field(0, mapType(DOUBLE, BIGINT))))); MetadataManager metadata = MetadataManager.createTestMetadataManager(); diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkRowToRowCast.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkRowToRowCast.java index bb261dfe641de..527a39cc487a8 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkRowToRowCast.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkRowToRowCast.java @@ -14,19 +14,19 @@ package com.facebook.presto.operator.scalar; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.DriverYieldSignal; import com.facebook.presto.operator.project.PageProcessor; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.CallExpression; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.spi.type.RowType; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.VarcharType; import com.facebook.presto.sql.gen.ExpressionCompiler; import com.facebook.presto.sql.gen.PageFunctionCompiler; -import com.facebook.presto.sql.relational.CallExpression; -import com.facebook.presto.sql.relational.RowExpression; import com.google.common.collect.ImmutableList; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; @@ -48,8 +48,8 @@ import java.util.concurrent.ThreadLocalRandom; import static com.facebook.presto.memory.context.AggregatedMemoryContext.newSimpleAggregatedMemoryContext; -import static com.facebook.presto.metadata.FunctionKind.SCALAR; import static com.facebook.presto.spi.block.RowBlock.fromFieldBlocks; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.VarcharType.createVarcharType; import static com.facebook.presto.sql.relational.Expressions.field; @@ -93,7 +93,7 @@ public void setup() { Signature signature = new Signature("$operator$CAST", SCALAR, RowType.anonymous(fromFieldTypes).getTypeSignature(), RowType.anonymous(toFieldTypes).getTypeSignature()); - List projections = ImmutableList.of( + List projections = ImmutableList.of( new CallExpression(signature, RowType.anonymous(fromFieldTypes), ImmutableList.of(field(0, RowType.anonymous(toFieldTypes))))); MetadataManager metadata = MetadataManager.createTestMetadataManager(); diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkTransformKey.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkTransformKey.java index a816dcc229291..8ce293109f33f 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkTransformKey.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkTransformKey.java @@ -14,21 +14,21 @@ package com.facebook.presto.operator.scalar; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.DriverYieldSignal; import com.facebook.presto.operator.project.PageProcessor; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.ColumnExpression; +import com.facebook.presto.spi.relation.column.LambdaDefinitionExpression; +import com.facebook.presto.spi.relation.column.VariableReferenceExpression; import com.facebook.presto.spi.type.MapType; import com.facebook.presto.spi.type.Type; import com.facebook.presto.sql.gen.ExpressionCompiler; import com.facebook.presto.sql.gen.PageFunctionCompiler; -import com.facebook.presto.sql.relational.LambdaDefinitionExpression; -import com.facebook.presto.sql.relational.RowExpression; -import com.facebook.presto.sql.relational.VariableReferenceExpression; import com.google.common.collect.ImmutableList; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; @@ -106,7 +106,7 @@ public void setup() { MetadataManager metadata = MetadataManager.createTestMetadataManager(); ExpressionCompiler compiler = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)); - ImmutableList.Builder projectionsBuilder = ImmutableList.builder(); + ImmutableList.Builder projectionsBuilder = ImmutableList.builder(); Type elementType; Object increment; switch (type) { @@ -139,7 +139,7 @@ public void setup() constant(increment, elementType))))))); Block block = createChannel(POSITIONS, mapType, elementType); - ImmutableList projections = projectionsBuilder.build(); + ImmutableList projections = projectionsBuilder.build(); pageProcessor = compiler.compilePageProcessor(Optional.empty(), projections).get(); page = new Page(block); } diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkTransformValue.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkTransformValue.java index d32cd50932662..6ccb7d512ed57 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkTransformValue.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkTransformValue.java @@ -14,21 +14,21 @@ package com.facebook.presto.operator.scalar; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.DriverYieldSignal; import com.facebook.presto.operator.project.PageProcessor; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.ColumnExpression; +import com.facebook.presto.spi.relation.column.LambdaDefinitionExpression; +import com.facebook.presto.spi.relation.column.VariableReferenceExpression; import com.facebook.presto.spi.type.MapType; import com.facebook.presto.spi.type.Type; import com.facebook.presto.sql.gen.ExpressionCompiler; import com.facebook.presto.sql.gen.PageFunctionCompiler; -import com.facebook.presto.sql.relational.LambdaDefinitionExpression; -import com.facebook.presto.sql.relational.RowExpression; -import com.facebook.presto.sql.relational.VariableReferenceExpression; import com.google.common.collect.ImmutableList; import io.airlift.slice.Slices; import org.openjdk.jmh.annotations.Benchmark; @@ -109,7 +109,7 @@ public void setup() { MetadataManager metadata = MetadataManager.createTestMetadataManager(); ExpressionCompiler compiler = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)); - ImmutableList.Builder projectionsBuilder = ImmutableList.builder(); + ImmutableList.Builder projectionsBuilder = ImmutableList.builder(); Type elementType; Object compareValue; switch (type) { @@ -152,7 +152,7 @@ public void setup() constant(compareValue, elementType))))))); Block block = createChannel(POSITIONS, mapType, elementType); - ImmutableList projections = projectionsBuilder.build(); + ImmutableList projections = projectionsBuilder.build(); pageProcessor = compiler.compilePageProcessor(Optional.empty(), projections).get(); page = new Page(block); } diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/FunctionAssertions.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/FunctionAssertions.java index c0bcb22eae100..a030bb23fe29c 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/FunctionAssertions.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/FunctionAssertions.java @@ -48,6 +48,7 @@ import com.facebook.presto.spi.RecordSet; import com.facebook.presto.spi.StandardErrorCode; import com.facebook.presto.spi.block.Block; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.spi.type.TimeZoneKey; import com.facebook.presto.spi.type.Type; import com.facebook.presto.split.PageSourceProvider; @@ -61,7 +62,6 @@ import com.facebook.presto.sql.planner.SymbolToInputRewriter; import com.facebook.presto.sql.planner.TypeProvider; import com.facebook.presto.sql.planner.plan.PlanNodeId; -import com.facebook.presto.sql.relational.RowExpression; import com.facebook.presto.sql.tree.Cast; import com.facebook.presto.sql.tree.DefaultTraversalVisitor; import com.facebook.presto.sql.tree.DereferenceExpression; @@ -110,10 +110,10 @@ import static com.facebook.presto.block.BlockAssertions.createStringsBlock; import static com.facebook.presto.block.BlockAssertions.createTimestampsWithTimezoneBlock; import static com.facebook.presto.memory.context.AggregatedMemoryContext.newSimpleAggregatedMemoryContext; -import static com.facebook.presto.metadata.FunctionKind.SCALAR; import static com.facebook.presto.spi.StandardErrorCode.INVALID_CAST_ARGUMENT; import static com.facebook.presto.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT; import static com.facebook.presto.spi.StandardErrorCode.NUMERIC_VALUE_OUT_OF_RANGE; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.BooleanType.BOOLEAN; import static com.facebook.presto.spi.type.DateTimeEncoding.packDateTimeWithZone; @@ -128,7 +128,7 @@ import static com.facebook.presto.sql.analyzer.ExpressionAnalyzer.getExpressionTypesFromInput; import static com.facebook.presto.sql.planner.iterative.rule.CanonicalizeExpressionRewriter.canonicalizeExpression; import static com.facebook.presto.sql.relational.Expressions.constant; -import static com.facebook.presto.sql.relational.SqlToRowExpressionTranslator.translate; +import static com.facebook.presto.sql.relational.SqlToColumnExpressionTranslator.translate; import static com.facebook.presto.sql.tree.BooleanLiteral.TRUE_LITERAL; import static com.facebook.presto.testing.TestingTaskContext.createTaskContext; import static com.facebook.presto.type.UnknownType.UNKNOWN; @@ -464,8 +464,8 @@ public void assertCachedInstanceHasBoundedRetainedSize(String projection) requireNonNull(projection, "projection is null"); Expression projectionExpression = createExpression(session, projection, metadata, SYMBOL_TYPES); - RowExpression projectionRowExpression = toRowExpression(session, projectionExpression); - PageProcessor processor = compiler.compilePageProcessor(Optional.empty(), ImmutableList.of(projectionRowExpression)).get(); + ColumnExpression projectionColumnExpression = toColumnExpression(session, projectionExpression); + PageProcessor processor = compiler.compilePageProcessor(Optional.empty(), ImmutableList.of(projectionColumnExpression)).get(); // This is a heuristic to detect whether the retained size of cachedInstance is bounded. // * The test runs at least 1000 iterations. @@ -579,7 +579,7 @@ private List executeProjectionWithAll(String projection, Type expectedTy requireNonNull(projection, "projection is null"); Expression projectionExpression = createExpression(session, projection, metadata, SYMBOL_TYPES); - RowExpression projectionRowExpression = toRowExpression(session, projectionExpression); + ColumnExpression projectionColumnExpression = toColumnExpression(session, projectionExpression); List results = new ArrayList<>(); @@ -594,7 +594,7 @@ private List executeProjectionWithAll(String projection, Type expectedTy } // execute as standalone operator - OperatorFactory operatorFactory = compileFilterProject(Optional.empty(), projectionRowExpression, compiler); + OperatorFactory operatorFactory = compileFilterProject(Optional.empty(), projectionColumnExpression, compiler); Object directOperatorValue = selectSingleValue(operatorFactory, expectedType, session); results.add(directOperatorValue); @@ -604,7 +604,7 @@ private List executeProjectionWithAll(String projection, Type expectedTy results.add(interpretedValue); // execute over normal operator - SourceOperatorFactory scanProjectOperatorFactory = compileScanFilterProject(Optional.empty(), projectionRowExpression, compiler); + SourceOperatorFactory scanProjectOperatorFactory = compileScanFilterProject(Optional.empty(), projectionColumnExpression, compiler); Object scanOperatorValue = selectSingleValue(scanProjectOperatorFactory, expectedType, createNormalSplit(), session); results.add(scanOperatorValue); @@ -624,11 +624,11 @@ private List executeProjectionWithAll(String projection, Type expectedTy } // validate type at end since some tests expect failure and for those UNKNOWN is used instead of actual type - assertEquals(projectionRowExpression.getType(), expectedType); + assertEquals(projectionColumnExpression.getType(), expectedType); return results; } - private RowExpression toRowExpression(Session session, Expression projectionExpression) + private ColumnExpression toColumnExpression(Session session, Expression projectionExpression) { Expression translatedProjection = new SymbolToInputRewriter(INPUT_MAPPING).rewrite(projectionExpression); Map, Type> expressionTypes = getExpressionTypesFromInput( @@ -639,7 +639,7 @@ private RowExpression toRowExpression(Session session, Expression projectionExpr ImmutableList.of(translatedProjection), ImmutableList.of(), WarningCollector.NOOP); - return toRowExpression(translatedProjection, expressionTypes); + return toColumnExpression(translatedProjection, expressionTypes); } private Object selectSingleValue(OperatorFactory operatorFactory, Type type, Session session) @@ -691,17 +691,17 @@ private List executeFilterWithAll(String filter, Session session, boole requireNonNull(filter, "filter is null"); Expression filterExpression = createExpression(session, filter, metadata, SYMBOL_TYPES); - RowExpression filterRowExpression = toRowExpression(session, filterExpression); + ColumnExpression filterColumnExpression = toColumnExpression(session, filterExpression); List results = new ArrayList<>(); // execute as standalone operator - OperatorFactory operatorFactory = compileFilterProject(Optional.of(filterRowExpression), constant(true, BOOLEAN), compiler); + OperatorFactory operatorFactory = compileFilterProject(Optional.of(filterColumnExpression), constant(true, BOOLEAN), compiler); results.add(executeFilter(operatorFactory, session)); if (executeWithNoInputColumns) { // execute as standalone operator - operatorFactory = compileFilterWithNoInputColumns(filterRowExpression, compiler); + operatorFactory = compileFilterWithNoInputColumns(filterColumnExpression, compiler); results.add(executeFilterWithNoInputColumns(operatorFactory, session)); } @@ -710,7 +710,7 @@ private List executeFilterWithAll(String filter, Session session, boole results.add(interpretedValue); // execute over normal operator - SourceOperatorFactory scanProjectOperatorFactory = compileScanFilterProject(Optional.of(filterRowExpression), constant(true, BOOLEAN), compiler); + SourceOperatorFactory scanProjectOperatorFactory = compileScanFilterProject(Optional.of(filterColumnExpression), constant(true, BOOLEAN), compiler); boolean scanOperatorValue = executeFilter(scanProjectOperatorFactory, createNormalSplit(), session); results.add(scanOperatorValue); @@ -894,7 +894,7 @@ private Operator interpretedFilterProject(Optional filter, Expressio return operatorFactory.createOperator(createDriverContext(session)); } - private static OperatorFactory compileFilterWithNoInputColumns(RowExpression filter, ExpressionCompiler compiler) + private static OperatorFactory compileFilterWithNoInputColumns(ColumnExpression filter, ExpressionCompiler compiler) { try { Supplier processor = compiler.compilePageProcessor(Optional.of(filter), ImmutableList.of()); @@ -909,7 +909,7 @@ private static OperatorFactory compileFilterWithNoInputColumns(RowExpression fil } } - private static OperatorFactory compileFilterProject(Optional filter, RowExpression projection, ExpressionCompiler compiler) + private static OperatorFactory compileFilterProject(Optional filter, ColumnExpression projection, ExpressionCompiler compiler) { try { Supplier processor = compiler.compilePageProcessor(filter, ImmutableList.of(projection)); @@ -923,7 +923,7 @@ private static OperatorFactory compileFilterProject(Optional filt } } - private static SourceOperatorFactory compileScanFilterProject(Optional filter, RowExpression projection, ExpressionCompiler compiler) + private static SourceOperatorFactory compileScanFilterProject(Optional filter, ColumnExpression projection, ExpressionCompiler compiler) { try { Supplier cursorProcessor = compiler.compileCursorProcessor( @@ -955,7 +955,7 @@ private static SourceOperatorFactory compileScanFilterProject(Optional, Type> expressionTypes) + private ColumnExpression toColumnExpression(Expression projection, Map, Type> expressionTypes) { return translate(projection, SCALAR, expressionTypes, metadata.getFunctionRegistry(), metadata.getTypeManager(), session, false); } diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/TestPageProcessorCompiler.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/TestPageProcessorCompiler.java index 764950738e5ee..6d78b7b045a26 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/TestPageProcessorCompiler.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/TestPageProcessorCompiler.java @@ -14,20 +14,20 @@ package com.facebook.presto.operator.scalar; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.DriverYieldSignal; import com.facebook.presto.operator.project.PageProcessor; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.block.DictionaryBlock; import com.facebook.presto.spi.block.RunLengthEncodedBlock; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.CallExpression; +import com.facebook.presto.spi.relation.column.ColumnExpression; +import com.facebook.presto.spi.relation.column.InputReferenceExpression; import com.facebook.presto.spi.type.ArrayType; import com.facebook.presto.spi.type.StandardTypes; import com.facebook.presto.sql.gen.ExpressionCompiler; import com.facebook.presto.sql.gen.PageFunctionCompiler; -import com.facebook.presto.sql.relational.CallExpression; import com.facebook.presto.sql.relational.DeterminismEvaluator; -import com.facebook.presto.sql.relational.InputReferenceExpression; -import com.facebook.presto.sql.relational.RowExpression; import com.google.common.collect.ImmutableList; import io.airlift.slice.DynamicSliceOutput; import io.airlift.slice.Slice; @@ -42,10 +42,10 @@ import static com.facebook.presto.block.BlockAssertions.createRLEBlock; import static com.facebook.presto.block.BlockAssertions.createSlicesBlock; import static com.facebook.presto.memory.context.AggregatedMemoryContext.newSimpleAggregatedMemoryContext; -import static com.facebook.presto.metadata.FunctionKind.SCALAR; +import static com.facebook.presto.metadata.InternalFunction.internalOperator; import static com.facebook.presto.metadata.MetadataManager.createTestMetadataManager; -import static com.facebook.presto.metadata.Signature.internalOperator; import static com.facebook.presto.operator.project.PageProcessor.MAX_BATCH_SIZE; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.facebook.presto.spi.function.OperatorType.LESS_THAN; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.BooleanType.BOOLEAN; @@ -81,12 +81,12 @@ public void tearDown() @Test public void testNoCaching() { - ImmutableList.Builder projectionsBuilder = ImmutableList.builder(); + ImmutableList.Builder projectionsBuilder = ImmutableList.builder(); ArrayType arrayType = new ArrayType(VARCHAR); Signature signature = new Signature("concat", SCALAR, arrayType.getTypeSignature(), arrayType.getTypeSignature(), arrayType.getTypeSignature()); projectionsBuilder.add(new CallExpression(signature, arrayType, ImmutableList.of(field(0, arrayType), field(1, arrayType)))); - ImmutableList projections = projectionsBuilder.build(); + ImmutableList projections = projectionsBuilder.build(); PageProcessor pageProcessor = compiler.compilePageProcessor(Optional.empty(), projections).get(); PageProcessor pageProcessor2 = compiler.compilePageProcessor(Optional.empty(), projections).get(); assertTrue(pageProcessor != pageProcessor2); diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/TestProvidedBlockBuilderReturnPlaceConvention.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/TestProvidedBlockBuilderReturnPlaceConvention.java index 5e601ba961e0f..2c1e29f74e5f2 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/TestProvidedBlockBuilderReturnPlaceConvention.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/TestProvidedBlockBuilderReturnPlaceConvention.java @@ -14,14 +14,14 @@ package com.facebook.presto.operator.scalar; import com.facebook.presto.metadata.BoundVariables; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ReturnPlaceConvention; import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ScalarImplementationChoice; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.ArrayType; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeManager; @@ -35,13 +35,13 @@ import java.util.Optional; import java.util.concurrent.atomic.AtomicLong; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.USE_BOXED_TYPE; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ReturnPlaceConvention.PROVIDED_BLOCKBUILDER; import static com.facebook.presto.operator.scalar.TestProvidedBlockBuilderReturnPlaceConvention.FunctionWithProvidedBlockReturnPlaceConvention1.PROVIDED_BLOCKBUILDER_CONVENTION1; import static com.facebook.presto.operator.scalar.TestProvidedBlockBuilderReturnPlaceConvention.FunctionWithProvidedBlockReturnPlaceConvention2.PROVIDED_BLOCKBUILDER_CONVENTION2; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.BooleanType.BOOLEAN; import static com.facebook.presto.spi.type.DoubleType.DOUBLE; import static com.facebook.presto.spi.type.IntegerType.INTEGER; diff --git a/presto-main/src/test/java/com/facebook/presto/sql/TestColumnExpressionToSqlTranslator.java b/presto-main/src/test/java/com/facebook/presto/sql/TestColumnExpressionToSqlTranslator.java new file mode 100644 index 0000000000000..8ee1d3f2f77e5 --- /dev/null +++ b/presto-main/src/test/java/com/facebook/presto/sql/TestColumnExpressionToSqlTranslator.java @@ -0,0 +1,249 @@ +/* + * 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 com.facebook.presto.sql; + +import com.facebook.presto.execution.warnings.WarningCollector; +import com.facebook.presto.metadata.Metadata; +import com.facebook.presto.metadata.MetadataManager; +import com.facebook.presto.spi.ColumnHandle; +import com.facebook.presto.spi.block.MethodHandleUtil; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.relation.column.ColumnExpression; +import com.facebook.presto.spi.type.ArrayType; +import com.facebook.presto.spi.type.MapType; +import com.facebook.presto.spi.type.RowType; +import com.facebook.presto.spi.type.TestMapType; +import com.facebook.presto.spi.type.Type; +import com.facebook.presto.sql.analyzer.ExpressionAnalyzer; +import com.facebook.presto.sql.analyzer.Scope; +import com.facebook.presto.sql.parser.ParsingOptions; +import com.facebook.presto.sql.parser.SqlParser; +import com.facebook.presto.sql.planner.LiteralEncoder; +import com.facebook.presto.sql.planner.Symbol; +import com.facebook.presto.sql.planner.TypeProvider; +import com.facebook.presto.sql.planner.optimizations.ExpressionEquivalence; +import com.facebook.presto.sql.relational.SqlToColumnExpressionTranslator; +import com.facebook.presto.sql.tree.Expression; +import com.facebook.presto.sql.tree.NodeRef; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import org.intellij.lang.annotations.Language; +import org.testng.annotations.Test; + +import java.util.Map; +import java.util.Optional; + +import static com.facebook.presto.SessionTestUtils.TEST_SESSION; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; +import static com.facebook.presto.spi.type.BigintType.BIGINT; +import static com.facebook.presto.spi.type.IntegerType.INTEGER; +import static com.facebook.presto.spi.type.VarcharType.VARCHAR; +import static com.facebook.presto.spi.type.VarcharType.createVarcharType; +import static com.facebook.presto.sql.relational.ColumnExpressionToSqlTranslator.translate; +import static java.util.Collections.emptyList; +import static java.util.stream.Collectors.toMap; +import static org.testng.Assert.assertTrue; + +public class TestColumnExpressionToSqlTranslator +{ + private final Metadata metadata = MetadataManager.createTestMetadataManager(); + private final LiteralEncoder literalEncoder = new LiteralEncoder(metadata.getBlockEncodingSerde()); + + private static final SqlParser SQL_PARSER = new SqlParser(); + private static final MetadataManager METADATA = MetadataManager.createTestMetadataManager(); + private static final ExpressionEquivalence EQUIVALENCE = new ExpressionEquivalence(METADATA, SQL_PARSER); + private static final RowType ROW_TYPE = RowType.from(ImmutableList.of(new RowType.Field(Optional.of("x"), INTEGER))); + private static final MapType MAP_TYPE = new MapType( + createVarcharType(42), + BIGINT, + MethodHandleUtil.methodHandle(TestMapType.class, "throwUnsupportedOperation"), + MethodHandleUtil.methodHandle(TestMapType.class, "throwUnsupportedOperation"), + MethodHandleUtil.methodHandle(TestMapType.class, "throwUnsupportedOperation"), + MethodHandleUtil.methodHandle(TestMapType.class, "throwUnsupportedOperation")); + private static final Map COLUMNS = new ImmutableMap.Builder() + .put("c1", new TestColumnHandle("c1", BIGINT)) + .put("c2", new TestColumnHandle("c2", BIGINT)) + .put("c3", new TestColumnHandle("c3", VARCHAR)) + .put("c4", new TestColumnHandle("c4", ROW_TYPE)) + .put("c5", new TestColumnHandle("c5", new ArrayType(INTEGER))) + .put("c6", new TestColumnHandle("c6", MAP_TYPE)) + .build(); + private static final Map TYPES = COLUMNS.values() + .stream() + .map(TestColumnHandle.class::cast) + .collect(toMap(column -> new Symbol(column.getColumnName()), column -> column.getType())); + private static final Map columnReverse = COLUMNS.entrySet() + .stream() + .collect(toMap(Map.Entry::getValue, Map.Entry::getKey)); + + @Test + public void testConstantExpressionRoundTrip() + { + assertExpressionConversion("NULL"); + assertExpressionConversion("TRUE"); + assertExpressionConversion("FALSE"); + assertExpressionConversion("1"); + assertExpressionConversion("1.1"); + assertExpressionConversion("DECIMAL '10.3'"); + assertExpressionConversion("BIGINT '1'"); + assertExpressionConversion("'string'"); + assertExpressionConversion("DATE '2001-01-02'"); + assertExpressionConversion("ARRAY [1, 2, 3]"); + assertExpressionConversion("MAP(ARRAY [1, 2, 3], ARRAY ['a', 'b', 'c'])"); + assertExpressionConversion("ROW(1, 2)"); + assertExpressionConversion("TIMESTAMP '2001-08-22 03:04:05.321'"); + assertExpressionConversion("x'01 0f'"); + // TODO following evaluates to magical literal thus cannot compare +// assertExpressionConversion("TIMESTAMP '2001-08-22 03:04:05.321 America/Los_Angeles'"); +// assertExpressionConversion("INTERVAL '2' DAY"); + } + + @Test + public void testCast() + { + assertExpressionConversion("CAST(ROW(1, 2) AS ROW(x BIGINT, y INTEGER))"); + assertExpressionConversion("CAST(NULL AS VARCHAR)"); + assertExpressionConversion("CAST('TRUE' AS BOOLEAN)"); + assertExpressionConversion("CAST('1' AS BIGINT)"); + assertExpressionConversion("CAST('1' AS INTEGER)"); + assertExpressionConversion("CAST('1' AS SMALLINT)"); +// assertExpressionConversion("cast(TIME '03:04:05.321' as varchar)"); +// assertExpressionConversion("cast(TIMESTAMP '2017-06-06 10:00:00.000 Asia/Kathmandu' as time with time zone)"); + assertExpressionConversion("CAST(infinity() AS JSON)"); + } + + @Test + public void testSimpleExpressionRoundTrip() + { + assertExpressionConversion("c1 + c2"); + assertExpressionConversion("c1 + BIGINT '1'"); + assertExpressionConversion("c1 - c2"); + assertExpressionConversion("c1 - BIGINT '1'"); + assertExpressionConversion("c1 * c2"); + assertExpressionConversion("c1 * BIGINT '1'"); + assertExpressionConversion("c1 / c2"); + assertExpressionConversion("c1 / BIGINT '1'"); + assertExpressionConversion("c1 % c2"); + assertExpressionConversion("c1 % BIGINT '1'"); + + assertExpressionConversion("c1 < c2"); + assertExpressionConversion("c1 <= c2"); + assertExpressionConversion("c1 > c2"); + assertExpressionConversion("c1 >= c2"); + assertExpressionConversion("c1 = c2"); + assertExpressionConversion("c1 <> c2"); + assertExpressionConversion("NOT c1 > 1"); + assertExpressionConversion("TRUE AND TRUE AND FALSE"); + assertExpressionConversion("TRUE OR TRUE OR FALSE"); + assertExpressionConversion("c1 IN (1, 2, 3)"); + + assertExpressionConversion("IF(c1 > 0, 1)"); + assertExpressionConversion("c4 IS NULL"); + assertExpressionConversion("c4 IS NOT NULL"); + assertExpressionConversion("COALESCE(CAST(NULL AS INTEGER), 1, 2)"); + assertExpressionConversion("c3 LIKE '%c3%'"); + assertExpressionConversion("'abc' LIKE 'a\\_c' ESCAPE '\\'"); + + assertExpressionConversion("TRY_CAST(c1 AS VARCHAR)"); + assertExpressionConversion("TRY(c1 + 1)"); + assertExpressionConversion("TRY(CAST(c1 AS VARCHAR))"); + assertExpressionConversion("typeof(c1)"); + + assertExpressionConversion("TRANSFORM(ARRAY [1, 2, 3], x -> x + 1)"); + assertExpressionConversion("REDUCE(ARRAY [5, 20, 50], 0, (s, x) -> s + x, s -> s)"); + + assertExpressionConversion("c4.x"); + assertExpressionConversion("c5[1]"); + assertExpressionConversion("c6['a']"); + } + + @Test + public void testComplexExpressionRoundTrip() + { + assertExpressionConversion("c1 > BIGINT '100' AND (c1 + c2) > BIGINT '100' AND hamming_distance(c3, 'test_str') > BIGINT '10' " + + "AND cardinality(filter(ARRAY[5, -6, CAST(NULL AS INTEGER), 7], x -> x > 0)) > BIGINT '0'"); + } + + private static Expression expression(String sql) + { + return ExpressionUtils.rewriteIdentifiersToSymbolReferences(new SqlParser().createExpression(sql, new ParsingOptions(ParsingOptions.DecimalLiteralTreatment.AS_DOUBLE))); + } + + private void assertExpressionConversion(@Language("SQL") String sql) + { + // must explicitly cast the type since we won't add coercing here. + // we don't want simplify or optimization to mess up the equivalence comparison. + Expression expression = expression(sql); + + ColumnExpression columnExpression = translateAndOptimize(expression, SCALAR, TYPES, COLUMNS); + Optional resultExpression = translate(columnExpression, ImmutableList.of(), columnReverse, literalEncoder, metadata.getFunctionRegistry()); + assertTrue(resultExpression.isPresent()); + assertEquivalent(expression, resultExpression.get(), TYPES); + } + + private ColumnExpression translateAndOptimize(Expression expression, FunctionKind kind, Map symbolTypeMap, Map columns) + { + return SqlToColumnExpressionTranslator.translate(expression, kind, getExpressionTypes(expression, symbolTypeMap), columns, metadata.getFunctionRegistry(), metadata.getTypeManager(), TEST_SESSION, false); + } + + private Map, Type> getExpressionTypes(Expression expression, Map symbolTypes) + { + ExpressionAnalyzer expressionAnalyzer = ExpressionAnalyzer.createWithoutSubqueries( + metadata.getFunctionRegistry(), + metadata.getTypeManager(), + TEST_SESSION, + TypeProvider.copyOf(symbolTypes), + emptyList(), + node -> new IllegalStateException("Unexpected node: %s" + node), + WarningCollector.NOOP, + false); + expressionAnalyzer.analyze(expression, Scope.create()); + return expressionAnalyzer.getExpressionTypes(); + } + + private static void assertEquivalent(Expression leftExpression, Expression rightExpression, Map typeMap) + { + TypeProvider types = TypeProvider.copyOf(typeMap); + + assertTrue( + EQUIVALENCE.areExpressionsEquivalent(TEST_SESSION, leftExpression, rightExpression, types), + String.format("Expected (%s) and (%s) to be equivalent", leftExpression.toString(), rightExpression.toString())); + assertTrue( + EQUIVALENCE.areExpressionsEquivalent(TEST_SESSION, rightExpression, leftExpression, types), + String.format("Expected (%s) and (%s) to be equivalent", leftExpression.toString(), rightExpression.toString())); + } + + private static class TestColumnHandle + implements ColumnHandle + { + private final String columnName; + private final Type type; + + public TestColumnHandle(String columnName, Type type) + { + this.columnName = columnName; + this.type = type; + } + + public String getColumnName() + { + return columnName; + } + + public Type getType() + { + return type; + } + } +} diff --git a/presto-main/src/test/java/com/facebook/presto/sql/TestExpressionOptimizer.java b/presto-main/src/test/java/com/facebook/presto/sql/TestExpressionOptimizer.java index 8f897d9c9f5c7..8f39ce4f4ed71 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/TestExpressionOptimizer.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/TestExpressionOptimizer.java @@ -15,16 +15,16 @@ import com.facebook.presto.block.BlockEncodingManager; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.spi.block.IntArrayBlock; import com.facebook.presto.spi.function.OperatorType; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.CallExpression; +import com.facebook.presto.spi.relation.column.ColumnExpression; +import com.facebook.presto.spi.relation.column.ConstantExpression; import com.facebook.presto.spi.type.ArrayType; import com.facebook.presto.spi.type.RowType; import com.facebook.presto.spi.type.StandardTypes; import com.facebook.presto.sql.analyzer.FeaturesConfig; -import com.facebook.presto.sql.relational.CallExpression; -import com.facebook.presto.sql.relational.ConstantExpression; -import com.facebook.presto.sql.relational.RowExpression; import com.facebook.presto.sql.relational.optimizer.ExpressionOptimizer; import com.facebook.presto.type.TypeRegistry; import com.google.common.collect.ImmutableList; @@ -34,12 +34,12 @@ import static com.facebook.presto.SessionTestUtils.TEST_SESSION; import static com.facebook.presto.block.BlockAssertions.toValues; -import static com.facebook.presto.metadata.FunctionKind.SCALAR; -import static com.facebook.presto.metadata.Signature.internalOperator; -import static com.facebook.presto.metadata.Signature.internalScalarFunction; +import static com.facebook.presto.metadata.InternalFunction.internalOperator; +import static com.facebook.presto.metadata.InternalFunction.internalScalarFunction; import static com.facebook.presto.operator.scalar.JsonStringToArrayCast.JSON_STRING_TO_ARRAY_NAME; import static com.facebook.presto.operator.scalar.JsonStringToMapCast.JSON_STRING_TO_MAP_NAME; import static com.facebook.presto.operator.scalar.JsonStringToRowCast.JSON_STRING_TO_ROW_NAME; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.BooleanType.BOOLEAN; import static com.facebook.presto.spi.type.IntegerType.INTEGER; @@ -77,7 +77,7 @@ public void tearDown() @Test(timeOut = 10_000) public void testPossibleExponentialOptimizationTime() { - RowExpression expression = constant(1L, BIGINT); + ColumnExpression expression = constant(1L, BIGINT); for (int i = 0; i < 100; i++) { Signature signature = internalOperator(OperatorType.ADD.name(), parseTypeSignature(StandardTypes.BIGINT), parseTypeSignature(StandardTypes.BIGINT), parseTypeSignature(StandardTypes.BIGINT)); expression = new CallExpression(signature, BIGINT, ImmutableList.of(expression, constant(1L, BIGINT))); @@ -93,7 +93,7 @@ public void testIfConstantOptimization() assertEquals(optimizer.optimize(ifExpression(constant(null, BOOLEAN), 1L, 2L)), constant(2L, BIGINT)); Signature bigintEquals = internalOperator(OperatorType.EQUAL.name(), BOOLEAN.getTypeSignature(), BIGINT.getTypeSignature(), BIGINT.getTypeSignature()); - RowExpression condition = new CallExpression(bigintEquals, BOOLEAN, ImmutableList.of(constant(3L, BIGINT), constant(3L, BIGINT))); + ColumnExpression condition = new CallExpression(bigintEquals, BOOLEAN, ImmutableList.of(constant(3L, BIGINT), constant(3L, BIGINT))); assertEquals(optimizer.optimize(ifExpression(condition, 1L, 2L)), constant(1L, BIGINT)); } @@ -104,8 +104,8 @@ public void testCastWithJsonParseOptimization() // constant Signature jsonCastSignature = new Signature(CAST, SCALAR, parseTypeSignature("array(integer)"), ImmutableList.of(JSON.getTypeSignature())); - RowExpression jsonCastExpression = new CallExpression(jsonCastSignature, new ArrayType(INTEGER), ImmutableList.of(call(jsonParseSignature, JSON, constant(utf8Slice("[1, 2]"), VARCHAR)))); - RowExpression resultExpression = optimizer.optimize(jsonCastExpression); + ColumnExpression jsonCastExpression = new CallExpression(jsonCastSignature, new ArrayType(INTEGER), ImmutableList.of(call(jsonParseSignature, JSON, constant(utf8Slice("[1, 2]"), VARCHAR)))); + ColumnExpression resultExpression = optimizer.optimize(jsonCastExpression); assertInstanceOf(resultExpression, ConstantExpression.class); Object resultValue = ((ConstantExpression) resultExpression).getValue(); assertInstanceOf(resultValue, IntArrayBlock.class); @@ -136,7 +136,7 @@ public void testCastWithJsonParseOptimization() call(internalScalarFunction(JSON_STRING_TO_ROW_NAME, parseTypeSignature("row(varchar,bigint)"), parseTypeSignature(StandardTypes.VARCHAR)), RowType.anonymous(ImmutableList.of(VARCHAR, BIGINT)), field(1, VARCHAR))); } - private static RowExpression ifExpression(RowExpression condition, long trueValue, long falseValue) + private static ColumnExpression ifExpression(ColumnExpression condition, long trueValue, long falseValue) { Signature signature = new Signature("IF", SCALAR, BIGINT.getTypeSignature(), BOOLEAN.getTypeSignature(), BIGINT.getTypeSignature(), BIGINT.getTypeSignature()); return new CallExpression(signature, BIGINT, ImmutableList.of(condition, constant(trueValue, BIGINT), constant(falseValue, BIGINT))); diff --git a/presto-main/src/test/java/com/facebook/presto/sql/TestSqlToRowExpressionTranslator.java b/presto-main/src/test/java/com/facebook/presto/sql/TestSqlToColumnExpressionTranslator.java similarity index 90% rename from presto-main/src/test/java/com/facebook/presto/sql/TestSqlToRowExpressionTranslator.java rename to presto-main/src/test/java/com/facebook/presto/sql/TestSqlToColumnExpressionTranslator.java index 1f2bcdaa6ae4b..8aadb8c5a93a2 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/TestSqlToRowExpressionTranslator.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/TestSqlToColumnExpressionTranslator.java @@ -16,6 +16,7 @@ import com.facebook.presto.execution.warnings.WarningCollector; import com.facebook.presto.metadata.Metadata; import com.facebook.presto.metadata.MetadataManager; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.spi.type.Type; import com.facebook.presto.sql.analyzer.ExpressionAnalyzer; import com.facebook.presto.sql.analyzer.Scope; @@ -23,8 +24,7 @@ import com.facebook.presto.sql.planner.LiteralEncoder; import com.facebook.presto.sql.planner.NoOpSymbolResolver; import com.facebook.presto.sql.planner.TypeProvider; -import com.facebook.presto.sql.relational.RowExpression; -import com.facebook.presto.sql.relational.SqlToRowExpressionTranslator; +import com.facebook.presto.sql.relational.SqlToColumnExpressionTranslator; import com.facebook.presto.sql.tree.CoalesceExpression; import com.facebook.presto.sql.tree.Expression; import com.facebook.presto.sql.tree.LongLiteral; @@ -36,7 +36,7 @@ import java.util.Map; import static com.facebook.presto.SessionTestUtils.TEST_SESSION; -import static com.facebook.presto.metadata.FunctionKind.SCALAR; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.DecimalType.createDecimalType; import static com.facebook.presto.spi.type.Decimals.encodeScaledValue; @@ -45,7 +45,7 @@ import static com.facebook.presto.testing.assertions.Assert.assertEquals; import static java.util.Collections.emptyList; -public class TestSqlToRowExpressionTranslator +public class TestSqlToColumnExpressionTranslator { private final Metadata metadata = MetadataManager.createTestMetadataManager(); private final LiteralEncoder literalEncoder = new LiteralEncoder(metadata.getBlockEncodingSerde()); @@ -85,14 +85,14 @@ public void testOptimizeDecimalLiteral() constant(encodeScaledValue(new BigDecimal("123456789012345678901234567890.00")), createDecimalType(35, 2))); } - private RowExpression translateAndOptimize(Expression expression) + private ColumnExpression translateAndOptimize(Expression expression) { return translateAndOptimize(expression, getExpressionTypes(expression)); } - private RowExpression translateAndOptimize(Expression expression, Map, Type> types) + private ColumnExpression translateAndOptimize(Expression expression, Map, Type> types) { - return SqlToRowExpressionTranslator.translate(expression, SCALAR, types, metadata.getFunctionRegistry(), metadata.getTypeManager(), TEST_SESSION, true); + return SqlToColumnExpressionTranslator.translate(expression, SCALAR, types, metadata.getFunctionRegistry(), metadata.getTypeManager(), TEST_SESSION, true); } private Expression simplifyExpression(Expression expression) diff --git a/presto-main/src/test/java/com/facebook/presto/sql/gen/BenchmarkPageProcessor.java b/presto-main/src/test/java/com/facebook/presto/sql/gen/BenchmarkPageProcessor.java index 10a504df5d449..2aa2a244c2b38 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/gen/BenchmarkPageProcessor.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/gen/BenchmarkPageProcessor.java @@ -14,15 +14,15 @@ package com.facebook.presto.sql.gen; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.DriverYieldSignal; import com.facebook.presto.operator.project.PageProcessor; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.PageBuilder; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.function.OperatorType; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.spi.type.StandardTypes; -import com.facebook.presto.sql.relational.RowExpression; import com.google.common.collect.ImmutableList; import io.airlift.slice.Slice; import io.airlift.tpch.LineItem; @@ -47,8 +47,8 @@ import java.util.concurrent.TimeUnit; import static com.facebook.presto.memory.context.AggregatedMemoryContext.newSimpleAggregatedMemoryContext; -import static com.facebook.presto.metadata.FunctionKind.SCALAR; -import static com.facebook.presto.metadata.Signature.internalOperator; +import static com.facebook.presto.metadata.InternalFunction.internalOperator; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.facebook.presto.spi.type.BooleanType.BOOLEAN; import static com.facebook.presto.spi.type.DateType.DATE; import static com.facebook.presto.spi.type.DoubleType.DOUBLE; @@ -183,7 +183,7 @@ private static boolean filter(int position, Block discountBlock, Block shipDateB // and discount >= 0.05 // and discount <= 0.07 // and quantity < 24; - private static final RowExpression FILTER = call(new Signature("AND", SCALAR, parseTypeSignature(StandardTypes.BOOLEAN)), + private static final ColumnExpression FILTER = call(new Signature("AND", SCALAR, parseTypeSignature(StandardTypes.BOOLEAN)), BOOLEAN, call(internalOperator(OperatorType.GREATER_THAN_OR_EQUAL, BOOLEAN.getTypeSignature(), VARCHAR.getTypeSignature(), VARCHAR.getTypeSignature()), BOOLEAN, @@ -212,7 +212,7 @@ private static boolean filter(int position, Block discountBlock, Block shipDateB field(QUANTITY, DOUBLE), constant(24.0, DOUBLE)))))); - private static final RowExpression PROJECT = call( + private static final ColumnExpression PROJECT = call( internalOperator(OperatorType.MULTIPLY, DOUBLE.getTypeSignature(), DOUBLE.getTypeSignature(), DOUBLE.getTypeSignature()), DOUBLE, field(EXTENDED_PRICE, DOUBLE), diff --git a/presto-main/src/test/java/com/facebook/presto/sql/gen/InCodeGeneratorBenchmark.java b/presto-main/src/test/java/com/facebook/presto/sql/gen/InCodeGeneratorBenchmark.java index 6345193d1c022..b1b4c57e0d0c6 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/gen/InCodeGeneratorBenchmark.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/gen/InCodeGeneratorBenchmark.java @@ -14,14 +14,14 @@ package com.facebook.presto.sql.gen; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.DriverYieldSignal; import com.facebook.presto.operator.project.PageProcessor; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.PageBuilder; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.spi.type.StandardTypes; import com.facebook.presto.spi.type.Type; -import com.facebook.presto.sql.relational.RowExpression; import com.google.common.collect.ImmutableList; import io.airlift.slice.Slices; import org.openjdk.jmh.annotations.Benchmark; @@ -46,7 +46,7 @@ import java.util.concurrent.TimeUnit; import static com.facebook.presto.memory.context.AggregatedMemoryContext.newSimpleAggregatedMemoryContext; -import static com.facebook.presto.metadata.FunctionKind.SCALAR; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.BooleanType.BOOLEAN; import static com.facebook.presto.spi.type.DoubleType.DOUBLE; @@ -82,7 +82,7 @@ public class InCodeGeneratorBenchmark public void setup() { Random random = new Random(); - RowExpression[] arguments = new RowExpression[1 + inListCount]; + ColumnExpression[] arguments = new ColumnExpression[1 + inListCount]; switch (type) { case StandardTypes.BIGINT: prestoType = BIGINT; @@ -107,7 +107,7 @@ public void setup() } arguments[0] = field(0, prestoType); - RowExpression project = field(0, prestoType); + ColumnExpression project = field(0, prestoType); PageBuilder pageBuilder = new PageBuilder(ImmutableList.of(prestoType)); for (int i = 0; i < 10_000; i++) { @@ -127,7 +127,7 @@ public void setup() } inputPage = pageBuilder.build(); - RowExpression filter = call( + ColumnExpression filter = call( new Signature(IN, SCALAR, parseTypeSignature(StandardTypes.BOOLEAN)), BOOLEAN, arguments); diff --git a/presto-main/src/test/java/com/facebook/presto/sql/gen/PageProcessorBenchmark.java b/presto-main/src/test/java/com/facebook/presto/sql/gen/PageProcessorBenchmark.java index fd1843c982c5a..ef4091b818f1c 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/gen/PageProcessorBenchmark.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/gen/PageProcessorBenchmark.java @@ -25,13 +25,13 @@ import com.facebook.presto.spi.Page; import com.facebook.presto.spi.PageBuilder; import com.facebook.presto.spi.RecordSet; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.spi.type.Type; import com.facebook.presto.sql.parser.SqlParser; import com.facebook.presto.sql.planner.Symbol; import com.facebook.presto.sql.planner.SymbolToInputRewriter; import com.facebook.presto.sql.planner.TypeProvider; -import com.facebook.presto.sql.relational.RowExpression; -import com.facebook.presto.sql.relational.SqlToRowExpressionTranslator; +import com.facebook.presto.sql.relational.SqlToColumnExpressionTranslator; import com.facebook.presto.sql.tree.Expression; import com.facebook.presto.sql.tree.NodeRef; import com.facebook.presto.testing.TestingSession; @@ -61,9 +61,9 @@ import java.util.concurrent.TimeUnit; import static com.facebook.presto.memory.context.AggregatedMemoryContext.newSimpleAggregatedMemoryContext; -import static com.facebook.presto.metadata.FunctionKind.SCALAR; import static com.facebook.presto.metadata.MetadataManager.createTestMetadataManager; import static com.facebook.presto.operator.scalar.FunctionAssertions.createExpression; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.VarcharType.VARCHAR; import static com.facebook.presto.sql.analyzer.ExpressionAnalyzer.getExpressionTypesFromInput; @@ -116,8 +116,8 @@ public void setup() sourceLayout.put(symbol, i); } - List projections = getProjections(type); - types = projections.stream().map(RowExpression::getType).collect(toList()); + List projections = getProjections(type); + types = projections.stream().map(ColumnExpression::getType).collect(toList()); MetadataManager metadata = createTestMetadataManager(); PageFunctionCompiler pageFunctionCompiler = new PageFunctionCompiler(metadata, 0); @@ -148,36 +148,36 @@ public List> columnOriented() inputPage)); } - private RowExpression getFilter(Type type) + private ColumnExpression getFilter(Type type) { if (type == VARCHAR) { - return rowExpression("cast(varchar0 as bigint) % 2 = 0", VARCHAR); + return columnExpression("cast(varchar0 as bigint) % 2 = 0", VARCHAR); } if (type == BIGINT) { - return rowExpression("bigint0 % 2 = 0", BIGINT); + return columnExpression("bigint0 % 2 = 0", BIGINT); } throw new IllegalArgumentException("filter not supported for type : " + type); } - private List getProjections(Type type) + private List getProjections(Type type) { - ImmutableList.Builder builder = ImmutableList.builder(); + ImmutableList.Builder builder = ImmutableList.builder(); if (type == BIGINT) { for (int i = 0; i < columnCount; i++) { - builder.add(rowExpression("bigint" + i + " + 5", type)); + builder.add(columnExpression("bigint" + i + " + 5", type)); } } else if (type == VARCHAR) { for (int i = 0; i < columnCount; i++) { - // alternatively use identity expression rowExpression("varchar" + i, type) or - // rowExpression("substr(varchar" + i + ", 1, 1)", type) - builder.add(rowExpression("concat(varchar" + i + ", 'foo')", type)); + // alternatively use identity expression columnExpression("varchar" + i, type) or + // columnExpression("substr(varchar" + i + ", 1, 1)", type) + builder.add(columnExpression("concat(varchar" + i + ", 'foo')", type)); } } return builder.build(); } - private RowExpression rowExpression(String expression, Type type) + private ColumnExpression columnExpression(String expression, Type type) { SymbolToInputRewriter symbolToInputRewriter = new SymbolToInputRewriter(sourceLayout); Expression inputReferenceExpression = symbolToInputRewriter.rewrite(createExpression(expression, METADATA, TypeProvider.copyOf(symbolTypes))); @@ -189,7 +189,7 @@ private RowExpression rowExpression(String expression, Type type) Map types = builder.build(); Map, Type> expressionTypes = getExpressionTypesFromInput(TEST_SESSION, METADATA, SQL_PARSER, types, inputReferenceExpression, emptyList(), WarningCollector.NOOP); - return SqlToRowExpressionTranslator.translate(inputReferenceExpression, SCALAR, expressionTypes, METADATA.getFunctionRegistry(), METADATA.getTypeManager(), TEST_SESSION, true); + return SqlToColumnExpressionTranslator.translate(inputReferenceExpression, SCALAR, expressionTypes, METADATA.getFunctionRegistry(), METADATA.getTypeManager(), TEST_SESSION, true); } private static Page createPage(List types, boolean dictionary) diff --git a/presto-main/src/test/java/com/facebook/presto/sql/gen/TestInCodeGenerator.java b/presto-main/src/test/java/com/facebook/presto/sql/gen/TestInCodeGenerator.java index 1d192028c0b98..07a87a9991c68 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/gen/TestInCodeGenerator.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/gen/TestInCodeGenerator.java @@ -13,9 +13,9 @@ */ package com.facebook.presto.sql.gen; -import com.facebook.presto.metadata.Signature; -import com.facebook.presto.sql.relational.CallExpression; -import com.facebook.presto.sql.relational.RowExpression; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.CallExpression; +import com.facebook.presto.spi.relation.column.ColumnExpression; import io.airlift.slice.Slices; import org.testng.annotations.Test; @@ -23,7 +23,7 @@ import java.util.Collections; import java.util.List; -import static com.facebook.presto.metadata.FunctionKind.SCALAR; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.DateType.DATE; import static com.facebook.presto.spi.type.DoubleType.DOUBLE; @@ -42,7 +42,7 @@ public class TestInCodeGenerator @Test public void testInteger() { - List values = new ArrayList<>(); + List values = new ArrayList<>(); values.add(constant(Integer.MIN_VALUE, INTEGER)); values.add(constant(Integer.MAX_VALUE, INTEGER)); values.add(constant(3, INTEGER)); @@ -72,7 +72,7 @@ public void testInteger() @Test public void testBigint() { - List values = new ArrayList<>(); + List values = new ArrayList<>(); values.add(constant(Integer.MAX_VALUE + 1L, BIGINT)); values.add(constant(Integer.MIN_VALUE - 1L, BIGINT)); values.add(constant(3L, BIGINT)); @@ -102,7 +102,7 @@ public void testBigint() @Test public void testDate() { - List values = new ArrayList<>(); + List values = new ArrayList<>(); values.add(constant(1L, DATE)); values.add(constant(2L, DATE)); values.add(constant(3L, DATE)); @@ -120,7 +120,7 @@ public void testDate() @Test public void testDouble() { - List values = new ArrayList<>(); + List values = new ArrayList<>(); values.add(constant(1.5, DOUBLE)); values.add(constant(2.5, DOUBLE)); values.add(constant(3.5, DOUBLE)); @@ -141,7 +141,7 @@ public void testDouble() @Test public void testVarchar() { - List values = new ArrayList<>(); + List values = new ArrayList<>(); values.add(constant(Slices.utf8Slice("1"), DOUBLE)); values.add(constant(Slices.utf8Slice("2"), DOUBLE)); values.add(constant(Slices.utf8Slice("3"), DOUBLE)); diff --git a/presto-main/src/test/java/com/facebook/presto/sql/gen/TestPageFunctionCompiler.java b/presto-main/src/test/java/com/facebook/presto/sql/gen/TestPageFunctionCompiler.java index 83a9a03d7ce1e..bf085f710c459 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/gen/TestPageFunctionCompiler.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/gen/TestPageFunctionCompiler.java @@ -13,7 +13,7 @@ */ package com.facebook.presto.sql.gen; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.metadata.InternalFunction; import com.facebook.presto.operator.DriverYieldSignal; import com.facebook.presto.operator.Work; import com.facebook.presto.operator.project.PageProjection; @@ -22,7 +22,7 @@ import com.facebook.presto.spi.PrestoException; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; -import com.facebook.presto.sql.relational.CallExpression; +import com.facebook.presto.spi.relation.column.CallExpression; import com.google.common.collect.ImmutableList; import org.testng.annotations.Test; @@ -46,7 +46,7 @@ public class TestPageFunctionCompiler { private static final CallExpression ADD_10_EXPRESSION = call( - Signature.internalOperator(ADD, BIGINT.getTypeSignature(), ImmutableList.of(BIGINT.getTypeSignature(), BIGINT.getTypeSignature())), + InternalFunction.internalOperator(ADD, BIGINT.getTypeSignature(), ImmutableList.of(BIGINT.getTypeSignature(), BIGINT.getTypeSignature())), BIGINT, field(0, BIGINT), constant(10L, BIGINT)); diff --git a/presto-main/src/test/java/com/facebook/presto/sql/gen/TestVarArgsToArrayAdapterGenerator.java b/presto-main/src/test/java/com/facebook/presto/sql/gen/TestVarArgsToArrayAdapterGenerator.java index f839f0a9ea5e9..ba233332ccd61 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/gen/TestVarArgsToArrayAdapterGenerator.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/gen/TestVarArgsToArrayAdapterGenerator.java @@ -15,12 +15,12 @@ import com.facebook.presto.annotation.UsedByGeneratedCode; import com.facebook.presto.metadata.BoundVariables; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.operator.scalar.AbstractTestFunctions; import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.TypeManager; import com.google.common.base.Joiner; import com.google.common.collect.ImmutableList; diff --git a/presto-main/src/test/java/com/facebook/presto/sql/planner/TestEffectivePredicateExtractor.java b/presto-main/src/test/java/com/facebook/presto/sql/planner/TestEffectivePredicateExtractor.java index 206f0ee482448..9876e52f1a9b7 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/planner/TestEffectivePredicateExtractor.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/planner/TestEffectivePredicateExtractor.java @@ -14,14 +14,14 @@ package com.facebook.presto.sql.planner; import com.facebook.presto.connector.ConnectorId; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.Metadata; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.TableHandle; import com.facebook.presto.metadata.TableLayoutHandle; import com.facebook.presto.spi.ColumnHandle; import com.facebook.presto.spi.block.SortOrder; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.predicate.Domain; import com.facebook.presto.spi.predicate.TupleDomain; import com.facebook.presto.spi.type.TypeSignature; @@ -75,7 +75,7 @@ import java.util.Set; import java.util.UUID; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.sql.ExpressionUtils.and; import static com.facebook.presto.sql.ExpressionUtils.combineConjuncts; diff --git a/presto-main/src/test/java/com/facebook/presto/sql/planner/TestTypeValidator.java b/presto-main/src/test/java/com/facebook/presto/sql/planner/TestTypeValidator.java index 09796e1bbb349..d6f02a4596d63 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/planner/TestTypeValidator.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/planner/TestTypeValidator.java @@ -15,10 +15,10 @@ import com.facebook.presto.connector.ConnectorId; import com.facebook.presto.execution.warnings.WarningCollector; -import com.facebook.presto.metadata.FunctionKind; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.TableHandle; import com.facebook.presto.spi.ColumnHandle; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.predicate.TupleDomain; import com.facebook.presto.spi.type.StandardTypes; import com.facebook.presto.spi.type.VarcharType; diff --git a/presto-main/src/test/java/com/facebook/presto/sql/planner/assertions/WindowFunctionMatcher.java b/presto-main/src/test/java/com/facebook/presto/sql/planner/assertions/WindowFunctionMatcher.java index 2daa8c47f5730..d05f1805b0e12 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/planner/assertions/WindowFunctionMatcher.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/planner/assertions/WindowFunctionMatcher.java @@ -15,7 +15,7 @@ import com.facebook.presto.Session; import com.facebook.presto.metadata.Metadata; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.sql.planner.Symbol; import com.facebook.presto.sql.planner.plan.PlanNode; import com.facebook.presto.sql.planner.plan.WindowNode; diff --git a/presto-main/src/test/java/com/facebook/presto/sql/planner/assertions/WindowMatcher.java b/presto-main/src/test/java/com/facebook/presto/sql/planner/assertions/WindowMatcher.java index de6053030846e..2a138b092da18 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/planner/assertions/WindowMatcher.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/planner/assertions/WindowMatcher.java @@ -16,8 +16,8 @@ import com.facebook.presto.Session; import com.facebook.presto.cost.StatsProvider; import com.facebook.presto.metadata.Metadata; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.spi.block.SortOrder; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.sql.planner.plan.PlanNode; import com.facebook.presto.sql.planner.plan.WindowNode; import com.facebook.presto.sql.tree.FunctionCall; diff --git a/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/TestMemo.java b/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/TestMemo.java index c1ed8faa41439..934072acfb7dc 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/TestMemo.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/TestMemo.java @@ -13,6 +13,7 @@ */ package com.facebook.presto.sql.planner.iterative; +import com.facebook.presto.connector.ConnectorId; import com.facebook.presto.cost.PlanNodeCostEstimate; import com.facebook.presto.cost.PlanNodeStatsEstimate; import com.facebook.presto.sql.planner.PlanNodeIdAllocator; @@ -20,10 +21,12 @@ import com.facebook.presto.sql.planner.plan.PlanNode; import com.facebook.presto.sql.planner.plan.PlanNodeId; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; import org.testng.annotations.Test; import java.util.List; import java.util.Optional; +import java.util.Set; import static com.google.common.collect.Iterables.getOnlyElement; import static org.testng.Assert.assertEquals; @@ -42,6 +45,44 @@ public void testInitialization() assertMatchesStructure(plan, memo.extract()); } + @Test + public void testTraitGroup() + { + Memo.TraitGroup traitGroup1 = Memo.TraitGroup.emptyTraitGroup(); + traitGroup1.addTrait(new ConnectorId("test1")); + Memo.TraitGroup traitGroup2 = Memo.TraitGroup.emptyTraitGroup(); + traitGroup2.addTrait(new ConnectorId("test2")); + traitGroup2.addTrait(new ConnectorId("test1")); + Memo.TraitGroup traitGroup3 = traitGroup1.merge(traitGroup2); + Set set = traitGroup3.getTraitSet(ConnectorId.class); + assertEquals(set, ImmutableSet.of(new ConnectorId("test1"), new ConnectorId("test2"))); + } + + @Test + public void testCollectTrait() + { + PlanNode plan = node(node(leaf("test1")), node(node(node(leaf("test2"))))); + Memo memo = new Memo(idAllocator, plan, ImmutableSet.of( + new Memo.TraitCollector() + { + @Override + public boolean canApplyTo(PlanNode node) + { + return node instanceof LeafNode; + } + + @Override + public Memo.TraitGroup exploreTraits(PlanNode node) + { + Memo.TraitGroup traitGroup = Memo.TraitGroup.emptyTraitGroup(); + traitGroup.addTrait(((LeafNode) node).connectorId); + return traitGroup; + } + })); + Memo.TraitGroup traitGroup = memo.getTraitGroup(memo.getRootGroup()); + assertEquals(traitGroup.getTraitSet(ConnectorId.class), ImmutableSet.of(new ConnectorId("test1"), new ConnectorId("test2"))); + } + /* From: X -> Y -> Z To: X -> Y' -> Z' @@ -282,6 +323,11 @@ private GenericNode node(PlanNode... children) return node(idAllocator.getNextId(), children); } + private LeafNode leaf(String connector) + { + return new LeafNode(idAllocator.getNextId(), new ConnectorId(connector)); + } + private static class GenericNode extends PlanNode { @@ -311,4 +357,34 @@ public PlanNode replaceChildren(List newChildren) return new GenericNode(getId(), newChildren); } } + + private static class LeafNode + extends PlanNode + { + private final ConnectorId connectorId; + + public LeafNode(PlanNodeId id, ConnectorId connectorId) + { + super(id); + this.connectorId = connectorId; + } + + @Override + public List getSources() + { + return ImmutableList.of(); + } + + @Override + public List getOutputSymbols() + { + return ImmutableList.of(); + } + + @Override + public PlanNode replaceChildren(List newChildren) + { + return this; + } + } } diff --git a/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/connector/TestAggregateRoundTrip.java b/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/connector/TestAggregateRoundTrip.java new file mode 100644 index 0000000000000..45da022c3157c --- /dev/null +++ b/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/connector/TestAggregateRoundTrip.java @@ -0,0 +1,64 @@ +/* + * 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 com.facebook.presto.sql.planner.iterative.connector; + +import com.facebook.presto.sql.planner.RuleStatsRecorder; +import com.facebook.presto.sql.planner.iterative.IterativeOptimizer; +import com.facebook.presto.sql.planner.iterative.rule.InlineProjections; +import com.facebook.presto.sql.planner.iterative.rule.RemoveRedundantIdentityProjections; +import com.facebook.presto.sql.planner.optimizations.PlanOptimizer; +import com.facebook.presto.sql.planner.optimizations.PruneUnreferencedOutputs; +import com.facebook.presto.sql.planner.plan.AggregationNode; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; +import org.testng.annotations.Test; + +import java.util.List; + +import static org.testng.Assert.assertEquals; + +public class TestAggregateRoundTrip + extends TestPlanNodeTableExpressionRoundTrip +{ + @Test + public void testAggregateRoundTrip() + { + List optimizeProjections = new ImmutableList.Builder() + .add(new PruneUnreferencedOutputs()) + .add(new IterativeOptimizer( + new RuleStatsRecorder(), + getQueryRunner().getStatsCalculator(), + getQueryRunner().getCostCalculator(), + ImmutableSet.of( + new InlineProjections(), + new RemoveRedundantIdentityProjections()))) + .build(); + assertRoundTrip(AggregationNode.class, "SELECT orderkey, custkey, approx_distinct(clerk, 0.012) FROM orders WHERE orderkey > 1 \n" + + " GROUP BY GROUPING SETS ((orderkey, custkey), (orderkey))", this::assertAggregationEquals, optimizeProjections); + assertRoundTrip(AggregationNode.class, "SELECT orderkey, custkey, sum(totalprice) FROM orders WHERE orderkey > 1 \n" + + " GROUP BY GROUPING SETS ((orderkey, custkey), (orderkey))", this::assertAggregationEquals, optimizeProjections); + assertRoundTrip(AggregationNode.class, "SELECT orderkey +1, custkey, sum(totalprice) FROM orders WHERE orderkey > 1 GROUP BY 1, 2", this::assertAggregationEquals, optimizeProjections); + // TODO test equivalence of columnExpression of tableExpression following creates equal columnExpression but not exact match + // rewritten add CAST( ) to CAST(CAST(12 DECIMAL(3,3)) + assertRoundTrip(AggregationNode.class, "SELECT orderkey +1, custkey, approx_distinct(clerk, 0.012) FROM orders WHERE orderkey > 1 GROUP BY 1, 2", this::assertAggregationEquals, optimizeProjections); + + assertRoundTripFail(AggregationNode.class, "SELECT orderkey +1, custkey, sum(totalprice) FILTER (WHERE orderkey > 1) FROM orders WHERE orderkey > 1 GROUP BY 1, 2", this::assertAggregationEquals, optimizeProjections); + assertRoundTripFail(AggregationNode.class, "SELECT orderkey +1, COUNT(DISTINCT custkey) FROM orders WHERE orderkey > 1 GROUP BY 1", this::assertAggregationEquals, optimizeProjections); + } + + private void assertAggregationEquals(AggregationNode actual, AggregationNode expected) + { + assertEquals(actual.getOutputSymbols(), expected.getOutputSymbols()); + } +} diff --git a/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/connector/TestFilterRoundTrip.java b/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/connector/TestFilterRoundTrip.java new file mode 100644 index 0000000000000..05697142613c0 --- /dev/null +++ b/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/connector/TestFilterRoundTrip.java @@ -0,0 +1,35 @@ +/* + * 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 com.facebook.presto.sql.planner.iterative.connector; + +import com.facebook.presto.sql.planner.plan.FilterNode; +import org.testng.annotations.Test; + +import static org.testng.Assert.assertEquals; + +public class TestFilterRoundTrip + extends TestPlanNodeTableExpressionRoundTrip +{ + @Test + public void testFilterRoundTrip() + { + assertRoundTrip(FilterNode.class, "SELECT * FROM orders WHERE orderkey > 1", this::assertFilterEquals); + } + + private void assertFilterEquals(FilterNode actual, FilterNode expected) + { + assertEquals(actual.getOutputSymbols(), expected.getOutputSymbols()); + assertEquals(actual.getPredicate(), expected.getPredicate()); + } +} diff --git a/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/connector/TestPlanNodeTableExpressionRoundTrip.java b/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/connector/TestPlanNodeTableExpressionRoundTrip.java new file mode 100644 index 0000000000000..a3b04c855b561 --- /dev/null +++ b/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/connector/TestPlanNodeTableExpressionRoundTrip.java @@ -0,0 +1,188 @@ +/* + * 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 com.facebook.presto.sql.planner.iterative.connector; + +import com.facebook.presto.Session; +import com.facebook.presto.connector.ConnectorId; +import com.facebook.presto.execution.warnings.WarningCollector; +import com.facebook.presto.matching.Captures; +import com.facebook.presto.matching.Pattern; +import com.facebook.presto.spi.relation.TableExpression; +import com.facebook.presto.sql.planner.LiteralEncoder; +import com.facebook.presto.sql.planner.RuleStatsRecorder; +import com.facebook.presto.sql.planner.assertions.BasePlanTest; +import com.facebook.presto.sql.planner.iterative.IterativeOptimizer; +import com.facebook.presto.sql.planner.iterative.Rule; +import com.facebook.presto.sql.planner.optimizations.PlanOptimizer; +import com.facebook.presto.sql.planner.plan.PlanNode; +import com.facebook.presto.testing.LocalQueryRunner; +import com.facebook.presto.tpch.TpchConnectorFactory; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import org.intellij.lang.annotations.Language; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; + +import java.util.List; +import java.util.Optional; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.BiConsumer; + +import static com.facebook.presto.testing.TestingSession.testSessionBuilder; +import static java.util.Objects.requireNonNull; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; +import static org.testng.Assert.fail; + +public abstract class TestPlanNodeTableExpressionRoundTrip + extends BasePlanTest +{ + private LocalQueryRunner queryRunner; + + @BeforeClass + public void setUp() + { + Session.SessionBuilder sessionBuilder = testSessionBuilder() + .setCatalog("local") + .setSchema("tiny") + .setSystemProperty("task_concurrency", "1") + .setSystemProperty("iterative_optimizer_enabled", "true") + .setSystemProperty("iterative_optimizer_timeout", "100s"); + + queryRunner = new LocalQueryRunner(sessionBuilder.build()); + + queryRunner.createCatalog(queryRunner.getDefaultSession().getCatalog().get(), + new TpchConnectorFactory(1), + ImmutableMap.of()); + } + + @AfterClass(alwaysRun = true) + public void tearDown() + { + if (queryRunner != null) { + queryRunner.close(); + queryRunner = null; + } + } + + protected void assertRoundTrip(Class planNodeType, @Language("SQL") String sql, BiConsumer equalAssertion) + { + assertRoundTrip(planNodeType, sql, equalAssertion, ImmutableList.of()); + } + + protected void assertRoundTrip(Class planNodeType, @Language("SQL") String sql, BiConsumer equalAssertion, List perquisiteOptimizers) + { + PlanOptimizer optimizer = new IterativeOptimizer( + new RuleStatsRecorder(), + queryRunner.getStatsCalculator(), + queryRunner.getCostCalculator(), + ImmutableSet.of(new TranslateRule<>(planNodeType, queryRunner, equalAssertion))); + + queryRunner.inTransaction(transactionSession -> { + queryRunner.createPlan( + transactionSession, + sql, + new ImmutableList.Builder() + .addAll(perquisiteOptimizers) + .add(optimizer) + .build(), + WarningCollector.NOOP); + return null; + }); + } + + protected void assertRoundTripFail(Class planNodeType, @Language("SQL") String sql, BiConsumer equalAssertion, List perquisiteOptimizers) + { + PlanOptimizer optimizer = new IterativeOptimizer( + new RuleStatsRecorder(), + queryRunner.getStatsCalculator(), + queryRunner.getCostCalculator(), + ImmutableSet.of(new TranslateRule<>(planNodeType, queryRunner, equalAssertion))); + + try { + queryRunner.inTransaction(transactionSession -> { + queryRunner.createPlan( + transactionSession, + sql, + new ImmutableList.Builder() + .addAll(perquisiteOptimizers) + .add(optimizer) + .build(), + WarningCollector.NOOP); + fail("expected to fail"); + return null; + }); + } + catch (AssertionError e) { + if (e.getMessage().startsWith("expected to fail")) { + throw e; + } + } + } + + private static class TranslateRule + implements Rule + { + private final AtomicInteger count = new AtomicInteger(0); + private final Class type; + private final LocalQueryRunner queryRunner; + private final BiConsumer nodeEqualAssertion; + + public TranslateRule(Class type, LocalQueryRunner queryRunner, BiConsumer nodeEqualAssertion) + { + this.type = requireNonNull(type, "type is null"); + this.queryRunner = requireNonNull(queryRunner, "queryRunner is null"); + this.nodeEqualAssertion = requireNonNull(nodeEqualAssertion, "nodeEqualAssertion is null"); + } + + @Override + public Pattern getPattern() + { + return Pattern.typeOf(type); + } + + @Override + public Result apply(T node, Captures captures, Context context) + { + if (count.getAndIncrement() == 0) { + PlanNodeToTableExpressionTranslator planNodeToTableExpressionTranslator = new PlanNodeToTableExpressionTranslator( + queryRunner.getMetadata(), + context.getSymbolAllocator().getTypes(), + context.getSession(), + queryRunner.getSqlParser(), + context.getLookup()); + Optional tableExpression = planNodeToTableExpressionTranslator.translate(node); + TableExpressionToPlanNodeTranslator tableExpressionToPlanNodeTranslator = new TableExpressionToPlanNodeTranslator( + context.getIdAllocator(), + context.getSymbolAllocator(), + new LiteralEncoder(queryRunner.getMetadata().getBlockEncodingSerde()), + queryRunner.getMetadata()); + + assertTrue(tableExpression.isPresent(), "planNode cannot be represented by table expression"); + Optional rewrittenPlanNode = tableExpressionToPlanNodeTranslator.translate( + context.getSession(), + new ConnectorId("local"), + tableExpression.get(), node.getOutputSymbols()); + assertTrue(rewrittenPlanNode.isPresent(), "rewritten planNode is empty"); + assertTrue(type.isAssignableFrom(rewrittenPlanNode.get().getClass()), "PlanNode rewrite into different types"); + nodeEqualAssertion.accept((T) rewrittenPlanNode.get(), node); + Optional rewrittenTableExpression = planNodeToTableExpressionTranslator.translate(rewrittenPlanNode.get()); + assertTrue(rewrittenTableExpression.isPresent(), "rewritten planNode cannot be convert back to table expression"); + assertEquals(rewrittenTableExpression.get(), tableExpression.get()); + } + return Result.empty(); + } + } +} diff --git a/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/connector/TestProjectRoundTrip.java b/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/connector/TestProjectRoundTrip.java new file mode 100644 index 0000000000000..77acdd44c19ce --- /dev/null +++ b/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/connector/TestProjectRoundTrip.java @@ -0,0 +1,54 @@ +/* + * 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 com.facebook.presto.sql.planner.iterative.connector; + +import com.facebook.presto.sql.planner.RuleStatsRecorder; +import com.facebook.presto.sql.planner.iterative.IterativeOptimizer; +import com.facebook.presto.sql.planner.iterative.rule.InlineProjections; +import com.facebook.presto.sql.planner.iterative.rule.RemoveRedundantIdentityProjections; +import com.facebook.presto.sql.planner.optimizations.PlanOptimizer; +import com.facebook.presto.sql.planner.optimizations.PruneUnreferencedOutputs; +import com.facebook.presto.sql.planner.plan.ProjectNode; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; +import org.testng.annotations.Test; + +import java.util.List; + +import static org.testng.Assert.assertEquals; + +public class TestProjectRoundTrip + extends TestPlanNodeTableExpressionRoundTrip +{ + @Test + public void testProjectRoundTrip() + { + List optimizeProject = new ImmutableList.Builder() + .add(new PruneUnreferencedOutputs()) + .add(new IterativeOptimizer( + new RuleStatsRecorder(), + getQueryRunner().getStatsCalculator(), + getQueryRunner().getCostCalculator(), + ImmutableSet.of( + new InlineProjections(), + new RemoveRedundantIdentityProjections()))) + .build(); + assertRoundTrip(ProjectNode.class, "SELECT orderkey +1 FROM orders WHERE orderkey > 1", this::assertProjectEquals, optimizeProject); + } + + private void assertProjectEquals(ProjectNode actual, ProjectNode expected) + { + assertEquals(actual.getOutputSymbols(), expected.getOutputSymbols()); + } +} diff --git a/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/connector/TestTableExpressionRewriter.java b/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/connector/TestTableExpressionRewriter.java new file mode 100644 index 0000000000000..deed6562245ec --- /dev/null +++ b/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/connector/TestTableExpressionRewriter.java @@ -0,0 +1,166 @@ +/* + * 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 com.facebook.presto.sql.planner.iterative.connector; + +import com.facebook.presto.spi.relation.BinaryTableExpression; +import com.facebook.presto.spi.relation.LeafTableExpression; +import com.facebook.presto.spi.relation.TableExpression; +import com.facebook.presto.spi.relation.UnaryTableExpression; +import com.facebook.presto.spi.relation.column.ColumnExpression; +import com.facebook.presto.sql.planner.iterative.connector.rewriter.TableExpressionRewriter; +import com.google.common.collect.ImmutableList; +import org.testng.annotations.Test; + +import java.util.List; + +import static java.lang.String.format; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertThrows; + +public class TestTableExpressionRewriter +{ + @Test + public void testSimpleRewriter() + { + TableExpressionRewriter rewriter = new TableExpressionRewriter() + .addRule(TableScan.class, (tableScan, quote) -> quote + "tableScan" + quote) + .addRule(Project.class, (my, project, quote) -> { + String result = my.accept(project.getSource(), quote); + return format("%s%s -> %s", quote + "project" + quote, project.getExtra(), result); + }) + .addRule(UnaryTableExpression.class, (my, unary, quote) -> { + String result = my.accept(unary.getSource(), quote); + return format("%s -> %s", quote + "unaryNode" + quote, result); + }); + assertEquals(rewriter.accept(new Project(new Filter(new TableScan())), "`"), "`project`() -> `unaryNode` -> `tableScan`"); + } + + @Test + public void testRewriterUnknownNode() + { + TableExpressionRewriter rewriter = new TableExpressionRewriter() + .addRule(TableScan.class, (tableScan, quote) -> quote + "tableScan" + quote) + .addRule(Project.class, (my, project, quote) -> { + String result = my.accept(project.getSource(), quote); + return format("%s%s -> %s", quote + "project" + quote, project.getExtra(), result); + }) + .addRule(UnaryTableExpression.class, (my, unary, quote) -> { + String result = my.accept(unary.getSource(), quote); + return format("%s -> %s", quote + "unaryNode" + quote, result); + }); + assertThrows(UnsupportedOperationException.class, () -> rewriter.accept(new Join(new TableScan(), new Project(new Filter(new TableScan()))), "`")); + } + + private static final class TableScan + extends LeafTableExpression + { + public static TableScan tableScan() + { + return new TableScan(); + } + + @Override + public List getOutput() + { + return ImmutableList.of(); + } + } + + private static final class Project + extends UnaryTableExpression + { + private final TableExpression source; + + public Project(TableExpression source) + { + this.source = source; + } + + public static Project project(TableExpression source) + { + return new Project(source); + } + + public String getExtra() + { + return "()"; + } + + @Override + public List getOutput() + { + return ImmutableList.of(); + } + + @Override + public TableExpression getSource() + { + return source; + } + } + + private static final class Filter + extends UnaryTableExpression + { + private final TableExpression source; + + public Filter(TableExpression source) + { + this.source = source; + } + + public static Filter filter(TableExpression source) + { + return new Filter(source); + } + + @Override + public List getOutput() + { + return ImmutableList.of(); + } + + @Override + public TableExpression getSource() + { + return source; + } + } + + private static final class Join + extends BinaryTableExpression + { + private final TableExpression left; + private final TableExpression right; + + public Join(TableExpression left, TableExpression right) + { + this.left = left; + this.right = right; + } + + @Override + public List getOutput() + { + return null; + } + + @Override + public List getSources() + { + return ImmutableList.of(left, right); + } + } +} diff --git a/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/connector/TestTableScanRoundTrip.java b/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/connector/TestTableScanRoundTrip.java new file mode 100644 index 0000000000000..3909ebaac26bc --- /dev/null +++ b/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/connector/TestTableScanRoundTrip.java @@ -0,0 +1,40 @@ +/* + * 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 com.facebook.presto.sql.planner.iterative.connector; + +import com.facebook.presto.sql.planner.plan.TableScanNode; +import org.testng.annotations.Test; + +import static com.google.common.collect.ImmutableList.toImmutableList; +import static org.testng.Assert.assertEquals; + +public class TestTableScanRoundTrip + extends TestPlanNodeTableExpressionRoundTrip +{ + @Test + public void testTableScanRoundTrip() + { + assertRoundTrip(TableScanNode.class, "SELECT * FROM orders", this::assertTableScanEquals); + } + + private void assertTableScanEquals(TableScanNode actual, TableScanNode expected) + { + assertEquals(actual.getTable(), expected.getTable()); + assertEquals(actual.getOutputSymbols(), expected.getOutputSymbols()); + assertEquals(actual.getOutputSymbols().stream() + .map(actual.getAssignments()::get).collect(toImmutableList()), + expected.getOutputSymbols().stream() + .map(actual.getAssignments()::get).collect(toImmutableList())); + } +} diff --git a/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/rule/TestMergeAdjacentWindows.java b/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/rule/TestMergeAdjacentWindows.java index 6b97b41c2ccf6..1fd869e514530 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/rule/TestMergeAdjacentWindows.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/rule/TestMergeAdjacentWindows.java @@ -13,8 +13,8 @@ */ package com.facebook.presto.sql.planner.iterative.rule; -import com.facebook.presto.metadata.FunctionKind; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.sql.planner.assertions.ExpectedValueProvider; import com.facebook.presto.sql.planner.assertions.PlanMatchPattern; import com.facebook.presto.sql.planner.iterative.rule.test.BaseRuleTest; diff --git a/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/rule/TestPruneWindowColumns.java b/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/rule/TestPruneWindowColumns.java index edc12994c2b24..52c69403b49c8 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/rule/TestPruneWindowColumns.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/rule/TestPruneWindowColumns.java @@ -13,9 +13,9 @@ */ package com.facebook.presto.sql.planner.iterative.rule; -import com.facebook.presto.metadata.FunctionKind; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.spi.block.SortOrder; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.sql.planner.OrderingScheme; import com.facebook.presto.sql.planner.Symbol; import com.facebook.presto.sql.planner.assertions.ExpectedValueProvider; diff --git a/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/rule/TestSwapAdjacentWindowsBySpecifications.java b/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/rule/TestSwapAdjacentWindowsBySpecifications.java index 782776342a036..b2027843f8339 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/rule/TestSwapAdjacentWindowsBySpecifications.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/rule/TestSwapAdjacentWindowsBySpecifications.java @@ -13,8 +13,8 @@ */ package com.facebook.presto.sql.planner.iterative.rule; -import com.facebook.presto.metadata.FunctionKind; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.sql.planner.assertions.ExpectedValueProvider; import com.facebook.presto.sql.planner.iterative.rule.test.BaseRuleTest; import com.facebook.presto.sql.planner.plan.WindowNode; diff --git a/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/rule/test/PlanBuilder.java b/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/rule/test/PlanBuilder.java index 51f523a035814..ade8fd42939c4 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/rule/test/PlanBuilder.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/rule/test/PlanBuilder.java @@ -16,12 +16,12 @@ import com.facebook.presto.connector.ConnectorId; import com.facebook.presto.metadata.IndexHandle; import com.facebook.presto.metadata.Metadata; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.TableHandle; import com.facebook.presto.metadata.TableLayoutHandle; import com.facebook.presto.spi.ColumnHandle; import com.facebook.presto.spi.SchemaTableName; import com.facebook.presto.spi.block.SortOrder; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.predicate.TupleDomain; import com.facebook.presto.spi.type.Type; import com.facebook.presto.sql.ExpressionUtils; diff --git a/presto-main/src/test/java/com/facebook/presto/sql/planner/plan/TestWindowNode.java b/presto-main/src/test/java/com/facebook/presto/sql/planner/plan/TestWindowNode.java index 12c8a9537a2e2..cd3b9e01cbd9b 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/planner/plan/TestWindowNode.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/planner/plan/TestWindowNode.java @@ -13,11 +13,11 @@ */ package com.facebook.presto.sql.planner.plan; -import com.facebook.presto.metadata.FunctionKind; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.server.SliceDeserializer; import com.facebook.presto.server.SliceSerializer; import com.facebook.presto.spi.block.SortOrder; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.sql.Serialization; import com.facebook.presto.sql.parser.SqlParser; import com.facebook.presto.sql.planner.OrderingScheme; diff --git a/presto-main/src/test/java/com/facebook/presto/sql/relational/TestDeterminismEvaluator.java b/presto-main/src/test/java/com/facebook/presto/sql/relational/TestDeterminismEvaluator.java index 0ea8e2e13579f..f70de5486e318 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/relational/TestDeterminismEvaluator.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/relational/TestDeterminismEvaluator.java @@ -13,14 +13,16 @@ */ package com.facebook.presto.sql.relational; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.relation.column.CallExpression; +import com.facebook.presto.spi.relation.column.InputReferenceExpression; import com.facebook.presto.spi.type.StandardTypes; import com.google.common.collect.ImmutableList; import org.testng.annotations.Test; -import static com.facebook.presto.metadata.FunctionKind.SCALAR; +import static com.facebook.presto.metadata.InternalFunction.internalOperator; import static com.facebook.presto.metadata.MetadataManager.createTestMetadataManager; -import static com.facebook.presto.metadata.Signature.internalOperator; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.facebook.presto.spi.function.OperatorType.LESS_THAN; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.BooleanType.BOOLEAN; diff --git a/presto-main/src/test/java/com/facebook/presto/type/BenchmarkDecimalOperators.java b/presto-main/src/test/java/com/facebook/presto/type/BenchmarkDecimalOperators.java index e5a04341977ae..7446e03749d9d 100644 --- a/presto-main/src/test/java/com/facebook/presto/type/BenchmarkDecimalOperators.java +++ b/presto-main/src/test/java/com/facebook/presto/type/BenchmarkDecimalOperators.java @@ -20,6 +20,7 @@ import com.facebook.presto.operator.DriverYieldSignal; import com.facebook.presto.operator.project.PageProcessor; import com.facebook.presto.spi.Page; +import com.facebook.presto.spi.relation.column.ColumnExpression; import com.facebook.presto.spi.type.BigintType; import com.facebook.presto.spi.type.DecimalType; import com.facebook.presto.spi.type.DoubleType; @@ -31,8 +32,7 @@ import com.facebook.presto.sql.planner.Symbol; import com.facebook.presto.sql.planner.SymbolToInputRewriter; import com.facebook.presto.sql.planner.TypeProvider; -import com.facebook.presto.sql.relational.RowExpression; -import com.facebook.presto.sql.relational.SqlToRowExpressionTranslator; +import com.facebook.presto.sql.relational.SqlToColumnExpressionTranslator; import com.facebook.presto.sql.tree.Expression; import com.facebook.presto.sql.tree.NodeRef; import com.google.common.collect.ImmutableList; @@ -64,9 +64,9 @@ import static com.facebook.presto.RowPagesBuilder.rowPagesBuilder; import static com.facebook.presto.SessionTestUtils.TEST_SESSION; import static com.facebook.presto.memory.context.AggregatedMemoryContext.newSimpleAggregatedMemoryContext; -import static com.facebook.presto.metadata.FunctionKind.SCALAR; import static com.facebook.presto.metadata.MetadataManager.createTestMetadataManager; import static com.facebook.presto.operator.scalar.FunctionAssertions.createExpression; +import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.DecimalType.createDecimalType; import static com.facebook.presto.spi.type.DoubleType.DOUBLE; @@ -603,7 +603,7 @@ protected void generateInputPage(int... initialValues) protected void generateProcessor(String expression) { - processor = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)).compilePageProcessor(Optional.empty(), ImmutableList.of(rowExpression(expression))).get(); + processor = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)).compilePageProcessor(Optional.empty(), ImmutableList.of(columnExpression(expression))).get(); } protected void setDoubleMaxValue(double doubleMaxValue) @@ -611,7 +611,7 @@ protected void setDoubleMaxValue(double doubleMaxValue) this.doubleMaxValue = doubleMaxValue; } - private RowExpression rowExpression(String expression) + private ColumnExpression columnExpression(String expression) { Expression inputReferenceExpression = new SymbolToInputRewriter(sourceLayout).rewrite(createExpression(expression, metadata, TypeProvider.copyOf(symbolTypes))); @@ -619,7 +619,7 @@ private RowExpression rowExpression(String expression) .collect(toMap(Map.Entry::getValue, entry -> symbolTypes.get(entry.getKey()))); Map, Type> expressionTypes = getExpressionTypesFromInput(TEST_SESSION, metadata, SQL_PARSER, types, inputReferenceExpression, emptyList(), WarningCollector.NOOP); - return SqlToRowExpressionTranslator.translate(inputReferenceExpression, SCALAR, expressionTypes, metadata.getFunctionRegistry(), metadata.getTypeManager(), TEST_SESSION, true); + return SqlToColumnExpressionTranslator.translate(inputReferenceExpression, SCALAR, expressionTypes, metadata.getFunctionRegistry(), metadata.getTypeManager(), TEST_SESSION, true); } private Object generateRandomValue(Type type) diff --git a/presto-ml/src/test/java/com/facebook/presto/ml/TestEvaluateClassifierPredictions.java b/presto-ml/src/test/java/com/facebook/presto/ml/TestEvaluateClassifierPredictions.java index 40970b4d37e22..2aea3f43d3e9d 100644 --- a/presto-ml/src/test/java/com/facebook/presto/ml/TestEvaluateClassifierPredictions.java +++ b/presto-ml/src/test/java/com/facebook/presto/ml/TestEvaluateClassifierPredictions.java @@ -16,12 +16,12 @@ import com.facebook.presto.RowPageBuilder; import com.facebook.presto.metadata.Metadata; import com.facebook.presto.metadata.MetadataManager; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.operator.aggregation.Accumulator; import com.facebook.presto.operator.aggregation.InternalAggregationFunction; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.StandardTypes; import com.google.common.base.Splitter; import com.google.common.collect.ImmutableList; @@ -31,7 +31,7 @@ import java.util.Optional; import static com.facebook.presto.metadata.FunctionExtractor.extractFunctions; -import static com.facebook.presto.metadata.FunctionKind.AGGREGATE; +import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.spi.type.VarcharType.VARCHAR; diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/connector/Connector.java b/presto-spi/src/main/java/com/facebook/presto/spi/connector/Connector.java index 5b61e1c6e880f..f7e104a76187c 100644 --- a/presto-spi/src/main/java/com/facebook/presto/spi/connector/Connector.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/connector/Connector.java @@ -68,6 +68,14 @@ default ConnectorIndexProvider getIndexProvider() throw new UnsupportedOperationException(); } + /** + * @throws UnsupportedOperationException if this connector does not support rewrite plan + */ + default ConnectorRuleProvider getConnectorRuleProvider() + { + throw new UnsupportedOperationException(); + } + /** * @throws UnsupportedOperationException if this connector does not support partitioned table layouts */ diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/connector/ConnectorOptimizationRule.java b/presto-spi/src/main/java/com/facebook/presto/spi/connector/ConnectorOptimizationRule.java new file mode 100644 index 0000000000000..f5d6af093829f --- /dev/null +++ b/presto-spi/src/main/java/com/facebook/presto/spi/connector/ConnectorOptimizationRule.java @@ -0,0 +1,28 @@ +/* + * 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 com.facebook.presto.spi.connector; + +import com.facebook.presto.spi.ConnectorSession; +import com.facebook.presto.spi.relation.TableExpression; + +import java.util.Optional; + +public interface ConnectorOptimizationRule +{ + boolean enabled(ConnectorSession session); + + boolean match(ConnectorSession session, TableExpression tableExpression); + + Optional optimize(ConnectorSession session, TableExpression tableExpression); +} diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/connector/ConnectorRuleProvider.java b/presto-spi/src/main/java/com/facebook/presto/spi/connector/ConnectorRuleProvider.java new file mode 100644 index 0000000000000..9c93e5211b6a2 --- /dev/null +++ b/presto-spi/src/main/java/com/facebook/presto/spi/connector/ConnectorRuleProvider.java @@ -0,0 +1,21 @@ +/* + * 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 com.facebook.presto.spi.connector; + +import java.util.Set; + +public interface ConnectorRuleProvider +{ + Set getRules(); +} diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/FunctionKind.java b/presto-spi/src/main/java/com/facebook/presto/spi/function/FunctionKind.java similarity index 93% rename from presto-main/src/main/java/com/facebook/presto/metadata/FunctionKind.java rename to presto-spi/src/main/java/com/facebook/presto/spi/function/FunctionKind.java index 9313d5467ad63..b8647c9760b89 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/FunctionKind.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/function/FunctionKind.java @@ -11,7 +11,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.facebook.presto.metadata; +package com.facebook.presto.spi.function; public enum FunctionKind { diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/LongVariableConstraint.java b/presto-spi/src/main/java/com/facebook/presto/spi/function/LongVariableConstraint.java similarity index 97% rename from presto-main/src/main/java/com/facebook/presto/metadata/LongVariableConstraint.java rename to presto-spi/src/main/java/com/facebook/presto/spi/function/LongVariableConstraint.java index f40679816859e..dbfd3142977d7 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/LongVariableConstraint.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/function/LongVariableConstraint.java @@ -11,7 +11,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.facebook.presto.metadata; +package com.facebook.presto.spi.function; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/Signature.java b/presto-spi/src/main/java/com/facebook/presto/spi/function/Signature.java similarity index 67% rename from presto-main/src/main/java/com/facebook/presto/metadata/Signature.java rename to presto-spi/src/main/java/com/facebook/presto/spi/function/Signature.java index 23cd0cf48568f..39f3b1917d589 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/Signature.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/function/Signature.java @@ -11,23 +11,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.facebook.presto.metadata; +package com.facebook.presto.spi.function; -import com.facebook.presto.spi.function.OperatorType; -import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeSignature; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import com.google.common.base.Joiner; -import com.google.common.collect.ImmutableList; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; -import static com.facebook.presto.metadata.FunctionKind.SCALAR; -import static com.facebook.presto.metadata.FunctionRegistry.mangleOperatorName; -import static com.google.common.collect.ImmutableList.toImmutableList; +import static java.util.Collections.emptyList; +import static java.util.Collections.unmodifiableList; import static java.util.Objects.requireNonNull; import static java.util.stream.Stream.concat; @@ -57,56 +54,21 @@ public Signature( this.name = name; this.kind = requireNonNull(kind, "type is null"); - this.typeVariableConstraints = ImmutableList.copyOf(typeVariableConstraints); - this.longVariableConstraints = ImmutableList.copyOf(longVariableConstraints); + this.typeVariableConstraints = unmodifiableList(new ArrayList<>(typeVariableConstraints)); + this.longVariableConstraints = unmodifiableList(new ArrayList<>(longVariableConstraints)); this.returnType = requireNonNull(returnType, "returnType is null"); - this.argumentTypes = ImmutableList.copyOf(requireNonNull(argumentTypes, "argumentTypes is null")); + this.argumentTypes = unmodifiableList(new ArrayList<>(requireNonNull(argumentTypes, "argumentTypes is null"))); this.variableArity = variableArity; } public Signature(String name, FunctionKind kind, TypeSignature returnType, TypeSignature... argumentTypes) { - this(name, kind, returnType, ImmutableList.copyOf(argumentTypes)); + this(name, kind, returnType, unmodifiableList(new ArrayList<>(Arrays.asList(argumentTypes)))); } public Signature(String name, FunctionKind kind, TypeSignature returnType, List argumentTypes) { - this(name, kind, ImmutableList.of(), ImmutableList.of(), returnType, argumentTypes, false); - } - - public static Signature internalOperator(OperatorType operator, Type returnType, List argumentTypes) - { - return internalScalarFunction(mangleOperatorName(operator.name()), returnType.getTypeSignature(), argumentTypes.stream().map(Type::getTypeSignature).collect(toImmutableList())); - } - - public static Signature internalOperator(OperatorType operator, TypeSignature returnType, TypeSignature... argumentTypes) - { - return internalOperator(operator, returnType, ImmutableList.copyOf(argumentTypes)); - } - - public static Signature internalOperator(OperatorType operator, TypeSignature returnType, List argumentTypes) - { - return internalScalarFunction(mangleOperatorName(operator.name()), returnType, argumentTypes); - } - - public static Signature internalOperator(String name, TypeSignature returnType, List argumentTypes) - { - return internalScalarFunction(mangleOperatorName(name), returnType, argumentTypes); - } - - public static Signature internalOperator(String name, TypeSignature returnType, TypeSignature... argumentTypes) - { - return internalScalarFunction(mangleOperatorName(name), returnType, ImmutableList.copyOf(argumentTypes)); - } - - public static Signature internalScalarFunction(String name, TypeSignature returnType, TypeSignature... argumentTypes) - { - return internalScalarFunction(name, returnType, ImmutableList.copyOf(argumentTypes)); - } - - public static Signature internalScalarFunction(String name, TypeSignature returnType, List argumentTypes) - { - return new Signature(name, SCALAR, ImmutableList.of(), ImmutableList.of(), returnType, argumentTypes, false); + this(name, kind, emptyList(), emptyList(), returnType, argumentTypes, false); } public Signature withAlias(String name) @@ -189,7 +151,25 @@ public String toString() longVariableConstraints.stream().map(LongVariableConstraint::toString)) .collect(Collectors.toList()); - return name + (allConstraints.isEmpty() ? "" : "<" + Joiner.on(",").join(allConstraints) + ">") + "(" + Joiner.on(",").join(argumentTypes) + "):" + returnType; + StringBuilder stringBuilder = new StringBuilder(name); + if (!allConstraints.isEmpty()) { + stringBuilder.append("<").append(allConstraints.get(0)); + for (int i = 1; i < allConstraints.size(); i++) { + stringBuilder.append(",").append(allConstraints.get(i)); + } + stringBuilder.append(">"); + } + stringBuilder.append("("); + if (!argumentTypes.isEmpty()) { + stringBuilder.append(argumentTypes.get(0)); + } + for (int i = 1; i < argumentTypes.size(); i++) { + stringBuilder.append(",").append(argumentTypes.get(i)); + } + stringBuilder.append(")") + .append(":") + .append(returnType); + return stringBuilder.toString(); } /* @@ -229,9 +209,4 @@ public static LongVariableConstraint longVariableExpression(String variable, Str { return new LongVariableConstraint(variable, expression); } - - public static SignatureBuilder builder() - { - return new SignatureBuilder(); - } } diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/TypeVariableConstraint.java b/presto-spi/src/main/java/com/facebook/presto/spi/function/TypeVariableConstraint.java similarity index 98% rename from presto-main/src/main/java/com/facebook/presto/metadata/TypeVariableConstraint.java rename to presto-spi/src/main/java/com/facebook/presto/spi/function/TypeVariableConstraint.java index 9306e014ff009..acde45b70a0e4 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/TypeVariableConstraint.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/function/TypeVariableConstraint.java @@ -11,7 +11,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.facebook.presto.metadata; +package com.facebook.presto.spi.function; import com.facebook.presto.spi.type.Type; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/predicate/NullableValue.java b/presto-spi/src/main/java/com/facebook/presto/spi/predicate/NullableValue.java index b51d22bdbb9c2..7d6ce59ff09f0 100644 --- a/presto-spi/src/main/java/com/facebook/presto/spi/predicate/NullableValue.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/predicate/NullableValue.java @@ -22,7 +22,7 @@ import static java.util.Objects.requireNonNull; -// TODO: When we move RowExpressions to the SPI, we should get rid of this. This is effectively a ConstantExpression. +// TODO: When we move ColumnExpressions to the SPI, we should get rid of this. This is effectively a ConstantExpression. public final class NullableValue { private final Type type; diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/relation/AggregateExpression.java b/presto-spi/src/main/java/com/facebook/presto/spi/relation/AggregateExpression.java new file mode 100644 index 0000000000000..31c035fdbf2fa --- /dev/null +++ b/presto-spi/src/main/java/com/facebook/presto/spi/relation/AggregateExpression.java @@ -0,0 +1,106 @@ +/* + * 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 com.facebook.presto.spi.relation; + +import com.facebook.presto.spi.relation.column.ColumnExpression; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +import static java.util.Collections.unmodifiableList; +import static java.util.Objects.requireNonNull; + +public final class AggregateExpression + extends UnaryTableExpression +{ + private final List aggregations; + private final List groups; + private final List> groupSets; + private final TableExpression source; + + public AggregateExpression( + List aggregations, + List groups, + List> groupSets, + TableExpression source) + { + this.aggregations = requireNonNull(aggregations, "aggregations is null"); + this.groups = requireNonNull(groups, "groups is null"); + this.groupSets = requireNonNull(groupSets, "groupSets is null"); + this.source = requireNonNull(source, "source is null"); + } + + public List getAggregations() + { + return aggregations; + } + + public List getGroups() + { + return groups; + } + + public List> getGroupSets() + { + return groupSets; + } + + @Override + public TableExpression getSource() + { + return source; + } + + @Override + public List getOutput() + { + List outputs = new ArrayList<>(groups.size() + aggregations.size() + groupSets.size() > 1 ? 1 : 0); + outputs.addAll(groups); + outputs.addAll(aggregations); + return unmodifiableList(outputs); + } + + @Override + public boolean equals(Object o) + { + if (this == o) { + return true; + } + if (!(o instanceof AggregateExpression)) { + return false; + } + AggregateExpression aggregate = (AggregateExpression) o; + return Objects.equals(aggregations, aggregate.aggregations) && + Objects.equals(groups, aggregate.groups) && + Objects.equals(source, aggregate.source); + } + + @Override + public int hashCode() + { + return Objects.hash(aggregations, groups, source); + } + + @Override + public String toString() + { + return "AggregateExpression{" + + "aggregations=" + aggregations + + ", groups=" + groups + + ", groupSets=" + groupSets + + ", source=" + source + + '}'; + } +} diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/relation/BinaryTableExpression.java b/presto-spi/src/main/java/com/facebook/presto/spi/relation/BinaryTableExpression.java new file mode 100644 index 0000000000000..a27d368eb2a21 --- /dev/null +++ b/presto-spi/src/main/java/com/facebook/presto/spi/relation/BinaryTableExpression.java @@ -0,0 +1,22 @@ +/* + * 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 com.facebook.presto.spi.relation; + +import java.util.List; + +public abstract class BinaryTableExpression + extends TableExpression +{ + public abstract List getSources(); +} diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/relation/FilterExpression.java b/presto-spi/src/main/java/com/facebook/presto/spi/relation/FilterExpression.java new file mode 100644 index 0000000000000..30cb858a81fe9 --- /dev/null +++ b/presto-spi/src/main/java/com/facebook/presto/spi/relation/FilterExpression.java @@ -0,0 +1,80 @@ +/* + * 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 com.facebook.presto.spi.relation; + +import com.facebook.presto.spi.relation.column.ColumnExpression; + +import java.util.List; +import java.util.Objects; + +import static java.util.Objects.requireNonNull; + +public final class FilterExpression + extends UnaryTableExpression +{ + private final ColumnExpression predicate; + private final TableExpression source; + + public FilterExpression(ColumnExpression predicate, TableExpression source) + { + this.predicate = requireNonNull(predicate, "predicate is null"); + this.source = requireNonNull(source, "source is null"); + } + + public ColumnExpression getPredicate() + { + return predicate; + } + + @Override + public List getOutput() + { + return source.getOutput(); + } + + @Override + public TableExpression getSource() + { + return source; + } + + @Override + public boolean equals(Object o) + { + if (this == o) { + return true; + } + if (!(o instanceof FilterExpression)) { + return false; + } + FilterExpression that = (FilterExpression) o; + return Objects.equals(predicate, that.predicate) && + Objects.equals(source, that.source); + } + + @Override + public int hashCode() + { + return Objects.hash(predicate, source); + } + + @Override + public String toString() + { + return "FilterExpression{" + + "predicate=" + predicate + + ", source=" + source + + '}'; + } +} diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/relation/LeafTableExpression.java b/presto-spi/src/main/java/com/facebook/presto/spi/relation/LeafTableExpression.java new file mode 100644 index 0000000000000..738ff2fb81b36 --- /dev/null +++ b/presto-spi/src/main/java/com/facebook/presto/spi/relation/LeafTableExpression.java @@ -0,0 +1,19 @@ +/* + * 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 com.facebook.presto.spi.relation; + +public abstract class LeafTableExpression + extends TableExpression +{ +} diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/relation/ProjectExpression.java b/presto-spi/src/main/java/com/facebook/presto/spi/relation/ProjectExpression.java new file mode 100644 index 0000000000000..054d2307c5da4 --- /dev/null +++ b/presto-spi/src/main/java/com/facebook/presto/spi/relation/ProjectExpression.java @@ -0,0 +1,75 @@ +/* + * 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 com.facebook.presto.spi.relation; + +import com.facebook.presto.spi.relation.column.ColumnExpression; + +import java.util.List; +import java.util.Objects; + +import static java.util.Objects.requireNonNull; + +public final class ProjectExpression + extends UnaryTableExpression +{ + private final List output; + private final TableExpression source; + + public ProjectExpression(List output, TableExpression source) + { + this.output = requireNonNull(output, "output is null"); + this.source = requireNonNull(source, "source is null"); + } + + @Override + public List getOutput() + { + return output; + } + + @Override + public TableExpression getSource() + { + return source; + } + + @Override + public boolean equals(Object o) + { + if (this == o) { + return true; + } + if (!(o instanceof ProjectExpression)) { + return false; + } + ProjectExpression that = (ProjectExpression) o; + return Objects.equals(output, that.output) && + Objects.equals(source, that.source); + } + + @Override + public int hashCode() + { + return Objects.hash(output, source); + } + + @Override + public String toString() + { + return "ProjectExpression{" + + "output=" + output + + ", source=" + source + + '}'; + } +} diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/relation/TableExpression.java b/presto-spi/src/main/java/com/facebook/presto/spi/relation/TableExpression.java new file mode 100644 index 0000000000000..07a518787a3e0 --- /dev/null +++ b/presto-spi/src/main/java/com/facebook/presto/spi/relation/TableExpression.java @@ -0,0 +1,23 @@ +/* + * 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 com.facebook.presto.spi.relation; + +import com.facebook.presto.spi.relation.column.ColumnExpression; + +import java.util.List; + +public abstract class TableExpression +{ + public abstract List getOutput(); +} diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/relation/TableScanExpression.java b/presto-spi/src/main/java/com/facebook/presto/spi/relation/TableScanExpression.java new file mode 100644 index 0000000000000..50f4367087adc --- /dev/null +++ b/presto-spi/src/main/java/com/facebook/presto/spi/relation/TableScanExpression.java @@ -0,0 +1,93 @@ +/* + * 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 com.facebook.presto.spi.relation; + +import com.facebook.presto.spi.ConnectorTableHandle; +import com.facebook.presto.spi.ConnectorTableLayoutHandle; +import com.facebook.presto.spi.relation.column.ColumnExpression; + +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +import static java.util.Objects.requireNonNull; + +public final class TableScanExpression + extends LeafTableExpression +{ + private final ConnectorTableHandle tableHandle; + private final List output; + private final Optional connectorTableLayoutHandle; + + public TableScanExpression( + ConnectorTableHandle tableHandle, + List output, + Optional connectorTableLayoutHandle) + { + this.tableHandle = requireNonNull(tableHandle, "tableHandle is null"); + this.output = requireNonNull(output, "output is null"); + this.connectorTableLayoutHandle = requireNonNull(connectorTableLayoutHandle, "connectorTableLayoutHandle is null"); + } + + public ConnectorTableHandle getTableHandle() + { + return tableHandle; + } + + public List getOutput() + { + return output; + } + + public Optional getConnectorTableLayoutHandle() + { + return connectorTableLayoutHandle; + } + + public TableScanExpression withTableLayout(ConnectorTableLayoutHandle connectorTableHandle) + { + return new TableScanExpression(tableHandle, output, Optional.of(connectorTableHandle)); + } + + @Override + public boolean equals(Object o) + { + if (this == o) { + return true; + } + if (!(o instanceof TableScanExpression)) { + return false; + } + TableScanExpression tableScan = (TableScanExpression) o; + return Objects.equals(tableHandle, tableScan.tableHandle) && + Objects.equals(output, tableScan.output) && + Objects.equals(connectorTableLayoutHandle, tableScan.connectorTableLayoutHandle); + } + + @Override + public int hashCode() + { + return Objects.hash(tableHandle, output, connectorTableLayoutHandle); + } + + @Override + public String toString() + { + return "TableScanExpression{" + + "tableHandle=" + tableHandle + + ", output=" + output + + ", connectorTableLayoutHandle=" + connectorTableLayoutHandle + + '}'; + } +} diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/relation/UnaryTableExpression.java b/presto-spi/src/main/java/com/facebook/presto/spi/relation/UnaryTableExpression.java new file mode 100644 index 0000000000000..a04d63a274654 --- /dev/null +++ b/presto-spi/src/main/java/com/facebook/presto/spi/relation/UnaryTableExpression.java @@ -0,0 +1,20 @@ +/* + * 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 com.facebook.presto.spi.relation; + +public abstract class UnaryTableExpression + extends TableExpression +{ + public abstract TableExpression getSource(); +} diff --git a/presto-main/src/main/java/com/facebook/presto/sql/relational/CallExpression.java b/presto-spi/src/main/java/com/facebook/presto/spi/relation/column/CallExpression.java similarity index 65% rename from presto-main/src/main/java/com/facebook/presto/sql/relational/CallExpression.java rename to presto-spi/src/main/java/com/facebook/presto/spi/relation/column/CallExpression.java index 8bc0f2720b8c4..5c732360d7191 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/relational/CallExpression.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/relation/column/CallExpression.java @@ -11,26 +11,26 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.facebook.presto.sql.relational; +package com.facebook.presto.spi.relation.column; -import com.facebook.presto.metadata.Signature; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; -import com.google.common.base.Joiner; -import com.google.common.collect.ImmutableList; +import java.util.ArrayList; import java.util.List; import java.util.Objects; +import static java.util.Collections.unmodifiableList; import static java.util.Objects.requireNonNull; public final class CallExpression - extends RowExpression + extends ColumnExpression { private final Signature signature; private final Type returnType; - private final List arguments; + private final List arguments; - public CallExpression(Signature signature, Type returnType, List arguments) + public CallExpression(Signature signature, Type returnType, List arguments) { requireNonNull(signature, "signature is null"); requireNonNull(arguments, "arguments is null"); @@ -38,7 +38,7 @@ public CallExpression(Signature signature, Type returnType, List this.signature = signature; this.returnType = returnType; - this.arguments = ImmutableList.copyOf(arguments); + this.arguments = unmodifiableList(new ArrayList(arguments)); } public Signature getSignature() @@ -52,7 +52,7 @@ public Type getType() return returnType; } - public List getArguments() + public List getArguments() { return arguments; } @@ -60,7 +60,13 @@ public List getArguments() @Override public String toString() { - return signature.getName() + "(" + Joiner.on(", ").join(arguments) + ")"; + StringBuilder callExpression = new StringBuilder(signature.getName()); + callExpression.append("(").append(arguments.get(0)); + for (int i = 1; i < arguments.size(); i++) { + callExpression.append(",").append(arguments.get(i)); + } + callExpression.append(")"); + return callExpression.toString(); } @Override @@ -83,7 +89,13 @@ public boolean equals(Object obj) } @Override - public R accept(RowExpressionVisitor visitor, C context) + public ColumnExpression replaceChildren(List newChildren) + { + return new CallExpression(signature, returnType, newChildren); + } + + @Override + public R accept(ColumnExpressionVisitor visitor, C context) { return visitor.visitCall(this, context); } diff --git a/presto-main/src/main/java/com/facebook/presto/sql/relational/RowExpression.java b/presto-spi/src/main/java/com/facebook/presto/spi/relation/column/ColumnExpression.java similarity index 73% rename from presto-main/src/main/java/com/facebook/presto/sql/relational/RowExpression.java rename to presto-spi/src/main/java/com/facebook/presto/spi/relation/column/ColumnExpression.java index 7541d74d783c8..d1bfdebb8c7eb 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/relational/RowExpression.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/relation/column/ColumnExpression.java @@ -11,11 +11,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.facebook.presto.sql.relational; +package com.facebook.presto.spi.relation.column; import com.facebook.presto.spi.type.Type; -public abstract class RowExpression +import java.util.List; + +public abstract class ColumnExpression { public abstract Type getType(); @@ -28,5 +30,7 @@ public abstract class RowExpression @Override public abstract String toString(); - public abstract R accept(RowExpressionVisitor visitor, C context); + public abstract ColumnExpression replaceChildren(List newChildren); + + public abstract R accept(ColumnExpressionVisitor visitor, C context); } diff --git a/presto-main/src/main/java/com/facebook/presto/sql/relational/RowExpressionVisitor.java b/presto-spi/src/main/java/com/facebook/presto/spi/relation/column/ColumnExpressionVisitor.java similarity index 82% rename from presto-main/src/main/java/com/facebook/presto/sql/relational/RowExpressionVisitor.java rename to presto-spi/src/main/java/com/facebook/presto/spi/relation/column/ColumnExpressionVisitor.java index c4f90c880f8b9..e8b31dcf1b5cd 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/relational/RowExpressionVisitor.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/relation/column/ColumnExpressionVisitor.java @@ -11,9 +11,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.facebook.presto.sql.relational; +package com.facebook.presto.spi.relation.column; -public interface RowExpressionVisitor +public interface ColumnExpressionVisitor { R visitCall(CallExpression call, C context); @@ -24,4 +24,6 @@ public interface RowExpressionVisitor R visitLambda(LambdaDefinitionExpression lambda, C context); R visitVariableReference(VariableReferenceExpression reference, C context); + + R visitColumnReference(ColumnReferenceExpression columnReferenceExpression, C context); } diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/relation/column/ColumnReferenceExpression.java b/presto-spi/src/main/java/com/facebook/presto/spi/relation/column/ColumnReferenceExpression.java new file mode 100644 index 0000000000000..4f1be631f474e --- /dev/null +++ b/presto-spi/src/main/java/com/facebook/presto/spi/relation/column/ColumnReferenceExpression.java @@ -0,0 +1,85 @@ +/* + * 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 com.facebook.presto.spi.relation.column; + +import com.facebook.presto.spi.ColumnHandle; +import com.facebook.presto.spi.type.Type; + +import java.util.List; +import java.util.Objects; + +public class ColumnReferenceExpression + extends ColumnExpression +{ + private final ColumnHandle columnHandle; + private final Type type; + + public ColumnReferenceExpression(ColumnHandle columnHandle, Type type) + { + this.columnHandle = columnHandle; + this.type = type; + } + + public ColumnHandle getColumnHandle() + { + return columnHandle; + } + + @Override + public Type getType() + { + return type; + } + + @Override + public boolean equals(Object o) + { + if (this == o) { + return true; + } + if (!(o instanceof ColumnReferenceExpression)) { + return false; + } + ColumnReferenceExpression that = (ColumnReferenceExpression) o; + return Objects.equals(columnHandle, that.columnHandle) && + Objects.equals(type, that.type); + } + + @Override + public int hashCode() + { + return Objects.hash(columnHandle, type); + } + + @Override + public String toString() + { + return "ColumnReferenceExpression{" + + "columnHandle=" + columnHandle + + ", type=" + type + + '}'; + } + + @Override + public ColumnExpression replaceChildren(List newChildren) + { + throw new UnsupportedOperationException(); + } + + @Override + public R accept(ColumnExpressionVisitor visitor, C context) + { + return visitor.visitColumnReference(this, context); + } +} diff --git a/presto-main/src/main/java/com/facebook/presto/sql/relational/ConstantExpression.java b/presto-spi/src/main/java/com/facebook/presto/spi/relation/column/ConstantExpression.java similarity index 83% rename from presto-main/src/main/java/com/facebook/presto/sql/relational/ConstantExpression.java rename to presto-spi/src/main/java/com/facebook/presto/spi/relation/column/ConstantExpression.java index eceed74ff0b94..a1a276e580783 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/relational/ConstantExpression.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/relation/column/ConstantExpression.java @@ -11,16 +11,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.facebook.presto.sql.relational; +package com.facebook.presto.spi.relation.column; import com.facebook.presto.spi.type.Type; +import java.util.List; import java.util.Objects; import static java.util.Objects.requireNonNull; public final class ConstantExpression - extends RowExpression + extends ColumnExpression { private final Object value; private final Type type; @@ -70,7 +71,13 @@ public boolean equals(Object obj) } @Override - public R accept(RowExpressionVisitor visitor, C context) + public ColumnExpression replaceChildren(List newChildren) + { + throw new UnsupportedOperationException(); + } + + @Override + public R accept(ColumnExpressionVisitor visitor, C context) { return visitor.visitConstant(this, context); } diff --git a/presto-main/src/main/java/com/facebook/presto/sql/relational/InputReferenceExpression.java b/presto-spi/src/main/java/com/facebook/presto/spi/relation/column/InputReferenceExpression.java similarity index 84% rename from presto-main/src/main/java/com/facebook/presto/sql/relational/InputReferenceExpression.java rename to presto-spi/src/main/java/com/facebook/presto/spi/relation/column/InputReferenceExpression.java index f6e09ea817408..280febcdd12ad 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/relational/InputReferenceExpression.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/relation/column/InputReferenceExpression.java @@ -11,17 +11,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.facebook.presto.sql.relational; +package com.facebook.presto.spi.relation.column; import com.facebook.presto.spi.type.Type; import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.List; import java.util.Objects; import static java.util.Objects.requireNonNull; public final class InputReferenceExpression - extends RowExpression + extends ColumnExpression { private final int field; private final Type type; @@ -60,7 +61,13 @@ public String toString() } @Override - public R accept(RowExpressionVisitor visitor, C context) + public ColumnExpression replaceChildren(List newChildren) + { + throw new UnsupportedOperationException(); + } + + @Override + public R accept(ColumnExpressionVisitor visitor, C context) { return visitor.visitInputReference(this, context); } diff --git a/presto-main/src/main/java/com/facebook/presto/sql/relational/LambdaDefinitionExpression.java b/presto-spi/src/main/java/com/facebook/presto/spi/relation/column/LambdaDefinitionExpression.java similarity index 57% rename from presto-main/src/main/java/com/facebook/presto/sql/relational/LambdaDefinitionExpression.java rename to presto-spi/src/main/java/com/facebook/presto/spi/relation/column/LambdaDefinitionExpression.java index 39b2439de31a6..12de9b7b96954 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/relational/LambdaDefinitionExpression.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/relation/column/LambdaDefinitionExpression.java @@ -11,30 +11,30 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.facebook.presto.sql.relational; +package com.facebook.presto.spi.relation.column; +import com.facebook.presto.spi.type.FunctionType; import com.facebook.presto.spi.type.Type; -import com.facebook.presto.type.FunctionType; -import com.google.common.base.Joiner; -import com.google.common.collect.ImmutableList; +import java.util.ArrayList; import java.util.List; import java.util.Objects; -import static com.google.common.base.Preconditions.checkArgument; +import static java.lang.String.format; +import static java.util.Collections.unmodifiableList; import static java.util.Objects.requireNonNull; public final class LambdaDefinitionExpression - extends RowExpression + extends ColumnExpression { private final List argumentTypes; private final List arguments; - private final RowExpression body; + private final ColumnExpression body; - public LambdaDefinitionExpression(List argumentTypes, List arguments, RowExpression body) + public LambdaDefinitionExpression(List argumentTypes, List arguments, ColumnExpression body) { - this.argumentTypes = ImmutableList.copyOf(requireNonNull(argumentTypes, "argumentTypes is null")); - this.arguments = ImmutableList.copyOf(requireNonNull(arguments, "arguments is null")); + this.argumentTypes = unmodifiableList(new ArrayList<>(requireNonNull(argumentTypes, "argumentTypes is null"))); + this.arguments = unmodifiableList(new ArrayList<>(requireNonNull(arguments, "arguments is null"))); checkArgument(argumentTypes.size() == arguments.size(), "Number of argument types does not match number of arguments"); this.body = requireNonNull(body, "body is null"); } @@ -49,7 +49,7 @@ public List getArguments() return arguments; } - public RowExpression getBody() + public ColumnExpression getBody() { return body; } @@ -63,7 +63,14 @@ public Type getType() @Override public String toString() { - return "(" + Joiner.on(",").join(arguments) + ") -> " + body; + StringBuilder lambdaDefinition = new StringBuilder(); + lambdaDefinition.append("(").append(arguments.get(0)); + for (int i = 1; i < arguments.size(); i++) { + lambdaDefinition.append(",").append(arguments.get(i)); + } + lambdaDefinition.append(") -> "); + lambdaDefinition.append(body); + return lambdaDefinition.toString(); } @Override @@ -88,8 +95,22 @@ public int hashCode() } @Override - public R accept(RowExpressionVisitor visitor, C context) + public ColumnExpression replaceChildren(List newChildren) + { + checkArgument(newChildren.size() == 1, "Lambda defintion can only has one children"); + return new LambdaDefinitionExpression(argumentTypes, arguments, newChildren.get(0)); + } + + @Override + public R accept(ColumnExpressionVisitor visitor, C context) { return visitor.visitLambda(this, context); } + + private static void checkArgument(boolean argument, String format, Object... args) + { + if (!argument) { + throw new IllegalArgumentException(format(format, args)); + } + } } diff --git a/presto-main/src/main/java/com/facebook/presto/sql/relational/VariableReferenceExpression.java b/presto-spi/src/main/java/com/facebook/presto/spi/relation/column/VariableReferenceExpression.java similarity index 83% rename from presto-main/src/main/java/com/facebook/presto/sql/relational/VariableReferenceExpression.java rename to presto-spi/src/main/java/com/facebook/presto/spi/relation/column/VariableReferenceExpression.java index 46ed7a1a2bff4..6e43033532177 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/relational/VariableReferenceExpression.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/relation/column/VariableReferenceExpression.java @@ -11,16 +11,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.facebook.presto.sql.relational; +package com.facebook.presto.spi.relation.column; import com.facebook.presto.spi.type.Type; +import java.util.List; import java.util.Objects; import static java.util.Objects.requireNonNull; public final class VariableReferenceExpression - extends RowExpression + extends ColumnExpression { private final String name; private final Type type; @@ -55,7 +56,13 @@ public String toString() } @Override - public R accept(RowExpressionVisitor visitor, C context) + public ColumnExpression replaceChildren(List newChildren) + { + throw new UnsupportedOperationException(); + } + + @Override + public R accept(ColumnExpressionVisitor visitor, C context) { return visitor.visitVariableReference(this, context); } diff --git a/presto-main/src/main/java/com/facebook/presto/type/FunctionType.java b/presto-spi/src/main/java/com/facebook/presto/spi/type/FunctionType.java similarity index 83% rename from presto-main/src/main/java/com/facebook/presto/type/FunctionType.java rename to presto-spi/src/main/java/com/facebook/presto/spi/type/FunctionType.java index a180b772de56e..ef833e035fdbe 100644 --- a/presto-main/src/main/java/com/facebook/presto/type/FunctionType.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/type/FunctionType.java @@ -11,22 +11,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.facebook.presto.type; +package com.facebook.presto.spi.type; import com.facebook.presto.spi.ConnectorSession; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; import com.facebook.presto.spi.block.BlockBuilderStatus; -import com.facebook.presto.spi.type.Type; -import com.facebook.presto.spi.type.TypeSignature; -import com.facebook.presto.spi.type.TypeSignatureParameter; -import com.google.common.base.Joiner; -import com.google.common.collect.ImmutableList; import io.airlift.slice.Slice; +import java.util.ArrayList; import java.util.List; -import static com.google.common.collect.ImmutableList.toImmutableList; +import static java.util.Collections.unmodifiableList; import static java.util.Objects.requireNonNull; public class FunctionType @@ -42,20 +38,20 @@ public FunctionType(List argumentTypes, Type returnType) { this.signature = new TypeSignature(NAME, typeParameters(argumentTypes, returnType)); this.returnType = requireNonNull(returnType, "returnType is null"); - this.argumentTypes = ImmutableList.copyOf(requireNonNull(argumentTypes, "argumentTypes is null")); + this.argumentTypes = unmodifiableList(new ArrayList<>(requireNonNull(argumentTypes, "argumentTypes is null"))); } private static List typeParameters(List argumentTypes, Type returnType) { requireNonNull(returnType, "returnType is null"); requireNonNull(argumentTypes, "argumentTypes is null"); - ImmutableList.Builder builder = ImmutableList.builder(); + List parameters = new ArrayList<>(argumentTypes.size() + 1); argumentTypes.stream() .map(Type::getTypeSignature) .map(TypeSignatureParameter::of) - .forEach(builder::add); - builder.add(TypeSignatureParameter.of(returnType.getTypeSignature())); - return builder.build(); + .forEach(parameters::add); + parameters.add(TypeSignatureParameter.of(returnType.getTypeSignature())); + return unmodifiableList(parameters); } public Type getReturnType() @@ -71,7 +67,11 @@ public List getArgumentTypes() @Override public List getTypeParameters() { - return ImmutableList.builder().addAll(argumentTypes).add(returnType).build(); + List parameters = new ArrayList<>(argumentTypes.size() + 1); + argumentTypes.stream() + .forEach(parameters::add); + parameters.add(returnType); + return unmodifiableList(parameters); } @Override @@ -83,10 +83,16 @@ public final TypeSignature getTypeSignature() @Override public String getDisplayName() { - ImmutableList names = getTypeParameters().stream() - .map(Type::getDisplayName) - .collect(toImmutableList()); - return "function<" + Joiner.on(",").join(names) + ">"; + StringBuilder name = new StringBuilder("function"); + List types = getTypeParameters(); + name.append("<"); + name.append(types.get(0).getDisplayName()); + for (int i = 1; i < types.size(); i++) { + name.append(","); + name.append(types.get(i).getDisplayName()); + } + name.append(">"); + return name.toString(); } @Override diff --git a/presto-tests/src/main/java/com/facebook/presto/tests/AbstractTestQueryFramework.java b/presto-tests/src/main/java/com/facebook/presto/tests/AbstractTestQueryFramework.java index e3fe104a1cce4..203e7ad74e8db 100644 --- a/presto-tests/src/main/java/com/facebook/presto/tests/AbstractTestQueryFramework.java +++ b/presto-tests/src/main/java/com/facebook/presto/tests/AbstractTestQueryFramework.java @@ -14,6 +14,7 @@ package com.facebook.presto.tests; import com.facebook.presto.Session; +import com.facebook.presto.connector.ConnectorOptimizationRuleManager; import com.facebook.presto.cost.CostCalculator; import com.facebook.presto.cost.CostCalculatorUsingExchanges; import com.facebook.presto.cost.CostCalculatorWithEstimatedExchanges; @@ -349,7 +350,8 @@ private QueryExplainer getQueryExplainer() costCalculator, new CostCalculatorWithEstimatedExchanges(costCalculator, taskCountEstimator), new CostComparator(featuresConfig), - taskCountEstimator).get(); + taskCountEstimator, + new ConnectorOptimizationRuleManager()).get(); return new QueryExplainer( optimizers, new PlanFragmenter(metadata, queryRunner.getNodePartitioningManager(), new QueryManagerConfig()), diff --git a/presto-tests/src/main/java/com/facebook/presto/tests/StatefulSleepingSum.java b/presto-tests/src/main/java/com/facebook/presto/tests/StatefulSleepingSum.java index d30a8305815f3..3923b5867acdf 100644 --- a/presto-tests/src/main/java/com/facebook/presto/tests/StatefulSleepingSum.java +++ b/presto-tests/src/main/java/com/facebook/presto/tests/StatefulSleepingSum.java @@ -14,11 +14,11 @@ package com.facebook.presto.tests; import com.facebook.presto.metadata.BoundVariables; -import com.facebook.presto.metadata.FunctionKind; import com.facebook.presto.metadata.FunctionRegistry; -import com.facebook.presto.metadata.Signature; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; +import com.facebook.presto.spi.function.FunctionKind; +import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.TypeManager; import com.google.common.collect.ImmutableList; @@ -26,9 +26,9 @@ import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.atomic.AtomicInteger; -import static com.facebook.presto.metadata.Signature.typeVariable; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.Reflection.constructorMethodHandle; import static com.facebook.presto.util.Reflection.methodHandle;