From b4069babbf6410e90ca3a3324bba1c2a4951162b Mon Sep 17 00:00:00 2001 From: Rongrong Zhong Date: Fri, 4 Oct 2019 15:08:49 -0700 Subject: [PATCH 01/11] Remove TypeProvider from LocalExecutionPlanContext --- .../sql/planner/LocalExecutionPlanner.java | 32 +++++++------------ 1 file changed, 11 insertions(+), 21 deletions(-) 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 4499d35027951..346c7234e4875 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 @@ -487,7 +487,7 @@ public LocalExecutionPlan plan( TableWriteInfo tableWriteInfo) { Session session = taskContext.getSession(); - LocalExecutionPlanContext context = new LocalExecutionPlanContext(taskContext, types, taskExchangeClientManager, tableWriteInfo); + LocalExecutionPlanContext context = new LocalExecutionPlanContext(taskContext, taskExchangeClientManager, tableWriteInfo); PhysicalOperation physicalOperation = plan.accept(new Visitor(session, stageExecutionDescriptor), context); @@ -558,7 +558,6 @@ private static void addLookupOuterDrivers(LocalExecutionPlanContext context) private static class LocalExecutionPlanContext { private final TaskContext taskContext; - private final TypeProvider types; private final TaskExchangeClientManager taskExchangeClientManager; private final List driverFactories; private final Optional indexSourceContext; @@ -573,16 +572,14 @@ private static class LocalExecutionPlanContext public LocalExecutionPlanContext( TaskContext taskContext, - TypeProvider types, TaskExchangeClientManager taskExchangeClientManager, TableWriteInfo tableWriteInfo) { - this(taskContext, types, taskExchangeClientManager, new ArrayList<>(), Optional.empty(), new AtomicInteger(0), tableWriteInfo); + this(taskContext, taskExchangeClientManager, new ArrayList<>(), Optional.empty(), new AtomicInteger(0), tableWriteInfo); } private LocalExecutionPlanContext( TaskContext taskContext, - TypeProvider types, TaskExchangeClientManager taskExchangeClientManager, List driverFactories, Optional indexSourceContext, @@ -590,7 +587,6 @@ private LocalExecutionPlanContext( TableWriteInfo tableWriteInfo) { this.taskContext = taskContext; - this.types = types; this.taskExchangeClientManager = taskExchangeClientManager; this.driverFactories = driverFactories; this.indexSourceContext = indexSourceContext; @@ -627,11 +623,6 @@ public StageExecutionId getStageExecutionId() return taskContext.getTaskId().getStageExecutionId(); } - public TypeProvider getTypes() - { - return types; - } - public TaskExchangeClientManager getTaskExchangeClientManager() { return taskExchangeClientManager; @@ -670,12 +661,12 @@ public TableWriteInfo getTableWriteInfo() public LocalExecutionPlanContext createSubContext() { checkState(!indexSourceContext.isPresent(), "index build plan can not have sub-contexts"); - return new LocalExecutionPlanContext(taskContext, types, taskExchangeClientManager, driverFactories, indexSourceContext, nextPipelineId, tableWriteInfo); + return new LocalExecutionPlanContext(taskContext, taskExchangeClientManager, driverFactories, indexSourceContext, nextPipelineId, tableWriteInfo); } public LocalExecutionPlanContext createIndexSourceSubContext(IndexSourceContext indexSourceContext) { - return new LocalExecutionPlanContext(taskContext, types, taskExchangeClientManager, driverFactories, Optional.of(indexSourceContext), nextPipelineId, tableWriteInfo); + return new LocalExecutionPlanContext(taskContext, taskExchangeClientManager, driverFactories, Optional.of(indexSourceContext), nextPipelineId, tableWriteInfo); } public OptionalInt getDriverInstanceCount() @@ -771,7 +762,7 @@ private PhysicalOperation createMergeSource(RemoteSourceNode node, LocalExecutio List sortChannels = getChannelsForVariables(orderingScheme.getOrderByVariables(), layout); List sortOrder = getOrderingList(orderingScheme); - List types = getSourceOperatorTypes(node, context.getTypes()); + List types = getSourceOperatorTypes(node); ImmutableList outputChannels = IntStream.range(0, types.size()) .boxed() .collect(toImmutableList()); @@ -2494,7 +2485,7 @@ private PhysicalOperation createLocalMerge(ExchangeNode node, LocalExecutionPlan PhysicalOperation source = sourceNode.accept(this, subContext); int operatorsCount = subContext.getDriverInstanceCount().orElse(1); - List types = getSourceOperatorTypes(node, context.getTypes()); + List types = getSourceOperatorTypes(node); LocalExchangeFactory exchangeFactory = new LocalExchangeFactory( partitioningProviderManager, session, @@ -2549,7 +2540,7 @@ else if (context.getDriverInstanceCount().isPresent()) { context.setDriverInstanceCount(driverInstanceCount); } - List types = getSourceOperatorTypes(node, context.getTypes()); + List types = getSourceOperatorTypes(node); List channels = node.getPartitioningScheme().getPartitioning().getArguments().stream() .map(argument -> { checkArgument(argument instanceof VariableReferenceExpression, format("Expect VariableReferenceExpression but get %s", argument)); @@ -2622,7 +2613,7 @@ public PhysicalOperation visitPlan(PlanNode node, LocalExecutionPlanContext cont throw new UnsupportedOperationException("not yet implemented"); } - private List getSourceOperatorTypes(PlanNode node, TypeProvider types) + private List getSourceOperatorTypes(PlanNode node) { return getVariableTypes(node.getOutputVariables()); } @@ -2636,8 +2627,7 @@ private List getVariableTypes(List variables) private AccumulatorFactory buildAccumulatorFactory( PhysicalOperation source, - Aggregation aggregation, - TypeProvider types) + Aggregation aggregation) { FunctionManager functionManager = metadata.getFunctionManager(); InternalAggregationFunction internalAggregationFunction = functionManager.getAggregateFunctionImplementation(aggregation.getFunctionHandle()); @@ -2718,7 +2708,7 @@ private AggregationOperatorFactory createAggregationOperatorFactory( for (Map.Entry entry : aggregations.entrySet()) { VariableReferenceExpression variable = entry.getKey(); Aggregation aggregation = entry.getValue(); - accumulatorFactories.add(buildAccumulatorFactory(source, aggregation, context.getTypes())); + accumulatorFactories.add(buildAccumulatorFactory(source, aggregation)); outputMappings.put(variable, outputChannel); // one aggregation per channel outputChannel++; } @@ -2781,7 +2771,7 @@ private OperatorFactory createHashAggregationOperatorFactory( VariableReferenceExpression variable = entry.getKey(); Aggregation aggregation = entry.getValue(); - accumulatorFactories.add(buildAccumulatorFactory(source, aggregation, context.getTypes())); + accumulatorFactories.add(buildAccumulatorFactory(source, aggregation)); aggregationOutputVariables.add(variable); } From 9cb7095a6e7ab73276b6e5228642360109f7426c Mon Sep 17 00:00:00 2001 From: Rongrong Zhong Date: Tue, 10 Sep 2019 18:16:26 -0700 Subject: [PATCH 02/11] Check call convention once in ExpressionInterpreter.visitFunctionCall --- .../presto/sql/planner/ExpressionInterpreter.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) 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 48da9402878c2..0c69e02d16fe2 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 @@ -894,10 +894,12 @@ protected Object visitFunctionCall(FunctionCall node, Object context) } FunctionHandle functionHandle = metadata.getFunctionManager().resolveFunction(session, node.getName(), fromTypes(argumentTypes)); FunctionMetadata functionMetadata = metadata.getFunctionManager().getFunctionMetadata(functionHandle); - for (int i = 0; i < argumentValues.size(); i++) { - Object value = argumentValues.get(i); - if (value == null && !functionMetadata.isCalledOnNullInput()) { - return null; + if (!functionMetadata.isCalledOnNullInput()) { + for (int i = 0; i < argumentValues.size(); i++) { + Object value = argumentValues.get(i); + if (value == null) { + return null; + } } } From a66271b164e9530e07463429832ae749f56d19c1 Mon Sep 17 00:00:00 2001 From: Rongrong Zhong Date: Mon, 14 Oct 2019 15:32:53 -0700 Subject: [PATCH 03/11] Check call convention once in RowExpressionInterpreter.visitCall --- .../sql/planner/RowExpressionInterpreter.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/RowExpressionInterpreter.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/RowExpressionInterpreter.java index 3b2f5a2a6fd25..05c762569a761 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/RowExpressionInterpreter.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/RowExpressionInterpreter.java @@ -207,17 +207,22 @@ public Object visitCall(CallExpression node, Object context) { List argumentTypes = new ArrayList<>(); List argumentValues = new ArrayList<>(); - FunctionHandle functionHandle = node.getFunctionHandle(); - FunctionMetadata functionMetadata = metadata.getFunctionManager().getFunctionMetadata(node.getFunctionHandle()); for (RowExpression expression : node.getArguments()) { Object value = expression.accept(this, context); - if (value == null && !functionMetadata.isCalledOnNullInput()) { - return null; - } argumentValues.add(value); argumentTypes.add(expression.getType()); } + FunctionHandle functionHandle = node.getFunctionHandle(); + FunctionMetadata functionMetadata = metadata.getFunctionManager().getFunctionMetadata(node.getFunctionHandle()); + if (!functionMetadata.isCalledOnNullInput()) { + for (Object value : argumentValues) { + if (value == null) { + return null; + } + } + } + // Special casing for large constant array construction if (resolution.isArrayConstructor(functionHandle)) { SpecialCallResult result = tryHandleArrayConstructor(node, argumentValues); From 43b0d900d66056a490b2509e6805d0b833d6e470 Mon Sep 17 00:00:00 2001 From: Rongrong Zhong Date: Thu, 10 Oct 2019 20:22:40 -0700 Subject: [PATCH 04/11] Fix error message in FunctionManager --- .../java/com/facebook/presto/metadata/FunctionManager.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/FunctionManager.java b/presto-main/src/main/java/com/facebook/presto/metadata/FunctionManager.java index 32c508c9039c7..605015dc11ff7 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/FunctionManager.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/FunctionManager.java @@ -129,8 +129,9 @@ public void loadFunctionNamespaces(String functionNamespaceManagerName, List otherFunctionNamespaceManager = functionNamespaces.putIfAbsent(FullyQualifiedName.Prefix.of(functionNamespacePrefix), functionNamespaceManager); + if (otherFunctionNamespaceManager != null) { + throw new IllegalArgumentException(format("Function namespace manager '%s' already registered to handle function namespace '%s'", otherFunctionNamespaceManager.getName(), functionNamespacePrefix)); } } } From 7c704ee0bf2934d8293759ac202f16bf232a7b74 Mon Sep 17 00:00:00 2001 From: Rongrong Zhong Date: Thu, 12 Sep 2019 11:12:23 -0700 Subject: [PATCH 05/11] Factor out Expression related session configs into SqlFunctionProperties --- .../presto/hive/AbstractTestHiveClient.java | 7 ++ .../facebook/presto/FullConnectorSession.java | 15 ++- .../java/com/facebook/presto/Session.java | 14 +++ .../presto/metadata/FunctionManager.java | 12 +- .../sql/analyzer/ExpressionAnalyzer.java | 38 ++++--- .../sql/planner/ExpressionInterpreter.java | 2 +- .../SqlToRowExpressionTranslator.java | 2 +- .../testing/TestingConnectorSession.java | 22 ++-- .../presto/metadata/TestFunctionManager.java | 4 +- .../AbstractTestAggregationFunction.java | 2 +- .../iterative/rule/test/PlanBuilder.java | 2 +- .../facebook/presto/spi/ConnectorSession.java | 12 ++ .../spi/function/SqlFunctionProperties.java | 103 ++++++++++++++++++ .../presto/spi/block/TestingSession.java | 7 ++ 14 files changed, 200 insertions(+), 42 deletions(-) create mode 100644 presto-spi/src/main/java/com/facebook/presto/spi/function/SqlFunctionProperties.java diff --git a/presto-hive/src/test/java/com/facebook/presto/hive/AbstractTestHiveClient.java b/presto-hive/src/test/java/com/facebook/presto/hive/AbstractTestHiveClient.java index 89975bf507459..2fc0be0234f87 100644 --- a/presto-hive/src/test/java/com/facebook/presto/hive/AbstractTestHiveClient.java +++ b/presto-hive/src/test/java/com/facebook/presto/hive/AbstractTestHiveClient.java @@ -79,6 +79,7 @@ import com.facebook.presto.spi.connector.ConnectorSplitManager; import com.facebook.presto.spi.connector.ConnectorSplitManager.SplitSchedulingContext; import com.facebook.presto.spi.connector.ConnectorTransactionHandle; +import com.facebook.presto.spi.function.SqlFunctionProperties; import com.facebook.presto.spi.predicate.Domain; import com.facebook.presto.spi.predicate.NullableValue; import com.facebook.presto.spi.predicate.Range; @@ -949,6 +950,12 @@ public boolean isLegacyTimestamp() return session.isLegacyTimestamp(); } + @Override + public SqlFunctionProperties getSqlFunctionProperties() + { + return session.getSqlFunctionProperties(); + } + @Override public T getProperty(String name, Class type) { diff --git a/presto-main/src/main/java/com/facebook/presto/FullConnectorSession.java b/presto-main/src/main/java/com/facebook/presto/FullConnectorSession.java index 4cdaf15d90ed5..58a359f73a2ba 100644 --- a/presto-main/src/main/java/com/facebook/presto/FullConnectorSession.java +++ b/presto-main/src/main/java/com/facebook/presto/FullConnectorSession.java @@ -17,6 +17,7 @@ import com.facebook.presto.spi.ConnectorId; import com.facebook.presto.spi.ConnectorSession; import com.facebook.presto.spi.PrestoException; +import com.facebook.presto.spi.function.SqlFunctionProperties; import com.facebook.presto.spi.security.ConnectorIdentity; import com.facebook.presto.spi.type.TimeZoneKey; import com.google.common.collect.ImmutableMap; @@ -39,7 +40,7 @@ public class FullConnectorSession private final ConnectorId connectorId; private final String catalog; private final SessionPropertyManager sessionPropertyManager; - private final boolean isLegacyTimestamp; + private final SqlFunctionProperties sqlFunctionProperties; public FullConnectorSession(Session session, ConnectorIdentity identity) { @@ -49,7 +50,7 @@ public FullConnectorSession(Session session, ConnectorIdentity identity) this.connectorId = null; this.catalog = null; this.sessionPropertyManager = null; - this.isLegacyTimestamp = SystemSessionProperties.isLegacyTimestamp(session); + this.sqlFunctionProperties = session.getSqlFunctionProperties(); } public FullConnectorSession( @@ -66,7 +67,7 @@ public FullConnectorSession( this.connectorId = requireNonNull(connectorId, "connectorId is null"); this.catalog = requireNonNull(catalog, "catalog is null"); this.sessionPropertyManager = requireNonNull(sessionPropertyManager, "sessionPropertyManager is null"); - this.isLegacyTimestamp = SystemSessionProperties.isLegacyTimestamp(session); + this.sqlFunctionProperties = session.getSqlFunctionProperties(); } public Session getSession() @@ -125,7 +126,13 @@ public Optional getClientInfo() @Override public boolean isLegacyTimestamp() { - return isLegacyTimestamp; + return sqlFunctionProperties.isLegacyTimestamp(); + } + + @Override + public SqlFunctionProperties getSqlFunctionProperties() + { + return sqlFunctionProperties; } @Override diff --git a/presto-main/src/main/java/com/facebook/presto/Session.java b/presto-main/src/main/java/com/facebook/presto/Session.java index cccecb87405f9..fe4f05ea2e3da 100644 --- a/presto-main/src/main/java/com/facebook/presto/Session.java +++ b/presto-main/src/main/java/com/facebook/presto/Session.java @@ -19,6 +19,7 @@ import com.facebook.presto.spi.ConnectorSession; import com.facebook.presto.spi.PrestoException; import com.facebook.presto.spi.QueryId; +import com.facebook.presto.spi.function.SqlFunctionProperties; import com.facebook.presto.spi.security.Identity; import com.facebook.presto.spi.security.SelectedRole; import com.facebook.presto.spi.session.ResourceEstimates; @@ -43,6 +44,9 @@ import java.util.TimeZone; import java.util.stream.Collectors; +import static com.facebook.presto.SystemSessionProperties.isLegacyRowFieldOrdinalAccessEnabled; +import static com.facebook.presto.SystemSessionProperties.isLegacyTimestamp; +import static com.facebook.presto.SystemSessionProperties.isParseDecimalLiteralsAsDouble; import static com.facebook.presto.spi.ConnectorId.createInformationSchemaConnectorId; import static com.facebook.presto.spi.ConnectorId.createSystemTablesConnectorId; import static com.facebook.presto.spi.StandardErrorCode.NOT_FOUND; @@ -409,6 +413,16 @@ public ConnectorSession toConnectorSession() return new FullConnectorSession(this, identity.toConnectorIdentity()); } + public SqlFunctionProperties getSqlFunctionProperties() + { + return SqlFunctionProperties.builder() + .setTimeZoneKey(timeZoneKey) + .setLegacyRowFieldOrdinalAccessEnabled(isLegacyRowFieldOrdinalAccessEnabled(this)) + .setLegacyTimestamp(isLegacyTimestamp(this)) + .setParseDecimalLiteralAsDouble(isParseDecimalLiteralsAsDouble(this)) + .build(); + } + public ConnectorSession toConnectorSession(ConnectorId connectorId) { requireNonNull(connectorId, "connectorId is null"); diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/FunctionManager.java b/presto-main/src/main/java/com/facebook/presto/metadata/FunctionManager.java index 605015dc11ff7..843fd98149706 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/FunctionManager.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/FunctionManager.java @@ -36,6 +36,7 @@ import com.facebook.presto.sql.analyzer.FeaturesConfig; import com.facebook.presto.sql.analyzer.TypeSignatureProvider; import com.facebook.presto.sql.tree.QualifiedName; +import com.facebook.presto.transaction.TransactionId; import com.facebook.presto.transaction.TransactionManager; import com.facebook.presto.type.TypeRegistry; import com.google.common.annotations.VisibleForTesting; @@ -169,12 +170,7 @@ public List listFunctions() * * @throws PrestoException if there are no matches or multiple matches */ - public FunctionHandle resolveFunction(Session session, QualifiedName name, List parameterTypes) - { - return resolveFunction(Optional.of(session), name, parameterTypes); - } - - private FunctionHandle resolveFunction(Optional session, QualifiedName name, List parameterTypes) + public FunctionHandle resolveFunction(Optional transactionId, QualifiedName name, List parameterTypes) { FullyQualifiedName functionName; if (!name.getPrefix().isPresent()) { @@ -189,8 +185,8 @@ private FunctionHandle resolveFunction(Optional session, QualifiedName throw new PrestoException(FUNCTION_NOT_FOUND, format("Cannot find function namespace for function %s", name)); } - Optional transactionHandle = session.flatMap(Session::getTransactionId) - .map(transactionId -> transactionManager.getFunctionNamespaceTransaction(transactionId, functionNamespaceManager.get().getName())); + Optional transactionHandle = transactionId + .map(id -> transactionManager.getFunctionNamespaceTransaction(id, functionNamespaceManager.get().getName())); Collection candidates = functionNamespaceManager.get().getFunctions(transactionHandle, functionName); try { 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 63ada762b12f0..c17ac25e0ccce 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 @@ -14,7 +14,6 @@ package com.facebook.presto.sql.analyzer; import com.facebook.presto.Session; -import com.facebook.presto.SystemSessionProperties; import com.facebook.presto.execution.warnings.WarningCollector; import com.facebook.presto.metadata.FunctionManager; import com.facebook.presto.metadata.Metadata; @@ -27,6 +26,7 @@ import com.facebook.presto.spi.function.FunctionHandle; import com.facebook.presto.spi.function.FunctionMetadata; import com.facebook.presto.spi.function.OperatorType; +import com.facebook.presto.spi.function.SqlFunctionProperties; import com.facebook.presto.spi.type.CharType; import com.facebook.presto.spi.type.DecimalParseResult; import com.facebook.presto.spi.type.Decimals; @@ -96,6 +96,7 @@ 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.transaction.TransactionId; import com.google.common.collect.HashMultimap; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; @@ -114,7 +115,6 @@ import java.util.Set; import java.util.function.Function; -import static com.facebook.presto.SystemSessionProperties.isLegacyRowFieldOrdinalAccessEnabled; import static com.facebook.presto.metadata.CastType.CAST; import static com.facebook.presto.spi.function.OperatorType.SUBSCRIPT; import static com.facebook.presto.spi.type.BigintType.BIGINT; @@ -175,7 +175,6 @@ public class ExpressionAnalyzer private final Function statementAnalyzerFactory; private final TypeProvider symbolTypes; private final boolean isDescribe; - private final boolean legacyRowFieldOrdinalAccess; private final Map, FunctionHandle> resolvedFunctions = new LinkedHashMap<>(); private final Set> scalarSubqueries = new LinkedHashSet<>(); @@ -191,15 +190,17 @@ public class ExpressionAnalyzer private final Set> windowFunctions = new LinkedHashSet<>(); private final Multimap tableColumnReferences = HashMultimap.create(); - private final Session session; + private final Optional transactionId; + private final SqlFunctionProperties sqlFunctionProperties; private final List parameters; private final WarningCollector warningCollector; - public ExpressionAnalyzer( + private ExpressionAnalyzer( FunctionManager functionManager, TypeManager typeManager, Function statementAnalyzerFactory, - Session session, + Optional transactionId, + SqlFunctionProperties sqlFunctionProperties, TypeProvider symbolTypes, List parameters, WarningCollector warningCollector, @@ -208,11 +209,11 @@ public ExpressionAnalyzer( this.functionManager = requireNonNull(functionManager, "functionManager is null"); this.typeManager = requireNonNull(typeManager, "typeManager is null"); this.statementAnalyzerFactory = requireNonNull(statementAnalyzerFactory, "statementAnalyzerFactory is null"); - this.session = requireNonNull(session, "session is null"); + this.transactionId = requireNonNull(transactionId, "transactionId is null"); + this.sqlFunctionProperties = requireNonNull(sqlFunctionProperties, "sqlFunctionProperties is null"); this.symbolTypes = requireNonNull(symbolTypes, "symbolTypes is null"); this.parameters = requireNonNull(parameters, "parameters is null"); this.isDescribe = isDescribe; - this.legacyRowFieldOrdinalAccess = isLegacyRowFieldOrdinalAccessEnabled(session); this.warningCollector = requireNonNull(warningCollector, "warningCollector is null"); } @@ -453,7 +454,7 @@ protected Type visitDereferenceExpression(DereferenceExpression node, StackableA } } - if (legacyRowFieldOrdinalAccess && rowFieldType == null) { + if (sqlFunctionProperties.isLegacyRowFieldOrdinalAccessEnabled() && rowFieldType == null) { OptionalInt rowIndex = parseAnonymousRowFieldOrdinalAccess(fieldName, rowType.getFields()); if (rowIndex.isPresent()) { rowFieldType = rowType.getFields().get(rowIndex.getAsInt()).getType(); @@ -784,8 +785,8 @@ protected Type visitTimeLiteral(TimeLiteral node, StackableAstVisitorContext context) { try { - if (SystemSessionProperties.isLegacyTimestamp(session)) { - parseTimestampLiteral(session.getTimeZoneKey(), node.getValue()); + if (sqlFunctionProperties.isLegacyTimestamp()) { + parseTimestampLiteral(sqlFunctionProperties.getTimeZoneKey(), node.getValue()); } else { parseTimestampLiteral(node.getValue()); @@ -879,7 +880,8 @@ protected Type visitFunctionCall(FunctionCall node, StackableAstVisitorContext argumentTypes = argumentTypesBuilder.build(); - FunctionHandle function = resolveFunction(session, node, argumentTypes, functionManager); + FunctionHandle function = resolveFunction(transactionId, node, argumentTypes, functionManager); FunctionMetadata functionMetadata = functionManager.getFunctionMetadata(function); if (node.getOrderBy().isPresent()) { @@ -1449,10 +1451,10 @@ public List getFunctionInputTypes() } } - public static FunctionHandle resolveFunction(Session session, FunctionCall node, List argumentTypes, FunctionManager functionManager) + public static FunctionHandle resolveFunction(Optional transactionId, FunctionCall node, List argumentTypes, FunctionManager functionManager) { try { - return functionManager.resolveFunction(session, node.getName(), argumentTypes); + return functionManager.resolveFunction(transactionId, node.getName(), argumentTypes); } catch (PrestoException e) { if (e.getErrorCode().getCode() == StandardErrorCode.FUNCTION_NOT_FOUND.toErrorCode().getCode()) { @@ -1585,7 +1587,8 @@ private static ExpressionAnalyzer create( metadata.getFunctionManager(), metadata.getTypeManager(), node -> new StatementAnalyzer(analysis, metadata, sqlParser, accessControl, session, warningCollector), - session, + session.getTransactionId(), + session.getSqlFunctionProperties(), types, analysis.getParameters(), warningCollector, @@ -1655,7 +1658,8 @@ public static ExpressionAnalyzer createWithoutSubqueries( node -> { throw statementAnalyzerRejection.apply(node); }, - session, + session.getTransactionId(), + session.getSqlFunctionProperties(), symbolTypes, parameters, warningCollector, 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 0c69e02d16fe2..04c41662a199b 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 @@ -892,7 +892,7 @@ protected Object visitFunctionCall(FunctionCall node, Object context) argumentValues.add(value); argumentTypes.add(type); } - FunctionHandle functionHandle = metadata.getFunctionManager().resolveFunction(session, node.getName(), fromTypes(argumentTypes)); + FunctionHandle functionHandle = metadata.getFunctionManager().resolveFunction(session.getTransactionId(), node.getName(), fromTypes(argumentTypes)); FunctionMetadata functionMetadata = metadata.getFunctionManager().getFunctionMetadata(functionHandle); if (!functionMetadata.isCalledOnNullInput()) { for (int i = 0; i < argumentValues.size(); i++) { 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/SqlToRowExpressionTranslator.java index 12072b8729175..9fe43b6486384 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/SqlToRowExpressionTranslator.java @@ -383,7 +383,7 @@ protected RowExpression visitFunctionCall(FunctionCall node, Void context) .map(TypeSignatureProvider::new) .collect(toImmutableList()); - return call(node.getName().toString(), functionManager.resolveFunction(session, node.getName(), argumentTypes), getType(node), arguments); + return call(node.getName().toString(), functionManager.resolveFunction(session.getTransactionId(), node.getName(), argumentTypes), getType(node), arguments); } @Override diff --git a/presto-main/src/main/java/com/facebook/presto/testing/TestingConnectorSession.java b/presto-main/src/main/java/com/facebook/presto/testing/TestingConnectorSession.java index 61f8faf2fca35..5215d54bb3950 100644 --- a/presto-main/src/main/java/com/facebook/presto/testing/TestingConnectorSession.java +++ b/presto-main/src/main/java/com/facebook/presto/testing/TestingConnectorSession.java @@ -16,6 +16,7 @@ import com.facebook.presto.execution.QueryIdGenerator; import com.facebook.presto.spi.ConnectorSession; import com.facebook.presto.spi.PrestoException; +import com.facebook.presto.spi.function.SqlFunctionProperties; import com.facebook.presto.spi.security.ConnectorIdentity; import com.facebook.presto.spi.session.PropertyMetadata; import com.facebook.presto.spi.type.TimeZoneKey; @@ -44,14 +45,13 @@ public class TestingConnectorSession private final String queryId; private final ConnectorIdentity identity; private final Optional source; - private final TimeZoneKey timeZoneKey; private final Locale locale; private final Optional traceToken; private final long startTime; private final Map> properties; private final Map propertyValues; - private final boolean isLegacyTimestamp; private final Optional clientInfo; + private final SqlFunctionProperties sqlFunctionProperties; public TestingConnectorSession(List> properties) { @@ -74,13 +74,15 @@ public TestingConnectorSession( this.identity = new ConnectorIdentity(requireNonNull(user, "user is null"), Optional.empty(), Optional.empty()); this.source = requireNonNull(source, "source is null"); this.traceToken = requireNonNull(traceToken, "traceToken is null"); - this.timeZoneKey = requireNonNull(timeZoneKey, "timeZoneKey is null"); this.locale = requireNonNull(locale, "locale is null"); this.startTime = startTime; this.properties = Maps.uniqueIndex(propertyMetadatas, PropertyMetadata::getName); this.propertyValues = ImmutableMap.copyOf(propertyValues); - this.isLegacyTimestamp = isLegacyTimestamp; this.clientInfo = clientInfo; + this.sqlFunctionProperties = SqlFunctionProperties.builder() + .setTimeZoneKey(requireNonNull(timeZoneKey, "timeZoneKey is null")) + .setLegacyTimestamp(isLegacyTimestamp) + .build(); } @Override @@ -104,7 +106,7 @@ public ConnectorIdentity getIdentity() @Override public TimeZoneKey getTimeZoneKey() { - return timeZoneKey; + return sqlFunctionProperties.getTimeZoneKey(); } @Override @@ -134,7 +136,13 @@ public Optional getClientInfo() @Override public boolean isLegacyTimestamp() { - return isLegacyTimestamp; + return sqlFunctionProperties.isLegacyTimestamp(); + } + + @Override + public SqlFunctionProperties getSqlFunctionProperties() + { + return SqlFunctionProperties.builder().setTimeZoneKey(UTC_KEY).build(); } @Override @@ -158,9 +166,9 @@ public String toString() .add("user", getUser()) .add("source", source.orElse(null)) .add("traceToken", traceToken.orElse(null)) - .add("timeZoneKey", timeZoneKey) .add("locale", locale) .add("startTime", startTime) + .add("sqlFunctionProperties", sqlFunctionProperties) .add("properties", propertyValues) .add("clientInfo", clientInfo) .omitNullValues() diff --git a/presto-main/src/test/java/com/facebook/presto/metadata/TestFunctionManager.java b/presto-main/src/test/java/com/facebook/presto/metadata/TestFunctionManager.java index 87d73d60beafc..a74c74f3faca3 100644 --- a/presto-main/src/test/java/com/facebook/presto/metadata/TestFunctionManager.java +++ b/presto-main/src/test/java/com/facebook/presto/metadata/TestFunctionManager.java @@ -109,7 +109,7 @@ public void testMagicLiteralFunction() TypeRegistry typeManager = new TypeRegistry(); FunctionManager functionManager = createFunctionManager(typeManager); - BuiltInFunctionHandle functionHandle = (BuiltInFunctionHandle) functionManager.resolveFunction(TEST_SESSION, QualifiedName.of(signature.getName().getParts()), fromTypeSignatures(signature.getArgumentTypes())); + BuiltInFunctionHandle functionHandle = (BuiltInFunctionHandle) functionManager.resolveFunction(TEST_SESSION.getTransactionId(), QualifiedName.of(signature.getName().getParts()), fromTypeSignatures(signature.getArgumentTypes())); assertEquals(functionManager.getFunctionMetadata(functionHandle).getArgumentTypes(), ImmutableList.of(parseTypeSignature(StandardTypes.BIGINT))); assertEquals(signature.getReturnType().getBase(), StandardTypes.TIMESTAMP_WITH_TIME_ZONE); } @@ -400,7 +400,7 @@ private FunctionHandle resolveFunctionHandle() FeaturesConfig featuresConfig = new FeaturesConfig(); FunctionManager functionManager = new FunctionManager(typeRegistry, blockEncoding, featuresConfig); functionManager.registerBuiltInFunctions(createFunctionsFromSignatures()); - return functionManager.resolveFunction(TEST_SESSION, QualifiedName.of("presto", "default", TEST_FUNCTION_NAME), fromTypeSignatures(parameterTypes)); + return functionManager.resolveFunction(TEST_SESSION.getTransactionId(), QualifiedName.of("presto", "default", TEST_FUNCTION_NAME), fromTypeSignatures(parameterTypes)); } private List createFunctionsFromSignatures() 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 47980932fdd0f..6bc7a5e556c97 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 @@ -77,7 +77,7 @@ protected void registerTypes(Plugin plugin) protected final InternalAggregationFunction getFunction() { List parameterTypes = fromTypeSignatures(Lists.transform(getFunctionParameterTypes(), TypeSignature::parseTypeSignature)); - FunctionHandle functionHandle = functionManager.resolveFunction(session, QualifiedName.of(getFunctionName()), parameterTypes); + FunctionHandle functionHandle = functionManager.resolveFunction(session.getTransactionId(), QualifiedName.of(getFunctionName()), parameterTypes); return functionManager.getAggregateFunctionImplementation(functionHandle); } 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 c0d513b98eee8..dda2dbda742b7 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 @@ -337,7 +337,7 @@ private AggregationBuilder addAggregation(VariableReferenceExpression output, Ex { checkArgument(expression instanceof FunctionCall); FunctionCall call = (FunctionCall) expression; - FunctionHandle functionHandle = metadata.getFunctionManager().resolveFunction(session, call.getName(), TypeSignatureProvider.fromTypes(inputTypes)); + FunctionHandle functionHandle = metadata.getFunctionManager().resolveFunction(session.getTransactionId(), call.getName(), TypeSignatureProvider.fromTypes(inputTypes)); return addAggregation(output, new Aggregation( new CallExpression( call.getName().getSuffix(), diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/ConnectorSession.java b/presto-spi/src/main/java/com/facebook/presto/spi/ConnectorSession.java index dd79bf4b22b9f..c186ceb7e3958 100644 --- a/presto-spi/src/main/java/com/facebook/presto/spi/ConnectorSession.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/ConnectorSession.java @@ -13,6 +13,7 @@ */ package com.facebook.presto.spi; +import com.facebook.presto.spi.function.SqlFunctionProperties; import com.facebook.presto.spi.security.ConnectorIdentity; import com.facebook.presto.spi.type.TimeZoneKey; @@ -32,6 +33,11 @@ default String getUser() ConnectorIdentity getIdentity(); + /** + * @deprecated In favor of {@link com.facebook.presto.spi.function.SqlFunctionProperties#getTimeZoneKey()} + * @return + */ + @Deprecated TimeZoneKey getTimeZoneKey(); Locale getLocale(); @@ -42,8 +48,14 @@ default String getUser() long getStartTime(); + /** + * @deprecated In favor of {@link com.facebook.presto.spi.function.SqlFunctionProperties#isLegacyTimestamp()} + * @return + */ @Deprecated boolean isLegacyTimestamp(); + SqlFunctionProperties getSqlFunctionProperties(); + T getProperty(String name, Class type); } diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/function/SqlFunctionProperties.java b/presto-spi/src/main/java/com/facebook/presto/spi/function/SqlFunctionProperties.java new file mode 100644 index 0000000000000..ea22e356519e4 --- /dev/null +++ b/presto-spi/src/main/java/com/facebook/presto/spi/function/SqlFunctionProperties.java @@ -0,0 +1,103 @@ +/* + * 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.function; + +import com.facebook.presto.spi.type.TimeZoneKey; + +import static java.util.Objects.requireNonNull; + +public class SqlFunctionProperties +{ + private final boolean parseDecimalLiteralAsDouble; + private final boolean legacyRowFieldOrdinalAccessEnabled; + private final TimeZoneKey timeZoneKey; + private final boolean legacyTimestamp; + + private SqlFunctionProperties( + boolean parseDecimalLiteralAsDouble, + boolean legacyRowFieldOrdinalAccessEnabled, + TimeZoneKey timeZoneKey, + boolean legacyTimestamp) + { + this.parseDecimalLiteralAsDouble = parseDecimalLiteralAsDouble; + this.legacyRowFieldOrdinalAccessEnabled = legacyRowFieldOrdinalAccessEnabled; + this.timeZoneKey = requireNonNull(timeZoneKey, "timeZoneKey is null"); + this.legacyTimestamp = legacyTimestamp; + } + + public boolean isParseDecimalLiteralAsDouble() + { + return parseDecimalLiteralAsDouble; + } + + public boolean isLegacyRowFieldOrdinalAccessEnabled() + { + return legacyRowFieldOrdinalAccessEnabled; + } + + public TimeZoneKey getTimeZoneKey() + { + return timeZoneKey; + } + + @Deprecated + public boolean isLegacyTimestamp() + { + return legacyTimestamp; + } + + public static Builder builder() + { + return new Builder(); + } + + public static class Builder + { + private boolean parseDecimalLiteralAsDouble; + private boolean legacyRowFieldOrdinalAccessEnabled; + private TimeZoneKey timeZoneKey; + private boolean legacyTimestamp; + + private Builder() {} + + public Builder setParseDecimalLiteralAsDouble(boolean parseDecimalLiteralAsDouble) + { + this.parseDecimalLiteralAsDouble = parseDecimalLiteralAsDouble; + return this; + } + + public Builder setLegacyRowFieldOrdinalAccessEnabled(boolean legacyRowFieldOrdinalAccessEnabled) + { + this.legacyRowFieldOrdinalAccessEnabled = legacyRowFieldOrdinalAccessEnabled; + return this; + } + + public Builder setTimeZoneKey(TimeZoneKey timeZoneKey) + { + this.timeZoneKey = requireNonNull(timeZoneKey, "timeZoneKey is null"); + return this; + } + + public Builder setLegacyTimestamp(boolean legacyTimestamp) + { + this.legacyTimestamp = legacyTimestamp; + return this; + } + + public SqlFunctionProperties build() + { + return new SqlFunctionProperties(parseDecimalLiteralAsDouble, legacyRowFieldOrdinalAccessEnabled, timeZoneKey, legacyTimestamp); + } + } +} diff --git a/presto-spi/src/test/java/com/facebook/presto/spi/block/TestingSession.java b/presto-spi/src/test/java/com/facebook/presto/spi/block/TestingSession.java index 201dff82e70c3..49e1ec57529c5 100644 --- a/presto-spi/src/test/java/com/facebook/presto/spi/block/TestingSession.java +++ b/presto-spi/src/test/java/com/facebook/presto/spi/block/TestingSession.java @@ -15,6 +15,7 @@ import com.facebook.presto.spi.ConnectorSession; import com.facebook.presto.spi.PrestoException; +import com.facebook.presto.spi.function.SqlFunctionProperties; import com.facebook.presto.spi.security.ConnectorIdentity; import com.facebook.presto.spi.type.TimeZoneKey; @@ -83,6 +84,12 @@ public boolean isLegacyTimestamp() return true; } + @Override + public SqlFunctionProperties getSqlFunctionProperties() + { + return SqlFunctionProperties.builder().setTimeZoneKey(UTC_KEY).build(); + } + @Override public T getProperty(String name, Class type) { From 281c0a4df4ef3dd5bca4decf3f7dd5b2688ed6ca Mon Sep 17 00:00:00 2001 From: Rongrong Zhong Date: Wed, 2 Oct 2019 18:33:21 -0700 Subject: [PATCH 06/11] Remove Session from SqlToRowExpressionTranslator --- .../SqlToRowExpressionTranslator.java | 48 ++++++++++++++----- 1 file changed, 35 insertions(+), 13 deletions(-) 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/SqlToRowExpressionTranslator.java index 9fe43b6486384..4c8276ba0c581 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/SqlToRowExpressionTranslator.java @@ -15,6 +15,7 @@ import com.facebook.presto.Session; import com.facebook.presto.metadata.FunctionManager; +import com.facebook.presto.spi.function.SqlFunctionProperties; import com.facebook.presto.spi.relation.ConstantExpression; import com.facebook.presto.spi.relation.LambdaDefinitionExpression; import com.facebook.presto.spi.relation.RowExpression; @@ -77,6 +78,7 @@ import com.facebook.presto.sql.tree.TimestampLiteral; import com.facebook.presto.sql.tree.TryExpression; import com.facebook.presto.sql.tree.WhenClause; +import com.facebook.presto.transaction.TransactionId; import com.facebook.presto.type.UnknownType; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; @@ -85,10 +87,9 @@ import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.OptionalInt; -import static com.facebook.presto.SystemSessionProperties.isLegacyRowFieldOrdinalAccessEnabled; -import static com.facebook.presto.SystemSessionProperties.isLegacyTimestamp; import static com.facebook.presto.metadata.CastType.CAST; import static com.facebook.presto.metadata.CastType.TRY_CAST; import static com.facebook.presto.spi.function.OperatorType.BETWEEN; @@ -151,13 +152,28 @@ public static RowExpression translate( FunctionManager functionManager, TypeManager typeManager, Session session) + { + return translate(expression, types, layout, functionManager, typeManager, Optional.of(session.getUser()), session.getTransactionId(), session.getSqlFunctionProperties()); + } + + public static RowExpression translate( + Expression expression, + Map, Type> types, + Map layout, + FunctionManager functionManager, + TypeManager typeManager, + Optional user, + Optional transactionId, + SqlFunctionProperties sqlFunctionProperties) { Visitor visitor = new Visitor( types, layout, typeManager, functionManager, - session); + user, + transactionId, + sqlFunctionProperties); RowExpression result = visitor.process(expression, null); requireNonNull(result, "translated expression is null"); return result; @@ -170,7 +186,9 @@ private static class Visitor private final Map layout; private final TypeManager typeManager; private final FunctionManager functionManager; - private final Session session; + private final Optional user; + private final Optional transactionId; + private final SqlFunctionProperties sqlFunctionProperties; private final FunctionResolution functionResolution; private Visitor( @@ -178,13 +196,17 @@ private Visitor( Map layout, TypeManager typeManager, FunctionManager functionManager, - Session session) + Optional user, + Optional transactionId, + SqlFunctionProperties sqlFunctionProperties) { this.types = ImmutableMap.copyOf(requireNonNull(types, "types is null")); this.layout = layout; this.typeManager = typeManager; this.functionManager = functionManager; - this.session = session; + this.user = user; + this.transactionId = transactionId; + this.sqlFunctionProperties = sqlFunctionProperties; this.functionResolution = new FunctionResolution(functionManager); } @@ -209,7 +231,7 @@ protected RowExpression visitIdentifier(Identifier node, Void context) @Override protected RowExpression visitCurrentUser(CurrentUser node, Void context) { - return constant(Slices.utf8Slice(session.getUser()), VARCHAR); + return user.map(user -> constant(Slices.utf8Slice(user), VARCHAR)).orElseThrow(() -> new UnsupportedOperationException("Do not have current user")); } @Override @@ -319,9 +341,9 @@ protected RowExpression visitTimeLiteral(TimeLiteral node, Void context) value = parseTimeWithTimeZone(node.getValue()); } else { - if (isLegacyTimestamp(session)) { + if (sqlFunctionProperties.isLegacyTimestamp()) { // parse in time zone of client - value = parseTimeWithoutTimeZone(session.getTimeZoneKey(), node.getValue()); + value = parseTimeWithoutTimeZone(sqlFunctionProperties.getTimeZoneKey(), node.getValue()); } else { value = parseTimeWithoutTimeZone(node.getValue()); @@ -334,8 +356,8 @@ protected RowExpression visitTimeLiteral(TimeLiteral node, Void context) protected RowExpression visitTimestampLiteral(TimestampLiteral node, Void context) { long value; - if (isLegacyTimestamp(session)) { - value = parseTimestampLiteral(session.getTimeZoneKey(), node.getValue()); + if (sqlFunctionProperties.isLegacyTimestamp()) { + value = parseTimestampLiteral(sqlFunctionProperties.getTimeZoneKey(), node.getValue()); } else { value = parseTimestampLiteral(node.getValue()); @@ -383,7 +405,7 @@ protected RowExpression visitFunctionCall(FunctionCall node, Void context) .map(TypeSignatureProvider::new) .collect(toImmutableList()); - return call(node.getName().toString(), functionManager.resolveFunction(session.getTransactionId(), node.getName(), argumentTypes), getType(node), arguments); + return call(node.getName().toString(), functionManager.resolveFunction(transactionId, node.getName(), argumentTypes), getType(node), arguments); } @Override @@ -580,7 +602,7 @@ protected RowExpression visitDereferenceExpression(DereferenceExpression node, V } } - if (isLegacyRowFieldOrdinalAccessEnabled(session) && index < 0) { + if (sqlFunctionProperties.isLegacyRowFieldOrdinalAccessEnabled() && index < 0) { OptionalInt rowIndex = parseAnonymousRowFieldOrdinalAccess(fieldName, fields); if (rowIndex.isPresent()) { index = rowIndex.getAsInt(); From 56bb1871b15c0fd55f6aa96dc03b7320531a2051 Mon Sep 17 00:00:00 2001 From: Rongrong Zhong Date: Fri, 13 Sep 2019 15:51:18 -0700 Subject: [PATCH 07/11] Add SqlFunctionProperties to bytecode compiler cache keys Since RowExpression could include CallExpression that are defined in sql text, which would be parsed to different expressions depending on SqlFunctionProperties, we need to include SqlFunctionProperties in the cache keys. --- .../benchmark/AbstractOperatorBenchmark.java | 2 +- .../presto/benchmark/HandTpchQuery6.java | 2 +- .../benchmark/PredicateFilterBenchmark.java | 2 +- .../orc/OrcSelectivePageSourceFactory.java | 4 +- .../TestOrcBatchPageSourceMemoryTracking.java | 4 +- .../index/DynamicTupleFilterFactory.java | 4 +- .../presto/sql/gen/ExpressionCompiler.java | 41 ++++++++----- .../sql/gen/JoinFilterFunctionCompiler.java | 14 ++++- .../presto/sql/gen/PageFunctionCompiler.java | 58 +++++++++++++++---- .../gen/RowExpressionPredicateCompiler.java | 46 +++++++++++++-- .../sql/planner/LocalExecutionPlanner.java | 14 +++-- .../operator/TestColumnarPageProcessor.java | 2 +- .../TestFilterAndProjectOperator.java | 4 +- .../TestScanFilterAndProjectOperator.java | 22 +++---- .../index/TestTupleFilterProcessor.java | 1 + .../operator/project/TestPageProcessor.java | 2 +- .../scalar/BenchmarkArrayDistinct.java | 2 +- .../operator/scalar/BenchmarkArrayFilter.java | 2 +- .../BenchmarkArrayHashCodeOperator.java | 2 +- .../scalar/BenchmarkArrayIntersect.java | 2 +- .../operator/scalar/BenchmarkArrayJoin.java | 2 +- .../operator/scalar/BenchmarkArraySort.java | 2 +- .../scalar/BenchmarkArraySubscript.java | 2 +- .../scalar/BenchmarkArrayTransform.java | 2 +- .../scalar/BenchmarkEqualsOperator.java | 2 +- .../scalar/BenchmarkJsonToArrayCast.java | 2 +- .../scalar/BenchmarkJsonToMapCast.java | 2 +- .../operator/scalar/BenchmarkMapConcat.java | 2 +- .../scalar/BenchmarkMapSubscript.java | 2 +- .../scalar/BenchmarkMapToMapCast.java | 2 +- .../scalar/BenchmarkRowToRowCast.java | 2 +- .../scalar/BenchmarkTransformKey.java | 2 +- .../scalar/BenchmarkTransformValue.java | 2 +- .../operator/scalar/FunctionAssertions.java | 25 ++++---- .../scalar/TestPageProcessorCompiler.java | 15 ++--- .../sql/gen/BenchmarkPageProcessor.java | 3 +- .../sql/gen/InCodeGeneratorBenchmark.java | 2 +- .../sql/gen/PageProcessorBenchmark.java | 4 +- .../sql/gen/TestPageFunctionCompiler.java | 36 ++++++------ .../TestRowExpressionPredicateCompiler.java | 8 +-- .../type/BenchmarkDecimalOperators.java | 2 +- .../spi/function/SqlFunctionProperties.java | 24 ++++++++ .../spi/relation/PredicateCompiler.java | 3 +- 43 files changed, 252 insertions(+), 126 deletions(-) diff --git a/presto-benchmark/src/main/java/com/facebook/presto/benchmark/AbstractOperatorBenchmark.java b/presto-benchmark/src/main/java/com/facebook/presto/benchmark/AbstractOperatorBenchmark.java index b818ce30425f2..65d13eba63bf2 100644 --- a/presto-benchmark/src/main/java/com/facebook/presto/benchmark/AbstractOperatorBenchmark.java +++ b/presto-benchmark/src/main/java/com/facebook/presto/benchmark/AbstractOperatorBenchmark.java @@ -224,7 +224,7 @@ protected final OperatorFactory createHashProjectOperator(int operatorId, PlanNo RowExpression translatedHashExpression = translate(hashExpression.get(), variableToInputMapping.build()); PageFunctionCompiler functionCompiler = new PageFunctionCompiler(localQueryRunner.getMetadata(), 0); - projections.add(functionCompiler.compileProjection(translatedHashExpression, Optional.empty()).get()); + projections.add(functionCompiler.compileProjection(session.getSqlFunctionProperties(), translatedHashExpression, Optional.empty()).get()); return new FilterAndProjectOperator.FilterAndProjectOperatorFactory( operatorId, 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 3c478d1b06aac..1b189a2d8bb5f 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 @@ -71,7 +71,7 @@ protected List createOperatorFactories() // and quantity < 24; OperatorFactory tableScanOperator = createTableScanOperator(0, new PlanNodeId("test"), "lineitem", "extendedprice", "discount", "shipdate", "quantity"); - Supplier projection = new PageFunctionCompiler(localQueryRunner.getMetadata(), 0).compileProjection(field(0, BIGINT), Optional.empty()); + Supplier projection = new PageFunctionCompiler(localQueryRunner.getMetadata(), 0).compileProjection(session.getSqlFunctionProperties(), field(0, BIGINT), Optional.empty()); FilterAndProjectOperator.FilterAndProjectOperatorFactory tpchQuery6Operator = new FilterAndProjectOperator.FilterAndProjectOperatorFactory( 1, 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 c7f28dcf7153b..7a28e70b6ea99 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 @@ -59,7 +59,7 @@ protected List createOperatorFactories() field(0, DOUBLE), constant(50000.0, DOUBLE)); ExpressionCompiler expressionCompiler = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)); - Supplier pageProcessor = expressionCompiler.compilePageProcessor(Optional.of(filter), ImmutableList.of(field(0, DOUBLE))); + Supplier pageProcessor = expressionCompiler.compilePageProcessor(localQueryRunner.getDefaultSession().getSqlFunctionProperties(), Optional.of(filter), ImmutableList.of(field(0, DOUBLE))); FilterAndProjectOperator.FilterAndProjectOperatorFactory filterAndProjectOperator = new FilterAndProjectOperator.FilterAndProjectOperatorFactory( 1, diff --git a/presto-hive/src/main/java/com/facebook/presto/hive/orc/OrcSelectivePageSourceFactory.java b/presto-hive/src/main/java/com/facebook/presto/hive/orc/OrcSelectivePageSourceFactory.java index 4586b87f01cb0..54c4304ee7d67 100644 --- a/presto-hive/src/main/java/com/facebook/presto/hive/orc/OrcSelectivePageSourceFactory.java +++ b/presto-hive/src/main/java/com/facebook/presto/hive/orc/OrcSelectivePageSourceFactory.java @@ -506,7 +506,7 @@ private static List toFilterFunctions(RowExpression filter, Conn List conjuncts = extractConjuncts(filter); if (conjuncts.size() == 1) { - return ImmutableList.of(new FilterFunction(session, determinismEvaluator.isDeterministic(filter), predicateCompiler.compilePredicate(filter).get())); + return ImmutableList.of(new FilterFunction(session, determinismEvaluator.isDeterministic(filter), predicateCompiler.compilePredicate(session.getSqlFunctionProperties(), filter).get())); } // Use LinkedHashMap to preserve user-specified order of conjuncts. This will be the initial order in which filters are applied. @@ -517,7 +517,7 @@ private static List toFilterFunctions(RowExpression filter, Conn return inputsToConjuncts.values().stream() .map(expressions -> binaryExpression(AND, expressions)) - .map(predicate -> new FilterFunction(session, determinismEvaluator.isDeterministic(predicate), predicateCompiler.compilePredicate(predicate).get())) + .map(predicate -> new FilterFunction(session, determinismEvaluator.isDeterministic(predicate), predicateCompiler.compilePredicate(session.getSqlFunctionProperties(), predicate).get())) .collect(toImmutableList()); } diff --git a/presto-hive/src/test/java/com/facebook/presto/hive/TestOrcBatchPageSourceMemoryTracking.java b/presto-hive/src/test/java/com/facebook/presto/hive/TestOrcBatchPageSourceMemoryTracking.java index b0817cb8c85f3..81eba32421538 100644 --- a/presto-hive/src/test/java/com/facebook/presto/hive/TestOrcBatchPageSourceMemoryTracking.java +++ b/presto-hive/src/test/java/com/facebook/presto/hive/TestOrcBatchPageSourceMemoryTracking.java @@ -522,8 +522,8 @@ public SourceOperator newScanFilterAndProjectOperator(DriverContext driverContex for (int i = 0; i < types.size(); i++) { projectionsBuilder.add(field(i, types.get(i))); } - Supplier cursorProcessor = EXPRESSION_COMPILER.compileCursorProcessor(Optional.empty(), projectionsBuilder.build(), "key"); - Supplier pageProcessor = EXPRESSION_COMPILER.compilePageProcessor(Optional.empty(), projectionsBuilder.build()); + Supplier cursorProcessor = EXPRESSION_COMPILER.compileCursorProcessor(SESSION.getSqlFunctionProperties(), Optional.empty(), projectionsBuilder.build(), "key"); + Supplier pageProcessor = EXPRESSION_COMPILER.compilePageProcessor(SESSION.getSqlFunctionProperties(), Optional.empty(), projectionsBuilder.build()); SourceOperatorFactory sourceOperatorFactory = new ScanFilterAndProjectOperatorFactory( 0, new PlanNodeId("test"), diff --git a/presto-main/src/main/java/com/facebook/presto/operator/index/DynamicTupleFilterFactory.java b/presto-main/src/main/java/com/facebook/presto/operator/index/DynamicTupleFilterFactory.java index 926a377689f7b..09c839e88f7d2 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/index/DynamicTupleFilterFactory.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/index/DynamicTupleFilterFactory.java @@ -18,6 +18,7 @@ import com.facebook.presto.operator.project.PageProjection; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.block.Block; +import com.facebook.presto.spi.function.SqlFunctionProperties; import com.facebook.presto.spi.plan.PlanNodeId; import com.facebook.presto.spi.type.Type; import com.facebook.presto.sql.gen.PageFunctionCompiler; @@ -57,6 +58,7 @@ public DynamicTupleFilterFactory( int[] tupleFilterChannels, int[] outputFilterChannels, List outputTypes, + SqlFunctionProperties sqlFunctionProperties, PageFunctionCompiler pageFunctionCompiler) { requireNonNull(planNodeId, "planNodeId is null"); @@ -79,7 +81,7 @@ public DynamicTupleFilterFactory( this.outputTypes = ImmutableList.copyOf(outputTypes); this.outputProjections = IntStream.range(0, outputTypes.size()) - .mapToObj(field -> pageFunctionCompiler.compileProjection(Expressions.field(field, outputTypes.get(field)), Optional.empty())) + .mapToObj(field -> pageFunctionCompiler.compileProjection(sqlFunctionProperties, Expressions.field(field, outputTypes.get(field)), Optional.empty())) .collect(toImmutableList()); } 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 09ce4e4b533e2..ec8b04c9d6fd5 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 @@ -21,6 +21,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.spi.function.SqlFunctionProperties; import com.facebook.presto.spi.relation.RowExpression; import com.google.common.annotations.VisibleForTesting; import com.google.common.cache.CacheBuilder; @@ -66,7 +67,7 @@ public ExpressionCompiler(Metadata metadata, PageFunctionCompiler pageFunctionCo this.cursorProcessors = CacheBuilder.newBuilder() .recordStats() .maximumSize(1000) - .build(CacheLoader.from(key -> compile(key.getFilter(), key.getProjections(), new CursorProcessorCompiler(metadata), CursorProcessor.class))); + .build(CacheLoader.from(key -> compile(key.getSqlFunctionProperties(), key.getFilter(), key.getProjections(), new CursorProcessorCompiler(metadata), CursorProcessor.class))); this.cacheStatsMBean = new CacheStatsMBean(cursorProcessors); } @@ -77,9 +78,9 @@ public CacheStatsMBean getCursorProcessorCache() return cacheStatsMBean; } - public Supplier compileCursorProcessor(Optional filter, List projections, Object uniqueKey) + public Supplier compileCursorProcessor(SqlFunctionProperties sqlFunctionProperties, Optional filter, List projections, Object uniqueKey) { - Class cursorProcessor = cursorProcessors.getUnchecked(new CacheKey(filter, projections, uniqueKey)); + Class cursorProcessor = cursorProcessors.getUnchecked(new CacheKey(sqlFunctionProperties, filter, projections, uniqueKey)); return () -> { try { return cursorProcessor.getConstructor().newInstance(); @@ -90,20 +91,21 @@ public Supplier compileCursorProcessor(Optional }; } - public Supplier compilePageProcessor(Optional filter, List projections, Optional classNameSuffix) + public Supplier compilePageProcessor(SqlFunctionProperties sqlFunctionProperties, Optional filter, List projections, Optional classNameSuffix) { - return compilePageProcessor(filter, projections, classNameSuffix, OptionalInt.empty()); + return compilePageProcessor(sqlFunctionProperties, filter, projections, classNameSuffix, OptionalInt.empty()); } private Supplier compilePageProcessor( + SqlFunctionProperties sqlFunctionProperties, Optional filter, List projections, Optional classNameSuffix, OptionalInt initialBatchSize) { - Optional> filterFunctionSupplier = filter.map(expression -> pageFunctionCompiler.compileFilter(expression, classNameSuffix)); + Optional> filterFunctionSupplier = filter.map(expression -> pageFunctionCompiler.compileFilter(sqlFunctionProperties, expression, classNameSuffix)); List> pageProjectionSuppliers = projections.stream() - .map(projection -> pageFunctionCompiler.compileProjection(projection, classNameSuffix)) + .map(projection -> pageFunctionCompiler.compileProjection(sqlFunctionProperties, projection, classNameSuffix)) .collect(toImmutableList()); return () -> { @@ -115,18 +117,18 @@ private Supplier compilePageProcessor( }; } - public Supplier compilePageProcessor(Optional filter, List projections) + public Supplier compilePageProcessor(SqlFunctionProperties sqlFunctionProperties, Optional filter, List projections) { - return compilePageProcessor(filter, projections, Optional.empty()); + return compilePageProcessor(sqlFunctionProperties, filter, projections, Optional.empty()); } @VisibleForTesting - public Supplier compilePageProcessor(Optional filter, List projections, int initialBatchSize) + public Supplier compilePageProcessor(SqlFunctionProperties sqlFunctionProperties, Optional filter, List projections, int initialBatchSize) { - return compilePageProcessor(filter, projections, Optional.empty(), OptionalInt.of(initialBatchSize)); + return compilePageProcessor(sqlFunctionProperties, filter, projections, Optional.empty(), OptionalInt.of(initialBatchSize)); } - private Class compile(Optional filter, List projections, BodyCompiler bodyCompiler, Class superType) + private Class compile(SqlFunctionProperties sqlFunctionProperties, Optional filter, List projections, BodyCompiler bodyCompiler, Class superType) { // create filter and project page iterator class try { @@ -177,17 +179,24 @@ private static void generateToString(ClassDefinition classDefinition, CallSiteBi private static final class CacheKey { + private final SqlFunctionProperties sqlFunctionProperties; private final Optional filter; private final List projections; private final Object uniqueKey; - private CacheKey(Optional filter, List projections, Object uniqueKey) + private CacheKey(SqlFunctionProperties sqlFunctionProperties, Optional filter, List projections, Object uniqueKey) { + this.sqlFunctionProperties = sqlFunctionProperties; this.filter = filter; this.uniqueKey = uniqueKey; this.projections = ImmutableList.copyOf(projections); } + public SqlFunctionProperties getSqlFunctionProperties() + { + return sqlFunctionProperties; + } + private Optional getFilter() { return filter; @@ -201,7 +210,7 @@ private List getProjections() @Override public int hashCode() { - return Objects.hash(filter, projections, uniqueKey); + return Objects.hash(sqlFunctionProperties, filter, projections, uniqueKey); } @Override @@ -214,7 +223,8 @@ public boolean equals(Object obj) return false; } CacheKey other = (CacheKey) obj; - return Objects.equals(this.filter, other.filter) && + return Objects.equals(this.sqlFunctionProperties, other.sqlFunctionProperties) && + Objects.equals(this.filter, other.filter) && Objects.equals(this.projections, other.projections) && Objects.equals(this.uniqueKey, other.uniqueKey); } @@ -223,6 +233,7 @@ public boolean equals(Object obj) public String toString() { return toStringHelper(this) + .add("sqlFunctionProperties", sqlFunctionProperties) .add("filter", filter) .add("projections", projections) .add("uniqueKey", uniqueKey) 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 8ff5d07e80a9b..52adf3375b55a 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 @@ -30,6 +30,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.SqlFunctionProperties; import com.facebook.presto.spi.relation.LambdaDefinitionExpression; import com.facebook.presto.spi.relation.RowExpression; import com.facebook.presto.spi.relation.RowExpressionVisitor; @@ -87,9 +88,9 @@ public CacheStatsMBean getJoinFilterFunctionFactoryStats() return new CacheStatsMBean(joinFilterFunctionFactories); } - public JoinFilterFunctionFactory compileJoinFilterFunction(RowExpression filter, int leftBlocksSize) + public JoinFilterFunctionFactory compileJoinFilterFunction(SqlFunctionProperties sqlFunctionProperties, RowExpression filter, int leftBlocksSize) { - return joinFilterFunctionFactories.getUnchecked(new JoinFilterCacheKey(filter, leftBlocksSize)); + return joinFilterFunctionFactories.getUnchecked(new JoinFilterCacheKey(sqlFunctionProperties, filter, leftBlocksSize)); } private JoinFilterFunctionFactory internalCompileFilterFunctionFactory(RowExpression filterExpression, int leftBlocksSize) @@ -242,15 +243,22 @@ private static RowExpressionVisitor fieldReferenceCompiler( private static final class JoinFilterCacheKey { + private final SqlFunctionProperties sqlFunctionProperties; private final RowExpression filter; private final int leftBlocksSize; - public JoinFilterCacheKey(RowExpression filter, int leftBlocksSize) + public JoinFilterCacheKey(SqlFunctionProperties sqlFunctionProperties, RowExpression filter, int leftBlocksSize) { + this.sqlFunctionProperties = requireNonNull(sqlFunctionProperties, "sqlFunctionProperties is null"); this.filter = requireNonNull(filter, "filter can not be null"); this.leftBlocksSize = leftBlocksSize; } + public SqlFunctionProperties getSqlFunctionProperties() + { + return sqlFunctionProperties; + } + public RowExpression getFilter() { return filter; 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 42ab951ba1646..b8b177bab58b2 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 @@ -39,6 +39,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.spi.function.SqlFunctionProperties; import com.facebook.presto.spi.relation.ConstantExpression; import com.facebook.presto.spi.relation.DeterminismEvaluator; import com.facebook.presto.spi.relation.InputReferenceExpression; @@ -61,6 +62,7 @@ import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.TreeSet; import java.util.function.Consumer; @@ -97,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; @@ -118,7 +120,7 @@ public PageFunctionCompiler(Metadata metadata, int expressionCacheSize) projectionCache = CacheBuilder.newBuilder() .recordStats() .maximumSize(expressionCacheSize) - .build(CacheLoader.from(projection -> compileProjectionInternal(projection, Optional.empty()))); + .build(CacheLoader.from(cacheKey -> compileProjectionInternal(cacheKey.sqlFunctionProperties, cacheKey.rowExpression, Optional.empty()))); projectionCacheStats = new CacheStatsMBean(projectionCache); } else { @@ -130,7 +132,7 @@ public PageFunctionCompiler(Metadata metadata, int expressionCacheSize) filterCache = CacheBuilder.newBuilder() .recordStats() .maximumSize(expressionCacheSize) - .build(CacheLoader.from(filter -> compileFilterInternal(filter, Optional.empty()))); + .build(CacheLoader.from(cacheKey -> compileFilterInternal(cacheKey.sqlFunctionProperties, cacheKey.rowExpression, Optional.empty()))); filterCacheStats = new CacheStatsMBean(filterCache); } else { @@ -155,15 +157,15 @@ public CacheStatsMBean getFilterCache() return filterCacheStats; } - public Supplier compileProjection(RowExpression projection, Optional classNameSuffix) + public Supplier compileProjection(SqlFunctionProperties sqlFunctionProperties, RowExpression projection, Optional classNameSuffix) { if (projectionCache == null) { - return compileProjectionInternal(projection, classNameSuffix); + return compileProjectionInternal(sqlFunctionProperties, projection, classNameSuffix); } - return projectionCache.getUnchecked(projection); + return projectionCache.getUnchecked(new CacheKey(sqlFunctionProperties, projection)); } - private Supplier compileProjectionInternal(RowExpression projection, Optional classNameSuffix) + private Supplier compileProjectionInternal(SqlFunctionProperties sqlFunctionProperties, RowExpression projection, Optional classNameSuffix) { requireNonNull(projection, "projection is null"); @@ -354,15 +356,15 @@ private MethodDefinition generateEvaluateMethod( return method; } - public Supplier compileFilter(RowExpression filter, Optional classNameSuffix) + public Supplier compileFilter(SqlFunctionProperties sqlFunctionProperties, RowExpression filter, Optional classNameSuffix) { if (filterCache == null) { - return compileFilterInternal(filter, classNameSuffix); + return compileFilterInternal(sqlFunctionProperties, filter, classNameSuffix); } - return filterCache.getUnchecked(filter); + return filterCache.getUnchecked(new CacheKey(sqlFunctionProperties, filter)); } - private Supplier compileFilterInternal(RowExpression filter, Optional classNameSuffix) + private Supplier compileFilterInternal(SqlFunctionProperties sqlFunctionProperties, RowExpression filter, Optional classNameSuffix) { requireNonNull(filter, "filter is null"); @@ -589,4 +591,36 @@ private static RowExpressionVisitor fieldReferenceCompiler( (scope, field) -> scope.getVariable("position"), callSiteBinder); } + + private static final class CacheKey + { + private final SqlFunctionProperties sqlFunctionProperties; + private final RowExpression rowExpression; + + private CacheKey(SqlFunctionProperties sqlFunctionProperties, RowExpression rowExpression) + { + this.sqlFunctionProperties = requireNonNull(sqlFunctionProperties, "sqlFunctionProperties is null"); + this.rowExpression = requireNonNull(rowExpression, "rowExpression is null"); + } + + @Override + public boolean equals(Object o) + { + if (this == o) { + return true; + } + if (!(o instanceof CacheKey)) { + return false; + } + CacheKey that = (CacheKey) o; + return Objects.equals(sqlFunctionProperties, that.sqlFunctionProperties) && + Objects.equals(rowExpression, that.rowExpression); + } + + @Override + public int hashCode() + { + return Objects.hash(sqlFunctionProperties, rowExpression); + } + } } diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/RowExpressionPredicateCompiler.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/RowExpressionPredicateCompiler.java index 68fa5cc459e55..9334fefa28d2d 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/RowExpressionPredicateCompiler.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/RowExpressionPredicateCompiler.java @@ -27,6 +27,7 @@ import com.facebook.presto.spi.Page; import com.facebook.presto.spi.PrestoException; import com.facebook.presto.spi.block.Block; +import com.facebook.presto.spi.function.SqlFunctionProperties; import com.facebook.presto.spi.relation.InputReferenceExpression; import com.facebook.presto.spi.relation.LambdaDefinitionExpression; import com.facebook.presto.spi.relation.Predicate; @@ -43,6 +44,7 @@ import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.TreeSet; import java.util.function.Supplier; @@ -69,7 +71,7 @@ public class RowExpressionPredicateCompiler { private final FunctionManager functionManager; - private final LoadingCache> predicateCache; + private final LoadingCache> predicateCache; @Inject public RowExpressionPredicateCompiler(Metadata metadata) @@ -85,7 +87,7 @@ public RowExpressionPredicateCompiler(FunctionManager functionManager, int predi predicateCache = CacheBuilder.newBuilder() .recordStats() .maximumSize(predicateCacheSize) - .build(CacheLoader.from(this::compilePredicateInternal)); + .build(CacheLoader.from(cacheKey -> compilePredicateInternal(cacheKey.sqlFunctionProperties, cacheKey.rowExpression))); } else { predicateCache = null; @@ -93,15 +95,15 @@ public RowExpressionPredicateCompiler(FunctionManager functionManager, int predi } @Override - public Supplier compilePredicate(RowExpression predicate) + public Supplier compilePredicate(SqlFunctionProperties sqlFunctionProperties, RowExpression predicate) { if (predicateCache == null) { - return compilePredicateInternal(predicate); + return compilePredicateInternal(sqlFunctionProperties, predicate); } - return predicateCache.getUnchecked(predicate); + return predicateCache.getUnchecked(new CacheKey(sqlFunctionProperties, predicate)); } - private Supplier compilePredicateInternal(RowExpression predicate) + private Supplier compilePredicateInternal(SqlFunctionProperties sqlFunctionProperties, RowExpression predicate) { requireNonNull(predicate, "predicate is null"); @@ -247,4 +249,36 @@ private static void generateConstructor( cachedInstanceBinder.generateInitializations(thisVariable, body); body.ret(); } + + private static final class CacheKey + { + private final SqlFunctionProperties sqlFunctionProperties; + private final RowExpression rowExpression; + + private CacheKey(SqlFunctionProperties sqlFunctionProperties, RowExpression rowExpression) + { + this.sqlFunctionProperties = requireNonNull(sqlFunctionProperties, "sqlFunctionProperties is null"); + this.rowExpression = requireNonNull(rowExpression, "rowExpression is null"); + } + + @Override + public boolean equals(Object o) + { + if (this == o) { + return true; + } + if (!(o instanceof CacheKey)) { + return false; + } + CacheKey that = (CacheKey) o; + return Objects.equals(sqlFunctionProperties, that.sqlFunctionProperties) && + Objects.equals(rowExpression, that.rowExpression); + } + + @Override + public int hashCode() + { + return Objects.hash(sqlFunctionProperties, rowExpression); + } + } } 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 346c7234e4875..e2045992ab146 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 @@ -121,6 +121,7 @@ import com.facebook.presto.spi.function.FunctionHandle; import com.facebook.presto.spi.function.FunctionMetadata; import com.facebook.presto.spi.function.OperatorType; +import com.facebook.presto.spi.function.SqlFunctionProperties; import com.facebook.presto.spi.plan.AggregationNode; import com.facebook.presto.spi.plan.AggregationNode.Aggregation; import com.facebook.presto.spi.plan.AggregationNode.Step; @@ -1257,8 +1258,8 @@ private PhysicalOperation visitScanFilterAndProject( try { if (columns != null) { - Supplier cursorProcessor = expressionCompiler.compileCursorProcessor(filterExpression, projections, sourceNode.getId()); - Supplier pageProcessor = expressionCompiler.compilePageProcessor(filterExpression, projections, Optional.of(context.getStageExecutionId() + "_" + planNodeId)); + Supplier cursorProcessor = expressionCompiler.compileCursorProcessor(session.getSqlFunctionProperties(), filterExpression, projections, sourceNode.getId()); + Supplier pageProcessor = expressionCompiler.compilePageProcessor(session.getSqlFunctionProperties(), filterExpression, projections, Optional.of(context.getStageExecutionId() + "_" + planNodeId)); SourceOperatorFactory operatorFactory = new ScanFilterAndProjectOperatorFactory( context.getNextOperatorId(), @@ -1276,7 +1277,7 @@ private PhysicalOperation visitScanFilterAndProject( return new PhysicalOperation(operatorFactory, outputMappings, context, stageExecutionDescriptor.isScanGroupedExecution(sourceNode.getId()) ? GROUPED_EXECUTION : UNGROUPED_EXECUTION); } else { - Supplier pageProcessor = expressionCompiler.compilePageProcessor(filterExpression, projections, Optional.of(context.getStageExecutionId() + "_" + planNodeId)); + Supplier pageProcessor = expressionCompiler.compilePageProcessor(session.getSqlFunctionProperties(), filterExpression, projections, Optional.of(context.getStageExecutionId() + "_" + planNodeId)); OperatorFactory operatorFactory = new FilterAndProjectOperator.FilterAndProjectOperatorFactory( context.getNextOperatorId(), @@ -1558,6 +1559,7 @@ public PhysicalOperation visitIndexJoin(IndexJoinNode node, LocalExecutionPlanCo nonLookupInputChannels, nonLookupOutputChannels, indexSource.getTypes(), + session.getSqlFunctionProperties(), pageFunctionCompiler)); } @@ -1923,6 +1925,7 @@ private PagesSpatialIndexFactory createPagesSpatialIndexFactory( Optional filterFunctionFactory = joinFilter .map(filterExpression -> compileJoinFilterFunction( + session.getSqlFunctionProperties(), filterExpression, probeLayout, buildLayout)); @@ -2014,6 +2017,7 @@ private JoinBridgeManager createLookupSourceFact Optional filterFunctionFactory = node.getFilter() .map(filterExpression -> compileJoinFilterFunction( + session.getSqlFunctionProperties(), filterExpression, probeSource.getLayout(), buildSource.getLayout())); @@ -2031,6 +2035,7 @@ private JoinBridgeManager createLookupSourceFact .map(SortExpressionContext::getSearchExpressions) .map(searchExpressions -> searchExpressions.stream() .map(searchExpression -> compileJoinFilterFunction( + session.getSqlFunctionProperties(), searchExpression, probeSource.getLayout(), buildSource.getLayout())) @@ -2083,12 +2088,13 @@ private JoinBridgeManager createLookupSourceFact } private JoinFilterFunctionFactory compileJoinFilterFunction( + SqlFunctionProperties sqlFunctionProperties, RowExpression filterExpression, Map probeLayout, Map buildLayout) { Map joinSourcesLayout = createJoinSourcesLayout(buildLayout, probeLayout); - return joinFilterFunctionCompiler.compileJoinFilterFunction(bindChannels(filterExpression, joinSourcesLayout), buildLayout.size()); + return joinFilterFunctionCompiler.compileJoinFilterFunction(sqlFunctionProperties, bindChannels(filterExpression, joinSourcesLayout), buildLayout.size()); } private int sortExpressionAsSortChannel( diff --git a/presto-main/src/test/java/com/facebook/presto/operator/TestColumnarPageProcessor.java b/presto-main/src/test/java/com/facebook/presto/operator/TestColumnarPageProcessor.java index be88b3bf64252..431b39489ae6d 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/TestColumnarPageProcessor.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/TestColumnarPageProcessor.java @@ -81,6 +81,6 @@ private static Page createPage(List types, boolean dictionary) private PageProcessor newPageProcessor() { return new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)) - .compilePageProcessor(Optional.empty(), ImmutableList.of(field(0, types.get(0)), field(1, types.get(1))), MAX_BATCH_SIZE).get(); + .compilePageProcessor(SESSION.getSqlFunctionProperties(), Optional.empty(), ImmutableList.of(field(0, types.get(0)), field(1, types.get(1))), MAX_BATCH_SIZE).get(); } } 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 c714b9516a268..f8edc70e96364 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 @@ -106,7 +106,7 @@ public void test() constant(5L, BIGINT)); ExpressionCompiler compiler = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)); - Supplier processor = compiler.compilePageProcessor(Optional.of(filter), ImmutableList.of(field0, add5)); + Supplier processor = compiler.compilePageProcessor(TEST_SESSION.getSqlFunctionProperties(), Optional.of(filter), ImmutableList.of(field0, add5)); OperatorFactory operatorFactory = new FilterAndProjectOperator.FilterAndProjectOperatorFactory( 0, @@ -151,7 +151,7 @@ public void testMergeOutput() constant(10L, BIGINT)); ExpressionCompiler compiler = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)); - Supplier processor = compiler.compilePageProcessor(Optional.of(filter), ImmutableList.of(field(1, BIGINT))); + Supplier processor = compiler.compilePageProcessor(TEST_SESSION.getSqlFunctionProperties(), Optional.of(filter), ImmutableList.of(field(1, BIGINT))); OperatorFactory operatorFactory = new FilterAndProjectOperator.FilterAndProjectOperatorFactory( 0, 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 0688aee866793..adcde12bebd34 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 @@ -107,8 +107,8 @@ public void testPageSource() DriverContext driverContext = newDriverContext(); List projections = ImmutableList.of(field(0, VARCHAR)); - Supplier cursorProcessor = expressionCompiler.compileCursorProcessor(Optional.empty(), projections, "key"); - Supplier pageProcessor = expressionCompiler.compilePageProcessor(Optional.empty(), projections); + Supplier cursorProcessor = expressionCompiler.compileCursorProcessor(driverContext.getSession().getSqlFunctionProperties(), Optional.empty(), projections, "key"); + Supplier pageProcessor = expressionCompiler.compilePageProcessor(driverContext.getSession().getSqlFunctionProperties(), Optional.empty(), projections); ScanFilterAndProjectOperator.ScanFilterAndProjectOperatorFactory factory = new ScanFilterAndProjectOperator.ScanFilterAndProjectOperatorFactory( 0, @@ -151,8 +151,8 @@ public void testPageSourceMergeOutput() field(0, BIGINT), constant(10L, 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); + Supplier cursorProcessor = expressionCompiler.compileCursorProcessor(TEST_SESSION.getSqlFunctionProperties(), Optional.of(filter), projections, "key"); + Supplier pageProcessor = expressionCompiler.compilePageProcessor(TEST_SESSION.getSqlFunctionProperties(), Optional.of(filter), projections); ScanFilterAndProjectOperator.ScanFilterAndProjectOperatorFactory factory = new ScanFilterAndProjectOperator.ScanFilterAndProjectOperatorFactory( 0, @@ -195,7 +195,7 @@ public void testPageSourceLazyLoad() DriverContext driverContext = newDriverContext(); List projections = ImmutableList.of(field(0, VARCHAR)); - Supplier cursorProcessor = expressionCompiler.compileCursorProcessor(Optional.empty(), projections, "key"); + Supplier cursorProcessor = expressionCompiler.compileCursorProcessor(driverContext.getSession().getSqlFunctionProperties(), Optional.empty(), projections, "key"); PageProcessor pageProcessor = new PageProcessor(Optional.of(new SelectAllFilter()), ImmutableList.of(new LazyPagePageProjection())); ScanFilterAndProjectOperator.ScanFilterAndProjectOperatorFactory factory = new ScanFilterAndProjectOperator.ScanFilterAndProjectOperatorFactory( @@ -229,8 +229,8 @@ public void testRecordCursorSource() DriverContext driverContext = newDriverContext(); List projections = ImmutableList.of(field(0, VARCHAR)); - Supplier cursorProcessor = expressionCompiler.compileCursorProcessor(Optional.empty(), projections, "key"); - Supplier pageProcessor = expressionCompiler.compilePageProcessor(Optional.empty(), projections); + Supplier cursorProcessor = expressionCompiler.compileCursorProcessor(driverContext.getSession().getSqlFunctionProperties(), Optional.empty(), projections, "key"); + Supplier pageProcessor = expressionCompiler.compilePageProcessor(driverContext.getSession().getSqlFunctionProperties(), Optional.empty(), projections); ScanFilterAndProjectOperator.ScanFilterAndProjectOperatorFactory factory = new ScanFilterAndProjectOperator.ScanFilterAndProjectOperatorFactory( 0, @@ -282,8 +282,8 @@ public void testPageYield() for (int i = 0; i < totalColumns; i++) { projections.add(call("generic_long_page_col", functionManager.lookupFunction("generic_long_page_col" + i, fromTypes(BIGINT)), BIGINT, field(0, BIGINT))); } - Supplier cursorProcessor = expressionCompiler.compileCursorProcessor(Optional.empty(), projections.build(), "key"); - Supplier pageProcessor = expressionCompiler.compilePageProcessor(Optional.empty(), projections.build(), MAX_BATCH_SIZE); + Supplier cursorProcessor = expressionCompiler.compileCursorProcessor(driverContext.getSession().getSqlFunctionProperties(), Optional.empty(), projections.build(), "key"); + Supplier pageProcessor = expressionCompiler.compilePageProcessor(driverContext.getSession().getSqlFunctionProperties(), Optional.empty(), projections.build(), MAX_BATCH_SIZE); ScanFilterAndProjectOperator.ScanFilterAndProjectOperatorFactory factory = new ScanFilterAndProjectOperator.ScanFilterAndProjectOperatorFactory( 0, @@ -349,8 +349,8 @@ public void testRecordCursorYield() functionManager.lookupFunction("generic_long_record_cursor", fromTypes(BIGINT)), BIGINT, field(0, BIGINT))); - Supplier cursorProcessor = expressionCompiler.compileCursorProcessor(Optional.empty(), projections, "key"); - Supplier pageProcessor = expressionCompiler.compilePageProcessor(Optional.empty(), projections); + Supplier cursorProcessor = expressionCompiler.compileCursorProcessor(driverContext.getSession().getSqlFunctionProperties(), Optional.empty(), projections, "key"); + Supplier pageProcessor = expressionCompiler.compilePageProcessor(driverContext.getSession().getSqlFunctionProperties(), Optional.empty(), projections); ScanFilterAndProjectOperator.ScanFilterAndProjectOperatorFactory factory = new ScanFilterAndProjectOperator.ScanFilterAndProjectOperatorFactory( 0, diff --git a/presto-main/src/test/java/com/facebook/presto/operator/index/TestTupleFilterProcessor.java b/presto-main/src/test/java/com/facebook/presto/operator/index/TestTupleFilterProcessor.java index 1707b74e4eab6..ec669c22ae91c 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/index/TestTupleFilterProcessor.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/index/TestTupleFilterProcessor.java @@ -62,6 +62,7 @@ public void testFilter() new int[] {0, 1, 2}, new int[] {1, 0, 3}, outputTypes, + SESSION.getSqlFunctionProperties(), new PageFunctionCompiler(createTestMetadataManager(), 0)); PageProcessor tupleFilterProcessor = filterFactory.createPageProcessor(tuplePage, OptionalInt.of(MAX_BATCH_SIZE)).get(); Page actualPage = getOnlyElement( 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 27b1fbd21ac17..fe83349b14e2c 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 @@ -394,7 +394,7 @@ public void testExpressionProfiler() TestingTicker testingTicker = new TestingTicker(); PageFunctionCompiler functionCompiler = new PageFunctionCompiler(metadata, 0); - Supplier projectionSupplier = functionCompiler.compileProjection(add10Expression, Optional.empty()); + Supplier projectionSupplier = functionCompiler.compileProjection(SESSION.getSqlFunctionProperties(), add10Expression, Optional.empty()); PageProjection projection = projectionSupplier.get(); Page page = new Page(createLongSequenceBlock(1, 11)); ExpressionProfiler profiler = new ExpressionProfiler(testingTicker, SPLIT_RUN_QUANTA); 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 80797553cb785..57a7b4d7f6544 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 @@ -120,7 +120,7 @@ public void setup() } ImmutableList projections = projectionsBuilder.build(); - pageProcessor = compiler.compilePageProcessor(Optional.empty(), projections).get(); + pageProcessor = compiler.compilePageProcessor(SESSION.getSqlFunctionProperties(), 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 7aa66b60e6cd8..9d53ee12cc088 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 @@ -145,7 +145,7 @@ public void setup() } ImmutableList projections = projectionsBuilder.build(); - pageProcessor = compiler.compilePageProcessor(Optional.empty(), projections).get(); + pageProcessor = compiler.compilePageProcessor(SESSION.getSqlFunctionProperties(), 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 da4d41934e793..04e9d8a90895e 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 @@ -145,7 +145,7 @@ public void setup() blocks[0] = createChannel(POSITIONS, ARRAY_SIZE, arrayType); ImmutableList projections = projectionsBuilder.build(); - pageProcessor = compiler.compilePageProcessor(Optional.empty(), projections).get(); + pageProcessor = compiler.compilePageProcessor(SESSION.getSqlFunctionProperties(), 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 6bb2a72a00444..6dd8ffe05c505 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 @@ -128,7 +128,7 @@ public void setup() new CallExpression(name, functionHandle, arrayType, ImmutableList.of(field(0, arrayType), field(1, arrayType)))); ExpressionCompiler compiler = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)); - pageProcessor = compiler.compilePageProcessor(Optional.empty(), projections).get(); + pageProcessor = compiler.compilePageProcessor(SESSION.getSqlFunctionProperties(), Optional.empty(), projections).get(); page = new Page(createChannel(POSITIONS, arraySize, elementType), createChannel(POSITIONS, arraySize, elementType)); } 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 9d8d63fc28f7d..b7c41459655eb 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 @@ -100,7 +100,7 @@ public void setup() constant(Slices.wrappedBuffer(",".getBytes(UTF_8)), VARCHAR)))); pageProcessor = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)) - .compilePageProcessor(Optional.empty(), projections) + .compilePageProcessor(SESSION.getSqlFunctionProperties(), Optional.empty(), projections) .get(); page = new Page(createChannel(POSITIONS, ARRAY_SIZE)); 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 47e8f93ebc776..2dec2bf70364d 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 @@ -118,7 +118,7 @@ public void setup() } ImmutableList projections = projectionsBuilder.build(); - pageProcessor = compiler.compilePageProcessor(Optional.empty(), projections).get(); + pageProcessor = compiler.compilePageProcessor(SESSION.getSqlFunctionProperties(), 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 e8c09ef58998e..8e05f66f8b292 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 @@ -145,7 +145,7 @@ public void setup() } ImmutableList projections = projectionsBuilder.build(); - pageProcessor = compiler.compilePageProcessor(Optional.empty(), projections).get(); + pageProcessor = compiler.compilePageProcessor(SESSION.getSqlFunctionProperties(), 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 dd4d013aa30eb..c8fe32eeb3625 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 @@ -127,7 +127,7 @@ public void setup() } ImmutableList projections = projectionsBuilder.build(); - pageProcessor = compiler.compilePageProcessor(Optional.empty(), projections).get(); + pageProcessor = compiler.compilePageProcessor(SESSION.getSqlFunctionProperties(), Optional.empty(), projections).get(); pageBuilder = new PageBuilder(projections.stream().map(RowExpression::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 7f056ba150d7e..dfd5093cf1921 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 @@ -89,7 +89,7 @@ public void setup() metadata, new PageFunctionCompiler(metadata, 0)); RowExpression projection = generateComplexComparisonProjection(functionManager, FIELDS_COUNT, COMPARISONS_COUNT); - compiledProcessor = expressionCompiler.compilePageProcessor(Optional.empty(), ImmutableList.of(projection)).get(); + compiledProcessor = expressionCompiler.compilePageProcessor(SESSION.getSqlFunctionProperties(), Optional.empty(), ImmutableList.of(projection)).get(); } private static RowExpression generateComplexComparisonProjection(FunctionManager functionManager, int fieldsCount, int comparisonsCount) 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 0d750cc173d87..6aea907b7796c 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 @@ -120,7 +120,7 @@ public void setup() new CallExpression(CAST.name(), functionHandle, new ArrayType(elementType), ImmutableList.of(field(0, JSON)))); pageProcessor = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)) - .compilePageProcessor(Optional.empty(), projections) + .compilePageProcessor(SESSION.getSqlFunctionProperties(), Optional.empty(), projections) .get(); page = new Page(createChannel(POSITION_COUNT, ARRAY_SIZE, elementType)); 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 c5ef0ce6fa617..eac0e4114c7fd 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 @@ -120,7 +120,7 @@ public void setup() new CallExpression(CAST.name(), functionHandle, mapType(VARCHAR, valueType), ImmutableList.of(field(0, JSON)))); pageProcessor = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)) - .compilePageProcessor(Optional.empty(), projections) + .compilePageProcessor(SESSION.getSqlFunctionProperties(), Optional.empty(), projections) .get(); page = new Page(createChannel(POSITION_COUNT, MAP_SIZE, valueType)); 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 734b630548bb4..fd139b1d31564 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 @@ -146,7 +146,7 @@ public void setup() ImmutableList.of(field(0, mapType), field(1, mapType)))); ImmutableList projections = projectionsBuilder.build(); - pageProcessor = compiler.compilePageProcessor(Optional.empty(), projections).get(); + pageProcessor = compiler.compilePageProcessor(SESSION.getSqlFunctionProperties(), 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 691d05ecf6831..22e48d51bb342 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 @@ -157,7 +157,7 @@ public void setup() } ImmutableList projections = projectionsBuilder.build(); - pageProcessor = compiler.compilePageProcessor(Optional.empty(), projections).get(); + pageProcessor = compiler.compilePageProcessor(SESSION.getSqlFunctionProperties(), 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 807db118e7b53..aebef8774f986 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 @@ -99,7 +99,7 @@ public void setup() new CallExpression(CAST.name(), functionHandle, mapType(BIGINT, DOUBLE), ImmutableList.of(field(0, mapType(DOUBLE, BIGINT))))); pageProcessor = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)) - .compilePageProcessor(Optional.empty(), projections) + .compilePageProcessor(SESSION.getSqlFunctionProperties(), Optional.empty(), projections) .get(); Block keyBlock = createKeyBlock(POSITION_COUNT, MAP_SIZE); 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 595339e5e5106..24a4a2656a817 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 @@ -99,7 +99,7 @@ public void setup() new CallExpression(CAST.name(), functionHandle, RowType.anonymous(fromFieldTypes), ImmutableList.of(field(0, RowType.anonymous(toFieldTypes))))); pageProcessor = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)) - .compilePageProcessor(Optional.empty(), projections) + .compilePageProcessor(SESSION.getSqlFunctionProperties(), Optional.empty(), projections) .get(); Block[] fieldBlocks = fromFieldTypes.stream() 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 9731a58881d76..f204861f0ecef 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 @@ -142,7 +142,7 @@ public void setup() Block block = createChannel(POSITIONS, mapType, elementType); ImmutableList projections = projectionsBuilder.build(); - pageProcessor = compiler.compilePageProcessor(Optional.empty(), projections).get(); + pageProcessor = compiler.compilePageProcessor(SESSION.getSqlFunctionProperties(), 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 acf75f4e0b84d..231e2289fbcdf 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 @@ -154,7 +154,7 @@ public void setup() Block block = createChannel(POSITIONS, mapType, elementType); ImmutableList projections = projectionsBuilder.build(); - pageProcessor = compiler.compilePageProcessor(Optional.empty(), projections).get(); + pageProcessor = compiler.compilePageProcessor(SESSION.getSqlFunctionProperties(), 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 f0b4282de184b..045a98edd4dcd 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.TableHandle; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.connector.ConnectorTransactionHandle; +import com.facebook.presto.spi.function.SqlFunctionProperties; import com.facebook.presto.spi.plan.PlanNodeId; import com.facebook.presto.spi.predicate.Utils; import com.facebook.presto.spi.relation.RowExpression; @@ -448,7 +449,7 @@ public void assertCachedInstanceHasBoundedRetainedSize(String projection) Expression projectionExpression = createExpression(session, projection, metadata, SYMBOL_TYPES); RowExpression projectionRowExpression = toRowExpression(session, projectionExpression); - PageProcessor processor = compiler.compilePageProcessor(Optional.empty(), ImmutableList.of(projectionRowExpression)).get(); + PageProcessor processor = compiler.compilePageProcessor(session.getSqlFunctionProperties(), Optional.empty(), ImmutableList.of(projectionRowExpression)).get(); // This is a heuristic to detect whether the retained size of cachedInstance is bounded. // * The test runs at least 1000 iterations. @@ -577,7 +578,7 @@ private List executeProjectionWithAll(String projection, Type expectedTy } // execute as standalone operator - OperatorFactory operatorFactory = compileFilterProject(Optional.empty(), projectionRowExpression, compiler); + OperatorFactory operatorFactory = compileFilterProject(session.getSqlFunctionProperties(), Optional.empty(), projectionRowExpression, compiler); Object directOperatorValue = selectSingleValue(operatorFactory, expectedType, session); results.add(directOperatorValue); @@ -586,7 +587,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(session.getSqlFunctionProperties(), Optional.empty(), projectionRowExpression, compiler); Object scanOperatorValue = selectSingleValue(scanProjectOperatorFactory, expectedType, createNormalSplit(), session); results.add(scanOperatorValue); @@ -677,12 +678,12 @@ private List executeFilterWithAll(String filter, Session session, boole List results = new ArrayList<>(); // execute as standalone operator - OperatorFactory operatorFactory = compileFilterProject(Optional.of(filterRowExpression), constant(true, BOOLEAN), compiler); + OperatorFactory operatorFactory = compileFilterProject(session.getSqlFunctionProperties(), Optional.of(filterRowExpression), constant(true, BOOLEAN), compiler); results.add(executeFilter(operatorFactory, session)); if (executeWithNoInputColumns) { // execute as standalone operator - operatorFactory = compileFilterWithNoInputColumns(filterRowExpression, compiler); + operatorFactory = compileFilterWithNoInputColumns(session.getSqlFunctionProperties(), filterRowExpression, compiler); results.add(executeFilterWithNoInputColumns(operatorFactory, session)); } @@ -694,7 +695,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(session.getSqlFunctionProperties(), Optional.of(filterRowExpression), constant(true, BOOLEAN), compiler); boolean scanOperatorValue = executeFilter(scanProjectOperatorFactory, createNormalSplit(), session); results.add(scanOperatorValue); @@ -897,10 +898,10 @@ else if (javaType == Block.class) { return expectedType.getObjectValue(session.toConnectorSession(), block, 0); } - private static OperatorFactory compileFilterWithNoInputColumns(RowExpression filter, ExpressionCompiler compiler) + private static OperatorFactory compileFilterWithNoInputColumns(SqlFunctionProperties sqlFunctionProperties, RowExpression filter, ExpressionCompiler compiler) { try { - Supplier processor = compiler.compilePageProcessor(Optional.of(filter), ImmutableList.of()); + Supplier processor = compiler.compilePageProcessor(sqlFunctionProperties, Optional.of(filter), ImmutableList.of()); return new FilterAndProjectOperatorFactory(0, new PlanNodeId("test"), processor, ImmutableList.of(), new DataSize(0, BYTE), 0); } @@ -912,10 +913,10 @@ private static OperatorFactory compileFilterWithNoInputColumns(RowExpression fil } } - private static OperatorFactory compileFilterProject(Optional filter, RowExpression projection, ExpressionCompiler compiler) + private static OperatorFactory compileFilterProject(SqlFunctionProperties sqlFunctionProperties, Optional filter, RowExpression projection, ExpressionCompiler compiler) { try { - Supplier processor = compiler.compilePageProcessor(filter, ImmutableList.of(projection)); + Supplier processor = compiler.compilePageProcessor(sqlFunctionProperties, filter, ImmutableList.of(projection)); return new FilterAndProjectOperatorFactory(0, new PlanNodeId("test"), processor, ImmutableList.of(projection.getType()), new DataSize(0, BYTE), 0); } catch (Throwable e) { @@ -926,15 +927,17 @@ private static OperatorFactory compileFilterProject(Optional filt } } - private static SourceOperatorFactory compileScanFilterProject(Optional filter, RowExpression projection, ExpressionCompiler compiler) + private static SourceOperatorFactory compileScanFilterProject(SqlFunctionProperties sqlFunctionProperties, Optional filter, RowExpression projection, ExpressionCompiler compiler) { try { Supplier cursorProcessor = compiler.compileCursorProcessor( + sqlFunctionProperties, filter, ImmutableList.of(projection), SOURCE_ID); Supplier pageProcessor = compiler.compilePageProcessor( + sqlFunctionProperties, filter, ImmutableList.of(projection)); 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 ceca36252ee92..fe6e210cb2d90 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 @@ -38,6 +38,7 @@ import java.util.Optional; +import static com.facebook.presto.SessionTestUtils.TEST_SESSION; import static com.facebook.presto.block.BlockAssertions.createLongDictionaryBlock; import static com.facebook.presto.block.BlockAssertions.createRLEBlock; import static com.facebook.presto.block.BlockAssertions.createSlicesBlock; @@ -86,15 +87,15 @@ public void testNoCaching() projectionsBuilder.add(new CallExpression("concat", functionHandle, arrayType, ImmutableList.of(field(0, arrayType), field(1, arrayType)))); ImmutableList projections = projectionsBuilder.build(); - PageProcessor pageProcessor = compiler.compilePageProcessor(Optional.empty(), projections).get(); - PageProcessor pageProcessor2 = compiler.compilePageProcessor(Optional.empty(), projections).get(); + PageProcessor pageProcessor = compiler.compilePageProcessor(TEST_SESSION.getSqlFunctionProperties(), Optional.empty(), projections).get(); + PageProcessor pageProcessor2 = compiler.compilePageProcessor(TEST_SESSION.getSqlFunctionProperties(), Optional.empty(), projections).get(); assertTrue(pageProcessor != pageProcessor2); } @Test public void testSanityRLE() { - PageProcessor processor = compiler.compilePageProcessor(Optional.empty(), ImmutableList.of(field(0, BIGINT), field(1, VARCHAR)), MAX_BATCH_SIZE).get(); + PageProcessor processor = compiler.compilePageProcessor(TEST_SESSION.getSqlFunctionProperties(), Optional.empty(), ImmutableList.of(field(0, BIGINT), field(1, VARCHAR)), MAX_BATCH_SIZE).get(); Slice varcharValue = Slices.utf8Slice("hello"); Page page = new Page(RunLengthEncodedBlock.create(BIGINT, 123L, 100), RunLengthEncodedBlock.create(VARCHAR, varcharValue, 100)); @@ -126,7 +127,7 @@ public void testSanityFilterOnDictionary() FunctionHandle lessThan = functionManager.resolveOperator(LESS_THAN, fromTypes(BIGINT, BIGINT)); CallExpression filter = new CallExpression(LESS_THAN.name(), lessThan, BOOLEAN, ImmutableList.of(lengthVarchar, constant(10L, BIGINT))); - PageProcessor processor = compiler.compilePageProcessor(Optional.of(filter), ImmutableList.of(field(0, VARCHAR)), MAX_BATCH_SIZE).get(); + PageProcessor processor = compiler.compilePageProcessor(TEST_SESSION.getSqlFunctionProperties(), Optional.of(filter), ImmutableList.of(field(0, VARCHAR)), MAX_BATCH_SIZE).get(); Page page = new Page(createDictionaryBlock(createExpectedValues(10), 100)); Page outputPage = getOnlyElement( @@ -165,7 +166,7 @@ public void testSanityFilterOnRLE() FunctionHandle lessThan = functionManager.resolveOperator(LESS_THAN, fromTypes(BIGINT, BIGINT)); CallExpression filter = new CallExpression(LESS_THAN.name(), lessThan, BOOLEAN, ImmutableList.of(field(0, BIGINT), constant(10L, BIGINT))); - PageProcessor processor = compiler.compilePageProcessor(Optional.of(filter), ImmutableList.of(field(0, BIGINT)), MAX_BATCH_SIZE).get(); + PageProcessor processor = compiler.compilePageProcessor(TEST_SESSION.getSqlFunctionProperties(), Optional.of(filter), ImmutableList.of(field(0, BIGINT)), MAX_BATCH_SIZE).get(); Page page = new Page(createRLEBlock(5L, 100)); Page outputPage = getOnlyElement( @@ -186,7 +187,7 @@ public void testSanityFilterOnRLE() @Test public void testSanityColumnarDictionary() { - PageProcessor processor = compiler.compilePageProcessor(Optional.empty(), ImmutableList.of(field(0, VARCHAR)), MAX_BATCH_SIZE).get(); + PageProcessor processor = compiler.compilePageProcessor(TEST_SESSION.getSqlFunctionProperties(), Optional.empty(), ImmutableList.of(field(0, VARCHAR)), MAX_BATCH_SIZE).get(); Page page = new Page(createDictionaryBlock(createExpectedValues(10), 100)); Page outputPage = getOnlyElement( @@ -214,7 +215,7 @@ public void testNonDeterministicProject() InputReferenceExpression col0 = field(0, BIGINT); CallExpression lessThanRandomExpression = new CallExpression(LESS_THAN.name(), lessThan, BOOLEAN, ImmutableList.of(col0, random)); - PageProcessor processor = compiler.compilePageProcessor(Optional.empty(), ImmutableList.of(lessThanRandomExpression), MAX_BATCH_SIZE).get(); + PageProcessor processor = compiler.compilePageProcessor(TEST_SESSION.getSqlFunctionProperties(), Optional.empty(), ImmutableList.of(lessThanRandomExpression), MAX_BATCH_SIZE).get(); assertFalse(new RowExpressionDeterminismEvaluator(metadataManager.getFunctionManager()).isDeterministic(lessThanRandomExpression)); 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 bbd369ecb6d4d..e18853b9eb558 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 @@ -44,6 +44,7 @@ import java.util.Optional; import java.util.concurrent.TimeUnit; +import static com.facebook.presto.SessionTestUtils.TEST_SESSION; import static com.facebook.presto.memory.context.AggregatedMemoryContext.newSimpleAggregatedMemoryContext; import static com.facebook.presto.metadata.MetadataManager.createTestMetadataManager; import static com.facebook.presto.spi.function.OperatorType.GREATER_THAN_OR_EQUAL; @@ -89,7 +90,7 @@ public void setup() MetadataManager metadata = createTestMetadataManager(); FunctionManager functionManager = metadata.getFunctionManager(); compiledProcessor = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)) - .compilePageProcessor(Optional.of(createFilterExpression(functionManager)), ImmutableList.of(createProjectExpression(functionManager))) + .compilePageProcessor(TEST_SESSION.getSqlFunctionProperties(), Optional.of(createFilterExpression(functionManager)), ImmutableList.of(createProjectExpression(functionManager))) .get(); } 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 9a164ca5de4bd..6d11bbcc2ad82 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 @@ -127,7 +127,7 @@ public void setup() RowExpression filter = specialForm(IN, BOOLEAN, arguments); MetadataManager metadata = MetadataManager.createTestMetadataManager(); - processor = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)).compilePageProcessor(Optional.of(filter), ImmutableList.of(project)).get(); + processor = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)).compilePageProcessor(SESSION.getSqlFunctionProperties(), Optional.of(filter), ImmutableList.of(project)).get(); } @Benchmark 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 0f358b2724d9b..9d9173669f7d6 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 @@ -123,10 +123,10 @@ public void setup() PageFunctionCompiler pageFunctionCompiler = new PageFunctionCompiler(metadata, 0); inputPage = createPage(types, dictionaryBlocks); - pageProcessor = new ExpressionCompiler(metadata, pageFunctionCompiler).compilePageProcessor(Optional.of(getFilter(type)), projections).get(); + pageProcessor = new ExpressionCompiler(metadata, pageFunctionCompiler).compilePageProcessor(TEST_SESSION.getSqlFunctionProperties(), Optional.of(getFilter(type)), projections).get(); recordSet = new PageRecordSet(types, inputPage); - cursorProcessor = new ExpressionCompiler(metadata, pageFunctionCompiler).compileCursorProcessor(Optional.of(getFilter(type)), projections, "key").get(); + cursorProcessor = new ExpressionCompiler(metadata, pageFunctionCompiler).compileCursorProcessor(TEST_SESSION.getSqlFunctionProperties(), Optional.of(getFilter(type)), projections, "key").get(); } @Benchmark 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 d93e37474911d..9e6c07d8faf12 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 @@ -56,7 +56,7 @@ public void testFailureDoesNotCorruptFutureResults() { PageFunctionCompiler functionCompiler = new PageFunctionCompiler(createTestMetadataManager(), 0); - Supplier projectionSupplier = functionCompiler.compileProjection(ADD_10_EXPRESSION, Optional.empty()); + Supplier projectionSupplier = functionCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.empty()); PageProjection projection = projectionSupplier.get(); // process good page and verify we got the expected number of result rows @@ -88,7 +88,7 @@ public void testGeneratedClassName() String planNodeId = "7"; String stageId = "20170707_223500_67496_zguwn.2"; String classSuffix = stageId + "_" + planNodeId; - Supplier projectionSupplier = functionCompiler.compileProjection(ADD_10_EXPRESSION, Optional.of(classSuffix)); + Supplier projectionSupplier = functionCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.of(classSuffix)); PageProjection projection = projectionSupplier.get(); Work work = projection.project(SESSION, new DriverYieldSignal(), createLongBlockPage(0), SelectedPositions.positionsRange(0, 1)); // class name should look like PageProjectionOutput_20170707_223500_67496_zguwn_2_7_XX @@ -100,31 +100,31 @@ public void testCache() { PageFunctionCompiler cacheCompiler = new PageFunctionCompiler(createTestMetadataManager(), 100); assertSame( - cacheCompiler.compileProjection(ADD_10_EXPRESSION, Optional.empty()), - cacheCompiler.compileProjection(ADD_10_EXPRESSION, Optional.empty())); + cacheCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.empty()), + cacheCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.empty())); assertSame( - cacheCompiler.compileProjection(ADD_10_EXPRESSION, Optional.of("hint")), - cacheCompiler.compileProjection(ADD_10_EXPRESSION, Optional.of("hint"))); + cacheCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.of("hint")), + cacheCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.of("hint"))); assertSame( - cacheCompiler.compileProjection(ADD_10_EXPRESSION, Optional.of("hint")), - cacheCompiler.compileProjection(ADD_10_EXPRESSION, Optional.of("hint2"))); + cacheCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.of("hint")), + cacheCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.of("hint2"))); assertSame( - cacheCompiler.compileProjection(ADD_10_EXPRESSION, Optional.empty()), - cacheCompiler.compileProjection(ADD_10_EXPRESSION, Optional.of("hint2"))); + cacheCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.empty()), + cacheCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.of("hint2"))); PageFunctionCompiler noCacheCompiler = new PageFunctionCompiler(createTestMetadataManager(), 0); assertNotSame( - noCacheCompiler.compileProjection(ADD_10_EXPRESSION, Optional.empty()), - noCacheCompiler.compileProjection(ADD_10_EXPRESSION, Optional.empty())); + noCacheCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.empty()), + noCacheCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.empty())); assertNotSame( - noCacheCompiler.compileProjection(ADD_10_EXPRESSION, Optional.of("hint")), - noCacheCompiler.compileProjection(ADD_10_EXPRESSION, Optional.of("hint"))); + noCacheCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.of("hint")), + noCacheCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.of("hint"))); assertNotSame( - noCacheCompiler.compileProjection(ADD_10_EXPRESSION, Optional.of("hint")), - noCacheCompiler.compileProjection(ADD_10_EXPRESSION, Optional.of("hint2"))); + noCacheCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.of("hint")), + noCacheCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.of("hint2"))); assertNotSame( - noCacheCompiler.compileProjection(ADD_10_EXPRESSION, Optional.empty()), - noCacheCompiler.compileProjection(ADD_10_EXPRESSION, Optional.of("hint2"))); + noCacheCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.empty()), + noCacheCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.of("hint2"))); } private Block project(PageProjection projection, Page page, SelectedPositions selectedPositions) diff --git a/presto-main/src/test/java/com/facebook/presto/sql/gen/TestRowExpressionPredicateCompiler.java b/presto-main/src/test/java/com/facebook/presto/sql/gen/TestRowExpressionPredicateCompiler.java index 41e922ae519bd..39da2ea897553 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/gen/TestRowExpressionPredicateCompiler.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/gen/TestRowExpressionPredicateCompiler.java @@ -66,7 +66,7 @@ public void test() constant(0L, BIGINT)); PredicateCompiler compiler = new RowExpressionPredicateCompiler(functionManager, 10_000); - Predicate compiledSum = compiler.compilePredicate(sum).get(); + Predicate compiledSum = compiler.compilePredicate(SESSION.getSqlFunctionProperties(), sum).get(); assertEquals(Arrays.asList(1, 0), Ints.asList(compiledSum.getInputChannels())); @@ -84,7 +84,7 @@ public void test() BOOLEAN, call("b * 2", functionResolution.arithmeticFunction(MULTIPLY, BIGINT, BIGINT), BIGINT, b, constant(2L, BIGINT)), constant(10L, BIGINT)); - Predicate compiledTimesTwo = compiler.compilePredicate(timesTwo).get(); + Predicate compiledTimesTwo = compiler.compilePredicate(SESSION.getSqlFunctionProperties(), timesTwo).get(); assertEquals(Arrays.asList(1), Ints.asList(compiledTimesTwo.getInputChannels())); @@ -108,10 +108,10 @@ public void testCache() constant(10L, BIGINT)); PredicateCompiler compiler = new RowExpressionPredicateCompiler(functionManager, 10_000); - assertSame(compiler.compilePredicate(predicate), compiler.compilePredicate(predicate)); + assertSame(compiler.compilePredicate(SESSION.getSqlFunctionProperties(), predicate), compiler.compilePredicate(SESSION.getSqlFunctionProperties(), predicate)); PredicateCompiler noCacheCompiler = new RowExpressionPredicateCompiler(functionManager, 0); - assertNotSame(noCacheCompiler.compilePredicate(predicate), noCacheCompiler.compilePredicate(predicate)); + assertNotSame(noCacheCompiler.compilePredicate(SESSION.getSqlFunctionProperties(), predicate), noCacheCompiler.compilePredicate(SESSION.getSqlFunctionProperties(), predicate)); } private static Block createLongBlock(long... values) 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 c43f302a1c990..8a3466015059a 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 @@ -596,7 +596,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(SESSION.getSqlFunctionProperties(), Optional.empty(), ImmutableList.of(rowExpression(expression))).get(); } protected void setDoubleMaxValue(double doubleMaxValue) diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/function/SqlFunctionProperties.java b/presto-spi/src/main/java/com/facebook/presto/spi/function/SqlFunctionProperties.java index ea22e356519e4..b95223bed7a0f 100644 --- a/presto-spi/src/main/java/com/facebook/presto/spi/function/SqlFunctionProperties.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/function/SqlFunctionProperties.java @@ -15,6 +15,8 @@ import com.facebook.presto.spi.type.TimeZoneKey; +import java.util.Objects; + import static java.util.Objects.requireNonNull; public class SqlFunctionProperties @@ -57,6 +59,28 @@ public boolean isLegacyTimestamp() return legacyTimestamp; } + @Override + public boolean equals(Object o) + { + if (this == o) { + return true; + } + if (!(o instanceof SqlFunctionProperties)) { + return false; + } + SqlFunctionProperties that = (SqlFunctionProperties) o; + return Objects.equals(parseDecimalLiteralAsDouble, that.parseDecimalLiteralAsDouble) && + Objects.equals(legacyRowFieldOrdinalAccessEnabled, that.legacyRowFieldOrdinalAccessEnabled) && + Objects.equals(timeZoneKey, that.timeZoneKey) && + Objects.equals(legacyTimestamp, that.legacyTimestamp); + } + + @Override + public int hashCode() + { + return Objects.hash(parseDecimalLiteralAsDouble, legacyRowFieldOrdinalAccessEnabled, timeZoneKey, legacyTimestamp); + } + public static Builder builder() { return new Builder(); diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/relation/PredicateCompiler.java b/presto-spi/src/main/java/com/facebook/presto/spi/relation/PredicateCompiler.java index 49a323b1a2363..bc02c08568188 100644 --- a/presto-spi/src/main/java/com/facebook/presto/spi/relation/PredicateCompiler.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/relation/PredicateCompiler.java @@ -14,6 +14,7 @@ package com.facebook.presto.spi.relation; import com.facebook.presto.spi.api.Experimental; +import com.facebook.presto.spi.function.SqlFunctionProperties; import java.util.function.Supplier; @@ -27,5 +28,5 @@ public interface PredicateCompiler /** * Predicate expression may not contain any variable references, only input references. */ - Supplier compilePredicate(RowExpression predicate); + Supplier compilePredicate(SqlFunctionProperties sqlFunctionProperties, RowExpression predicate); } From 5fde5d424561f345184569a67a68530d1caed370 Mon Sep 17 00:00:00 2001 From: Rongrong Zhong Date: Mon, 14 Oct 2019 15:56:00 -0700 Subject: [PATCH 08/11] Rename ScalarFunctionImplementation to BuiltInScalarFunctionImplementation --- .../BuiltInFunctionNamespaceManager.java | 16 ++++++------ .../metadata/FunctionInvokerProvider.java | 22 ++++++++-------- .../presto/metadata/FunctionManager.java | 4 +-- .../metadata/PolymorphicScalarFunction.java | 18 ++++++------- .../PolymorphicScalarFunctionBuilder.java | 10 +++---- .../presto/metadata/SqlScalarFunction.java | 4 +-- .../operator/SimplePagesHashStrategy.java | 2 +- .../AbstractMinMaxAggregationFunction.java | 2 +- .../minmaxby/AbstractMinMaxBy.java | 2 +- .../ScalarImplementationDependency.java | 2 +- .../index/FieldSetFilteringRecordSet.java | 2 +- .../scalar/AbstractGreatestLeast.java | 10 +++---- .../presto/operator/scalar/ApplyFunction.java | 10 +++---- .../operator/scalar/ArrayConcatFunction.java | 8 +++--- .../operator/scalar/ArrayConstructor.java | 8 +++--- .../operator/scalar/ArrayFlattenFunction.java | 8 +++--- .../presto/operator/scalar/ArrayJoin.java | 20 +++++++------- .../operator/scalar/ArrayReduceFunction.java | 12 ++++----- .../scalar/ArraySubscriptOperator.java | 8 +++--- .../operator/scalar/ArrayToArrayCast.java | 12 ++++----- .../scalar/ArrayToElementConcatFunction.java | 8 +++--- .../operator/scalar/ArrayToJsonCast.java | 8 +++--- .../scalar/ArrayTransformFunction.java | 10 +++---- ... BuiltInScalarFunctionImplementation.java} | 12 ++++----- .../scalar/CastFromUnknownOperator.java | 8 +++--- .../operator/scalar/ConcatFunction.java | 8 +++--- .../scalar/ElementToArrayConcatFunction.java | 8 +++--- .../presto/operator/scalar/IdentityCast.java | 8 +++--- .../operator/scalar/InvokeFunction.java | 6 ++--- .../scalar/JsonStringToArrayCast.java | 2 +- .../operator/scalar/JsonStringToMapCast.java | 2 +- .../operator/scalar/JsonStringToRowCast.java | 2 +- .../operator/scalar/JsonToArrayCast.java | 8 +++--- .../presto/operator/scalar/JsonToMapCast.java | 8 +++--- .../presto/operator/scalar/JsonToRowCast.java | 8 +++--- .../operator/scalar/MapConcatFunction.java | 8 +++--- .../operator/scalar/MapConstructor.java | 14 +++++----- .../operator/scalar/MapElementAtFunction.java | 10 +++---- .../operator/scalar/MapFilterFunction.java | 10 +++---- .../operator/scalar/MapHashCodeOperator.java | 12 ++++----- .../operator/scalar/MapSubscriptOperator.java | 8 +++--- .../presto/operator/scalar/MapToJsonCast.java | 8 +++--- .../presto/operator/scalar/MapToMapCast.java | 10 +++---- .../scalar/MapTransformKeyFunction.java | 10 +++---- .../scalar/MapTransformValueFunction.java | 10 +++---- .../operator/scalar/MapZipWithFunction.java | 10 +++---- .../operator/scalar/ParametricScalar.java | 10 +++---- .../scalar/Re2JCastToRegexpFunction.java | 8 +++--- .../scalar/RowComparisonOperator.java | 2 +- .../scalar/RowDistinctFromOperator.java | 14 +++++----- .../operator/scalar/RowEqualOperator.java | 10 +++---- .../scalar/RowGreaterThanOperator.java | 8 +++--- .../scalar/RowGreaterThanOrEqualOperator.java | 8 +++--- .../operator/scalar/RowHashCodeOperator.java | 8 +++--- .../scalar/RowIndeterminateOperator.java | 10 +++---- .../operator/scalar/RowLessThanOperator.java | 8 +++--- .../scalar/RowLessThanOrEqualOperator.java | 8 +++--- .../operator/scalar/RowNotEqualOperator.java | 8 +++--- .../presto/operator/scalar/RowToJsonCast.java | 8 +++--- .../presto/operator/scalar/RowToRowCast.java | 10 +++---- .../operator/scalar/TryCastFunction.java | 8 +++--- .../presto/operator/scalar/ZipFunction.java | 10 +++---- .../operator/scalar/ZipWithFunction.java | 10 +++---- .../ParametricScalarImplementation.java | 26 +++++++++---------- .../sql/InterpretedFunctionInvoker.java | 16 ++++++------ .../presto/sql/gen/ArrayGeneratorUtils.java | 4 +-- .../sql/gen/BytecodeGeneratorContext.java | 6 ++--- .../presto/sql/gen/BytecodeUtils.java | 16 ++++++------ .../sql/gen/FunctionCallCodeGenerator.java | 8 +++--- .../presto/sql/gen/InCodeGenerator.java | 10 +++---- .../gen/InvokeFunctionBytecodeExpression.java | 8 +++--- .../facebook/presto/sql/gen/JoinCompiler.java | 4 +-- .../presto/sql/gen/NullIfCodeGenerator.java | 6 ++--- .../presto/sql/gen/SwitchCodeGenerator.java | 2 +- .../sql/planner/ExpressionInterpreter.java | 2 +- .../type/DecimalInequalityOperators.java | 6 ++--- .../facebook/presto/type/TypeRegistry.java | 2 +- .../presto/util/FastutilSetHelper.java | 12 ++++----- .../metadata/TestFunctionInvokerProvider.java | 12 ++++----- .../presto/metadata/TestFunctionManager.java | 10 +++---- .../TestPolymorphicScalarFunction.java | 20 +++++++------- .../presto/operator/GenericLongFunction.java | 10 +++---- .../TestAnnotationEngineForScalars.java | 16 ++++++------ .../operator/scalar/BenchmarkArrayFilter.java | 8 +++--- ...ametricScalarImplementationValidation.java | 12 ++++----- ...idedBlockBuilderReturnPlaceConvention.java | 20 +++++++------- .../TestVarArgsToArrayAdapterGenerator.java | 10 +++---- .../presto/tests/StatefulSleepingSum.java | 10 +++---- 88 files changed, 400 insertions(+), 400 deletions(-) rename presto-main/src/main/java/com/facebook/presto/operator/scalar/{ScalarFunctionImplementation.java => BuiltInScalarFunctionImplementation.java} (95%) diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/BuiltInFunctionNamespaceManager.java b/presto-main/src/main/java/com/facebook/presto/metadata/BuiltInFunctionNamespaceManager.java index 235ee37a6e117..d44f517ca1e39 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/BuiltInFunctionNamespaceManager.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/BuiltInFunctionNamespaceManager.java @@ -93,6 +93,7 @@ import com.facebook.presto.operator.scalar.ArrayUnionFunction; import com.facebook.presto.operator.scalar.ArraysOverlapFunction; import com.facebook.presto.operator.scalar.BitwiseFunctions; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; import com.facebook.presto.operator.scalar.CharacterStringCasts; import com.facebook.presto.operator.scalar.ColorFunctions; import com.facebook.presto.operator.scalar.CombineHashFunction; @@ -125,7 +126,6 @@ import com.facebook.presto.operator.scalar.Re2JRegexpFunctions; import com.facebook.presto.operator.scalar.Re2JRegexpReplaceLambdaFunction; import com.facebook.presto.operator.scalar.RepeatFunction; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; import com.facebook.presto.operator.scalar.SequenceFunction; import com.facebook.presto.operator.scalar.SessionFunctions; import com.facebook.presto.operator.scalar.SplitToMapFunction; @@ -247,6 +247,8 @@ import static com.facebook.presto.operator.scalar.ArrayToElementConcatFunction.ARRAY_TO_ELEMENT_CONCAT_FUNCTION; import static com.facebook.presto.operator.scalar.ArrayToJsonCast.ARRAY_TO_JSON; import static com.facebook.presto.operator.scalar.ArrayTransformFunction.ARRAY_TRANSFORM_FUNCTION; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.operator.scalar.CastFromUnknownOperator.CAST_FROM_UNKNOWN; import static com.facebook.presto.operator.scalar.ConcatFunction.VARBINARY_CONCAT; import static com.facebook.presto.operator.scalar.ConcatFunction.VARCHAR_CONCAT; @@ -284,8 +286,6 @@ import static com.facebook.presto.operator.scalar.RowNotEqualOperator.ROW_NOT_EQUAL; import static com.facebook.presto.operator.scalar.RowToJsonCast.ROW_TO_JSON; import static com.facebook.presto.operator.scalar.RowToRowCast.ROW_TO_ROW_CAST; -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.TryCastFunction.TRY_CAST; import static com.facebook.presto.operator.scalar.ZipFunction.ZIP_FUNCTIONS; import static com.facebook.presto.operator.scalar.ZipWithFunction.ZIP_WITH_FUNCTION; @@ -356,7 +356,7 @@ public class BuiltInFunctionNamespaceManager private final TypeManager typeManager; private final LoadingCache specializedFunctionKeyCache; - private final LoadingCache specializedScalarCache; + private final LoadingCache specializedScalarCache; private final LoadingCache specializedAggregationCache; private final LoadingCache specializedWindowCache; private final MagicLiteralFunction magicLiteralFunction; @@ -790,13 +790,13 @@ public InternalAggregationFunction getAggregateFunctionImplementation(FunctionHa } } - public ScalarFunctionImplementation getScalarFunctionImplementation(FunctionHandle functionHandle) + public BuiltInScalarFunctionImplementation getScalarFunctionImplementation(FunctionHandle functionHandle) { checkArgument(functionHandle instanceof BuiltInFunctionHandle, "Expect BuiltInFunctionHandle"); return getScalarFunctionImplementation(((BuiltInFunctionHandle) functionHandle).getSignature()); } - public ScalarFunctionImplementation getScalarFunctionImplementation(Signature signature) + public BuiltInScalarFunctionImplementation getScalarFunctionImplementation(Signature signature) { checkArgument(signature.getKind() == SCALAR, "%s is not a scalar function", signature); checkArgument(signature.getTypeVariableConstraints().isEmpty(), "%s has unbound type parameters", signature); @@ -963,7 +963,7 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type parameterType = boundVariables.getTypeVariable("T"); Type type = boundVariables.getTypeVariable("R"); @@ -985,7 +985,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in parameterType.getJavaType(), type.getJavaType()); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), methodHandle); 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 d2750720a1420..cf208410300ed 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 @@ -13,10 +13,10 @@ */ package com.facebook.presto.metadata; -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.operator.scalar.BuiltInScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ScalarImplementationChoice; import com.facebook.presto.spi.PrestoException; import com.facebook.presto.spi.function.FunctionHandle; import com.facebook.presto.spi.function.InvocationConvention; @@ -27,11 +27,11 @@ import java.util.List; import java.util.Optional; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentType.FUNCTION_TYPE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.BLOCK_AND_POSITION; -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.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentType.FUNCTION_TYPE; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.BLOCK_AND_POSITION; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.USE_BOXED_TYPE; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.USE_NULL_FLAG; import static com.facebook.presto.spi.StandardErrorCode.FUNCTION_NOT_FOUND; import static com.google.common.base.Preconditions.checkState; import static java.lang.String.format; @@ -47,8 +47,8 @@ public FunctionInvokerProvider(FunctionManager functionManager) public FunctionInvoker createFunctionInvoker(FunctionHandle functionHandle, Optional invocationConvention) { - ScalarFunctionImplementation scalarFunctionImplementation = functionManager.getScalarFunctionImplementation(functionHandle); - for (ScalarImplementationChoice choice : scalarFunctionImplementation.getAllChoices()) { + BuiltInScalarFunctionImplementation builtInScalarFunctionImplementation = functionManager.getBuiltInScalarFunctionImplementation(functionHandle); + for (ScalarImplementationChoice choice : builtInScalarFunctionImplementation.getAllChoices()) { if (checkChoice(choice.getArgumentProperties(), choice.isNullable(), choice.hasSession(), invocationConvention)) { return new FunctionInvoker(choice.getMethodHandle()); } diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/FunctionManager.java b/presto-main/src/main/java/com/facebook/presto/metadata/FunctionManager.java index 843fd98149706..2c8c0ace4cc50 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/FunctionManager.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/FunctionManager.java @@ -15,7 +15,7 @@ import com.facebook.presto.Session; import com.facebook.presto.operator.aggregation.InternalAggregationFunction; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; import com.facebook.presto.operator.window.WindowFunctionSupplier; import com.facebook.presto.spi.PrestoException; import com.facebook.presto.spi.block.BlockEncodingSerde; @@ -235,7 +235,7 @@ public InternalAggregationFunction getAggregateFunctionImplementation(FunctionHa return builtInFunctionNamespaceManager.getAggregateFunctionImplementation(functionHandle); } - public ScalarFunctionImplementation getScalarFunctionImplementation(FunctionHandle functionHandle) + public BuiltInScalarFunctionImplementation getBuiltInScalarFunctionImplementation(FunctionHandle functionHandle) { return builtInFunctionNamespaceManager.getScalarFunctionImplementation(functionHandle); } 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 80741ea1611f8..c015f044c0279 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 @@ -16,11 +16,11 @@ import com.facebook.presto.metadata.PolymorphicScalarFunctionBuilder.MethodAndNativeContainerTypes; import com.facebook.presto.metadata.PolymorphicScalarFunctionBuilder.MethodsGroup; import com.facebook.presto.metadata.PolymorphicScalarFunctionBuilder.SpecializeContext; -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.ReturnPlaceConvention; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ScalarImplementationChoice; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ReturnPlaceConvention; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ScalarImplementationChoice; import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeManager; @@ -35,8 +35,8 @@ import java.util.Optional; import static com.facebook.presto.metadata.SignatureBinder.applyBoundVariables; -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.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.BLOCK_AND_POSITION; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.USE_NULL_FLAG; import static com.google.common.base.Preconditions.checkState; import static java.util.Collections.emptyList; import static java.util.Objects.requireNonNull; @@ -92,7 +92,7 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { ImmutableList.Builder implementationChoices = ImmutableList.builder(); @@ -100,7 +100,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in implementationChoices.add(getScalarFunctionImplementationChoice(boundVariables, typeManager, functionManager, choice)); } - return new ScalarFunctionImplementation(implementationChoices.build()); + return new BuiltInScalarFunctionImplementation(implementationChoices.build()); } private ScalarImplementationChoice getScalarFunctionImplementationChoice( 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 ebe19d46ce307..75265f9a1c691 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 @@ -14,8 +14,8 @@ package com.facebook.presto.metadata; import com.facebook.presto.metadata.PolymorphicScalarFunction.PolymorphicScalarFunctionChoice; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ReturnPlaceConvention; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ReturnPlaceConvention; import com.facebook.presto.spi.function.OperatorType; import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; @@ -29,9 +29,9 @@ import java.util.Optional; import java.util.function.Function; -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.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.BLOCK_AND_POSITION; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; import static com.google.common.collect.ImmutableList.toImmutableList; 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 7596cf08ed870..da596d6af1e38 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 @@ -13,7 +13,7 @@ */ package com.facebook.presto.metadata; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; import com.facebook.presto.spi.function.OperatorType; import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.TypeManager; @@ -39,7 +39,7 @@ public final Signature getSignature() return signature; } - public abstract ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager); + public abstract BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager); public static PolymorphicScalarFunctionBuilder builder(Class clazz, OperatorType operatorType) { diff --git a/presto-main/src/main/java/com/facebook/presto/operator/SimplePagesHashStrategy.java b/presto-main/src/main/java/com/facebook/presto/operator/SimplePagesHashStrategy.java index 27bf24af7cb1f..aa4a770438cfa 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/SimplePagesHashStrategy.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/SimplePagesHashStrategy.java @@ -75,7 +75,7 @@ public SimplePagesHashStrategy( ImmutableList.Builder distinctFromMethodHandlesBuilder = ImmutableList.builder(); for (Type type : types) { distinctFromMethodHandlesBuilder.add( - functionManager.getScalarFunctionImplementation(functionManager.resolveOperator(IS_DISTINCT_FROM, fromTypes(type, type))).getMethodHandle()); + functionManager.getBuiltInScalarFunctionImplementation(functionManager.resolveOperator(IS_DISTINCT_FROM, fromTypes(type, type))).getMethodHandle()); } distinctFromMethodHandles = distinctFromMethodHandlesBuilder.build(); } 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 be20382c05099..4d479af727235 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 @@ -90,7 +90,7 @@ protected AbstractMinMaxAggregationFunction(String name, boolean min) public InternalAggregationFunction specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type type = boundVariables.getTypeVariable("E"); - MethodHandle compareMethodHandle = functionManager.getScalarFunctionImplementation( + MethodHandle compareMethodHandle = functionManager.getBuiltInScalarFunctionImplementation( functionManager.resolveOperator(operatorType, fromTypes(type, type))).getMethodHandle(); return generateAggregation(type, compareMethodHandle); } 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 71fae449886b7..f5df7c17990df 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 @@ -136,7 +136,7 @@ private InternalAggregationFunction generateAggregation(Type valueType, Type key CallSiteBinder binder = new CallSiteBinder(); OperatorType operator = min ? LESS_THAN : GREATER_THAN; - MethodHandle compareMethod = functionManager.getScalarFunctionImplementation(functionManager.resolveOperator(operator, fromTypes(keyType, keyType))).getMethodHandle(); + MethodHandle compareMethod = functionManager.getBuiltInScalarFunctionImplementation(functionManager.resolveOperator(operator, fromTypes(keyType, keyType))).getMethodHandle(); ClassDefinition definition = new ClassDefinition( a(PUBLIC, FINAL), 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 c07b6e92377d3..8ec12e632ef4c 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 @@ -41,7 +41,7 @@ public MethodHandle resolve(BoundVariables boundVariables, TypeManager typeManag return functionManager.getFunctionInvokerProvider().createFunctionInvoker(functionHandle, invocationConvention).methodHandle(); } else { - return functionManager.getScalarFunctionImplementation(functionHandle).getMethodHandle(); + return functionManager.getBuiltInScalarFunctionImplementation(functionHandle).getMethodHandle(); } } 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 9c0f314c42712..b2c065453f236 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 @@ -54,7 +54,7 @@ public FieldSetFilteringRecordSet(FunctionManager functionManager, RecordSet del for (int field : fieldSet) { fieldSetBuilder.add(new Field( field, - functionManager.getScalarFunctionImplementation( + functionManager.getBuiltInScalarFunctionImplementation( functionManager.resolveOperator(OperatorType.EQUAL, fromTypes(columnTypes.get(field), columnTypes.get(field)))).getMethodHandle())); } fieldSetsBuilder.add(fieldSetBuilder.build()); 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 5d7e13a62713b..b97dc36761d5b 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 @@ -47,8 +47,8 @@ import static com.facebook.presto.bytecode.Access.a; import static com.facebook.presto.bytecode.Parameter.arg; import static com.facebook.presto.bytecode.ParameterizedType.type; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -99,12 +99,12 @@ public boolean isDeterministic() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type type = boundVariables.getTypeVariable("E"); checkArgument(type.isOrderable(), "Type must be orderable"); - MethodHandle compareMethod = functionManager.getScalarFunctionImplementation( + MethodHandle compareMethod = functionManager.getBuiltInScalarFunctionImplementation( functionManager.resolveOperator(operatorType, fromTypes(type, type))).getMethodHandle(); List> javaTypes = IntStream.range(0, arity) @@ -114,7 +114,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in Class clazz = generate(javaTypes, type, compareMethod); MethodHandle methodHandle = methodHandle(clazz, getSignature().getNameSuffix(), javaTypes.toArray(new Class[javaTypes.size()])); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, nCopies(javaTypes.size(), valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), methodHandle); 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 98ee7adb3dfbb..55e480fcc4d83 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 @@ -27,9 +27,9 @@ import java.lang.invoke.MethodHandle; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -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.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -82,11 +82,11 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type argumentType = boundVariables.getTypeVariable("T"); Type returnType = boundVariables.getTypeVariable("U"); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( true, ImmutableList.of( valueTypeArgumentProperty(USE_BOXED_TYPE), 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 3588500385fc4..79439e6468991 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 @@ -33,8 +33,8 @@ import java.util.Optional; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -84,7 +84,7 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { if (arity < 2) { throw new PrestoException(INVALID_FUNCTION_ARGUMENT, "There must be two or more arguments to " + FUNCTION_NAME); @@ -99,7 +99,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in METHOD_HANDLE.bindTo(elementType), USER_STATE_FACTORY.bindTo(elementType)); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, nCopies(arity, valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), methodHandleAndConstructor.getMethodHandle(), 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 99c92ed3061bc..416f895c0c3b7 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 @@ -54,8 +54,8 @@ import static com.facebook.presto.bytecode.expression.BytecodeExpressions.constantNull; import static com.facebook.presto.bytecode.expression.BytecodeExpressions.equal; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -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.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -110,7 +110,7 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Map types = boundVariables.getTypeVariables(); checkArgument(types.size() == 1, "Can only construct arrays from exactly matching types"); @@ -134,7 +134,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in catch (ReflectiveOperationException e) { throw new RuntimeException(e); } - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, nCopies(stackTypes.size(), valueTypeArgumentProperty(USE_BOXED_TYPE)), methodHandle); 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 58744f9fee806..19224e1b9b58d 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 @@ -30,8 +30,8 @@ import java.lang.invoke.MethodHandle; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -74,12 +74,12 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type elementType = boundVariables.getTypeVariable("E"); Type arrayType = typeManager.getParameterizedType(StandardTypes.ARRAY, ImmutableList.of(TypeSignatureParameter.of(elementType.getTypeSignature()))); MethodHandle methodHandle = METHOD_HANDLE.bindTo(elementType).bindTo(arrayType); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), methodHandle); 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 dfa7a776289f9..04801b57f8c52 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 @@ -17,7 +17,7 @@ import com.facebook.presto.metadata.BoundVariables; import com.facebook.presto.metadata.FunctionManager; import com.facebook.presto.metadata.SqlScalarFunction; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty; import com.facebook.presto.spi.ConnectorSession; import com.facebook.presto.spi.PageBuilder; import com.facebook.presto.spi.PrestoException; @@ -43,9 +43,9 @@ import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; import static com.facebook.presto.metadata.CastType.CAST; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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.Signature.typeVariable; @@ -124,7 +124,7 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { return specializeArrayJoin(boundVariables.getTypeVariables(), functionManager, ImmutableList.of(false, false, false), METHOD_HANDLE); } @@ -167,12 +167,12 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { return specializeArrayJoin(boundVariables.getTypeVariables(), functionManager, ImmutableList.of(false, false), METHOD_HANDLE); } - private static ScalarFunctionImplementation specializeArrayJoin(Map types, FunctionManager functionManager, List nullableArguments, MethodHandle methodHandle) + private static BuiltInScalarFunctionImplementation specializeArrayJoin(Map types, FunctionManager functionManager, List nullableArguments, MethodHandle methodHandle) { Type type = types.get("T"); List argumentProperties = nullableArguments.stream() @@ -182,7 +182,7 @@ private static ScalarFunctionImplementation specializeArrayJoin(Map elementType = type.getJavaType(); @@ -226,7 +226,7 @@ else if (elementType == Slice.class) { cast = MethodHandles.foldArguments(cast, getter.bindTo(type)); MethodHandle target = MethodHandles.insertArguments(methodHandle, 0, cast); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, argumentProperties, target, 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 46b0f413f0729..eb3059bfe1e0d 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 @@ -30,10 +30,10 @@ import java.lang.invoke.MethodHandle; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -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.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -83,13 +83,13 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type inputType = boundVariables.getTypeVariable("T"); Type intermediateType = boundVariables.getTypeVariable("S"); Type outputType = boundVariables.getTypeVariable("R"); MethodHandle methodHandle = METHOD_HANDLE.bindTo(inputType); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( true, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), 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 135780db13128..0b192e20ff99b 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,8 +26,8 @@ import java.lang.invoke.MethodHandle; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -58,7 +58,7 @@ protected ArraySubscriptOperator() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { checkArgument(boundVariables.getTypeVariables().size() == 1, "Expected one type, got %s", boundVariables.getTypeVariables()); Type elementType = boundVariables.getTypeVariable("E"); @@ -81,7 +81,7 @@ else if (elementType.getJavaType() == Slice.class) { } methodHandle = methodHandle.bindTo(elementType); requireNonNull(methodHandle, "methodHandle is null"); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( true, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), 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 1991a3a764414..6d7b3260f4310 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 @@ -45,8 +45,8 @@ import static com.facebook.presto.bytecode.Parameter.arg; import static com.facebook.presto.bytecode.ParameterizedType.type; import static com.facebook.presto.bytecode.expression.BytecodeExpressions.constantBoolean; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -70,17 +70,17 @@ private ArrayToArrayCast() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { checkArgument(arity == 1, "Expected arity to be 1"); Type fromType = boundVariables.getTypeVariable("F"); Type toType = boundVariables.getTypeVariable("T"); FunctionHandle functionHandle = functionManager.lookupCast(CastType.CAST, fromType.getTypeSignature(), toType.getTypeSignature()); - ScalarFunctionImplementation function = functionManager.getScalarFunctionImplementation(functionHandle); + BuiltInScalarFunctionImplementation function = functionManager.getBuiltInScalarFunctionImplementation(functionHandle); Class castOperatorClass = generateArrayCast(typeManager, functionManager.getFunctionMetadata(functionHandle), function); MethodHandle methodHandle = methodHandle(castOperatorClass, "castArray", ConnectorSession.class, Block.class); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), @@ -88,7 +88,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in methodHandle); } - private static Class generateArrayCast(TypeManager typeManager, FunctionMetadata elementCastFunctionMetadata, ScalarFunctionImplementation elementCast) + private static Class generateArrayCast(TypeManager typeManager, FunctionMetadata elementCastFunctionMetadata, BuiltInScalarFunctionImplementation elementCast) { CallSiteBinder binder = new CallSiteBinder(); 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 fc3fdbcf4729f..b513ab2768ec1 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 @@ -28,8 +28,8 @@ import java.lang.invoke.MethodHandle; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -76,7 +76,7 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type type = boundVariables.getTypeVariable("E"); MethodHandle methodHandle; @@ -97,7 +97,7 @@ else if (type.getJavaType() == Slice.class) { } methodHandle = methodHandle.bindTo(type); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), 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 364b510ac12bc..f1526407e6668 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,9 +33,9 @@ import java.io.IOException; import java.lang.invoke.MethodHandle; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; 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; @@ -62,7 +62,7 @@ private ArrayToJsonCast() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { checkArgument(arity == 1, "Expected arity to be 1"); Type type = boundVariables.getTypeVariable("T"); @@ -71,7 +71,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in JsonGeneratorWriter writer = JsonGeneratorWriter.createJsonGeneratorWriter(type); MethodHandle methodHandle = METHOD_HANDLE.bindTo(writer); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), 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 001edf26d9c99..9d5292f5a75e8 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 @@ -57,9 +57,9 @@ import static com.facebook.presto.bytecode.expression.BytecodeExpressions.subtract; import static com.facebook.presto.bytecode.instruction.VariableInstruction.incrementVariable; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -104,12 +104,12 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type inputType = boundVariables.getTypeVariable("T"); Type outputType = boundVariables.getTypeVariable("U"); Class generatedClass = generateTransform(inputType, outputType); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ScalarFunctionImplementation.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/BuiltInScalarFunctionImplementation.java similarity index 95% rename from presto-main/src/main/java/com/facebook/presto/operator/scalar/ScalarFunctionImplementation.java rename to presto-main/src/main/java/com/facebook/presto/operator/scalar/BuiltInScalarFunctionImplementation.java index 2953b9e1fd260..13b9c423c504f 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ScalarFunctionImplementation.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/BuiltInScalarFunctionImplementation.java @@ -21,18 +21,18 @@ import java.util.Objects; import java.util.Optional; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentType.FUNCTION_TYPE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentType.VALUE_TYPE; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentType.FUNCTION_TYPE; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentType.VALUE_TYPE; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; import static java.lang.String.format; import static java.util.Objects.requireNonNull; -public final class ScalarFunctionImplementation +public final class BuiltInScalarFunctionImplementation { private final List choices; - public ScalarFunctionImplementation( + public BuiltInScalarFunctionImplementation( boolean nullable, List argumentProperties, MethodHandle methodHandle) @@ -44,7 +44,7 @@ public ScalarFunctionImplementation( Optional.empty()); } - public ScalarFunctionImplementation( + public BuiltInScalarFunctionImplementation( boolean nullable, List argumentProperties, MethodHandle methodHandle, @@ -68,7 +68,7 @@ public ScalarFunctionImplementation( * * @param choices the list of choices, ordered from generic to specific */ - public ScalarFunctionImplementation(List choices) + public BuiltInScalarFunctionImplementation(List choices) { checkArgument(!choices.isEmpty(), "choices is an empty list"); this.choices = ImmutableList.copyOf(choices); 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 2071ba1907d0a..9468625b1f9ca 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,8 +23,8 @@ import java.lang.invoke.MethodHandle; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -46,13 +46,13 @@ public CastFromUnknownOperator() } @Override - public ScalarFunctionImplementation specialize( + public BuiltInScalarFunctionImplementation specialize( BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type toType = boundVariables.getTypeVariable("E"); MethodHandle methodHandle = METHOD_HANDLE_NON_NULL.asType(METHOD_HANDLE_NON_NULL.type().changeReturnType(toType.getJavaType())); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), 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 eec29fb7a2bcc..5fd6e6e90906e 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 @@ -51,8 +51,8 @@ import static com.facebook.presto.bytecode.expression.BytecodeExpressions.constantInt; import static com.facebook.presto.bytecode.expression.BytecodeExpressions.invokeStatic; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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.type.VarbinaryType.VARBINARY; @@ -107,7 +107,7 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { if (arity < 2) { throw new PrestoException(INVALID_FUNCTION_ARGUMENT, "There must be two or more concatenation arguments"); @@ -116,7 +116,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in Class clazz = generateConcat(getSignature().getReturnType(), arity); MethodHandle methodHandle = methodHandle(clazz, "concat", nCopies(arity, Slice.class).toArray(new Class[arity])); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, nCopies(arity, valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), methodHandle); 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 afe323559e0fb..468b70e959b78 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 @@ -28,8 +28,8 @@ import java.lang.invoke.MethodHandle; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -76,7 +76,7 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type type = boundVariables.getTypeVariable("E"); MethodHandle methodHandle; @@ -97,7 +97,7 @@ else if (type.getJavaType() == Slice.class) { } methodHandle = methodHandle.bindTo(type); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), 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 7fa41a329144e..a8f09bd606175 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,8 +24,8 @@ import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -45,12 +45,12 @@ protected IdentityCast() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { checkArgument(boundVariables.getTypeVariables().size() == 1, "Expected only one type"); Type type = boundVariables.getTypeVariable("T"); MethodHandle identity = MethodHandles.identity(type.getJavaType()); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), identity); 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 52157e3118079..14fe2e91be7d9 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 @@ -28,7 +28,7 @@ import java.lang.invoke.MethodHandle; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -75,10 +75,10 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type returnType = boundVariables.getTypeVariable("T"); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( true, ImmutableList.of(functionTypeArgumentProperty(InvokeLambda.class)), METHOD_HANDLE.asType( 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 aab91fd2063fb..a5f9684fcc1ff 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 @@ -66,7 +66,7 @@ public final boolean isHidden() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { return JSON_TO_ARRAY.specialize(boundVariables, arity, typeManager, functionManager); } 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 d17e8f68861b3..3c7319844e4db 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 @@ -67,7 +67,7 @@ public final boolean isHidden() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { return JSON_TO_MAP.specialize(boundVariables, arity, typeManager, functionManager); } 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 1255b00e1b434..6120d481d7ae7 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 @@ -66,7 +66,7 @@ public final boolean isHidden() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { return JSON_TO_ROW.specialize(boundVariables, arity, typeManager, functionManager); } 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 46baf8ac4b49e..64cd45c153492 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,8 +36,8 @@ import java.lang.invoke.MethodHandle; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -67,7 +67,7 @@ private JsonToArrayCast() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { checkArgument(arity == 1, "Expected arity to be 1"); Type type = boundVariables.getTypeVariable("T"); @@ -76,7 +76,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in BlockBuilderAppender elementAppender = BlockBuilderAppender.createBlockBuilderAppender(arrayType.getElementType()); MethodHandle methodHandle = METHOD_HANDLE.bindTo(arrayType).bindTo(elementAppender); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( true, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), methodHandle); 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 574db4ec4c1a6..36829d8aaf85e 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,8 +36,8 @@ import java.lang.invoke.MethodHandle; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -70,7 +70,7 @@ private JsonToMapCast() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { checkArgument(arity == 1, "Expected arity to be 1"); Type keyType = boundVariables.getTypeVariable("K"); @@ -81,7 +81,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in BlockBuilderAppender keyAppender = createBlockBuilderAppender(mapType.getKeyType()); BlockBuilderAppender valueAppender = createBlockBuilderAppender(mapType.getValueType()); MethodHandle methodHandle = METHOD_HANDLE.bindTo(mapType).bindTo(keyAppender).bindTo(valueAppender); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( true, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), methodHandle); 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 b37370ac5f3b6..28c7cf33cde07 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,8 +39,8 @@ import java.util.Map; import java.util.Optional; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -74,7 +74,7 @@ private JsonToRowCast() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { checkArgument(arity == 1, "Expected arity to be 1"); RowType rowType = (RowType) boundVariables.getTypeVariable("T"); @@ -85,7 +85,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in .map(rowField -> createBlockBuilderAppender(rowField.getType())) .toArray(BlockBuilderAppender[]::new); MethodHandle methodHandle = METHOD_HANDLE.bindTo(rowType).bindTo(fieldAppenders).bindTo(getFieldNameToIndex(rowFields)); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( true, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), methodHandle); 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 60ec56ee6691e..8d51db9a951c9 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 @@ -37,8 +37,8 @@ import java.util.Optional; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -89,7 +89,7 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { if (arity < 2) { throw new PrestoException(INVALID_FUNCTION_ARGUMENT, "There must be two or more concatenation arguments to " + FUNCTION_NAME); @@ -108,7 +108,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in METHOD_HANDLE.bindTo(mapType), USER_STATE_FACTORY.bindTo(mapType)); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, nCopies(arity, valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), methodHandleAndConstructor.getMethodHandle(), 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 a97cd54a33814..1c8fd821f7855 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 @@ -39,8 +39,8 @@ import java.util.Optional; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -104,19 +104,19 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type keyType = boundVariables.getTypeVariable("K"); Type valueType = boundVariables.getTypeVariable("V"); Type mapType = typeManager.getParameterizedType(MAP, ImmutableList.of(TypeSignatureParameter.of(keyType.getTypeSignature()), TypeSignatureParameter.of(valueType.getTypeSignature()))); - MethodHandle keyHashCode = functionManager.getScalarFunctionImplementation(functionManager.resolveOperator(OperatorType.HASH_CODE, fromTypes(keyType))).getMethodHandle(); - MethodHandle keyEqual = functionManager.getScalarFunctionImplementation(functionManager.resolveOperator(OperatorType.EQUAL, fromTypes(keyType, keyType))).getMethodHandle(); - MethodHandle keyIndeterminate = functionManager.getScalarFunctionImplementation( + MethodHandle keyHashCode = functionManager.getBuiltInScalarFunctionImplementation(functionManager.resolveOperator(OperatorType.HASH_CODE, fromTypes(keyType))).getMethodHandle(); + MethodHandle keyEqual = functionManager.getBuiltInScalarFunctionImplementation(functionManager.resolveOperator(OperatorType.EQUAL, fromTypes(keyType, keyType))).getMethodHandle(); + MethodHandle keyIndeterminate = functionManager.getBuiltInScalarFunctionImplementation( functionManager.resolveOperator(INDETERMINATE, fromTypeSignatures((keyType.getTypeSignature())))).getMethodHandle(); MethodHandle instanceFactory = constructorMethodHandle(State.class, MapType.class).bindTo(mapType); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), 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 5b14b8cd12a67..d7a06c7f7f328 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 @@ -32,8 +32,8 @@ import java.lang.invoke.MethodHandle; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -82,12 +82,12 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type keyType = boundVariables.getTypeVariable("K"); Type valueType = boundVariables.getTypeVariable("V"); - MethodHandle keyEqualsMethod = functionManager.getScalarFunctionImplementation( + MethodHandle keyEqualsMethod = functionManager.getBuiltInScalarFunctionImplementation( functionManager.resolveOperator(OperatorType.EQUAL, fromTypes(keyType, keyType))).getMethodHandle(); MethodHandle methodHandle; @@ -109,7 +109,7 @@ else if (keyType.getJavaType() == Slice.class) { methodHandle = methodHandle.bindTo(keyEqualsMethod).bindTo(keyType).bindTo(valueType); methodHandle = methodHandle.asType(methodHandle.type().changeReturnType(Primitives.wrap(valueType.getJavaType()))); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( true, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), 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 6e90dd836c2cc..65d08c52a4327 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 @@ -62,9 +62,9 @@ import static com.facebook.presto.bytecode.expression.BytecodeExpressions.subtract; import static com.facebook.presto.bytecode.instruction.VariableInstruction.incrementVariable; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -110,14 +110,14 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type keyType = boundVariables.getTypeVariable("K"); Type valueType = boundVariables.getTypeVariable("V"); MapType mapType = (MapType) typeManager.getParameterizedType(StandardTypes.MAP, ImmutableList.of( TypeSignatureParameter.of(keyType.getTypeSignature()), TypeSignatureParameter.of(valueType.getTypeSignature()))); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), 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 e033044b3b126..f1cb90c05e9e9 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,8 +25,8 @@ import java.lang.invoke.MethodHandle; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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.TypeSignature.parseTypeSignature; @@ -50,16 +50,16 @@ private MapHashCodeOperator() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type keyType = boundVariables.getTypeVariable("K"); Type valueType = boundVariables.getTypeVariable("V"); - MethodHandle keyHashCodeFunction = functionManager.getScalarFunctionImplementation(functionManager.resolveOperator(HASH_CODE, fromTypes(keyType))).getMethodHandle(); - MethodHandle valueHashCodeFunction = functionManager.getScalarFunctionImplementation(functionManager.resolveOperator(HASH_CODE, fromTypes(valueType))).getMethodHandle(); + MethodHandle keyHashCodeFunction = functionManager.getBuiltInScalarFunctionImplementation(functionManager.resolveOperator(HASH_CODE, fromTypes(keyType))).getMethodHandle(); + MethodHandle valueHashCodeFunction = functionManager.getBuiltInScalarFunctionImplementation(functionManager.resolveOperator(HASH_CODE, fromTypes(valueType))).getMethodHandle(); MethodHandle method = METHOD_HANDLE.bindTo(keyHashCodeFunction).bindTo(valueHashCodeFunction).bindTo(keyType).bindTo(valueType); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), method); 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 4b5e1bf8dea6b..00355f4368cb0 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 @@ -33,8 +33,8 @@ import java.lang.invoke.MethodHandles; import static com.facebook.presto.metadata.CastType.CAST; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -66,7 +66,7 @@ public MapSubscriptOperator(boolean legacyMissingKey) } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type keyType = boundVariables.getTypeVariable("K"); Type valueType = boundVariables.getTypeVariable("V"); @@ -92,7 +92,7 @@ else if (keyType.getJavaType() == Slice.class) { methodHandle = methodHandle.bindTo(missingKeyExceptionFactory).bindTo(valueType); methodHandle = methodHandle.asType(methodHandle.type().changeReturnType(Primitives.wrap(valueType.getJavaType()))); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( true, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), 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 577ca3e3c89be..4cfb74e8999f7 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,9 +35,9 @@ import java.util.Map; import java.util.TreeMap; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; 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; @@ -66,7 +66,7 @@ private MapToJsonCast() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { checkArgument(arity == 1, "Expected arity to be 1"); Type keyType = boundVariables.getTypeVariable("K"); @@ -80,7 +80,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in JsonGeneratorWriter writer = JsonGeneratorWriter.createJsonGeneratorWriter(valueType); MethodHandle methodHandle = METHOD_HANDLE.bindTo(provider).bindTo(writer); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), methodHandle); 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 7f0fe9c5b0f34..23db25231aec3 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 @@ -32,8 +32,8 @@ import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.StandardErrorCode.INVALID_CAST_ARGUMENT; import static com.facebook.presto.spi.block.MethodHandleUtil.compose; import static com.facebook.presto.spi.block.MethodHandleUtil.nativeValueGetter; @@ -79,7 +79,7 @@ public MapToMapCast() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { checkArgument(arity == 1, "Expected arity to be 1"); Type fromKeyType = boundVariables.getTypeVariable("FK"); @@ -95,7 +95,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in MethodHandle keyProcessor = buildProcessor(functionManager, fromKeyType, toKeyType, true); MethodHandle valueProcessor = buildProcessor(functionManager, fromValueType, toValueType, false); MethodHandle target = MethodHandles.insertArguments(METHOD_HANDLE, 0, keyProcessor, valueProcessor, toMapType); - return new ScalarFunctionImplementation(true, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), target); + return new BuiltInScalarFunctionImplementation(true, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), target); } /** @@ -107,7 +107,7 @@ private MethodHandle buildProcessor(FunctionManager functionManager, Type fromTy MethodHandle getter = nativeValueGetter(fromType); // Adapt cast that takes ([ConnectorSession,] ?) to one that takes (?, ConnectorSession), where ? is the return type of getter. - ScalarFunctionImplementation castImplementation = functionManager.getScalarFunctionImplementation(functionManager.lookupCast(CastType.CAST, fromType.getTypeSignature(), toType.getTypeSignature())); + BuiltInScalarFunctionImplementation castImplementation = functionManager.getBuiltInScalarFunctionImplementation(functionManager.lookupCast(CastType.CAST, fromType.getTypeSignature(), toType.getTypeSignature())); MethodHandle cast = castImplementation.getMethodHandle(); if (cast.type().parameterArray()[0] != ConnectorSession.class) { cast = MethodHandles.dropArguments(cast, 0, ConnectorSession.class); 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 78a18fc2239dd..09f3e418be435 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 @@ -71,9 +71,9 @@ import static com.facebook.presto.bytecode.expression.BytecodeExpressions.subtract; import static com.facebook.presto.bytecode.instruction.VariableInstruction.incrementVariable; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -120,7 +120,7 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type keyType = boundVariables.getTypeVariable("K1"); Type transformedKeyType = boundVariables.getTypeVariable("K2"); @@ -128,7 +128,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in MapType resultMapType = (MapType) typeManager.getParameterizedType(StandardTypes.MAP, ImmutableList.of( TypeSignatureParameter.of(transformedKeyType.getTypeSignature()), TypeSignatureParameter.of(valueType.getTypeSignature()))); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), 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 b899a9b22dd12..b94cbf139cc99 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 @@ -69,9 +69,9 @@ import static com.facebook.presto.bytecode.expression.BytecodeExpressions.subtract; import static com.facebook.presto.bytecode.instruction.VariableInstruction.incrementVariable; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -118,7 +118,7 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type keyType = boundVariables.getTypeVariable("K"); Type valueType = boundVariables.getTypeVariable("V1"); @@ -126,7 +126,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in Type resultMapType = typeManager.getParameterizedType(StandardTypes.MAP, ImmutableList.of( TypeSignatureParameter.of(keyType.getTypeSignature()), TypeSignatureParameter.of(transformedValueType.getTypeSignature()))); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), 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 45ec282e724f3..e8d88b3c4e75e 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 @@ -35,9 +35,9 @@ import java.util.Optional; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -84,7 +84,7 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type keyType = boundVariables.getTypeVariable("K"); Type inputValueType1 = boundVariables.getTypeVariable("V1"); @@ -95,7 +95,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in ImmutableList.of( TypeSignatureParameter.of(keyType.getTypeSignature()), TypeSignatureParameter.of(outputValueType.getTypeSignature()))); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), 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 092f4ef273d12..107d5739b1d71 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 @@ -80,19 +80,19 @@ public ParametricImplementationsGroup getImpleme } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Signature boundSignature = applyBoundVariables(getSignature(), boundVariables, arity); if (implementations.getExactImplementations().containsKey(boundSignature)) { ParametricScalarImplementation implementation = implementations.getExactImplementations().get(boundSignature); - Optional scalarFunctionImplementation = implementation.specialize(boundSignature, boundVariables, typeManager, functionManager); + Optional scalarFunctionImplementation = implementation.specialize(boundSignature, boundVariables, typeManager, functionManager); checkCondition(scalarFunctionImplementation.isPresent(), FUNCTION_IMPLEMENTATION_ERROR, String.format("Exact implementation of %s do not match expected java types.", boundSignature.getNameSuffix())); return scalarFunctionImplementation.get(); } - ScalarFunctionImplementation selectedImplementation = null; + BuiltInScalarFunctionImplementation selectedImplementation = null; for (ParametricScalarImplementation implementation : implementations.getSpecializedImplementations()) { - Optional scalarFunctionImplementation = implementation.specialize(boundSignature, boundVariables, typeManager, functionManager); + Optional scalarFunctionImplementation = implementation.specialize(boundSignature, boundVariables, typeManager, functionManager); if (scalarFunctionImplementation.isPresent()) { checkCondition(selectedImplementation == null, AMBIGUOUS_FUNCTION_IMPLEMENTATION, "Ambiguous implementation for %s with bindings %s", getSignature(), boundVariables.getTypeVariables()); selectedImplementation = scalarFunctionImplementation.get(); @@ -102,7 +102,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in return selectedImplementation; } for (ParametricScalarImplementation implementation : implementations.getGenericImplementations()) { - Optional scalarFunctionImplementation = implementation.specialize(boundSignature, boundVariables, typeManager, functionManager); + Optional scalarFunctionImplementation = implementation.specialize(boundSignature, boundVariables, typeManager, functionManager); if (scalarFunctionImplementation.isPresent()) { checkCondition(selectedImplementation == null, AMBIGUOUS_FUNCTION_IMPLEMENTATION, "Ambiguous implementation for %s with bindings %s", getSignature(), boundVariables.getTypeVariables()); selectedImplementation = scalarFunctionImplementation.get(); diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/Re2JCastToRegexpFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/Re2JCastToRegexpFunction.java index 3aa79ae513a50..165ed3671952a 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/Re2JCastToRegexpFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/Re2JCastToRegexpFunction.java @@ -26,8 +26,8 @@ import java.lang.invoke.MethodHandle; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; 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.type.Chars.padSpaces; @@ -64,9 +64,9 @@ private Re2JCastToRegexpFunction(String sourceType, int dfaStatesLimit, int dfaR } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), insertArguments(METHOD_HANDLE, 0, dfaStatesLimit, dfaRetries, padSpaces, boundVariables.getLongVariable("x"))); 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 2c73c36729cd2..4d3925e2ea094 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 @@ -50,7 +50,7 @@ protected List getMethodHandles(RowType type, FunctionManager func ImmutableList.Builder argumentMethods = ImmutableList.builder(); for (Type parameterType : type.getTypeParameters()) { FunctionHandle operatorHandle = functionManager.resolveOperator(operatorType, fromTypes(parameterType, parameterType)); - argumentMethods.add(functionManager.getScalarFunctionImplementation(operatorHandle).getMethodHandle()); + argumentMethods.add(functionManager.getBuiltInScalarFunctionImplementation(operatorHandle).getMethodHandle()); } return argumentMethods.build(); } 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 98553ab3da70c..8660b80a890c6 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 @@ -17,8 +17,8 @@ import com.facebook.presto.metadata.FunctionInvoker; import com.facebook.presto.metadata.FunctionManager; 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.operator.scalar.BuiltInScalarFunctionImplementation.ReturnPlaceConvention; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ScalarImplementationChoice; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.function.FunctionHandle; import com.facebook.presto.spi.function.InvocationConvention; @@ -31,9 +31,9 @@ import java.util.List; import java.util.Optional; -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.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.BLOCK_AND_POSITION; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -61,7 +61,7 @@ private RowDistinctFromOperator() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { ImmutableList.Builder argumentMethods = ImmutableList.builder(); Type type = boundVariables.getTypeVariable("T"); @@ -75,7 +75,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in false))); argumentMethods.add(functionInvoker.methodHandle()); } - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( ImmutableList.of( new ScalarImplementationChoice( false, 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 ba4dbb2519fdf..f831cd441a0fa 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 @@ -27,8 +27,8 @@ import java.lang.invoke.MethodHandle; import java.util.List; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -54,10 +54,10 @@ private RowEqualOperator() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { RowType type = (RowType) boundVariables.getTypeVariable("T"); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( true, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), @@ -77,7 +77,7 @@ public static List resolveFieldEqualOperators(RowType rowType, Fun private static MethodHandle resolveEqualOperator(Type type, FunctionManager functionManager) { FunctionHandle operator = functionManager.resolveOperator(EQUAL, fromTypes(type, type)); - ScalarFunctionImplementation implementation = functionManager.getScalarFunctionImplementation(operator); + BuiltInScalarFunctionImplementation implementation = functionManager.getBuiltInScalarFunctionImplementation(operator); return implementation.getMethodHandle(); } diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowGreaterThanOperator.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowGreaterThanOperator.java index 822a4a10fad6f..eb7ed136c3d5e 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowGreaterThanOperator.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowGreaterThanOperator.java @@ -24,8 +24,8 @@ import java.lang.invoke.MethodHandle; import java.util.List; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.OperatorType.GREATER_THAN; import static com.facebook.presto.util.Reflection.methodHandle; @@ -41,10 +41,10 @@ private RowGreaterThanOperator() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type type = boundVariables.getTypeVariable("T"); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowGreaterThanOrEqualOperator.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowGreaterThanOrEqualOperator.java index 20617fc92a96f..98abee1cd6843 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowGreaterThanOrEqualOperator.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowGreaterThanOrEqualOperator.java @@ -24,8 +24,8 @@ import java.lang.invoke.MethodHandle; import java.util.List; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.OperatorType.GREATER_THAN; import static com.facebook.presto.spi.function.OperatorType.GREATER_THAN_OR_EQUAL; import static com.facebook.presto.util.Reflection.methodHandle; @@ -42,10 +42,10 @@ private RowGreaterThanOrEqualOperator() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type type = boundVariables.getTypeVariable("T"); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), 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 9b7b5f773973f..d0912af6612a6 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,8 +26,8 @@ import java.lang.invoke.MethodHandle; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -49,10 +49,10 @@ private RowHashCodeOperator() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type type = boundVariables.getTypeVariable("T"); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), METHOD_HANDLE.bindTo(type)); 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 cdb17f7ed7324..ce5549ca63d4b 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 @@ -43,8 +43,8 @@ import static com.facebook.presto.bytecode.ParameterizedType.type; import static com.facebook.presto.bytecode.expression.BytecodeExpressions.constantFalse; import static com.facebook.presto.bytecode.expression.BytecodeExpressions.constantInt; -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.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -69,13 +69,13 @@ private RowIndeterminateOperator() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { checkArgument(arity == 1, "Expected arity to be 1"); Type type = boundVariables.getTypeVariable("T"); Class indeterminateOperatorClass = generateIndeterminate(type, functionManager); MethodHandle indeterminateMethod = methodHandle(indeterminateOperatorClass, "indeterminate", type.getJavaType(), boolean.class); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of(valueTypeArgumentProperty(USE_NULL_FLAG)), indeterminateMethod); @@ -133,7 +133,7 @@ private static Class generateIndeterminate(Type type, FunctionManager functio FunctionHandle functionHandle = functionManager.resolveOperator(INDETERMINATE, fromTypes(fieldTypes.get(i))); - ScalarFunctionImplementation function = functionManager.getScalarFunctionImplementation(functionHandle); + BuiltInScalarFunctionImplementation function = functionManager.getBuiltInScalarFunctionImplementation(functionHandle); BytecodeExpression element = constantType(binder, fieldTypes.get(i)).getValue(value, constantInt(i)); ifNullField.ifFalse(new IfStatement("if the field is not null but indeterminate...") diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowLessThanOperator.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowLessThanOperator.java index 106c60d871bf5..532c75e7e1b8f 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowLessThanOperator.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowLessThanOperator.java @@ -24,8 +24,8 @@ import java.lang.invoke.MethodHandle; import java.util.List; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.OperatorType.LESS_THAN; import static com.facebook.presto.util.Reflection.methodHandle; @@ -41,10 +41,10 @@ private RowLessThanOperator() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type type = boundVariables.getTypeVariable("T"); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowLessThanOrEqualOperator.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowLessThanOrEqualOperator.java index e24f72af4d31e..2162d4d59958e 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowLessThanOrEqualOperator.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowLessThanOrEqualOperator.java @@ -24,8 +24,8 @@ import java.lang.invoke.MethodHandle; import java.util.List; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; 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.util.Reflection.methodHandle; @@ -42,10 +42,10 @@ private RowLessThanOrEqualOperator() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type type = boundVariables.getTypeVariable("T"); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), 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 61d20ebf2a067..06528f94745b3 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,8 +26,8 @@ import java.lang.invoke.MethodHandle; import java.util.List; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -49,10 +49,10 @@ private RowNotEqualOperator() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { RowType type = (RowType) boundVariables.getTypeVariable("T"); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( true, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), 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 cd49a29cf95ec..c606b94a1f1c1 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,9 +35,9 @@ import java.util.ArrayList; import java.util.List; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; 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; @@ -65,7 +65,7 @@ private RowToJsonCast() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { checkArgument(arity == 1, "Expected arity to be 1"); Type type = boundVariables.getTypeVariable("T"); @@ -78,7 +78,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in } MethodHandle methodHandle = METHOD_HANDLE.bindTo(fieldWriters); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), methodHandle); 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 d16912acc0b9d..87f36a804f24c 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 @@ -53,8 +53,8 @@ import static com.facebook.presto.bytecode.expression.BytecodeExpressions.constantBoolean; import static com.facebook.presto.bytecode.expression.BytecodeExpressions.constantInt; import static com.facebook.presto.bytecode.expression.BytecodeExpressions.constantNull; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -77,7 +77,7 @@ private RowToRowCast() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { checkArgument(arity == 1, "Expected arity to be 1"); Type fromType = boundVariables.getTypeVariable("F"); @@ -87,7 +87,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in } Class castOperatorClass = generateRowCast(fromType, toType, functionManager); MethodHandle methodHandle = methodHandle(castOperatorClass, "castRow", ConnectorSession.class, Block.class); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), methodHandle); @@ -142,7 +142,7 @@ private static Class generateRowCast(Type fromType, Type toType, FunctionMana // loop through to append member blocks for (int i = 0; i < toTypes.size(); i++) { FunctionHandle functionHandle = functionManager.lookupCast(CastType.CAST, fromTypes.get(i).getTypeSignature(), toTypes.get(i).getTypeSignature()); - ScalarFunctionImplementation function = functionManager.getScalarFunctionImplementation(functionHandle); + BuiltInScalarFunctionImplementation function = functionManager.getBuiltInScalarFunctionImplementation(functionHandle); Type currentFromType = fromTypes.get(i); if (currentFromType.equals(UNKNOWN)) { body.append(singleRowBlockWriter.invoke("appendNull", BlockBuilder.class).pop()); 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 d8eb3d1e13696..60cf95e728d60 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 @@ -16,7 +16,7 @@ import com.facebook.presto.metadata.BoundVariables; import com.facebook.presto.metadata.FunctionManager; import com.facebook.presto.metadata.SqlScalarFunction; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty; import com.facebook.presto.spi.function.FunctionHandle; import com.facebook.presto.spi.function.FunctionKind; import com.facebook.presto.spi.function.Signature; @@ -75,7 +75,7 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type fromType = boundVariables.getTypeVariable("F"); Type toType = boundVariables.getTypeVariable("T"); @@ -86,7 +86,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in // the resulting method needs to return a boxed type FunctionHandle functionHandle = functionManager.lookupCast(CAST, fromType.getTypeSignature(), toType.getTypeSignature()); - ScalarFunctionImplementation implementation = functionManager.getScalarFunctionImplementation(functionHandle); + BuiltInScalarFunctionImplementation implementation = functionManager.getBuiltInScalarFunctionImplementation(functionHandle); argumentProperties = ImmutableList.of(implementation.getArgumentProperty(0)); MethodHandle coercion = implementation.getMethodHandle(); coercion = coercion.asType(methodType(returnType, coercion.type())); @@ -94,6 +94,6 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in MethodHandle exceptionHandler = dropArguments(constant(returnType, null), 0, RuntimeException.class); tryCastHandle = catchException(coercion, RuntimeException.class, exceptionHandler); - return new ScalarFunctionImplementation(true, argumentProperties, tryCastHandle); + return new BuiltInScalarFunctionImplementation(true, argumentProperties, tryCastHandle); } } 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 fa88c01adcc69..32ceaca2471b5 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 @@ -17,7 +17,7 @@ import com.facebook.presto.metadata.BoundVariables; import com.facebook.presto.metadata.FunctionManager; import com.facebook.presto.metadata.SqlScalarFunction; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; import com.facebook.presto.spi.function.FunctionKind; @@ -34,8 +34,8 @@ import java.util.stream.IntStream; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; 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; @@ -98,13 +98,13 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { List types = this.typeParameters.stream().map(boundVariables::getTypeVariable).collect(toImmutableList()); List argumentProperties = nCopies(types.size(), valueTypeArgumentProperty(RETURN_NULL_ON_NULL)); List> javaArgumentTypes = nCopies(types.size(), Block.class); MethodHandle methodHandle = METHOD_HANDLE.bindTo(types).asVarargsCollector(Block[].class).asType(methodType(Block.class, javaArgumentTypes)); - return new ScalarFunctionImplementation(false, argumentProperties, methodHandle); + return new BuiltInScalarFunctionImplementation(false, argumentProperties, methodHandle); } @UsedByGeneratedCode 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 506f91e2b9b28..34b0baed98777 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 @@ -32,9 +32,9 @@ import java.util.Optional; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -82,13 +82,13 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type leftElementType = boundVariables.getTypeVariable("T"); Type rightElementType = boundVariables.getTypeVariable("U"); Type outputElementType = boundVariables.getTypeVariable("R"); ArrayType outputArrayType = new ArrayType(outputElementType); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), 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 ae89bb723464f..3b5a4e06a7e08 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 @@ -18,11 +18,11 @@ import com.facebook.presto.operator.ParametricImplementation; import com.facebook.presto.operator.annotations.FunctionsParserHelper; import com.facebook.presto.operator.annotations.ImplementationDependency; -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.ReturnPlaceConvention; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ScalarImplementationChoice; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ReturnPlaceConvention; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ScalarImplementationChoice; import com.facebook.presto.spi.ConnectorSession; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.function.BlockIndex; @@ -70,12 +70,12 @@ import static com.facebook.presto.operator.annotations.ImplementationDependency.checkTypeParameters; import static com.facebook.presto.operator.annotations.ImplementationDependency.getImplementationDependencyAnnotation; import static com.facebook.presto.operator.annotations.ImplementationDependency.validateImplementationDependencyAnnotation; -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.ArgumentType.VALUE_TYPE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.BLOCK_AND_POSITION; -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.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentType.VALUE_TYPE; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.BLOCK_AND_POSITION; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -118,7 +118,7 @@ private ParametricScalarImplementation( } } - public Optional specialize(Signature boundSignature, BoundVariables boundVariables, TypeManager typeManager, FunctionManager functionManager) + public Optional specialize(Signature boundSignature, BoundVariables boundVariables, TypeManager typeManager, FunctionManager functionManager) { List implementationChoices = new ArrayList<>(); for (Map.Entry> entry : specializedTypeParameters.entrySet()) { @@ -169,7 +169,7 @@ public Optional specialize(Signature boundSignatur boundMethodHandle.asType(javaMethodType(choice, boundSignature, typeManager)), boundConstructor)); } - return Optional.of(new ScalarFunctionImplementation(implementationChoices)); + return Optional.of(new BuiltInScalarFunctionImplementation(implementationChoices)); } @Override 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 b929cf65dd2ae..0460c34416a58 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,8 +14,8 @@ package com.facebook.presto.sql; import com.facebook.presto.metadata.FunctionManager; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty; import com.facebook.presto.spi.ConnectorSession; import com.facebook.presto.spi.function.FunctionHandle; import com.google.common.base.Defaults; @@ -25,9 +25,9 @@ import java.util.Arrays; import java.util.List; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentType.VALUE_TYPE; -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.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentType.VALUE_TYPE; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.USE_NULL_FLAG; import static com.google.common.base.Throwables.throwIfUnchecked; import static java.lang.invoke.MethodHandleProxies.asInterfaceInstance; import static java.util.Objects.requireNonNull; @@ -48,7 +48,7 @@ public Object invoke(FunctionHandle functionHandle, ConnectorSession session, Ob public Object invoke(FunctionHandle functionHandle, ConnectorSession session, List arguments) { - return invoke(functionManager.getScalarFunctionImplementation(functionHandle), session, arguments); + return invoke(functionManager.getBuiltInScalarFunctionImplementation(functionHandle), session, arguments); } /** @@ -56,7 +56,7 @@ public Object invoke(FunctionHandle functionHandle, ConnectorSession session, Li *

* Returns a value in the native container type corresponding to the declared SQL return type */ - private Object invoke(ScalarFunctionImplementation function, ConnectorSession session, List arguments) + private Object invoke(BuiltInScalarFunctionImplementation function, ConnectorSession session, List arguments) { MethodHandle method = function.getMethodHandle(); @@ -103,7 +103,7 @@ else if (function.getArgumentProperty(i).getNullConvention() == USE_NULL_FLAG) { } } - private static MethodHandle bindInstanceFactory(MethodHandle method, ScalarFunctionImplementation implementation) + private static MethodHandle bindInstanceFactory(MethodHandle method, BuiltInScalarFunctionImplementation implementation) { if (!implementation.getInstanceFactory().isPresent()) { return method; diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/ArrayGeneratorUtils.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/ArrayGeneratorUtils.java index b02ab4ef89708..ced4714312f4c 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/ArrayGeneratorUtils.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/ArrayGeneratorUtils.java @@ -16,7 +16,7 @@ import com.facebook.presto.bytecode.Scope; import com.facebook.presto.bytecode.Variable; import com.facebook.presto.bytecode.expression.BytecodeExpression; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; import com.facebook.presto.spi.type.Type; import java.util.function.Function; @@ -29,7 +29,7 @@ private ArrayGeneratorUtils() { } - public static ArrayMapBytecodeExpression map(Scope scope, CachedInstanceBinder cachedInstanceBinder, Type fromElementType, Type toElementType, Variable array, String elementFunctionName, ScalarFunctionImplementation elementFunction) + public static ArrayMapBytecodeExpression map(Scope scope, CachedInstanceBinder cachedInstanceBinder, Type fromElementType, Type toElementType, Variable array, String elementFunctionName, BuiltInScalarFunctionImplementation elementFunction) { return map( scope, 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 96115e1772d40..2b7cb0116f8d1 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 @@ -18,7 +18,7 @@ import com.facebook.presto.bytecode.Scope; import com.facebook.presto.bytecode.Variable; import com.facebook.presto.metadata.FunctionManager; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; import com.facebook.presto.spi.relation.RowExpression; import com.facebook.presto.sql.gen.BytecodeUtils.OutputBlockVariableAndType; @@ -83,7 +83,7 @@ public FunctionManager getFunctionManager() return manager; } - public BytecodeNode generateCall(String name, ScalarFunctionImplementation function, List arguments) + public BytecodeNode generateCall(String name, BuiltInScalarFunctionImplementation function, List arguments) { return generateCall(name, function, arguments, Optional.empty()); } @@ -93,7 +93,7 @@ public BytecodeNode generateCall(String name, ScalarFunctionImplementation funct */ public BytecodeNode generateCall( String name, - ScalarFunctionImplementation function, + BuiltInScalarFunctionImplementation function, List arguments, Optional outputBlockVariableAndType) { 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 25b122b60f976..f3780b654b715 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 @@ -20,10 +20,10 @@ import com.facebook.presto.bytecode.control.IfStatement; import com.facebook.presto.bytecode.expression.BytecodeExpression; import com.facebook.presto.bytecode.instruction.LabelNode; -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.operator.scalar.BuiltInScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ScalarImplementationChoice; import com.facebook.presto.spi.ConnectorSession; import com.facebook.presto.spi.block.BlockBuilder; import com.facebook.presto.spi.type.Type; @@ -44,8 +44,8 @@ import static com.facebook.presto.bytecode.expression.BytecodeExpressions.constantFalse; import static com.facebook.presto.bytecode.expression.BytecodeExpressions.constantTrue; import static com.facebook.presto.bytecode.expression.BytecodeExpressions.invokeDynamic; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentType.VALUE_TYPE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ReturnPlaceConvention.PROVIDED_BLOCKBUILDER; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentType.VALUE_TYPE; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ReturnPlaceConvention.PROVIDED_BLOCKBUILDER; import static com.facebook.presto.sql.gen.Bootstrap.BOOTSTRAP_METHOD; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; @@ -182,7 +182,7 @@ public static BytecodeExpression loadConstant(Binding binding) public static BytecodeNode generateInvocation( Scope scope, String name, - ScalarFunctionImplementation function, + BuiltInScalarFunctionImplementation function, Optional instance, List arguments, CallSiteBinder binder) @@ -200,7 +200,7 @@ public static BytecodeNode generateInvocation( public static BytecodeNode generateInvocation( Scope scope, String name, - ScalarFunctionImplementation function, + BuiltInScalarFunctionImplementation function, Optional instance, List arguments, CallSiteBinder binder, 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 43b0055ecc396..f39fc51f3f35f 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 @@ -16,7 +16,7 @@ import com.facebook.presto.bytecode.BytecodeNode; import com.facebook.presto.bytecode.Variable; import com.facebook.presto.metadata.FunctionManager; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; import com.facebook.presto.spi.function.FunctionHandle; import com.facebook.presto.spi.relation.RowExpression; import com.facebook.presto.spi.type.Type; @@ -26,7 +26,7 @@ import java.util.List; import java.util.Optional; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentType.VALUE_TYPE; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentType.VALUE_TYPE; public class FunctionCallCodeGenerator { @@ -34,12 +34,12 @@ public BytecodeNode generateCall(FunctionHandle functionHandle, BytecodeGenerato { FunctionManager functionManager = context.getFunctionManager(); - ScalarFunctionImplementation function = functionManager.getScalarFunctionImplementation(functionHandle); + BuiltInScalarFunctionImplementation function = functionManager.getBuiltInScalarFunctionImplementation(functionHandle); List argumentsBytecode = new ArrayList<>(); for (int i = 0; i < arguments.size(); i++) { RowExpression argument = arguments.get(i); - ScalarFunctionImplementation.ArgumentProperty argumentProperty = function.getArgumentProperty(i); + BuiltInScalarFunctionImplementation.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/InCodeGenerator.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/InCodeGenerator.java index 649168576a11a..1a794f69e0e66 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 @@ -21,7 +21,7 @@ import com.facebook.presto.bytecode.control.SwitchStatement.SwitchBuilder; import com.facebook.presto.bytecode.instruction.LabelNode; import com.facebook.presto.metadata.FunctionManager; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; import com.facebook.presto.spi.function.FunctionHandle; import com.facebook.presto.spi.relation.ConstantExpression; import com.facebook.presto.spi.relation.RowExpression; @@ -123,9 +123,9 @@ public BytecodeNode generateExpression(BytecodeGeneratorContext generatorContext SwitchGenerationCase switchGenerationCase = checkSwitchGenerationCase(type, values); FunctionHandle hashCodeHandle = generatorContext.getFunctionManager().resolveOperator(HASH_CODE, fromTypes(type)); - MethodHandle hashCodeFunction = generatorContext.getFunctionManager().getScalarFunctionImplementation(hashCodeHandle).getMethodHandle(); + MethodHandle hashCodeFunction = generatorContext.getFunctionManager().getBuiltInScalarFunctionImplementation(hashCodeHandle).getMethodHandle(); FunctionHandle isIndeterminateHandle = generatorContext.getFunctionManager().resolveOperator(INDETERMINATE, fromTypes(type)); - ScalarFunctionImplementation isIndeterminateFunction = generatorContext.getFunctionManager().getScalarFunctionImplementation(isIndeterminateHandle); + BuiltInScalarFunctionImplementation isIndeterminateFunction = generatorContext.getFunctionManager().getBuiltInScalarFunctionImplementation(isIndeterminateHandle); ImmutableListMultimap.Builder hashBucketsBuilder = ImmutableListMultimap.builder(); ImmutableList.Builder defaultBucket = ImmutableList.builder(); @@ -295,7 +295,7 @@ private static BytecodeBlock buildInCase( Variable value, Collection testValues, boolean checkForNulls, - ScalarFunctionImplementation isIndeterminateFunction) + BuiltInScalarFunctionImplementation isIndeterminateFunction) { Variable caseWasNull = null; // caseWasNull is set to true the first time a null in `testValues` is encountered if (checkForNulls) { @@ -332,7 +332,7 @@ private static BytecodeBlock buildInCase( elseBlock.gotoLabel(noMatchLabel); FunctionHandle equalsHandle = generatorContext.getFunctionManager().resolveOperator(EQUAL, fromTypes(type, type)); - ScalarFunctionImplementation equalsFunction = generatorContext.getFunctionManager().getScalarFunctionImplementation(equalsHandle); + BuiltInScalarFunctionImplementation equalsFunction = generatorContext.getFunctionManager().getBuiltInScalarFunctionImplementation(equalsHandle); BytecodeNode elseNode = elseBlock; for (BytecodeNode testNode : testValues) { diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/InvokeFunctionBytecodeExpression.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/InvokeFunctionBytecodeExpression.java index 54bad4747a41f..75be5120427db 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/InvokeFunctionBytecodeExpression.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/InvokeFunctionBytecodeExpression.java @@ -18,7 +18,7 @@ import com.facebook.presto.bytecode.MethodGenerationContext; import com.facebook.presto.bytecode.Scope; import com.facebook.presto.bytecode.expression.BytecodeExpression; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; import com.google.common.base.Joiner; import com.google.common.collect.ImmutableList; import com.google.common.primitives.Primitives; @@ -34,12 +34,12 @@ public class InvokeFunctionBytecodeExpression extends BytecodeExpression { - public static BytecodeExpression invokeFunction(Scope scope, CachedInstanceBinder cachedInstanceBinder, String name, ScalarFunctionImplementation function, BytecodeExpression... parameters) + public static BytecodeExpression invokeFunction(Scope scope, CachedInstanceBinder cachedInstanceBinder, String name, BuiltInScalarFunctionImplementation function, BytecodeExpression... parameters) { return invokeFunction(scope, cachedInstanceBinder, name, function, ImmutableList.copyOf(parameters)); } - public static BytecodeExpression invokeFunction(Scope scope, CachedInstanceBinder cachedInstanceBinder, String name, ScalarFunctionImplementation function, List parameters) + public static BytecodeExpression invokeFunction(Scope scope, CachedInstanceBinder cachedInstanceBinder, String name, BuiltInScalarFunctionImplementation function, List parameters) { requireNonNull(scope, "scope is null"); requireNonNull(function, "function is null"); @@ -59,7 +59,7 @@ private InvokeFunctionBytecodeExpression( Scope scope, CallSiteBinder binder, String name, - ScalarFunctionImplementation function, + BuiltInScalarFunctionImplementation function, Optional instance, List parameters) { diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/JoinCompiler.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/JoinCompiler.java index 108d41e3e93b8..62adc995b5010 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/JoinCompiler.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/JoinCompiler.java @@ -35,7 +35,7 @@ import com.facebook.presto.operator.LookupSourceSupplier; import com.facebook.presto.operator.PagesHash; import com.facebook.presto.operator.PagesHashStrategy; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.PageBuilder; import com.facebook.presto.spi.block.Block; @@ -707,7 +707,7 @@ private void generatePositionNotDistinctFromRowWithPageMethod( continue; } } - ScalarFunctionImplementation operator = functionManager.getScalarFunctionImplementation(functionManager.resolveOperator(OperatorType.IS_DISTINCT_FROM, fromTypes(type, type))); + BuiltInScalarFunctionImplementation operator = functionManager.getBuiltInScalarFunctionImplementation(functionManager.resolveOperator(OperatorType.IS_DISTINCT_FROM, fromTypes(type, type))); callSiteBinder.bind(operator.getMethodHandle()); List argumentsBytecode = new ArrayList<>(); argumentsBytecode.add(generateInputReference(callSiteBinder, scope, type, leftBlock, leftBlockPosition)); 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 8b5c2af157231..72921aa3353c9 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 @@ -21,7 +21,7 @@ import com.facebook.presto.bytecode.instruction.LabelNode; import com.facebook.presto.metadata.CastType; import com.facebook.presto.metadata.FunctionManager; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; import com.facebook.presto.spi.function.FunctionHandle; import com.facebook.presto.spi.function.FunctionMetadata; import com.facebook.presto.spi.relation.RowExpression; @@ -68,7 +68,7 @@ public BytecodeNode generateExpression(BytecodeGeneratorContext generatorContext FunctionManager functionManager = generatorContext.getFunctionManager(); FunctionHandle equalFunction = functionManager.resolveOperator(EQUAL, fromTypes(firstType, secondType)); FunctionMetadata equalFunctionMetadata = functionManager.getFunctionMetadata(equalFunction); - ScalarFunctionImplementation equalsFunction = generatorContext.getFunctionManager().getScalarFunctionImplementation(equalFunction); + BuiltInScalarFunctionImplementation equalsFunction = generatorContext.getFunctionManager().getBuiltInScalarFunctionImplementation(equalFunction); BytecodeNode equalsCall = generatorContext.generateCall( EQUAL.name(), equalsFunction, @@ -111,6 +111,6 @@ private static BytecodeNode cast( .lookupCast(CastType.CAST, actualType.getTypeSignature(), requiredType); // TODO: do we need a full function call? (nullability checks, etc) - return generatorContext.generateCall(CAST.name(), generatorContext.getFunctionManager().getScalarFunctionImplementation(functionHandle), ImmutableList.of(argument)); + return generatorContext.generateCall(CAST.name(), generatorContext.getFunctionManager().getBuiltInScalarFunctionImplementation(functionHandle), ImmutableList.of(argument)); } } 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 917dc42b2046b..fde1a4a1ea560 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 @@ -126,7 +126,7 @@ else if ( == ) { // check if wasNull is true BytecodeNode equalsCall = generatorContext.generateCall( EQUAL.name(), - generatorContext.getFunctionManager().getScalarFunctionImplementation(equalsFunction), + generatorContext.getFunctionManager().getBuiltInScalarFunctionImplementation(equalsFunction), ImmutableList.of(generatorContext.generate(operand, Optional.empty()), getTempVariableNode)); BytecodeBlock condition = new BytecodeBlock() 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 04c41662a199b..dce2f9c59e1ef 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 @@ -675,7 +675,7 @@ protected Object visitArithmeticUnary(ArithmeticUnaryExpression node, Object con return value; case MINUS: FunctionHandle operatorHandle = metadata.getFunctionManager().resolveOperator(OperatorType.NEGATION, fromTypes(types(node.getValue()))); - MethodHandle handle = metadata.getFunctionManager().getScalarFunctionImplementation(operatorHandle).getMethodHandle(); + MethodHandle handle = metadata.getFunctionManager().getBuiltInScalarFunctionImplementation(operatorHandle).getMethodHandle(); if (handle.type().parameterCount() > 0 && handle.type().parameterType(0) == ConnectorSession.class) { handle = handle.bindTo(connectorSession); 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 e2a1eb37bdffa..2fe144687c410 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 @@ -30,9 +30,9 @@ import java.util.Optional; 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.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.BLOCK_AND_POSITION; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; diff --git a/presto-main/src/main/java/com/facebook/presto/type/TypeRegistry.java b/presto-main/src/main/java/com/facebook/presto/type/TypeRegistry.java index aee5b9eb946fa..9238c1f5da6d4 100644 --- a/presto-main/src/main/java/com/facebook/presto/type/TypeRegistry.java +++ b/presto-main/src/main/java/com/facebook/presto/type/TypeRegistry.java @@ -665,7 +665,7 @@ public static boolean isCovariantTypeBase(String typeBase) public MethodHandle resolveOperator(OperatorType operatorType, List argumentTypes) { requireNonNull(functionManager, "functionManager is null"); - return functionManager.getScalarFunctionImplementation(functionManager.resolveOperator(operatorType, fromTypes(argumentTypes))).getMethodHandle(); + return functionManager.getBuiltInScalarFunctionImplementation(functionManager.resolveOperator(operatorType, fromTypes(argumentTypes))).getMethodHandle(); } public static class TypeCompatibility diff --git a/presto-main/src/main/java/com/facebook/presto/util/FastutilSetHelper.java b/presto-main/src/main/java/com/facebook/presto/util/FastutilSetHelper.java index d1e1364545f93..bd0b91b99d140 100644 --- a/presto-main/src/main/java/com/facebook/presto/util/FastutilSetHelper.java +++ b/presto-main/src/main/java/com/facebook/presto/util/FastutilSetHelper.java @@ -94,8 +94,8 @@ private static final class LongStrategy private LongStrategy(FunctionManager functionManager, Type type) { - hashCodeHandle = functionManager.getScalarFunctionImplementation(functionManager.resolveOperator(HASH_CODE, fromTypes(type))).getMethodHandle(); - equalsHandle = functionManager.getScalarFunctionImplementation(functionManager.resolveOperator(EQUAL, fromTypes(type, type))).getMethodHandle(); + hashCodeHandle = functionManager.getBuiltInScalarFunctionImplementation(functionManager.resolveOperator(HASH_CODE, fromTypes(type))).getMethodHandle(); + equalsHandle = functionManager.getBuiltInScalarFunctionImplementation(functionManager.resolveOperator(EQUAL, fromTypes(type, type))).getMethodHandle(); } @Override @@ -136,8 +136,8 @@ private static final class DoubleStrategy private DoubleStrategy(FunctionManager functionManager, Type type) { - hashCodeHandle = functionManager.getScalarFunctionImplementation(functionManager.resolveOperator(HASH_CODE, fromTypes(type))).getMethodHandle(); - equalsHandle = functionManager.getScalarFunctionImplementation(functionManager.resolveOperator(EQUAL, fromTypes(type, type))).getMethodHandle(); + hashCodeHandle = functionManager.getBuiltInScalarFunctionImplementation(functionManager.resolveOperator(HASH_CODE, fromTypes(type))).getMethodHandle(); + equalsHandle = functionManager.getBuiltInScalarFunctionImplementation(functionManager.resolveOperator(EQUAL, fromTypes(type, type))).getMethodHandle(); } @Override @@ -178,10 +178,10 @@ private static final class ObjectStrategy private ObjectStrategy(FunctionManager functionManager, Type type) { - hashCodeHandle = functionManager.getScalarFunctionImplementation(functionManager.resolveOperator(HASH_CODE, fromTypes(type))) + hashCodeHandle = functionManager.getBuiltInScalarFunctionImplementation(functionManager.resolveOperator(HASH_CODE, fromTypes(type))) .getMethodHandle() .asType(MethodType.methodType(long.class, Object.class)); - equalsHandle = functionManager.getScalarFunctionImplementation(functionManager.resolveOperator(EQUAL, fromTypes(type, type))) + equalsHandle = functionManager.getBuiltInScalarFunctionImplementation(functionManager.resolveOperator(EQUAL, fromTypes(type, type))) .getMethodHandle() .asType(MethodType.methodType(Boolean.class, Object.class, Object.class)); } diff --git a/presto-main/src/test/java/com/facebook/presto/metadata/TestFunctionInvokerProvider.java b/presto-main/src/test/java/com/facebook/presto/metadata/TestFunctionInvokerProvider.java index 0b517e6f76719..4d2729d9800a9 100644 --- a/presto-main/src/test/java/com/facebook/presto/metadata/TestFunctionInvokerProvider.java +++ b/presto-main/src/test/java/com/facebook/presto/metadata/TestFunctionInvokerProvider.java @@ -14,7 +14,7 @@ package com.facebook.presto.metadata; import com.facebook.presto.operator.scalar.AbstractTestFunctions; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty; import com.facebook.presto.spi.function.InvocationConvention; import com.facebook.presto.spi.function.InvocationConvention.InvocationReturnConvention; import com.google.common.collect.ImmutableList; @@ -23,11 +23,11 @@ import java.util.Optional; import static com.facebook.presto.metadata.FunctionInvokerProvider.checkChoice; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentType.VALUE_TYPE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.BLOCK_AND_POSITION; -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.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentType.VALUE_TYPE; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.BLOCK_AND_POSITION; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.USE_BOXED_TYPE; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.USE_NULL_FLAG; import static com.facebook.presto.spi.function.InvocationConvention.InvocationArgumentConvention.BLOCK_POSITION; import static com.facebook.presto.spi.function.InvocationConvention.InvocationArgumentConvention.BOXED_NULLABLE; import static com.facebook.presto.spi.function.InvocationConvention.InvocationArgumentConvention.NEVER_NULL; diff --git a/presto-main/src/test/java/com/facebook/presto/metadata/TestFunctionManager.java b/presto-main/src/test/java/com/facebook/presto/metadata/TestFunctionManager.java index a74c74f3faca3..e448b7e121b7c 100644 --- a/presto-main/src/test/java/com/facebook/presto/metadata/TestFunctionManager.java +++ b/presto-main/src/test/java/com/facebook/presto/metadata/TestFunctionManager.java @@ -14,8 +14,8 @@ package com.facebook.presto.metadata; import com.facebook.presto.block.BlockEncodingManager; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; import com.facebook.presto.operator.scalar.CustomFunctions; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; import com.facebook.presto.spi.block.BlockEncodingSerde; import com.facebook.presto.spi.function.FunctionHandle; import com.facebook.presto.spi.function.OperatorType; @@ -39,8 +39,8 @@ import java.util.List; import static com.facebook.presto.SessionTestUtils.TEST_SESSION; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; 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.OperatorType.SATURATED_FLOOR_CAST; @@ -411,13 +411,13 @@ private List createFunctionsFromSignatures() functions.add(new SqlScalarFunction(signature) { @Override - public ScalarFunctionImplementation specialize( + public BuiltInScalarFunctionImplementation specialize( BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, nCopies(arity, valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), MethodHandles.identity(Void.class)); 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 68634044b92a7..13d9c92436387 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 @@ -14,7 +14,7 @@ package com.facebook.presto.metadata; import com.facebook.presto.block.BlockEncodingManager; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.LongArrayBlock; import com.facebook.presto.spi.function.Signature; @@ -34,9 +34,9 @@ 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.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.BLOCK_AND_POSITION; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -108,7 +108,7 @@ public void testSelectsMultipleChoiceWithBlockPosition() asList(Optional.of(long.class), Optional.of(long.class))))) .build(); - ScalarFunctionImplementation functionImplementation = function.specialize(SHORT_DECIMAL_BOUND_VARIABLES, 2, TYPE_REGISTRY, FUNCTION_MANAGER); + BuiltInScalarFunctionImplementation functionImplementation = function.specialize(SHORT_DECIMAL_BOUND_VARIABLES, 2, TYPE_REGISTRY, FUNCTION_MANAGER); assertEquals(functionImplementation.getAllChoices().size(), 2); assertEquals(functionImplementation.getAllChoices().get(0).getArgumentProperties(), Collections.nCopies(2, valueTypeArgumentProperty(USE_NULL_FLAG))); @@ -135,7 +135,7 @@ public void testSelectsMethodBasedOnArgumentTypes() .withExtraParameters(context -> ImmutableList.of(context.getLiteral("x"))))) .build(); - ScalarFunctionImplementation functionImplementation = function.specialize(BOUND_VARIABLES, 1, TYPE_REGISTRY, FUNCTION_MANAGER); + BuiltInScalarFunctionImplementation functionImplementation = function.specialize(BOUND_VARIABLES, 1, TYPE_REGISTRY, FUNCTION_MANAGER); assertEquals(functionImplementation.getMethodHandle().invoke(INPUT_SLICE), INPUT_VARCHAR_LENGTH); } @@ -154,7 +154,7 @@ public void testSelectsMethodBasedOnReturnType() .withExtraParameters(context -> ImmutableList.of(42)))) .build(); - ScalarFunctionImplementation functionImplementation = function.specialize(BOUND_VARIABLES, 1, TYPE_REGISTRY, FUNCTION_MANAGER); + BuiltInScalarFunctionImplementation functionImplementation = function.specialize(BOUND_VARIABLES, 1, TYPE_REGISTRY, FUNCTION_MANAGER); assertEquals(functionImplementation.getMethodHandle().invoke(INPUT_SLICE), VARCHAR_TO_BIGINT_RETURN_VALUE); } @@ -178,7 +178,7 @@ public void testSameLiteralInArgumentsAndReturnValue() .implementation(methodsGroup -> methodsGroup.methods("varcharToVarchar"))) .build(); - ScalarFunctionImplementation functionImplementation = function.specialize(BOUND_VARIABLES, 1, TYPE_REGISTRY, FUNCTION_MANAGER); + BuiltInScalarFunctionImplementation functionImplementation = function.specialize(BOUND_VARIABLES, 1, TYPE_REGISTRY, FUNCTION_MANAGER); Slice slice = (Slice) functionImplementation.getMethodHandle().invoke(INPUT_SLICE); assertEquals(slice, VARCHAR_TO_VARCHAR_RETURN_VALUE); } @@ -203,7 +203,7 @@ public void testTypeParameters() .implementation(methodsGroup -> methodsGroup.methods("varcharToVarchar"))) .build(); - ScalarFunctionImplementation functionImplementation = function.specialize(BOUND_VARIABLES, 1, TYPE_REGISTRY, FUNCTION_MANAGER); + BuiltInScalarFunctionImplementation functionImplementation = function.specialize(BOUND_VARIABLES, 1, TYPE_REGISTRY, FUNCTION_MANAGER); Slice slice = (Slice) functionImplementation.getMethodHandle().invoke(INPUT_SLICE); assertEquals(slice, VARCHAR_TO_VARCHAR_RETURN_VALUE); } @@ -225,7 +225,7 @@ public void testSetsHiddenToTrueForOperators() .implementation(methodsGroup -> methodsGroup.methods("varcharToVarchar"))) .build(); - ScalarFunctionImplementation functionImplementation = function.specialize(BOUND_VARIABLES, 1, TYPE_REGISTRY, FUNCTION_MANAGER); + BuiltInScalarFunctionImplementation functionImplementation = function.specialize(BOUND_VARIABLES, 1, TYPE_REGISTRY, FUNCTION_MANAGER); } @Test(expectedExceptions = {IllegalStateException.class}, 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 d1418c08a18a1..06fda738af66f 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 @@ -16,7 +16,7 @@ import com.facebook.presto.metadata.BoundVariables; import com.facebook.presto.metadata.FunctionManager; import com.facebook.presto.metadata.SqlScalarFunction; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.relation.FullyQualifiedName; import com.facebook.presto.spi.type.TypeManager; @@ -26,8 +26,8 @@ import java.util.function.LongUnaryOperator; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.facebook.presto.spi.type.StandardTypes.BIGINT; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; @@ -69,10 +69,10 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { MethodHandle methodHandle = METHOD_HANDLE.bindTo(longUnaryOperator); - return new ScalarFunctionImplementation(false, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), methodHandle); + return new BuiltInScalarFunctionImplementation(false, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), methodHandle); } public static long apply(LongUnaryOperator longUnaryOperator, long value) 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 b201afa06a2c3..71b4998b92b80 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 @@ -18,8 +18,8 @@ import com.facebook.presto.operator.annotations.ImplementationDependency; import com.facebook.presto.operator.annotations.LiteralImplementationDependency; import com.facebook.presto.operator.annotations.TypeImplementationDependency; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; import com.facebook.presto.operator.scalar.ParametricScalar; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; import com.facebook.presto.operator.scalar.annotations.ParametricScalarImplementation.ParametricScalarImplementationChoice; import com.facebook.presto.operator.scalar.annotations.ScalarFromAnnotationsParser; import com.facebook.presto.spi.block.Block; @@ -45,10 +45,10 @@ import java.util.List; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -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.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.USE_BOXED_TYPE; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -94,7 +94,7 @@ public void testSingleImplementationScalarParse() assertImplementationCount(scalar, 1, 0, 0); - ScalarFunctionImplementation specialized = scalar.specialize(BoundVariables.builder().build(), 1, new TypeRegistry(), null); + BuiltInScalarFunctionImplementation specialized = scalar.specialize(BoundVariables.builder().build(), 1, new TypeRegistry(), null); assertFalse(specialized.getInstanceFactory().isPresent()); assertEquals(specialized.getArgumentProperty(0).getNullConvention(), RETURN_NULL_ON_NULL); @@ -176,7 +176,7 @@ public void testWithNullablePrimitiveArgScalarParse() assertFalse(scalar.isHidden()); assertEquals(scalar.getDescription(), "Simple scalar with nullable primitive"); - ScalarFunctionImplementation specialized = scalar.specialize(BoundVariables.builder().build(), 2, new TypeRegistry(), null); + BuiltInScalarFunctionImplementation specialized = scalar.specialize(BoundVariables.builder().build(), 2, new TypeRegistry(), null); assertFalse(specialized.getInstanceFactory().isPresent()); assertEquals(specialized.getArgumentProperty(0), valueTypeArgumentProperty(RETURN_NULL_ON_NULL)); @@ -214,7 +214,7 @@ public void testWithNullableComplexArgScalarParse() assertFalse(scalar.isHidden()); assertEquals(scalar.getDescription(), "Simple scalar with nullable complex type"); - ScalarFunctionImplementation specialized = scalar.specialize(BoundVariables.builder().build(), 2, new TypeRegistry(), null); + BuiltInScalarFunctionImplementation specialized = scalar.specialize(BoundVariables.builder().build(), 2, new TypeRegistry(), null); assertFalse(specialized.getInstanceFactory().isPresent()); assertEquals(specialized.getArgumentProperty(0), valueTypeArgumentProperty(RETURN_NULL_ON_NULL)); 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 9d53ee12cc088..260b290b54c84 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 @@ -64,8 +64,8 @@ import static com.facebook.presto.memory.context.AggregatedMemoryContext.newSimpleAggregatedMemoryContext; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; 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.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -231,10 +231,10 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type type = boundVariables.getTypeVariable("T"); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/TestParametricScalarImplementationValidation.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/TestParametricScalarImplementationValidation.java index 31f5dcc815207..29be0a32f5b9f 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/TestParametricScalarImplementationValidation.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/TestParametricScalarImplementationValidation.java @@ -20,8 +20,8 @@ import java.lang.invoke.MethodHandle; import java.util.Optional; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.util.Reflection.methodHandle; import static org.testng.Assert.assertEquals; import static org.testng.Assert.fail; @@ -35,7 +35,7 @@ public void testConnectorSessionPosition() { // Without cached instance factory MethodHandle validFunctionMethodHandle = methodHandle(TestParametricScalarImplementationValidation.class, "validConnectorSessionParameterPosition", ConnectorSession.class, long.class, long.class); - ScalarFunctionImplementation validFunction = new ScalarFunctionImplementation( + BuiltInScalarFunctionImplementation validFunction = new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), @@ -44,7 +44,7 @@ public void testConnectorSessionPosition() assertEquals(validFunction.getMethodHandle(), validFunctionMethodHandle); try { - ScalarFunctionImplementation invalidFunction = new ScalarFunctionImplementation( + BuiltInScalarFunctionImplementation invalidFunction = new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), @@ -58,7 +58,7 @@ public void testConnectorSessionPosition() // With cached instance factory MethodHandle validFunctionWithInstanceFactoryMethodHandle = methodHandle(TestParametricScalarImplementationValidation.class, "validConnectorSessionParameterPosition", Object.class, ConnectorSession.class, long.class, long.class); - ScalarFunctionImplementation validFunctionWithInstanceFactory = new ScalarFunctionImplementation( + BuiltInScalarFunctionImplementation validFunctionWithInstanceFactory = new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), @@ -68,7 +68,7 @@ public void testConnectorSessionPosition() assertEquals(validFunctionWithInstanceFactory.getMethodHandle(), validFunctionWithInstanceFactoryMethodHandle); try { - ScalarFunctionImplementation invalidFunctionWithInstanceFactory = new ScalarFunctionImplementation( + BuiltInScalarFunctionImplementation invalidFunctionWithInstanceFactory = new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), 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 5e6e981fd1457..8a8b33c47beb4 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 @@ -16,8 +16,8 @@ import com.facebook.presto.metadata.BoundVariables; import com.facebook.presto.metadata.FunctionManager; 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.operator.scalar.BuiltInScalarFunctionImplementation.ReturnPlaceConvention; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ScalarImplementationChoice; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; import com.facebook.presto.spi.function.FunctionKind; @@ -37,10 +37,10 @@ import java.util.concurrent.atomic.AtomicLong; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.USE_BOXED_TYPE; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -165,7 +165,7 @@ protected FunctionWithProvidedBlockReturnPlaceConvention1() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type type = boundVariables.getTypeVariable("T"); MethodHandle methodHandleStack = MethodHandles.identity(type.getJavaType()); @@ -189,7 +189,7 @@ else if (type.getJavaType() == Block.class) { throw new UnsupportedOperationException(); } - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( ImmutableList.of( new ScalarImplementationChoice( false, @@ -285,7 +285,7 @@ protected FunctionWithProvidedBlockReturnPlaceConvention2() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type type = boundVariables.getTypeVariable("T"); MethodHandle methodHandleStack = MethodHandles.identity(wrap(type.getJavaType())); @@ -309,7 +309,7 @@ else if (type.getJavaType() == Block.class) { throw new UnsupportedOperationException(); } - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( ImmutableList.of( new ScalarImplementationChoice( true, 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 0f79efc427d08..5199ba101c3a1 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 @@ -18,7 +18,7 @@ import com.facebook.presto.metadata.FunctionManager; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.operator.scalar.AbstractTestFunctions; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; import com.facebook.presto.spi.function.FunctionKind; import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.relation.FullyQualifiedName; @@ -33,8 +33,8 @@ import java.util.stream.IntStream; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.type.IntegerType.INTEGER; import static com.facebook.presto.sql.gen.TestVarArgsToArrayAdapterGenerator.TestVarArgsSum.VAR_ARGS_SUM; import static com.facebook.presto.sql.gen.VarArgsToArrayAdapterGenerator.generateVarArgsToArrayAdapter; @@ -107,7 +107,7 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { VarArgsToArrayAdapterGenerator.MethodHandleAndConstructor methodHandleAndConstructor = generateVarArgsToArrayAdapter( long.class, @@ -115,7 +115,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in arity, METHOD_HANDLE, USER_STATE_FACTORY); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, nCopies(arity, valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), methodHandleAndConstructor.getMethodHandle(), 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 25c334b5248af..7c9c9877ef9e5 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 @@ -16,7 +16,7 @@ import com.facebook.presto.metadata.BoundVariables; import com.facebook.presto.metadata.FunctionManager; import com.facebook.presto.metadata.SqlScalarFunction; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; import com.facebook.presto.spi.function.FunctionKind; import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.relation.FullyQualifiedName; @@ -28,8 +28,8 @@ import java.util.concurrent.atomic.AtomicInteger; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -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.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.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; @@ -73,10 +73,10 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { int args = 4; - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, nCopies(args, valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), methodHandle(StatefulSleepingSum.class, "statefulSleepingSum", State.class, double.class, long.class, long.class, long.class), From 8e8a59215f993a7e93371a9bd195996176b9b4d1 Mon Sep 17 00:00:00 2001 From: Rongrong Zhong Date: Thu, 12 Sep 2019 10:52:45 -0700 Subject: [PATCH 09/11] Add funcion implementation type and argument names to FunctionMetadata --- .../TranslatorAnnotationParser.java | 7 +++- .../BuiltInFunctionNamespaceManager.java | 3 ++ .../function/FunctionImplementationType.java | 20 ++++++++++ .../presto/spi/function/FunctionMetadata.java | 39 +++++++++++++++++-- ...actSqlInvokedFunctionNamespaceManager.java | 2 + .../SqlInvokedRegularFunction.java | 17 ++++++++ 6 files changed, 83 insertions(+), 5 deletions(-) create mode 100644 presto-spi/src/main/java/com/facebook/presto/spi/function/FunctionImplementationType.java diff --git a/presto-expressions/src/main/java/com/facebook/presto/expressions/translator/TranslatorAnnotationParser.java b/presto-expressions/src/main/java/com/facebook/presto/expressions/translator/TranslatorAnnotationParser.java index 2eac8d1026332..f5f1aa0c60df1 100644 --- a/presto-expressions/src/main/java/com/facebook/presto/expressions/translator/TranslatorAnnotationParser.java +++ b/presto-expressions/src/main/java/com/facebook/presto/expressions/translator/TranslatorAnnotationParser.java @@ -37,6 +37,7 @@ import java.util.Set; import java.util.stream.Stream; +import static com.facebook.presto.spi.function.FunctionImplementationType.BUILTIN; import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.google.common.base.CaseFormat.LOWER_CAMEL; @@ -79,6 +80,7 @@ public static FunctionMetadata removeTypeParameters(FunctionMetadata metadata) argumentsBuilder.build(), metadata.getReturnType(), metadata.getFunctionKind(), + metadata.getImplementationType(), metadata.isDeterministic(), metadata.isCalledOnNullInput()); } @@ -87,6 +89,7 @@ public static FunctionMetadata removeTypeParameters(FunctionMetadata metadata) argumentsBuilder.build(), metadata.getReturnType(), metadata.getFunctionKind(), + metadata.getImplementationType(), metadata.isDeterministic(), metadata.isCalledOnNullInput()); } @@ -155,9 +158,9 @@ private static FunctionMetadata methodToFunctionMetadata(ScalarTranslationHeader } if (header.getOperatorType().isPresent()) { - return new FunctionMetadata(header.getOperatorType().get(), argumentTypes.build(), returnType, SCALAR, header.isDeterministic(), header.isCalledOnNullInput()); + return new FunctionMetadata(header.getOperatorType().get(), argumentTypes.build(), returnType, SCALAR, BUILTIN, header.isDeterministic(), header.isCalledOnNullInput()); } - return new FunctionMetadata(header.getName(), argumentTypes.build(), returnType, SCALAR, header.isDeterministic(), header.isCalledOnNullInput()); + return new FunctionMetadata(header.getName(), argumentTypes.build(), returnType, SCALAR, BUILTIN, header.isDeterministic(), header.isCalledOnNullInput()); } @SafeVarargs diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/BuiltInFunctionNamespaceManager.java b/presto-main/src/main/java/com/facebook/presto/metadata/BuiltInFunctionNamespaceManager.java index d44f517ca1e39..d18245f9e6c65 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/BuiltInFunctionNamespaceManager.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/BuiltInFunctionNamespaceManager.java @@ -291,6 +291,7 @@ import static com.facebook.presto.operator.scalar.ZipWithFunction.ZIP_WITH_FUNCTION; import static com.facebook.presto.operator.window.AggregateWindowFunction.supplier; import static com.facebook.presto.spi.StandardErrorCode.FUNCTION_IMPLEMENTATION_MISSING; +import static com.facebook.presto.spi.function.FunctionImplementationType.BUILTIN; 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; @@ -744,6 +745,7 @@ public FunctionMetadata getFunctionMetadata(FunctionHandle functionHandle) signature.getArgumentTypes(), signature.getReturnType(), signature.getKind(), + BUILTIN, function.isDeterministic(), function.isCalledOnNullInput()); } @@ -753,6 +755,7 @@ public FunctionMetadata getFunctionMetadata(FunctionHandle functionHandle) signature.getArgumentTypes(), signature.getReturnType(), signature.getKind(), + BUILTIN, function.isDeterministic(), function.isCalledOnNullInput()); } diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/function/FunctionImplementationType.java b/presto-spi/src/main/java/com/facebook/presto/spi/function/FunctionImplementationType.java new file mode 100644 index 0000000000000..cf7965c033ef3 --- /dev/null +++ b/presto-spi/src/main/java/com/facebook/presto/spi/function/FunctionImplementationType.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.function; + +public enum FunctionImplementationType +{ + BUILTIN, + SQL +} diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/function/FunctionMetadata.java b/presto-spi/src/main/java/com/facebook/presto/spi/function/FunctionMetadata.java index c66c00b58ab67..cf400ff2d7c31 100644 --- a/presto-spi/src/main/java/com/facebook/presto/spi/function/FunctionMetadata.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/function/FunctionMetadata.java @@ -29,8 +29,10 @@ public class FunctionMetadata private final FullyQualifiedName name; private final Optional operatorType; private final List argumentTypes; + private final Optional> argumentNames; private final TypeSignature returnType; private final FunctionKind functionKind; + private final FunctionImplementationType implementationType; private final boolean deterministic; private final boolean calledOnNullInput; @@ -39,10 +41,24 @@ public FunctionMetadata( List argumentTypes, TypeSignature returnType, FunctionKind functionKind, + FunctionImplementationType implementationType, boolean deterministic, boolean calledOnNullInput) { - this(name, Optional.empty(), argumentTypes, returnType, functionKind, deterministic, calledOnNullInput); + this(name, Optional.empty(), argumentTypes, Optional.empty(), returnType, functionKind, implementationType, deterministic, calledOnNullInput); + } + + public FunctionMetadata( + FullyQualifiedName name, + List argumentTypes, + List argumentNames, + TypeSignature returnType, + FunctionKind functionKind, + FunctionImplementationType implementationType, + boolean deterministic, + boolean calledOnNullInput) + { + this(name, Optional.empty(), argumentTypes, Optional.of(argumentNames), returnType, functionKind, implementationType, deterministic, calledOnNullInput); } public FunctionMetadata( @@ -50,26 +66,31 @@ public FunctionMetadata( List argumentTypes, TypeSignature returnType, FunctionKind functionKind, + FunctionImplementationType implementationType, boolean deterministic, boolean calledOnNullInput) { - this(operatorType.getFunctionName(), Optional.of(operatorType), argumentTypes, returnType, functionKind, deterministic, calledOnNullInput); + this(operatorType.getFunctionName(), Optional.of(operatorType), argumentTypes, Optional.empty(), returnType, functionKind, implementationType, deterministic, calledOnNullInput); } private FunctionMetadata( FullyQualifiedName name, Optional operatorType, List argumentTypes, + Optional> argumentNames, TypeSignature returnType, FunctionKind functionKind, + FunctionImplementationType implementationType, boolean deterministic, boolean calledOnNullInput) { this.name = requireNonNull(name, "name is null"); this.operatorType = requireNonNull(operatorType, "operatorType is null"); this.argumentTypes = unmodifiableList(new ArrayList<>(requireNonNull(argumentTypes, "argumentTypes is null"))); + this.argumentNames = requireNonNull(argumentNames, "argumentNames is null").map(names -> unmodifiableList(new ArrayList<>(names))); this.returnType = requireNonNull(returnType, "returnType is null"); this.functionKind = requireNonNull(functionKind, "functionKind is null"); + this.implementationType = requireNonNull(implementationType, "language is null"); this.deterministic = deterministic; this.calledOnNullInput = calledOnNullInput; } @@ -89,6 +110,11 @@ public List getArgumentTypes() return argumentTypes; } + public Optional> getArgumentNames() + { + return argumentNames; + } + public TypeSignature getReturnType() { return returnType; @@ -99,6 +125,11 @@ public Optional getOperatorType() return operatorType; } + public FunctionImplementationType getImplementationType() + { + return implementationType; + } + public boolean isDeterministic() { return deterministic; @@ -122,8 +153,10 @@ public boolean equals(Object obj) return Objects.equals(this.name, other.name) && Objects.equals(this.operatorType, other.operatorType) && Objects.equals(this.argumentTypes, other.argumentTypes) && + Objects.equals(this.argumentNames, other.argumentNames) && Objects.equals(this.returnType, other.returnType) && Objects.equals(this.functionKind, other.functionKind) && + Objects.equals(this.implementationType, other.implementationType) && Objects.equals(this.deterministic, other.deterministic) && Objects.equals(this.calledOnNullInput, other.calledOnNullInput); } @@ -131,6 +164,6 @@ public boolean equals(Object obj) @Override public int hashCode() { - return Objects.hash(name, operatorType, argumentTypes, returnType, functionKind, deterministic, calledOnNullInput); + return Objects.hash(name, operatorType, argumentTypes, argumentNames, returnType, functionKind, implementationType, deterministic, calledOnNullInput); } } diff --git a/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/AbstractSqlInvokedFunctionNamespaceManager.java b/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/AbstractSqlInvokedFunctionNamespaceManager.java index 60b2650b71222..f6273a3aa1f43 100644 --- a/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/AbstractSqlInvokedFunctionNamespaceManager.java +++ b/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/AbstractSqlInvokedFunctionNamespaceManager.java @@ -125,8 +125,10 @@ protected static FunctionMetadata sqlInvokedFunctionToMetadata(SqlInvokedRegular return new FunctionMetadata( function.getSignature().getName(), function.getSignature().getArgumentTypes(), + function.getParameterNames(), function.getSignature().getReturnType(), SCALAR, + function.getFunctionImplementationType(), function.isDeterministic(), function.isCalledOnNullInput()); } diff --git a/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/SqlInvokedRegularFunction.java b/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/SqlInvokedRegularFunction.java index 061de88e0bc39..131d371bf4939 100644 --- a/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/SqlInvokedRegularFunction.java +++ b/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/SqlInvokedRegularFunction.java @@ -13,18 +13,22 @@ */ package com.facebook.presto.sqlfunction; +import com.facebook.presto.spi.function.FunctionImplementationType; import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.function.SqlFunction; import com.facebook.presto.spi.relation.FullyQualifiedName; import com.facebook.presto.spi.type.TypeSignature; +import com.google.common.collect.ImmutableMap; import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.Optional; import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.google.common.base.Preconditions.checkState; +import static com.google.common.collect.ImmutableList.toImmutableList; import static java.lang.String.format; import static java.util.Objects.requireNonNull; import static java.util.stream.Collectors.collectingAndThen; @@ -34,6 +38,8 @@ public class SqlInvokedRegularFunction implements SqlFunction { + private static final Map LANGUAGE_TO_IMPLEMENTATION_MAP = ImmutableMap.of(RoutineCharacteristics.Language.SQL, FunctionImplementationType.SQL); + private final List parameters; private final Optional comment; private final RoutineCharacteristics routineCharacteristics; @@ -115,6 +121,11 @@ public List getParameters() return parameters; } + public List getParameterNames() + { + return parameters.stream().map(SqlParameter::getName).collect(toImmutableList()); + } + public Optional getComment() { return comment; @@ -125,6 +136,12 @@ public RoutineCharacteristics getRoutineCharacteristics() return routineCharacteristics; } + public FunctionImplementationType getFunctionImplementationType() + { + checkState(LANGUAGE_TO_IMPLEMENTATION_MAP.containsKey(routineCharacteristics.getLanguage()), "Language is not supported: %s", routineCharacteristics.getLanguage()); + return LANGUAGE_TO_IMPLEMENTATION_MAP.get(routineCharacteristics.getLanguage()); + } + public String getBody() { return body; From 349f8798e8529fea29f1ecc3a6a9dd8ef3f47048 Mon Sep 17 00:00:00 2001 From: Rongrong Zhong Date: Fri, 13 Sep 2019 18:28:37 -0700 Subject: [PATCH 10/11] Add ScalarFunctionImplementation abstraction --- .../BuiltInFunctionNamespaceManager.java | 4 ++- .../presto/metadata/FunctionManager.java | 8 ++++- .../BuiltInScalarFunctionImplementation.java | 2 ++ .../InMemoryFunctionNamespaceManager.java | 10 ++++++ .../TestFunctionNamespaceManager.java | 2 +- .../function/FunctionNamespaceManager.java | 2 ++ .../ScalarFunctionImplementation.java | 21 ++++++++++++ ...actSqlInvokedFunctionNamespaceManager.java | 29 +++++++++++++++- ...InvokedFunctionNamespaceManagerConfig.java | 12 +++---- ...vokedRegularSqlFunctionImplementation.java | 34 +++++++++++++++++++ ...InvokedFunctionNamespaceManagerConfig.java | 6 ++-- 11 files changed, 117 insertions(+), 13 deletions(-) create mode 100644 presto-spi/src/main/java/com/facebook/presto/spi/function/ScalarFunctionImplementation.java create mode 100644 presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/SqlInvokedRegularSqlFunctionImplementation.java diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/BuiltInFunctionNamespaceManager.java b/presto-main/src/main/java/com/facebook/presto/metadata/BuiltInFunctionNamespaceManager.java index d18245f9e6c65..30ba09f9dcba7 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/BuiltInFunctionNamespaceManager.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/BuiltInFunctionNamespaceManager.java @@ -158,6 +158,7 @@ import com.facebook.presto.spi.function.FunctionNamespaceManager; import com.facebook.presto.spi.function.FunctionNamespaceTransactionHandle; import com.facebook.presto.spi.function.OperatorType; +import com.facebook.presto.spi.function.ScalarFunctionImplementation; import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.function.SqlFunction; import com.facebook.presto.spi.relation.FullyQualifiedName; @@ -793,7 +794,8 @@ public InternalAggregationFunction getAggregateFunctionImplementation(FunctionHa } } - public BuiltInScalarFunctionImplementation getScalarFunctionImplementation(FunctionHandle functionHandle) + @Override + public ScalarFunctionImplementation getScalarFunctionImplementation(FunctionHandle functionHandle) { checkArgument(functionHandle instanceof BuiltInFunctionHandle, "Expect BuiltInFunctionHandle"); return getScalarFunctionImplementation(((BuiltInFunctionHandle) functionHandle).getSignature()); diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/FunctionManager.java b/presto-main/src/main/java/com/facebook/presto/metadata/FunctionManager.java index 2c8c0ace4cc50..138b57d012580 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/FunctionManager.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/FunctionManager.java @@ -27,6 +27,7 @@ import com.facebook.presto.spi.function.FunctionNamespaceManagerFactory; import com.facebook.presto.spi.function.FunctionNamespaceTransactionHandle; import com.facebook.presto.spi.function.OperatorType; +import com.facebook.presto.spi.function.ScalarFunctionImplementation; import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.function.SqlFunction; import com.facebook.presto.spi.relation.FullyQualifiedName; @@ -225,6 +226,11 @@ public FunctionMetadata getFunctionMetadata(FunctionHandle functionHandle) return functionNamespaces.get(functionHandle.getFunctionNamespace()).getFunctionMetadata(functionHandle); } + public ScalarFunctionImplementation getScalarFunctionImplementation(FunctionHandle functionHandle) + { + return functionNamespaces.get(functionHandle.getFunctionNamespace()).getScalarFunctionImplementation(functionHandle); + } + public WindowFunctionSupplier getWindowFunctionImplementation(FunctionHandle functionHandle) { return builtInFunctionNamespaceManager.getWindowFunctionImplementation(functionHandle); @@ -237,7 +243,7 @@ public InternalAggregationFunction getAggregateFunctionImplementation(FunctionHa public BuiltInScalarFunctionImplementation getBuiltInScalarFunctionImplementation(FunctionHandle functionHandle) { - return builtInFunctionNamespaceManager.getScalarFunctionImplementation(functionHandle); + return (BuiltInScalarFunctionImplementation) builtInFunctionNamespaceManager.getScalarFunctionImplementation(functionHandle); } @VisibleForTesting diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/BuiltInScalarFunctionImplementation.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/BuiltInScalarFunctionImplementation.java index 13b9c423c504f..6fe41722a9008 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/BuiltInScalarFunctionImplementation.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/BuiltInScalarFunctionImplementation.java @@ -14,6 +14,7 @@ package com.facebook.presto.operator.scalar; import com.facebook.presto.spi.ConnectorSession; +import com.facebook.presto.spi.function.ScalarFunctionImplementation; import com.google.common.collect.ImmutableList; import java.lang.invoke.MethodHandle; @@ -29,6 +30,7 @@ import static java.util.Objects.requireNonNull; public final class BuiltInScalarFunctionImplementation + implements ScalarFunctionImplementation { private final List choices; diff --git a/presto-main/src/main/java/com/facebook/presto/testing/InMemoryFunctionNamespaceManager.java b/presto-main/src/main/java/com/facebook/presto/testing/InMemoryFunctionNamespaceManager.java index e3b3e5d8ace6a..13283f8c0c010 100644 --- a/presto-main/src/main/java/com/facebook/presto/testing/InMemoryFunctionNamespaceManager.java +++ b/presto-main/src/main/java/com/facebook/presto/testing/InMemoryFunctionNamespaceManager.java @@ -15,6 +15,7 @@ import com.facebook.presto.spi.PrestoException; import com.facebook.presto.spi.function.FunctionMetadata; +import com.facebook.presto.spi.function.ScalarFunctionImplementation; import com.facebook.presto.spi.relation.FullyQualifiedName; import com.facebook.presto.sqlfunction.AbstractSqlInvokedFunctionNamespaceManager; import com.facebook.presto.sqlfunction.SqlFunctionId; @@ -94,6 +95,15 @@ public FunctionMetadata fetchFunctionMetadataDirect(SqlInvokedRegularFunctionHan .collect(onlyElement()); } + @Override + protected ScalarFunctionImplementation fetchFunctionImplementationDirect(SqlInvokedRegularFunctionHandle functionHandle) + { + return fetchFunctionsDirect(functionHandle.getName()).stream() + .filter(function -> function.getRequiredFunctionHandle().equals(functionHandle)) + .map(AbstractSqlInvokedFunctionNamespaceManager::sqlInvokedFunctionToImplementation) + .collect(onlyElement()); + } + private static SqlInvokedRegularFunction copyFunction(SqlInvokedRegularFunction function) { return new SqlInvokedRegularFunction( diff --git a/presto-main/src/test/java/com/facebook/presto/metadata/TestFunctionNamespaceManager.java b/presto-main/src/test/java/com/facebook/presto/metadata/TestFunctionNamespaceManager.java index 79fdca16728f3..8607ef8c2c040 100644 --- a/presto-main/src/test/java/com/facebook/presto/metadata/TestFunctionNamespaceManager.java +++ b/presto-main/src/test/java/com/facebook/presto/metadata/TestFunctionNamespaceManager.java @@ -81,7 +81,7 @@ public void testTransactionalGetFunction() InMemoryFunctionNamespaceManager functionNamespaceManager = new InMemoryFunctionNamespaceManager( new SqlInvokedFunctionNamespaceManagerConfig() .setFunctionCacheExpiration(new Duration(0, MILLISECONDS)) - .setMetadataCacheExpiration(new Duration(0, MILLISECONDS))); + .setFunctionInstanceCacheExpiration(new Duration(0, MILLISECONDS))); // begin first transaction FunctionNamespaceTransactionHandle transaction1 = functionNamespaceManager.beginTransaction(); diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/function/FunctionNamespaceManager.java b/presto-spi/src/main/java/com/facebook/presto/spi/function/FunctionNamespaceManager.java index df723bbaf057d..f8afbffd13400 100644 --- a/presto-spi/src/main/java/com/facebook/presto/spi/function/FunctionNamespaceManager.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/function/FunctionNamespaceManager.java @@ -58,4 +58,6 @@ public interface FunctionNamespaceManager FunctionHandle getFunctionHandle(Optional transactionHandle, Signature signature); FunctionMetadata getFunctionMetadata(FunctionHandle functionHandle); + + ScalarFunctionImplementation getScalarFunctionImplementation(FunctionHandle functionHandle); } diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/function/ScalarFunctionImplementation.java b/presto-spi/src/main/java/com/facebook/presto/spi/function/ScalarFunctionImplementation.java new file mode 100644 index 0000000000000..99c45f251ce99 --- /dev/null +++ b/presto-spi/src/main/java/com/facebook/presto/spi/function/ScalarFunctionImplementation.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.function; + +import com.facebook.presto.spi.api.Experimental; + +@Experimental +public interface ScalarFunctionImplementation +{ +} diff --git a/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/AbstractSqlInvokedFunctionNamespaceManager.java b/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/AbstractSqlInvokedFunctionNamespaceManager.java index f6273a3aa1f43..4729f73186088 100644 --- a/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/AbstractSqlInvokedFunctionNamespaceManager.java +++ b/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/AbstractSqlInvokedFunctionNamespaceManager.java @@ -17,6 +17,7 @@ import com.facebook.presto.spi.function.FunctionMetadata; import com.facebook.presto.spi.function.FunctionNamespaceManager; import com.facebook.presto.spi.function.FunctionNamespaceTransactionHandle; +import com.facebook.presto.spi.function.ScalarFunctionImplementation; import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.relation.FullyQualifiedName; import com.google.common.cache.CacheBuilder; @@ -31,6 +32,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import static com.facebook.presto.spi.function.FunctionImplementationType.SQL; import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.collect.ImmutableMap.toImmutableMap; @@ -43,6 +45,7 @@ public abstract class AbstractSqlInvokedFunctionNamespaceManager private final LoadingCache> functions; private final LoadingCache metadataByHandle; + private final LoadingCache implementationByHandle; public AbstractSqlInvokedFunctionNamespaceManager(SqlInvokedFunctionNamespaceManagerConfig config) { @@ -61,7 +64,7 @@ public Collection load(FullyQualifiedName functionNam } }); this.metadataByHandle = CacheBuilder.newBuilder() - .expireAfterWrite(config.getMetadataCacheExpiration().toMillis(), MILLISECONDS) + .expireAfterWrite(config.getFunctionInstanceCacheExpiration().toMillis(), MILLISECONDS) .build(new CacheLoader() { @Override @@ -70,12 +73,23 @@ public FunctionMetadata load(SqlInvokedRegularFunctionHandle functionHandle) return fetchFunctionMetadataDirect(functionHandle); } }); + this.implementationByHandle = CacheBuilder.newBuilder() + .expireAfterWrite(config.getFunctionInstanceCacheExpiration().toMillis(), MILLISECONDS) + .build(new CacheLoader() { + @Override + public ScalarFunctionImplementation load(SqlInvokedRegularFunctionHandle functionHandle) + { + return fetchFunctionImplementationDirect(functionHandle); + } + }); } protected abstract Collection fetchFunctionsDirect(FullyQualifiedName functionName); protected abstract FunctionMetadata fetchFunctionMetadataDirect(SqlInvokedRegularFunctionHandle functionHandle); + protected abstract ScalarFunctionImplementation fetchFunctionImplementationDirect(SqlInvokedRegularFunctionHandle functionHandle); + @Override public final FunctionNamespaceTransactionHandle beginTransaction() { @@ -120,6 +134,13 @@ public final FunctionMetadata getFunctionMetadata(FunctionHandle functionHandle) return metadataByHandle.getUnchecked((SqlInvokedRegularFunctionHandle) functionHandle); } + @Override + public final ScalarFunctionImplementation getScalarFunctionImplementation(FunctionHandle functionHandle) + { + checkArgument(functionHandle instanceof SqlInvokedRegularFunctionHandle, "Unsupported FunctionHandle type '%s'", functionHandle.getClass().getSimpleName()); + return implementationByHandle.getUnchecked((SqlInvokedRegularFunctionHandle) functionHandle); + } + protected static FunctionMetadata sqlInvokedFunctionToMetadata(SqlInvokedRegularFunction function) { return new FunctionMetadata( @@ -133,6 +154,12 @@ protected static FunctionMetadata sqlInvokedFunctionToMetadata(SqlInvokedRegular function.isCalledOnNullInput()); } + protected static ScalarFunctionImplementation sqlInvokedFunctionToImplementation(SqlInvokedRegularFunction function) + { + checkArgument(function.getFunctionImplementationType().equals(SQL)); + return new SqlInvokedRegularSqlFunctionImplementation(function.getBody()); + } + private Collection fetchFunctions(FullyQualifiedName functionName) { return functions.getUnchecked(functionName); diff --git a/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/SqlInvokedFunctionNamespaceManagerConfig.java b/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/SqlInvokedFunctionNamespaceManagerConfig.java index 1d2ec59ea5d8d..194c64ef46ec6 100644 --- a/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/SqlInvokedFunctionNamespaceManagerConfig.java +++ b/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/SqlInvokedFunctionNamespaceManagerConfig.java @@ -23,7 +23,7 @@ public class SqlInvokedFunctionNamespaceManagerConfig { private Duration functionCacheExpiration = new Duration(5, MINUTES); - private Duration metadataCacheExpiration = new Duration(8, HOURS); + private Duration functionInstanceCacheExpiration = new Duration(8, HOURS); @MinDuration("0ns") public Duration getFunctionCacheExpiration() @@ -39,15 +39,15 @@ public SqlInvokedFunctionNamespaceManagerConfig setFunctionCacheExpiration(Durat } @MinDuration("0ns") - public Duration getMetadataCacheExpiration() + public Duration getFunctionInstanceCacheExpiration() { - return metadataCacheExpiration; + return functionInstanceCacheExpiration; } - @Config("metadata-cache-expiration") - public SqlInvokedFunctionNamespaceManagerConfig setMetadataCacheExpiration(Duration metadataCacheExpiration) + @Config("function-instance-cache-expiration") + public SqlInvokedFunctionNamespaceManagerConfig setFunctionInstanceCacheExpiration(Duration functionInstanceCacheExpiration) { - this.metadataCacheExpiration = metadataCacheExpiration; + this.functionInstanceCacheExpiration = functionInstanceCacheExpiration; return this; } } diff --git a/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/SqlInvokedRegularSqlFunctionImplementation.java b/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/SqlInvokedRegularSqlFunctionImplementation.java new file mode 100644 index 0000000000000..ac6c652c522f6 --- /dev/null +++ b/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/SqlInvokedRegularSqlFunctionImplementation.java @@ -0,0 +1,34 @@ +/* + * 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.sqlfunction; + +import com.facebook.presto.spi.function.ScalarFunctionImplementation; + +import static java.util.Objects.requireNonNull; + +public class SqlInvokedRegularSqlFunctionImplementation + implements ScalarFunctionImplementation +{ + private final String implementation; + + public SqlInvokedRegularSqlFunctionImplementation(String implementation) + { + this.implementation = requireNonNull(implementation, "implementation is null"); + } + + public String getImplementation() + { + return implementation; + } +} diff --git a/presto-sql-function/src/test/java/com/facebook/presto/sqlfunction/TestSqlInvokedFunctionNamespaceManagerConfig.java b/presto-sql-function/src/test/java/com/facebook/presto/sqlfunction/TestSqlInvokedFunctionNamespaceManagerConfig.java index d157f4086d0a9..46d4510886645 100644 --- a/presto-sql-function/src/test/java/com/facebook/presto/sqlfunction/TestSqlInvokedFunctionNamespaceManagerConfig.java +++ b/presto-sql-function/src/test/java/com/facebook/presto/sqlfunction/TestSqlInvokedFunctionNamespaceManagerConfig.java @@ -32,7 +32,7 @@ public void testDefault() { assertRecordedDefaults(recordDefaults(SqlInvokedFunctionNamespaceManagerConfig.class) .setFunctionCacheExpiration(new Duration(5, MINUTES)) - .setMetadataCacheExpiration(new Duration(8, HOURS))); + .setFunctionInstanceCacheExpiration(new Duration(8, HOURS))); } @Test @@ -40,11 +40,11 @@ public void testExplicitPropertyMappings() { Map properties = new ImmutableMap.Builder() .put("function-cache-expiration", "10m") - .put("metadata-cache-expiration", "4h") + .put("function-instance-cache-expiration", "4h") .build(); SqlInvokedFunctionNamespaceManagerConfig expected = new SqlInvokedFunctionNamespaceManagerConfig() .setFunctionCacheExpiration(new Duration(10, MINUTES)) - .setMetadataCacheExpiration(new Duration(4, HOURS)); + .setFunctionInstanceCacheExpiration(new Duration(4, HOURS)); assertFullMapping(properties, expected); } From 6563a199ebf9695648d3a81dc178141f7b05683c Mon Sep 17 00:00:00 2001 From: Rongrong Zhong Date: Fri, 4 Oct 2019 13:12:12 -0700 Subject: [PATCH 11/11] Support SQL function execution --- .../sql/analyzer/ExpressionAnalyzer.java | 27 +- .../facebook/presto/sql/gen/BodyCompiler.java | 3 +- .../sql/gen/CursorProcessorCompiler.java | 21 +- .../presto/sql/gen/ExpressionCompiler.java | 5 +- .../sql/gen/JoinFilterFunctionCompiler.java | 21 +- .../sql/gen/LambdaBytecodeGenerator.java | 32 ++- .../presto/sql/gen/PageFunctionCompiler.java | 26 +- .../presto/sql/gen/RowExpressionCompiler.java | 63 ++++- .../gen/RowExpressionPredicateCompiler.java | 22 +- .../sql/planner/ExpressionInterpreter.java | 27 +- .../sql/planner/LocalExecutionPlanner.java | 2 +- .../sql/planner/PlanVariableAllocator.java | 2 +- .../sql/planner/RowExpressionInterpreter.java | 23 +- .../presto/sql/planner/TypeProvider.java | 5 + .../sql/relational/SqlFunctionUtils.java | 260 ++++++++++++++++++ .../TestRowExpressionPredicateCompiler.java | 12 +- ...qlInvokedScalarFunctionImplementation.java | 9 +- presto-sql-function/pom.xml | 2 + ...actSqlInvokedFunctionNamespaceManager.java | 3 +- 19 files changed, 485 insertions(+), 80 deletions(-) create mode 100644 presto-main/src/main/java/com/facebook/presto/sql/relational/SqlFunctionUtils.java rename presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/SqlInvokedRegularSqlFunctionImplementation.java => presto-spi/src/main/java/com/facebook/presto/spi/function/SqlInvokedScalarFunctionImplementation.java (78%) 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 c17ac25e0ccce..dd4f03d121373 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 @@ -1651,6 +1651,29 @@ public static ExpressionAnalyzer createWithoutSubqueries( Function statementAnalyzerRejection, WarningCollector warningCollector, boolean isDescribe) + { + return createWithoutSubqueries( + functionManager, + typeManager, + session.getTransactionId(), + session.getSqlFunctionProperties(), + symbolTypes, + parameters, + statementAnalyzerRejection, + warningCollector, + isDescribe); + } + + public static ExpressionAnalyzer createWithoutSubqueries( + FunctionManager functionManager, + TypeManager typeManager, + Optional transactionId, + SqlFunctionProperties sqlFunctionProperties, + TypeProvider symbolTypes, + List parameters, + Function statementAnalyzerRejection, + WarningCollector warningCollector, + boolean isDescribe) { return new ExpressionAnalyzer( functionManager, @@ -1658,8 +1681,8 @@ public static ExpressionAnalyzer createWithoutSubqueries( node -> { throw statementAnalyzerRejection.apply(node); }, - session.getTransactionId(), - session.getSqlFunctionProperties(), + transactionId, + sqlFunctionProperties, symbolTypes, parameters, warningCollector, 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 c80883264870b..225a726f38c3d 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 @@ -14,11 +14,12 @@ package com.facebook.presto.sql.gen; import com.facebook.presto.bytecode.ClassDefinition; +import com.facebook.presto.spi.function.SqlFunctionProperties; import com.facebook.presto.spi.relation.RowExpression; import java.util.List; public interface BodyCompiler { - void generateMethods(ClassDefinition classDefinition, CallSiteBinder callSiteBinder, RowExpression filter, List projections); + void generateMethods(SqlFunctionProperties sqlFunctionProperties, ClassDefinition classDefinition, CallSiteBinder callSiteBinder, RowExpression filter, List projections); } 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 e1765ba006a82..5dc633b209d95 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 @@ -30,6 +30,7 @@ import com.facebook.presto.spi.PageBuilder; import com.facebook.presto.spi.RecordCursor; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.SqlFunctionProperties; import com.facebook.presto.spi.relation.CallExpression; import com.facebook.presto.spi.relation.ConstantExpression; import com.facebook.presto.spi.relation.InputReferenceExpression; @@ -69,19 +70,19 @@ public CursorProcessorCompiler(Metadata metadata) } @Override - public void generateMethods(ClassDefinition classDefinition, CallSiteBinder callSiteBinder, RowExpression filter, List projections) + public void generateMethods(SqlFunctionProperties sqlFunctionProperties, ClassDefinition classDefinition, CallSiteBinder callSiteBinder, RowExpression filter, List projections) { CachedInstanceBinder cachedInstanceBinder = new CachedInstanceBinder(classDefinition, callSiteBinder); generateProcessMethod(classDefinition, projections.size()); - Map filterCompiledLambdaMap = generateMethodsForLambda(classDefinition, callSiteBinder, cachedInstanceBinder, filter, metadata.getFunctionManager(), "filter"); - generateFilterMethod(classDefinition, callSiteBinder, cachedInstanceBinder, filterCompiledLambdaMap, filter); + Map filterCompiledLambdaMap = generateMethodsForLambda(classDefinition, callSiteBinder, cachedInstanceBinder, filter, metadata, sqlFunctionProperties, "filter"); + generateFilterMethod(sqlFunctionProperties, classDefinition, callSiteBinder, cachedInstanceBinder, filterCompiledLambdaMap, filter); for (int i = 0; i < projections.size(); i++) { String methodName = "project_" + i; - Map projectCompiledLambdaMap = generateMethodsForLambda(classDefinition, callSiteBinder, cachedInstanceBinder, projections.get(i), metadata.getFunctionManager(), methodName); - generateProjectMethod(classDefinition, callSiteBinder, cachedInstanceBinder, projectCompiledLambdaMap, methodName, projections.get(i)); + Map projectCompiledLambdaMap = generateMethodsForLambda(classDefinition, callSiteBinder, cachedInstanceBinder, projections.get(i), metadata, sqlFunctionProperties, methodName); + generateProjectMethod(sqlFunctionProperties, classDefinition, callSiteBinder, cachedInstanceBinder, projectCompiledLambdaMap, methodName, projections.get(i)); } MethodDefinition constructorDefinition = classDefinition.declareConstructor(a(PUBLIC)); @@ -189,6 +190,7 @@ private static IfStatement createProjectIfStatement( } private void generateFilterMethod( + SqlFunctionProperties sqlFunctionProperties, ClassDefinition classDefinition, CallSiteBinder callSiteBinder, CachedInstanceBinder cachedInstanceBinder, @@ -205,10 +207,12 @@ private void generateFilterMethod( Variable wasNullVariable = scope.declareVariable(type(boolean.class), "wasNull"); RowExpressionCompiler compiler = new RowExpressionCompiler( + classDefinition, callSiteBinder, cachedInstanceBinder, fieldReferenceCompiler(cursor), - metadata.getFunctionManager(), + metadata, + sqlFunctionProperties, compiledLambdaMap); LabelNode end = new LabelNode("end"); @@ -227,6 +231,7 @@ private void generateFilterMethod( } private void generateProjectMethod( + SqlFunctionProperties sqlFunctionProperties, ClassDefinition classDefinition, CallSiteBinder callSiteBinder, CachedInstanceBinder cachedInstanceBinder, @@ -245,10 +250,12 @@ private void generateProjectMethod( Variable wasNullVariable = scope.declareVariable(type(boolean.class), "wasNull"); RowExpressionCompiler compiler = new RowExpressionCompiler( + classDefinition, callSiteBinder, cachedInstanceBinder, fieldReferenceCompiler(cursor), - metadata.getFunctionManager(), + metadata, + sqlFunctionProperties, compiledLambdaMap); method.getBody() 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 ec8b04c9d6fd5..b524d298bd9fb 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 @@ -132,7 +132,7 @@ private Class compile(SqlFunctionProperties sqlFunctionProperti { // create filter and project page iterator class try { - return compileProcessor(filter.orElse(constant(true, BOOLEAN)), projections, bodyCompiler, superType); + return compileProcessor(sqlFunctionProperties, filter.orElse(constant(true, BOOLEAN)), projections, bodyCompiler, superType); } catch (CompilationException e) { throw new PrestoException(COMPILER_ERROR, e.getCause()); @@ -140,6 +140,7 @@ private Class compile(SqlFunctionProperties sqlFunctionProperti } private Class compileProcessor( + SqlFunctionProperties sqlFunctionProperties, RowExpression filter, List projections, BodyCompiler bodyCompiler, @@ -152,7 +153,7 @@ private Class compileProcessor( type(superType)); CallSiteBinder callSiteBinder = new CallSiteBinder(); - bodyCompiler.generateMethods(classDefinition, callSiteBinder, filter, projections); + bodyCompiler.generateMethods(sqlFunctionProperties, classDefinition, callSiteBinder, filter, projections); // // toString method 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 52adf3375b55a..904b0f6cd5388 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 @@ -79,7 +79,7 @@ public JoinFilterFunctionCompiler(Metadata metadata) private final LoadingCache joinFilterFunctionFactories = CacheBuilder.newBuilder() .recordStats() .maximumSize(1000) - .build(CacheLoader.from(key -> internalCompileFilterFunctionFactory(key.getFilter(), key.getLeftBlocksSize()))); + .build(CacheLoader.from(key -> internalCompileFilterFunctionFactory(key.getSqlFunctionProperties(), key.getFilter(), key.getLeftBlocksSize()))); @Managed @Nested @@ -93,13 +93,13 @@ public JoinFilterFunctionFactory compileJoinFilterFunction(SqlFunctionProperties return joinFilterFunctionFactories.getUnchecked(new JoinFilterCacheKey(sqlFunctionProperties, filter, leftBlocksSize)); } - private JoinFilterFunctionFactory internalCompileFilterFunctionFactory(RowExpression filterExpression, int leftBlocksSize) + private JoinFilterFunctionFactory internalCompileFilterFunctionFactory(SqlFunctionProperties sqlFunctionProperties, RowExpression filterExpression, int leftBlocksSize) { - Class internalJoinFilterFunction = compileInternalJoinFilterFunction(filterExpression, leftBlocksSize); + Class internalJoinFilterFunction = compileInternalJoinFilterFunction(sqlFunctionProperties, filterExpression, leftBlocksSize); return new IsolatedJoinFilterFunctionFactory(internalJoinFilterFunction); } - private Class compileInternalJoinFilterFunction(RowExpression filterExpression, int leftBlocksSize) + private Class compileInternalJoinFilterFunction(SqlFunctionProperties sqlFunctionProperties, RowExpression filterExpression, int leftBlocksSize) { ClassDefinition classDefinition = new ClassDefinition( a(PUBLIC, FINAL), @@ -109,7 +109,7 @@ private Class compileInternalJoinFilterFun CallSiteBinder callSiteBinder = new CallSiteBinder(); - new JoinFilterFunctionCompiler(metadata).generateMethods(classDefinition, callSiteBinder, filterExpression, leftBlocksSize); + new JoinFilterFunctionCompiler(metadata).generateMethods(sqlFunctionProperties, classDefinition, callSiteBinder, filterExpression, leftBlocksSize); // // toString method @@ -125,14 +125,14 @@ 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(SqlFunctionProperties sqlFunctionProperties, ClassDefinition classDefinition, CallSiteBinder callSiteBinder, RowExpression filter, int leftBlocksSize) { CachedInstanceBinder cachedInstanceBinder = new CachedInstanceBinder(classDefinition, callSiteBinder); FieldDefinition sessionField = classDefinition.declareField(a(PRIVATE, FINAL), "session", ConnectorSession.class); - Map compiledLambdaMap = generateMethodsForLambda(classDefinition, callSiteBinder, cachedInstanceBinder, filter, metadata.getFunctionManager()); - generateFilterMethod(classDefinition, callSiteBinder, cachedInstanceBinder, compiledLambdaMap, filter, leftBlocksSize, sessionField); + Map compiledLambdaMap = generateMethodsForLambda(classDefinition, callSiteBinder, cachedInstanceBinder, filter, metadata, sqlFunctionProperties); + generateFilterMethod(sqlFunctionProperties, classDefinition, callSiteBinder, cachedInstanceBinder, compiledLambdaMap, filter, leftBlocksSize, sessionField); generateConstructor(classDefinition, sessionField, cachedInstanceBinder); } @@ -158,6 +158,7 @@ private static void generateConstructor( } private void generateFilterMethod( + SqlFunctionProperties sqlFunctionProperties, ClassDefinition classDefinition, CallSiteBinder callSiteBinder, CachedInstanceBinder cachedInstanceBinder, @@ -191,10 +192,12 @@ private void generateFilterMethod( scope.declareVariable("session", body, method.getThis().getField(sessionField)); RowExpressionCompiler compiler = new RowExpressionCompiler( + classDefinition, callSiteBinder, cachedInstanceBinder, fieldReferenceCompiler(callSiteBinder, leftPosition, leftPage, rightPosition, rightPage, leftBlocksSize), - metadata.getFunctionManager(), + metadata, + sqlFunctionProperties, compiledLambdaMap); BytecodeNode visitorBody = compiler.compile(filter, scope, Optional.empty()); 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 6eddd349d13b4..3b32891ca8bb4 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 @@ -24,10 +24,11 @@ import com.facebook.presto.bytecode.Scope; import com.facebook.presto.bytecode.Variable; import com.facebook.presto.bytecode.expression.BytecodeExpression; -import com.facebook.presto.metadata.FunctionManager; +import com.facebook.presto.metadata.Metadata; import com.facebook.presto.operator.aggregation.AccumulatorCompiler; import com.facebook.presto.operator.aggregation.LambdaProvider; import com.facebook.presto.spi.ConnectorSession; +import com.facebook.presto.spi.function.SqlFunctionProperties; import com.facebook.presto.spi.relation.CallExpression; import com.facebook.presto.spi.relation.ConstantExpression; import com.facebook.presto.spi.relation.InputReferenceExpression; @@ -84,9 +85,10 @@ public static Map generateMethodsFor CallSiteBinder callSiteBinder, CachedInstanceBinder cachedInstanceBinder, RowExpression expression, - FunctionManager functionManager) + Metadata metadata, + SqlFunctionProperties sqlFunctionProperties) { - return generateMethodsForLambda(containerClassDefinition, callSiteBinder, cachedInstanceBinder, expression, functionManager, ""); + return generateMethodsForLambda(containerClassDefinition, callSiteBinder, cachedInstanceBinder, expression, metadata, sqlFunctionProperties, ""); } public static Map generateMethodsForLambda( @@ -94,7 +96,8 @@ public static Map generateMethodsFor CallSiteBinder callSiteBinder, CachedInstanceBinder cachedInstanceBinder, RowExpression expression, - FunctionManager functionManager, + Metadata metadata, + SqlFunctionProperties sqlFunctionProperties, String methodNamePrefix) { Set lambdaExpressions = ImmutableSet.copyOf(extractLambdaExpressions(expression)); @@ -109,7 +112,8 @@ public static Map generateMethodsFor compiledLambdaMap.build(), callSiteBinder, cachedInstanceBinder, - functionManager); + metadata, + sqlFunctionProperties); compiledLambdaMap.put(lambdaExpression, compiledLambda); counter++; } @@ -127,7 +131,8 @@ public static CompiledLambda preGenerateLambdaExpression( Map compiledLambdaMap, CallSiteBinder callSiteBinder, CachedInstanceBinder cachedInstanceBinder, - FunctionManager functionManager) + Metadata metadata, + SqlFunctionProperties sqlFunctionProperties) { ImmutableList.Builder parameters = ImmutableList.builder(); ImmutableMap.Builder parameterMapBuilder = ImmutableMap.builder(); @@ -142,10 +147,12 @@ public static CompiledLambda preGenerateLambdaExpression( } RowExpressionCompiler innerExpressionCompiler = new RowExpressionCompiler( + classDefinition, callSiteBinder, cachedInstanceBinder, variableReferenceCompiler(parameterMapBuilder.build()), - functionManager, + metadata, + sqlFunctionProperties, compiledLambdaMap); return defineLambdaMethod( @@ -242,7 +249,7 @@ public static BytecodeNode generateLambda( return block; } - public static Class compileLambdaProvider(LambdaDefinitionExpression lambdaExpression, FunctionManager functionManager, Class lambdaInterface) + public static Class compileLambdaProvider(LambdaDefinitionExpression lambdaExpression, Metadata metadata, SqlFunctionProperties sqlFunctionProperties, Class lambdaInterface) { ClassDefinition lambdaProviderClassDefinition = new ClassDefinition( a(PUBLIC, Access.FINAL), @@ -260,7 +267,8 @@ public static Class compileLambdaProvider(LambdaDefini callSiteBinder, cachedInstanceBinder, lambdaExpression, - functionManager); + metadata, + sqlFunctionProperties); MethodDefinition method = lambdaProviderClassDefinition.declareMethod( a(PUBLIC), @@ -274,10 +282,12 @@ public static Class compileLambdaProvider(LambdaDefini scope.declareVariable("session", body, method.getThis().getField(sessionField)); RowExpressionCompiler rowExpressionCompiler = new RowExpressionCompiler( + lambdaProviderClassDefinition, callSiteBinder, cachedInstanceBinder, variableReferenceCompiler(ImmutableMap.of()), - functionManager, + metadata, + sqlFunctionProperties, compiledLambdaMap); BytecodeGeneratorContext generatorContext = new BytecodeGeneratorContext( @@ -285,7 +295,7 @@ public static Class compileLambdaProvider(LambdaDefini scope, callSiteBinder, cachedInstanceBinder, - functionManager); + metadata.getFunctionManager()); body.append( generateLambda( 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 b8b177bab58b2..a197d408eb5b2 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 @@ -186,7 +186,7 @@ private Supplier compileProjectionInternal(SqlFunctionProperties CallSiteBinder callSiteBinder = new CallSiteBinder(); // generate Work - ClassDefinition pageProjectionWorkDefinition = definePageProjectWorkClass(result.getRewrittenExpression(), callSiteBinder, classNameSuffix); + ClassDefinition pageProjectionWorkDefinition = definePageProjectWorkClass(sqlFunctionProperties, result.getRewrittenExpression(), callSiteBinder, classNameSuffix); Class pageProjectionWorkClass; try { @@ -208,7 +208,7 @@ private static ParameterizedType generateProjectionWorkClassName(Optional classNameSuffix) + private ClassDefinition definePageProjectWorkClass(SqlFunctionProperties sqlFunctionProperties, RowExpression projection, CallSiteBinder callSiteBinder, Optional classNameSuffix) { ClassDefinition classDefinition = new ClassDefinition( a(PUBLIC, FINAL), @@ -233,8 +233,8 @@ private ClassDefinition definePageProjectWorkClass(RowExpression projection, Cal method.getBody().append(method.getThis().getField(resultField)).ret(Object.class); // evaluate - Map compiledLambdaMap = generateMethodsForLambda(classDefinition, callSiteBinder, cachedInstanceBinder, projection, metadata.getFunctionManager()); - generateEvaluateMethod(classDefinition, callSiteBinder, cachedInstanceBinder, compiledLambdaMap, projection, blockBuilderField); + Map compiledLambdaMap = generateMethodsForLambda(classDefinition, callSiteBinder, cachedInstanceBinder, projection, metadata, sqlFunctionProperties); + generateEvaluateMethod(sqlFunctionProperties, classDefinition, callSiteBinder, cachedInstanceBinder, compiledLambdaMap, projection, blockBuilderField); // constructor Parameter blockBuilder = arg("blockBuilder", BlockBuilder.class); @@ -312,6 +312,7 @@ private static MethodDefinition generateProcessMethod( } private MethodDefinition generateEvaluateMethod( + SqlFunctionProperties sqlFunctionProperties, ClassDefinition classDefinition, CallSiteBinder callSiteBinder, CachedInstanceBinder cachedInstanceBinder, @@ -343,10 +344,12 @@ private MethodDefinition generateEvaluateMethod( scope.declareVariable("wasNull", body, constantFalse()); RowExpressionCompiler compiler = new RowExpressionCompiler( + classDefinition, callSiteBinder, cachedInstanceBinder, fieldReferenceCompiler(callSiteBinder), - metadata.getFunctionManager(), + metadata, + sqlFunctionProperties, compiledLambdaMap); Variable outputBlockVariable = scope.createTempVariable(BlockBuilder.class); @@ -371,7 +374,7 @@ private Supplier compileFilterInternal(SqlFunctionProperties sqlFunc PageFieldsToInputParametersRewriter.Result result = rewritePageFieldsToInputParameters(filter); CallSiteBinder callSiteBinder = new CallSiteBinder(); - ClassDefinition classDefinition = defineFilterClass(result.getRewrittenExpression(), result.getInputChannels(), callSiteBinder, classNameSuffix); + ClassDefinition classDefinition = defineFilterClass(sqlFunctionProperties, result.getRewrittenExpression(), result.getInputChannels(), callSiteBinder, classNameSuffix); Class functionClass; try { @@ -396,7 +399,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(SqlFunctionProperties sqlFunctionProperties, RowExpression filter, InputChannels inputChannels, CallSiteBinder callSiteBinder, Optional classNameSuffix) { ClassDefinition classDefinition = new ClassDefinition( a(PUBLIC, FINAL), @@ -406,8 +409,8 @@ private ClassDefinition defineFilterClass(RowExpression filter, InputChannels in CachedInstanceBinder cachedInstanceBinder = new CachedInstanceBinder(classDefinition, callSiteBinder); - Map compiledLambdaMap = generateMethodsForLambda(classDefinition, callSiteBinder, cachedInstanceBinder, filter, metadata.getFunctionManager()); - generateFilterMethod(classDefinition, callSiteBinder, cachedInstanceBinder, compiledLambdaMap, filter); + Map compiledLambdaMap = generateMethodsForLambda(classDefinition, callSiteBinder, cachedInstanceBinder, filter, metadata, sqlFunctionProperties); + generateFilterMethod(sqlFunctionProperties, classDefinition, callSiteBinder, cachedInstanceBinder, compiledLambdaMap, filter); FieldDefinition selectedPositions = classDefinition.declareField(a(PRIVATE), "selectedPositions", boolean[].class); generatePageFilterMethod(classDefinition, selectedPositions); @@ -488,6 +491,7 @@ private static MethodDefinition generatePageFilterMethod(ClassDefinition classDe } private MethodDefinition generateFilterMethod( + SqlFunctionProperties sqlFunctionProperties, ClassDefinition classDefinition, CallSiteBinder callSiteBinder, CachedInstanceBinder cachedInstanceBinder, @@ -517,10 +521,12 @@ private MethodDefinition generateFilterMethod( Variable wasNullVariable = scope.declareVariable("wasNull", body, constantFalse()); RowExpressionCompiler compiler = new RowExpressionCompiler( + classDefinition, callSiteBinder, cachedInstanceBinder, fieldReferenceCompiler(callSiteBinder), - metadata.getFunctionManager(), + metadata, + sqlFunctionProperties, compiledLambdaMap); Variable result = scope.declareVariable(boolean.class, "result"); 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/RowExpressionCompiler.java index 3350eddcfcf86..8eef9b77c8f12 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/RowExpressionCompiler.java @@ -15,9 +15,14 @@ import com.facebook.presto.bytecode.BytecodeBlock; import com.facebook.presto.bytecode.BytecodeNode; +import com.facebook.presto.bytecode.ClassDefinition; import com.facebook.presto.bytecode.Scope; import com.facebook.presto.bytecode.Variable; import com.facebook.presto.metadata.FunctionManager; +import com.facebook.presto.metadata.Metadata; +import com.facebook.presto.spi.function.FunctionMetadata; +import com.facebook.presto.spi.function.SqlFunctionProperties; +import com.facebook.presto.spi.function.SqlInvokedScalarFunctionImplementation; import com.facebook.presto.spi.relation.CallExpression; import com.facebook.presto.spi.relation.ConstantExpression; import com.facebook.presto.spi.relation.InputReferenceExpression; @@ -29,6 +34,7 @@ import com.facebook.presto.sql.gen.LambdaBytecodeGenerator.CompiledLambda; import com.google.common.base.VerifyException; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import java.util.Map; import java.util.Optional; @@ -43,28 +49,37 @@ import static com.facebook.presto.sql.gen.BytecodeUtils.generateWrite; import static com.facebook.presto.sql.gen.BytecodeUtils.loadConstant; import static com.facebook.presto.sql.gen.LambdaBytecodeGenerator.generateLambda; +import static com.facebook.presto.sql.gen.LambdaBytecodeGenerator.generateMethodsForLambda; +import static com.facebook.presto.sql.relational.SqlFunctionUtils.getSqlFunctionRowExpression; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; +import static java.lang.String.format; public class RowExpressionCompiler { + private final ClassDefinition classDefinition; private final CallSiteBinder callSiteBinder; private final CachedInstanceBinder cachedInstanceBinder; private final RowExpressionVisitor fieldReferenceCompiler; - private final FunctionManager functionManager; + private final Metadata metadata; + private final SqlFunctionProperties sqlFunctionProperties; private final Map compiledLambdaMap; RowExpressionCompiler( + ClassDefinition classDefinition, CallSiteBinder callSiteBinder, CachedInstanceBinder cachedInstanceBinder, RowExpressionVisitor fieldReferenceCompiler, - FunctionManager functionManager, + Metadata metadata, + SqlFunctionProperties sqlFunctionProperties, Map compiledLambdaMap) { + this.classDefinition = classDefinition; this.callSiteBinder = callSiteBinder; this.cachedInstanceBinder = cachedInstanceBinder; this.fieldReferenceCompiler = fieldReferenceCompiler; - this.functionManager = functionManager; + this.metadata = metadata; + this.sqlFunctionProperties = sqlFunctionProperties; this.compiledLambdaMap = compiledLambdaMap; } @@ -86,14 +101,36 @@ private class Visitor @Override public BytecodeNode visitCall(CallExpression call, Context context) { - BytecodeGeneratorContext generatorContext = new BytecodeGeneratorContext( - RowExpressionCompiler.this, - context.getScope(), - callSiteBinder, - cachedInstanceBinder, - functionManager); + FunctionManager functionManager = metadata.getFunctionManager(); + FunctionMetadata functionMetadata = functionManager.getFunctionMetadata(call.getFunctionHandle()); + switch (functionMetadata.getImplementationType()) { + case BUILTIN: + BytecodeGeneratorContext generatorContext = new BytecodeGeneratorContext( + RowExpressionCompiler.this, + context.getScope(), + callSiteBinder, + cachedInstanceBinder, + functionManager); + return (new FunctionCallCodeGenerator()).generateCall(call.getFunctionHandle(), generatorContext, call.getType(), call.getArguments(), context.getOutputBlockVariable()); + case SQL: + SqlInvokedScalarFunctionImplementation functionImplementation = (SqlInvokedScalarFunctionImplementation) functionManager.getScalarFunctionImplementation(call.getFunctionHandle()); + RowExpression function = getSqlFunctionRowExpression(functionMetadata, functionImplementation, metadata, sqlFunctionProperties, call.getArguments()); + + // Pre-compile lambda bytecode + ImmutableMap.Builder newCompiledLambdaMap = ImmutableMap.builder(); + newCompiledLambdaMap.putAll(compiledLambdaMap); + newCompiledLambdaMap.putAll(generateMethodsForLambda(classDefinition, callSiteBinder, cachedInstanceBinder, function, metadata, sqlFunctionProperties, "sql")); + + // generate bytecode for SQL function + return new RowExpressionCompiler(classDefinition, callSiteBinder, cachedInstanceBinder, fieldReferenceCompiler, metadata, sqlFunctionProperties, newCompiledLambdaMap.build()).compile( + function, + context.getScope(), + context.getOutputBlockVariable(), + context.getLambdaInterface()); - return (new FunctionCallCodeGenerator()).generateCall(call.getFunctionHandle(), generatorContext, call.getType(), call.getArguments(), context.getOutputBlockVariable()); + default: + throw new IllegalArgumentException(format("Unsupported function implementation type: %s", functionMetadata.getImplementationType())); + } } @Override @@ -185,7 +222,7 @@ public BytecodeNode visitLambda(LambdaDefinitionExpression lambda, Context conte context.getScope(), callSiteBinder, cachedInstanceBinder, - functionManager); + metadata.getFunctionManager()); return generateLambda( generatorContext, @@ -237,7 +274,7 @@ public BytecodeNode visitSpecialForm(SpecialFormExpression specialForm, Context break; // functions that require varargs and/or complex types (e.g., lists) case IN: - generator = new InCodeGenerator(functionManager); + generator = new InCodeGenerator(metadata.getFunctionManager()); break; // optimized implementations (shortcircuiting behavior) case AND: @@ -263,7 +300,7 @@ public BytecodeNode visitSpecialForm(SpecialFormExpression specialForm, Context context.getScope(), callSiteBinder, cachedInstanceBinder, - functionManager); + metadata.getFunctionManager()); return generator.generateExpression(generatorContext, specialForm.getType(), specialForm.getArguments(), context.getOutputBlockVariable()); } diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/RowExpressionPredicateCompiler.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/RowExpressionPredicateCompiler.java index 9334fefa28d2d..6fa3be0440009 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/RowExpressionPredicateCompiler.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/RowExpressionPredicateCompiler.java @@ -20,7 +20,6 @@ import com.facebook.presto.bytecode.Parameter; import com.facebook.presto.bytecode.Scope; import com.facebook.presto.bytecode.Variable; -import com.facebook.presto.metadata.FunctionManager; import com.facebook.presto.metadata.Metadata; import com.facebook.presto.operator.project.PageFieldsToInputParametersRewriter; import com.facebook.presto.spi.ConnectorSession; @@ -69,19 +68,19 @@ public class RowExpressionPredicateCompiler implements PredicateCompiler { - private final FunctionManager functionManager; + private final Metadata metadata; private final LoadingCache> predicateCache; @Inject public RowExpressionPredicateCompiler(Metadata metadata) { - this(requireNonNull(metadata, "metadata is null").getFunctionManager(), 10_000); + this(requireNonNull(metadata, "metadata is null"), 10_000); } - public RowExpressionPredicateCompiler(FunctionManager functionManager, int predicateCacheSize) + public RowExpressionPredicateCompiler(Metadata metadata, int predicateCacheSize) { - this.functionManager = requireNonNull(functionManager, "functionManager is null"); + this.metadata = requireNonNull(metadata, "metadata is null"); if (predicateCacheSize > 0) { predicateCache = CacheBuilder.newBuilder() @@ -113,7 +112,7 @@ private Supplier compilePredicateInternal(SqlFunctionProperties sqlFu .toArray(); CallSiteBinder callSiteBinder = new CallSiteBinder(); - ClassDefinition classDefinition = definePredicateClass(result.getRewrittenExpression(), inputChannels, callSiteBinder); + ClassDefinition classDefinition = definePredicateClass(sqlFunctionProperties, result.getRewrittenExpression(), inputChannels, callSiteBinder); Class predicateClass; try { @@ -133,7 +132,7 @@ private Supplier compilePredicateInternal(SqlFunctionProperties sqlFu }; } - private ClassDefinition definePredicateClass(RowExpression predicate, int[] inputChannels, CallSiteBinder callSiteBinder) + private ClassDefinition definePredicateClass(SqlFunctionProperties sqlFunctionProperties, RowExpression predicate, int[] inputChannels, CallSiteBinder callSiteBinder) { ClassDefinition classDefinition = new ClassDefinition( a(PUBLIC, FINAL), @@ -143,7 +142,7 @@ private ClassDefinition definePredicateClass(RowExpression predicate, int[] inpu CachedInstanceBinder cachedInstanceBinder = new CachedInstanceBinder(classDefinition, callSiteBinder); - generatePredicateMethod(classDefinition, callSiteBinder, cachedInstanceBinder, predicate); + generatePredicateMethod(sqlFunctionProperties, classDefinition, callSiteBinder, cachedInstanceBinder, predicate); // getInputChannels classDefinition.declareMethod(a(PUBLIC), "getInputChannels", type(int[].class)) @@ -158,12 +157,13 @@ private ClassDefinition definePredicateClass(RowExpression predicate, int[] inpu } private MethodDefinition generatePredicateMethod( + SqlFunctionProperties sqlFunctionProperties, ClassDefinition classDefinition, CallSiteBinder callSiteBinder, CachedInstanceBinder cachedInstanceBinder, RowExpression predicate) { - Map compiledLambdaMap = generateMethodsForLambda(classDefinition, callSiteBinder, cachedInstanceBinder, predicate, functionManager); + Map compiledLambdaMap = generateMethodsForLambda(classDefinition, callSiteBinder, cachedInstanceBinder, predicate, metadata, sqlFunctionProperties); Parameter session = arg("session", ConnectorSession.class); Parameter page = arg("page", Page.class); @@ -188,10 +188,12 @@ private MethodDefinition generatePredicateMethod( Variable wasNullVariable = scope.declareVariable("wasNull", body, constantFalse()); RowExpressionCompiler compiler = new RowExpressionCompiler( + classDefinition, callSiteBinder, cachedInstanceBinder, fieldReferenceCompiler(callSiteBinder), - functionManager, + metadata, + sqlFunctionProperties, compiledLambdaMap); Variable result = scope.declareVariable(boolean.class, "result"); 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 dce2f9c59e1ef..b91fae9403a3e 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 @@ -28,6 +28,7 @@ import com.facebook.presto.spi.function.FunctionHandle; import com.facebook.presto.spi.function.FunctionMetadata; import com.facebook.presto.spi.function.OperatorType; +import com.facebook.presto.spi.function.SqlInvokedScalarFunctionImplementation; import com.facebook.presto.spi.type.ArrayType; import com.facebook.presto.spi.type.FunctionType; import com.facebook.presto.spi.type.RowType; @@ -41,6 +42,7 @@ import com.facebook.presto.sql.analyzer.Scope; import com.facebook.presto.sql.analyzer.SemanticErrorCode; import com.facebook.presto.sql.analyzer.SemanticException; +import com.facebook.presto.sql.parser.SqlParser; import com.facebook.presto.sql.planner.Interpreters.LambdaVariableResolver; import com.facebook.presto.sql.planner.iterative.rule.DesugarCurrentUser; import com.facebook.presto.sql.tree.ArithmeticBinaryExpression; @@ -119,6 +121,7 @@ import static com.facebook.presto.spi.type.VarcharType.createVarcharType; import static com.facebook.presto.sql.analyzer.ConstantExpressionVerifier.verifyExpressionIsConstant; import static com.facebook.presto.sql.analyzer.ExpressionAnalyzer.createConstantAnalyzer; +import static com.facebook.presto.sql.analyzer.ExpressionAnalyzer.getExpressionTypes; import static com.facebook.presto.sql.analyzer.TypeSignatureProvider.fromTypes; import static com.facebook.presto.sql.gen.VarArgsToMapAdapterGenerator.generateVarArgsToMapAdapter; import static com.facebook.presto.sql.planner.ExpressionDeterminismEvaluator.isDeterministic; @@ -128,6 +131,7 @@ import static com.facebook.presto.sql.planner.LiteralEncoder.isSupportedLiteralType; import static com.facebook.presto.sql.planner.iterative.rule.CanonicalizeExpressionRewriter.canonicalizeExpression; import static com.facebook.presto.sql.relational.Expressions.variable; +import static com.facebook.presto.sql.relational.SqlFunctionUtils.getSqlFunctionExpression; import static com.facebook.presto.type.LikeFunctions.isLikePattern; import static com.facebook.presto.type.LikeFunctions.unescapeLiteralLikePattern; import static com.facebook.presto.util.LegacyRowFieldOrdinalAccessUtil.parseAnonymousRowFieldOrdinalAccess; @@ -140,6 +144,7 @@ import static com.google.common.collect.Iterables.getOnlyElement; import static java.lang.Math.toIntExact; import static java.lang.String.format; +import static java.util.Collections.emptyList; import static java.util.Objects.requireNonNull; @Deprecated @@ -907,7 +912,27 @@ protected Object visitFunctionCall(FunctionCall node, Object context) if (optimize && (!functionMetadata.isDeterministic() || hasUnresolvedValue(argumentValues) || node.getName().equals(QualifiedName.of("fail")))) { return new FunctionCall(node.getName(), node.getWindow(), node.isDistinct(), toExpressions(argumentValues, argumentTypes)); } - Object result = functionInvoker.invoke(functionHandle, connectorSession, argumentValues); + + Object result; + + switch (functionMetadata.getImplementationType()) { + case BUILTIN: + result = functionInvoker.invoke(functionHandle, connectorSession, argumentValues); + break; + case SQL: + Expression function = getSqlFunctionExpression(functionMetadata, (SqlInvokedScalarFunctionImplementation) metadata.getFunctionManager().getScalarFunctionImplementation(functionHandle), session.getSqlFunctionProperties(), node.getArguments()); + ExpressionInterpreter functionInterpreter = new ExpressionInterpreter( + function, + metadata, + session, + getExpressionTypes(session, metadata, new SqlParser(), TypeProvider.empty(), function, emptyList(), WarningCollector.NOOP), + optimize); + result = functionInterpreter.visitor.process(function, context); + break; + default: + throw new IllegalArgumentException(format("Unsupported function implementation type: %s", functionMetadata.getImplementationType())); + } + if (optimize && !isSerializable(result, type(node))) { return new FunctionCall(node.getName(), node.getWindow(), node.isDistinct(), toExpressions(argumentValues, argumentTypes)); } 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 e2045992ab146..a07c14761e2ea 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 @@ -2653,7 +2653,7 @@ private AccumulatorFactory buildAccumulatorFactory( .collect(toImmutableList()); for (int i = 0; i < lambdas.size(); i++) { List lambdaInterfaces = internalAggregationFunction.getLambdaInterfaces(); - Class lambdaProviderClass = compileLambdaProvider(lambdas.get(i), metadata.getFunctionManager(), lambdaInterfaces.get(i)); + Class lambdaProviderClass = compileLambdaProvider(lambdas.get(i), metadata, session.getSqlFunctionProperties(), lambdaInterfaces.get(i)); try { lambdaProviders.add((LambdaProvider) constructorMethodHandle(lambdaProviderClass, ConnectorSession.class).invoke(session.toConnectorSession())); } diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/PlanVariableAllocator.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/PlanVariableAllocator.java index 71a46232f54a5..943e6e1b918b2 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/PlanVariableAllocator.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/PlanVariableAllocator.java @@ -157,7 +157,7 @@ public VariableReferenceExpression toVariableReference(Expression expression) { checkArgument(expression instanceof SymbolReference, "Unexpected expression: %s", expression); String name = ((SymbolReference) expression).getName(); - checkArgument(variables.containsKey(name), "variable map does not contain name"); + checkArgument(variables.containsKey(name), "variable map does not contain name %s", name); return new VariableReferenceExpression(name, variables.get(name)); } diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/RowExpressionInterpreter.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/RowExpressionInterpreter.java index 05c762569a761..bf2c2c3c86dc2 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/RowExpressionInterpreter.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/RowExpressionInterpreter.java @@ -23,6 +23,7 @@ import com.facebook.presto.spi.function.FunctionHandle; import com.facebook.presto.spi.function.FunctionMetadata; import com.facebook.presto.spi.function.OperatorType; +import com.facebook.presto.spi.function.SqlInvokedScalarFunctionImplementation; import com.facebook.presto.spi.relation.CallExpression; import com.facebook.presto.spi.relation.ConstantExpression; import com.facebook.presto.spi.relation.InputReferenceExpression; @@ -95,6 +96,7 @@ import static com.facebook.presto.sql.planner.RowExpressionInterpreter.SpecialCallResult.changed; import static com.facebook.presto.sql.planner.RowExpressionInterpreter.SpecialCallResult.notChanged; import static com.facebook.presto.sql.relational.Expressions.call; +import static com.facebook.presto.sql.relational.SqlFunctionUtils.getSqlFunctionRowExpression; import static com.facebook.presto.type.JsonType.JSON; import static com.facebook.presto.type.LikeFunctions.isLikePattern; import static com.facebook.presto.type.LikeFunctions.unescapeLiteralLikePattern; @@ -106,6 +108,7 @@ import static com.google.common.collect.ImmutableList.toImmutableList; import static com.google.common.collect.Iterables.getOnlyElement; import static io.airlift.slice.Slices.utf8Slice; +import static java.lang.String.format; import static java.lang.invoke.MethodHandles.insertArguments; import static java.util.Arrays.asList; import static java.util.Objects.requireNonNull; @@ -257,7 +260,25 @@ public Object visitCall(CallExpression node, Object context) return call(node.getDisplayName(), functionHandle, node.getType(), toRowExpressions(argumentValues, node.getArguments())); } - Object value = functionInvoker.invoke(functionHandle, session, argumentValues); + Object value; + switch (functionMetadata.getImplementationType()) { + case BUILTIN: + value = functionInvoker.invoke(functionHandle, session, argumentValues); + break; + case SQL: + SqlInvokedScalarFunctionImplementation functionImplementation = (SqlInvokedScalarFunctionImplementation) functionManager.getScalarFunctionImplementation(functionHandle); + RowExpression function = getSqlFunctionRowExpression(functionMetadata, functionImplementation, metadata, session.getSqlFunctionProperties(), node.getArguments()); + RowExpressionInterpreter rowExpressionInterpreter = new RowExpressionInterpreter(function, metadata, session, optimizationLevel); + if (optimizationLevel.ordinal() >= EVALUATED.ordinal()) { + value = rowExpressionInterpreter.evaluate(); + } + else { + value = rowExpressionInterpreter.optimize(); + } + break; + default: + throw new IllegalArgumentException(format("Unsupported function implementation type: %s", functionMetadata.getImplementationType())); + } if (optimizationLevel.ordinal() <= SERIALIZABLE.ordinal() && !isSerializable(value, node.getType())) { return call(node.getDisplayName(), functionHandle, node.getType(), toRowExpressions(argumentValues, node.getArguments())); diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/TypeProvider.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/TypeProvider.java index f3c5d6fc56cd9..d017494db8305 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/TypeProvider.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/TypeProvider.java @@ -72,4 +72,9 @@ public Set allVariables() .map(entry -> new VariableReferenceExpression(entry.getKey(), entry.getValue())) .collect(toImmutableSet()); } + + public Map allTypes() + { + return types; + } } diff --git a/presto-main/src/main/java/com/facebook/presto/sql/relational/SqlFunctionUtils.java b/presto-main/src/main/java/com/facebook/presto/sql/relational/SqlFunctionUtils.java new file mode 100644 index 0000000000000..6d7b0cede59cc --- /dev/null +++ b/presto-main/src/main/java/com/facebook/presto/sql/relational/SqlFunctionUtils.java @@ -0,0 +1,260 @@ +/* + * 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.execution.warnings.WarningCollector; +import com.facebook.presto.expressions.RowExpressionRewriter; +import com.facebook.presto.expressions.RowExpressionTreeRewriter; +import com.facebook.presto.metadata.Metadata; +import com.facebook.presto.spi.function.FunctionMetadata; +import com.facebook.presto.spi.function.SqlFunctionProperties; +import com.facebook.presto.spi.function.SqlInvokedScalarFunctionImplementation; +import com.facebook.presto.spi.relation.RowExpression; +import com.facebook.presto.spi.relation.VariableReferenceExpression; +import com.facebook.presto.spi.type.Type; +import com.facebook.presto.sql.analyzer.ExpressionAnalyzer; +import com.facebook.presto.sql.analyzer.Field; +import com.facebook.presto.sql.analyzer.RelationId; +import com.facebook.presto.sql.analyzer.RelationType; +import com.facebook.presto.sql.analyzer.Scope; +import com.facebook.presto.sql.analyzer.SemanticException; +import com.facebook.presto.sql.parser.ParsingOptions; +import com.facebook.presto.sql.parser.SqlParser; +import com.facebook.presto.sql.planner.PlanVariableAllocator; +import com.facebook.presto.sql.planner.TypeProvider; +import com.facebook.presto.sql.planner.iterative.rule.LambdaCaptureDesugaringRewriter; +import com.facebook.presto.sql.tree.Expression; +import com.facebook.presto.sql.tree.ExpressionRewriter; +import com.facebook.presto.sql.tree.ExpressionTreeRewriter; +import com.facebook.presto.sql.tree.Identifier; +import com.facebook.presto.sql.tree.LambdaArgumentDeclaration; +import com.facebook.presto.sql.tree.LambdaExpression; +import com.facebook.presto.sql.tree.NodeRef; +import com.facebook.presto.sql.tree.SymbolReference; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import static com.facebook.presto.spi.function.FunctionImplementationType.SQL; +import static com.facebook.presto.sql.analyzer.SemanticErrorCode.NOT_SUPPORTED; +import static com.facebook.presto.sql.parser.ParsingOptions.DecimalLiteralTreatment.AS_DECIMAL; +import static com.facebook.presto.sql.parser.ParsingOptions.DecimalLiteralTreatment.AS_DOUBLE; +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 java.lang.String.format; +import static java.util.Collections.emptyList; +import static java.util.Objects.requireNonNull; + +public final class SqlFunctionUtils +{ + private SqlFunctionUtils() {} + + public static Expression getSqlFunctionExpression(FunctionMetadata functionMetadata, SqlInvokedScalarFunctionImplementation implementation, SqlFunctionProperties sqlFunctionProperties, List arguments) + { + checkArgument(functionMetadata.getImplementationType().equals(SQL), format("Expect SQL function, get %s", functionMetadata.getImplementationType())); + ParsingOptions parsingOptions = ParsingOptions.builder() + .setDecimalLiteralTreatment(sqlFunctionProperties.isParseDecimalLiteralAsDouble() ? AS_DOUBLE : AS_DECIMAL) + .build(); + Expression expression = parseSqlFunctionExpression(implementation, sqlFunctionProperties); + return SqlFunctionArgumentBinder.bindFunctionArguments(expression, functionMetadata.getArgumentNames().get(), arguments); + } + + public static RowExpression getSqlFunctionRowExpression(FunctionMetadata functionMetadata, SqlInvokedScalarFunctionImplementation functionImplementation, Metadata metadata, SqlFunctionProperties sqlFunctionProperties, List arguments) + { + Expression expression = parseSqlFunctionExpression(functionImplementation, sqlFunctionProperties); + + // Allocate variables for identifiers + PlanVariableAllocator variableAllocator = new PlanVariableAllocator(); + Map variables = buildIdentifierToVariableMap(functionMetadata, expression, sqlFunctionProperties, metadata, variableAllocator); + + // Rewrite expression with allocated variables + Expression rewritten = rewriteSqlFunctionExpressionWithVariables(expression, variables); + + // Desugar lambda capture + Expression lambdaCaptureDesugaredExpression = LambdaCaptureDesugaringRewriter.rewrite(rewritten, variableAllocator); + + // Translate to row expression + return SqlFunctionArgumentBinder.bindFunctionArguments( + SqlToRowExpressionTranslator.translate( + lambdaCaptureDesugaredExpression, + getSqlFunctionExpressionTypes(metadata, sqlFunctionProperties, lambdaCaptureDesugaredExpression, variableAllocator.getTypes().allTypes()), + ImmutableMap.of(), + metadata.getFunctionManager(), + metadata.getTypeManager(), + Optional.empty(), + Optional.empty(), + sqlFunctionProperties), + functionMetadata.getArgumentNames().get().stream() + .map(Identifier::new) + .map(variables::get) + .map(VariableReferenceExpression::getName) + .collect(toImmutableList()), + arguments); + } + + private static Expression parseSqlFunctionExpression(SqlInvokedScalarFunctionImplementation functionImplementation, SqlFunctionProperties sqlFunctionProperties) + { + ParsingOptions parsingOptions = ParsingOptions.builder() + .setDecimalLiteralTreatment(sqlFunctionProperties.isParseDecimalLiteralAsDouble() ? AS_DOUBLE : AS_DECIMAL) + .build(); + return new SqlParser().createExpression(functionImplementation.getImplementation(), parsingOptions); + } + + private static Map, Type> getSqlFunctionExpressionTypes( + Metadata metadata, + SqlFunctionProperties sqlFunctionProperties, + Expression expression, + Map argumentTypes) + { + ExpressionAnalyzer analyzer = ExpressionAnalyzer.createWithoutSubqueries( + metadata.getFunctionManager(), + metadata.getTypeManager(), + Optional.empty(), + sqlFunctionProperties, + TypeProvider.copyOf(argumentTypes), + emptyList(), + node -> new SemanticException(NOT_SUPPORTED, node, "SQL function does not support subquery"), + WarningCollector.NOOP, + false); + + analyzer.analyze( + expression, + Scope.builder() + .withRelationType( + RelationId.anonymous(), + new RelationType(argumentTypes.entrySet().stream() + .map(entry -> Field.newUnqualified(entry.getKey(), entry.getValue())) + .collect(toImmutableList()))).build()); + return analyzer.getExpressionTypes(); + } + + private static Map getFunctionArgumentTypes(FunctionMetadata functionMetadata, Metadata metadata) + { + List argumentNames = functionMetadata.getArgumentNames().get(); + List argumentTypes = functionMetadata.getArgumentTypes().stream().map(metadata::getType).collect(toImmutableList()); + checkState(argumentNames.size() == argumentTypes.size(), format("Expect argumentNames (size %d) and argumentTypes (size %d) to be of the same size", argumentNames.size(), argumentTypes.size())); + ImmutableMap.Builder typeBuilder = ImmutableMap.builder(); + for (int i = 0; i < argumentNames.size(); i++) { + typeBuilder.put(argumentNames.get(i), argumentTypes.get(i)); + } + return typeBuilder.build(); + } + + private static Map buildIdentifierToVariableMap(FunctionMetadata functionMetadata, Expression sqlFunction, SqlFunctionProperties sqlFunctionProperties, Metadata metadata, PlanVariableAllocator variableAllocator) + { + // Allocate variables for identifiers + Map argumentTypes = getFunctionArgumentTypes(functionMetadata, metadata); + Map, Type> expressionTypes = getSqlFunctionExpressionTypes(metadata, sqlFunctionProperties, sqlFunction, argumentTypes); + Map variables = new LinkedHashMap<>(); + for (Map.Entry, Type> entry : expressionTypes.entrySet()) { + Expression node = entry.getKey().getNode(); + if (node instanceof LambdaArgumentDeclaration) { + LambdaArgumentDeclaration lambdaArgumentDeclaration = (LambdaArgumentDeclaration) node; + if (!variables.containsKey(lambdaArgumentDeclaration.getName())) { + variables.put(lambdaArgumentDeclaration.getName(), variableAllocator.newVariable(lambdaArgumentDeclaration.getName(), entry.getValue())); + } + } + else if (node instanceof Identifier && argumentTypes.containsKey(((Identifier) node).getValue())) { + // input + if (!variables.containsKey(node)) { + variables.put((Identifier) node, variableAllocator.newVariable(node, entry.getValue())); + } + } + } + return variables; + } + + private static Expression rewriteSqlFunctionExpressionWithVariables(Expression sqlFunction, Map variableMap) + { + return ExpressionTreeRewriter.rewriteWith(new ExpressionRewriter>() + { + @Override + public Expression rewriteLambdaExpression(LambdaExpression node, Map context, ExpressionTreeRewriter> treeRewriter) + { + ImmutableList.Builder newArguments = ImmutableList.builder(); + for (LambdaArgumentDeclaration argument : node.getArguments()) { + VariableReferenceExpression variable = context.get(argument.getName()); + newArguments.add(new LambdaArgumentDeclaration(new Identifier(variable.getName()))); + } + return new LambdaExpression(newArguments.build(), treeRewriter.rewrite(node.getBody(), context)); + } + + @Override + public Expression rewriteIdentifier(Identifier node, Map context, ExpressionTreeRewriter> treeRewriter) + { + return new SymbolReference(context.get(node).getName()); + } + }, sqlFunction, variableMap); + } + + private static final class SqlFunctionArgumentBinder + { + private SqlFunctionArgumentBinder() {} + + public static Expression bindFunctionArguments(Expression function, List argumentNames, List argumentValues) + { + checkArgument(argumentNames.size() == argumentValues.size(), format("Expect same size for argumentNames (%d) and argumentValues (%d)", argumentNames.size(), argumentValues.size())); + ImmutableMap.Builder argumentBindings = ImmutableMap.builder(); + for (int i = 0; i < argumentNames.size(); i++) { + argumentBindings.put(argumentNames.get(i), argumentValues.get(i)); + } + return ExpressionTreeRewriter.rewriteWith(new ExpressionFunctionVisitor(argumentBindings.build()), function); + } + + public static RowExpression bindFunctionArguments(RowExpression function, List argumentNames, List argumentValues) + { + checkArgument(argumentNames.size() == argumentValues.size(), format("Expect same size for argumentNames (%d) and argumentValues (%d)", argumentNames.size(), argumentValues.size())); + ImmutableMap.Builder argumentBindings = ImmutableMap.builder(); + for (int i = 0; i < argumentNames.size(); i++) { + argumentBindings.put(argumentNames.get(i), argumentValues.get(i)); + } + return RowExpressionTreeRewriter.rewriteWith(new RowExpressionRewriter>() + { + @Override + public RowExpression rewriteVariableReference(VariableReferenceExpression variable, Map context, RowExpressionTreeRewriter> treeRewriter) + { + if (context.containsKey(variable.getName())) { + return context.get(variable.getName()); + } + return variable; + } + }, function, argumentBindings.build()); + } + + private static class ExpressionFunctionVisitor + extends ExpressionRewriter + { + private final Map argumentBindings; + + public ExpressionFunctionVisitor(Map argumentBindings) + { + this.argumentBindings = requireNonNull(argumentBindings, "argumentBindings is null"); + } + + @Override + public Expression rewriteIdentifier(Identifier node, Void context, ExpressionTreeRewriter treeRewriter) + { + if (argumentBindings.containsKey(node.getValue())) { + return argumentBindings.get(node.getValue()); + } + return node; + } + } + } +} diff --git a/presto-main/src/test/java/com/facebook/presto/sql/gen/TestRowExpressionPredicateCompiler.java b/presto-main/src/test/java/com/facebook/presto/sql/gen/TestRowExpressionPredicateCompiler.java index 39da2ea897553..9b3bb83be6420 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/gen/TestRowExpressionPredicateCompiler.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/gen/TestRowExpressionPredicateCompiler.java @@ -13,7 +13,7 @@ */ package com.facebook.presto.sql.gen; -import com.facebook.presto.metadata.FunctionManager; +import com.facebook.presto.metadata.Metadata; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; @@ -45,8 +45,8 @@ public class TestRowExpressionPredicateCompiler { - private FunctionManager functionManager = createTestMetadataManager().getFunctionManager(); - private FunctionResolution functionResolution = new FunctionResolution(functionManager); + private Metadata metadata = createTestMetadataManager(); + private FunctionResolution functionResolution = new FunctionResolution(metadata.getFunctionManager()); @Test public void test() @@ -65,7 +65,7 @@ public void test() call("b - a", functionResolution.arithmeticFunction(SUBTRACT, BIGINT, BIGINT), BIGINT, b, a), constant(0L, BIGINT)); - PredicateCompiler compiler = new RowExpressionPredicateCompiler(functionManager, 10_000); + PredicateCompiler compiler = new RowExpressionPredicateCompiler(metadata, 10_000); Predicate compiledSum = compiler.compilePredicate(SESSION.getSqlFunctionProperties(), sum).get(); assertEquals(Arrays.asList(1, 0), Ints.asList(compiledSum.getInputChannels())); @@ -107,10 +107,10 @@ public void testCache() call("a * 2", functionResolution.arithmeticFunction(MULTIPLY, BIGINT, BIGINT), BIGINT, new InputReferenceExpression(1, BIGINT), constant(2L, BIGINT)), constant(10L, BIGINT)); - PredicateCompiler compiler = new RowExpressionPredicateCompiler(functionManager, 10_000); + PredicateCompiler compiler = new RowExpressionPredicateCompiler(metadata, 10_000); assertSame(compiler.compilePredicate(SESSION.getSqlFunctionProperties(), predicate), compiler.compilePredicate(SESSION.getSqlFunctionProperties(), predicate)); - PredicateCompiler noCacheCompiler = new RowExpressionPredicateCompiler(functionManager, 0); + PredicateCompiler noCacheCompiler = new RowExpressionPredicateCompiler(metadata, 0); assertNotSame(noCacheCompiler.compilePredicate(SESSION.getSqlFunctionProperties(), predicate), noCacheCompiler.compilePredicate(SESSION.getSqlFunctionProperties(), predicate)); } diff --git a/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/SqlInvokedRegularSqlFunctionImplementation.java b/presto-spi/src/main/java/com/facebook/presto/spi/function/SqlInvokedScalarFunctionImplementation.java similarity index 78% rename from presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/SqlInvokedRegularSqlFunctionImplementation.java rename to presto-spi/src/main/java/com/facebook/presto/spi/function/SqlInvokedScalarFunctionImplementation.java index ac6c652c522f6..03788a427cf11 100644 --- a/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/SqlInvokedRegularSqlFunctionImplementation.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/function/SqlInvokedScalarFunctionImplementation.java @@ -11,18 +11,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.facebook.presto.sqlfunction; +package com.facebook.presto.spi.function; -import com.facebook.presto.spi.function.ScalarFunctionImplementation; +import com.facebook.presto.spi.api.Experimental; import static java.util.Objects.requireNonNull; -public class SqlInvokedRegularSqlFunctionImplementation +@Experimental +public class SqlInvokedScalarFunctionImplementation implements ScalarFunctionImplementation { private final String implementation; - public SqlInvokedRegularSqlFunctionImplementation(String implementation) + public SqlInvokedScalarFunctionImplementation(String implementation) { this.implementation = requireNonNull(implementation, "implementation is null"); } diff --git a/presto-sql-function/pom.xml b/presto-sql-function/pom.xml index 91317878b1030..cb61e405a4bd5 100644 --- a/presto-sql-function/pom.xml +++ b/presto-sql-function/pom.xml @@ -20,11 +20,13 @@ com.facebook.presto presto-spi + provided com.fasterxml.jackson.core jackson-annotations + provided diff --git a/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/AbstractSqlInvokedFunctionNamespaceManager.java b/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/AbstractSqlInvokedFunctionNamespaceManager.java index 4729f73186088..2c0bc844109bc 100644 --- a/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/AbstractSqlInvokedFunctionNamespaceManager.java +++ b/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/AbstractSqlInvokedFunctionNamespaceManager.java @@ -19,6 +19,7 @@ import com.facebook.presto.spi.function.FunctionNamespaceTransactionHandle; import com.facebook.presto.spi.function.ScalarFunctionImplementation; import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.function.SqlInvokedScalarFunctionImplementation; import com.facebook.presto.spi.relation.FullyQualifiedName; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; @@ -157,7 +158,7 @@ protected static FunctionMetadata sqlInvokedFunctionToMetadata(SqlInvokedRegular protected static ScalarFunctionImplementation sqlInvokedFunctionToImplementation(SqlInvokedRegularFunction function) { checkArgument(function.getFunctionImplementationType().equals(SQL)); - return new SqlInvokedRegularSqlFunctionImplementation(function.getBody()); + return new SqlInvokedScalarFunctionImplementation(function.getBody()); } private Collection fetchFunctions(FullyQualifiedName functionName)