From c229714f890b9e8159bcf91f112980f83cea2c00 Mon Sep 17 00:00:00 2001 From: Tim Meehan Date: Fri, 22 Nov 2024 16:23:23 -0500 Subject: [PATCH] Use ExpressionOptimizerProvider The runtime should consolidate to the `ExpressionOptimizerProvider` factory so that it can be customized without significant refactoring. --- .../presto/plugin/jdbc/JdbcConnector.java | 2 +- .../optimization/JdbcComputePushdown.java | 10 ++--- .../JdbcPlanOptimizerProvider.java | 10 ++--- .../optimization/TestJdbcComputePushdown.java | 2 +- .../clickhouse/ClickHouseConnector.java | 3 +- .../ClickHouseComputePushdown.java | 10 ++--- .../ClickHousePlanOptimizerProvider.java | 13 +++---- .../facebook/presto/hive/MetadataUtils.java | 2 +- .../rule/BaseSubfieldExtractionRewriter.java | 6 +-- .../presto/hive/FilteringPageSource.java | 2 +- .../facebook/presto/hive/HiveMetadata.java | 2 +- .../presto/hive/HivePageSourceProvider.java | 2 +- .../orc/OrcSelectivePageSourceFactory.java | 2 +- .../presto/hive/AbstractTestHiveClient.java | 2 +- .../facebook/presto/hive/HiveTestUtils.java | 4 +- .../optimizer/IcebergMetadataOptimizer.java | 2 +- .../optimizer/IcebergPlanOptimizer.java | 4 +- .../presto/connector/ConnectorManager.java | 7 +++- .../presto/cost/ScalarStatsCalculator.java | 14 +++++-- .../ExpressionOptimizerManager.java | 3 ++ .../presto/sql/planner/PlanOptimizers.java | 4 +- .../optimizations/PredicatePushDown.java | 38 ++++++++++++------ .../optimizations/PushdownSubfields.java | 13 ++++--- .../ConnectorRowExpressionService.java | 11 +++--- .../presto/testing/LocalQueryRunner.java | 3 +- .../testing/TestingConnectorContext.java | 6 ++- ...AbstractTestComparisonStatsCalculator.java | 3 +- .../AbstractTestFilterStatsCalculator.java | 3 +- ...ConnectorFilterStatsCalculatorService.java | 8 +++- .../presto/cost/TestJoinStatsRule.java | 6 ++- .../cost/TestScalarStatsCalculator.java | 6 ++- .../InMemoryExpressionOptimizerProvider.java | 39 +++++++++++++++++++ .../sql/planner/TestPredicatePushdown.java | 7 ++-- .../optimizations/TestReorderWindows.java | 3 +- .../rule/ParquetDereferencePushDown.java | 2 +- .../relation/ExpressionOptimizerProvider.java | 21 ++++++++++ .../spi/relation/RowExpressionService.java | 3 +- 37 files changed, 194 insertions(+), 84 deletions(-) create mode 100644 presto-main/src/test/java/com/facebook/presto/sql/InMemoryExpressionOptimizerProvider.java create mode 100644 presto-spi/src/main/java/com/facebook/presto/spi/relation/ExpressionOptimizerProvider.java diff --git a/presto-base-jdbc/src/main/java/com/facebook/presto/plugin/jdbc/JdbcConnector.java b/presto-base-jdbc/src/main/java/com/facebook/presto/plugin/jdbc/JdbcConnector.java index 3eb3ef0112375..511899a2e03f9 100644 --- a/presto-base-jdbc/src/main/java/com/facebook/presto/plugin/jdbc/JdbcConnector.java +++ b/presto-base-jdbc/src/main/java/com/facebook/presto/plugin/jdbc/JdbcConnector.java @@ -109,7 +109,7 @@ public ConnectorPlanOptimizerProvider getConnectorPlanOptimizerProvider() functionManager, functionResolution, rowExpressionService.getDeterminismEvaluator(), - rowExpressionService.getExpressionOptimizer()); + rowExpressionService); } @Override diff --git a/presto-base-jdbc/src/main/java/com/facebook/presto/plugin/jdbc/optimization/JdbcComputePushdown.java b/presto-base-jdbc/src/main/java/com/facebook/presto/plugin/jdbc/optimization/JdbcComputePushdown.java index 7c3e8b0607d01..317bf8da07a8f 100644 --- a/presto-base-jdbc/src/main/java/com/facebook/presto/plugin/jdbc/optimization/JdbcComputePushdown.java +++ b/presto-base-jdbc/src/main/java/com/facebook/presto/plugin/jdbc/optimization/JdbcComputePushdown.java @@ -29,7 +29,7 @@ import com.facebook.presto.spi.plan.PlanNodeIdAllocator; import com.facebook.presto.spi.plan.TableScanNode; import com.facebook.presto.spi.relation.DeterminismEvaluator; -import com.facebook.presto.spi.relation.ExpressionOptimizer; +import com.facebook.presto.spi.relation.ExpressionOptimizerProvider; import com.facebook.presto.spi.relation.RowExpression; import java.util.Optional; @@ -44,7 +44,7 @@ public class JdbcComputePushdown implements ConnectorPlanOptimizer { - private final ExpressionOptimizer expressionOptimizer; + private final ExpressionOptimizerProvider expressionOptimizerProvider; private final JdbcFilterToSqlTranslator jdbcFilterToSqlTranslator; private final LogicalRowExpressions logicalRowExpressions; @@ -52,7 +52,7 @@ public JdbcComputePushdown( FunctionMetadataManager functionMetadataManager, StandardFunctionResolution functionResolution, DeterminismEvaluator determinismEvaluator, - ExpressionOptimizer expressionOptimizer, + ExpressionOptimizerProvider expressionOptimizerProvider, String identifierQuote, Set> functionTranslators) { @@ -62,7 +62,7 @@ public JdbcComputePushdown( requireNonNull(determinismEvaluator, "determinismEvaluator is null"); requireNonNull(functionResolution, "functionResolution is null"); - this.expressionOptimizer = requireNonNull(expressionOptimizer, "expressionOptimizer is null"); + this.expressionOptimizerProvider = requireNonNull(expressionOptimizerProvider, "expressionOptimizerProvider is null"); this.jdbcFilterToSqlTranslator = new JdbcFilterToSqlTranslator( functionMetadataManager, buildFunctionTranslator(functionTranslators), @@ -106,7 +106,7 @@ public PlanNode visitFilter(FilterNode node, RewriteContext context) TableHandle oldTableHandle = oldTableScanNode.getTable(); JdbcTableHandle oldConnectorTable = (JdbcTableHandle) oldTableHandle.getConnectorHandle(); - RowExpression predicate = expressionOptimizer.optimize(node.getPredicate(), OPTIMIZED, session); + RowExpression predicate = expressionOptimizerProvider.getExpressionOptimizer(session).optimize(node.getPredicate(), OPTIMIZED, session); predicate = logicalRowExpressions.convertToConjunctiveNormalForm(predicate); TranslatedExpression jdbcExpression = translateWith( predicate, diff --git a/presto-base-jdbc/src/main/java/com/facebook/presto/plugin/jdbc/optimization/JdbcPlanOptimizerProvider.java b/presto-base-jdbc/src/main/java/com/facebook/presto/plugin/jdbc/optimization/JdbcPlanOptimizerProvider.java index 9dcd399b66472..5edbfd21eb7f5 100644 --- a/presto-base-jdbc/src/main/java/com/facebook/presto/plugin/jdbc/optimization/JdbcPlanOptimizerProvider.java +++ b/presto-base-jdbc/src/main/java/com/facebook/presto/plugin/jdbc/optimization/JdbcPlanOptimizerProvider.java @@ -20,7 +20,7 @@ import com.facebook.presto.spi.function.FunctionMetadataManager; import com.facebook.presto.spi.function.StandardFunctionResolution; import com.facebook.presto.spi.relation.DeterminismEvaluator; -import com.facebook.presto.spi.relation.ExpressionOptimizer; +import com.facebook.presto.spi.relation.ExpressionOptimizerProvider; import com.google.common.collect.ImmutableSet; import com.google.inject.Inject; @@ -34,7 +34,7 @@ public class JdbcPlanOptimizerProvider private final FunctionMetadataManager functionManager; private final StandardFunctionResolution functionResolution; private final DeterminismEvaluator determinismEvaluator; - private final ExpressionOptimizer expressionOptimizer; + private final ExpressionOptimizerProvider expressionOptimizerProvider; private final String identifierQuote; @Inject @@ -43,12 +43,12 @@ public JdbcPlanOptimizerProvider( FunctionMetadataManager functionManager, StandardFunctionResolution functionResolution, DeterminismEvaluator determinismEvaluator, - ExpressionOptimizer expressionOptimizer) + ExpressionOptimizerProvider expressionOptimizerProvider) { this.functionManager = requireNonNull(functionManager, "functionManager is null"); this.functionResolution = requireNonNull(functionResolution, "functionResolution is null"); this.determinismEvaluator = requireNonNull(determinismEvaluator, "determinismEvaluator is null"); - this.expressionOptimizer = requireNonNull(expressionOptimizer, "expressionOptimizer is null"); + this.expressionOptimizerProvider = requireNonNull(expressionOptimizerProvider, "expressionOptimizerProvider is null"); this.identifierQuote = jdbcClient.getIdentifierQuote(); } @@ -65,7 +65,7 @@ public Set getPhysicalPlanOptimizers() functionManager, functionResolution, determinismEvaluator, - expressionOptimizer, + expressionOptimizerProvider, identifierQuote, getFunctionTranslators())); } diff --git a/presto-base-jdbc/src/test/java/com/facebook/presto/plugin/jdbc/optimization/TestJdbcComputePushdown.java b/presto-base-jdbc/src/test/java/com/facebook/presto/plugin/jdbc/optimization/TestJdbcComputePushdown.java index 726f89f6631ba..34669ff0f1fa2 100644 --- a/presto-base-jdbc/src/test/java/com/facebook/presto/plugin/jdbc/optimization/TestJdbcComputePushdown.java +++ b/presto-base-jdbc/src/test/java/com/facebook/presto/plugin/jdbc/optimization/TestJdbcComputePushdown.java @@ -105,7 +105,7 @@ public TestJdbcComputePushdown() functionAndTypeManager, functionResolution, determinismEvaluator, - new RowExpressionOptimizer(METADATA), + (ConnectorSession session) -> new RowExpressionOptimizer(METADATA), "'", getFunctionTranslators()); } diff --git a/presto-clickhouse/src/main/java/com/facebook/presto/plugin/clickhouse/ClickHouseConnector.java b/presto-clickhouse/src/main/java/com/facebook/presto/plugin/clickhouse/ClickHouseConnector.java index 421b95d1cb65c..a3ced140b87da 100755 --- a/presto-clickhouse/src/main/java/com/facebook/presto/plugin/clickhouse/ClickHouseConnector.java +++ b/presto-clickhouse/src/main/java/com/facebook/presto/plugin/clickhouse/ClickHouseConnector.java @@ -113,8 +113,7 @@ public ConnectorPlanOptimizerProvider getConnectorPlanOptimizerProvider() clickHouseClient, functionManager, functionResolution, - rowExpressionService.getDeterminismEvaluator(), - rowExpressionService.getExpressionOptimizer(), + rowExpressionService, clickhouseQueryGenerator); } diff --git a/presto-clickhouse/src/main/java/com/facebook/presto/plugin/clickhouse/optimization/ClickHouseComputePushdown.java b/presto-clickhouse/src/main/java/com/facebook/presto/plugin/clickhouse/optimization/ClickHouseComputePushdown.java index d6d18093cdb89..39bd93d8de15b 100755 --- a/presto-clickhouse/src/main/java/com/facebook/presto/plugin/clickhouse/optimization/ClickHouseComputePushdown.java +++ b/presto-clickhouse/src/main/java/com/facebook/presto/plugin/clickhouse/optimization/ClickHouseComputePushdown.java @@ -35,8 +35,8 @@ import com.facebook.presto.spi.plan.PlanVisitor; import com.facebook.presto.spi.plan.TableScanNode; import com.facebook.presto.spi.relation.DeterminismEvaluator; -import com.facebook.presto.spi.relation.ExpressionOptimizer; import com.facebook.presto.spi.relation.RowExpression; +import com.facebook.presto.spi.relation.RowExpressionService; import com.facebook.presto.spi.relation.VariableReferenceExpression; import com.google.common.collect.ImmutableList; @@ -57,7 +57,7 @@ public class ClickHouseComputePushdown implements ConnectorPlanOptimizer { - private final ExpressionOptimizer expressionOptimizer; + private final RowExpressionService rowExpressionService; private final ClickHouseFilterToSqlTranslator clickHouseFilterToSqlTranslator; private final LogicalRowExpressions logicalRowExpressions; private final ClickHouseQueryGenerator clickhouseQueryGenerator; @@ -67,7 +67,7 @@ public ClickHouseComputePushdown( FunctionMetadataManager functionMetadataManager, StandardFunctionResolution functionResolution, DeterminismEvaluator determinismEvaluator, - ExpressionOptimizer expressionOptimizer, + RowExpressionService rowExpressionService, String identifierQuote, Set> functionTranslators, ClickHouseQueryGenerator clickhouseQueryGenerator) @@ -78,7 +78,7 @@ public ClickHouseComputePushdown( requireNonNull(determinismEvaluator, "determinismEvaluator is null"); requireNonNull(functionResolution, "functionResolution is null"); - this.expressionOptimizer = requireNonNull(expressionOptimizer, "expressionOptimizer is null"); + this.rowExpressionService = requireNonNull(rowExpressionService, "rowExpressionService is null"); this.clickHouseFilterToSqlTranslator = new ClickHouseFilterToSqlTranslator( functionMetadataManager, buildFunctionTranslator(functionTranslators), @@ -257,7 +257,7 @@ public PlanNode visitFilter(FilterNode node, Void context) TableHandle oldTableHandle = oldTableScanNode.getTable(); ClickHouseTableHandle oldConnectorTable = (ClickHouseTableHandle) oldTableHandle.getConnectorHandle(); - RowExpression predicate = expressionOptimizer.optimize(node.getPredicate(), OPTIMIZED, session); + RowExpression predicate = rowExpressionService.getExpressionOptimizer(session).optimize(node.getPredicate(), OPTIMIZED, session); predicate = logicalRowExpressions.convertToConjunctiveNormalForm(predicate); TranslatedExpression clickHouseExpression = translateWith( predicate, diff --git a/presto-clickhouse/src/main/java/com/facebook/presto/plugin/clickhouse/optimization/ClickHousePlanOptimizerProvider.java b/presto-clickhouse/src/main/java/com/facebook/presto/plugin/clickhouse/optimization/ClickHousePlanOptimizerProvider.java index 60d59692971c8..8643b7acba550 100755 --- a/presto-clickhouse/src/main/java/com/facebook/presto/plugin/clickhouse/optimization/ClickHousePlanOptimizerProvider.java +++ b/presto-clickhouse/src/main/java/com/facebook/presto/plugin/clickhouse/optimization/ClickHousePlanOptimizerProvider.java @@ -20,7 +20,7 @@ import com.facebook.presto.spi.function.FunctionMetadataManager; import com.facebook.presto.spi.function.StandardFunctionResolution; import com.facebook.presto.spi.relation.DeterminismEvaluator; -import com.facebook.presto.spi.relation.ExpressionOptimizer; +import com.facebook.presto.spi.relation.RowExpressionService; import com.google.common.collect.ImmutableSet; import com.google.inject.Inject; @@ -33,8 +33,8 @@ public class ClickHousePlanOptimizerProvider { private final FunctionMetadataManager functionManager; private final StandardFunctionResolution functionResolution; + private final RowExpressionService rowExpressionService; private final DeterminismEvaluator determinismEvaluator; - private final ExpressionOptimizer expressionOptimizer; private final String identifierQuote; private final ClickHouseQueryGenerator clickhouseQueryGenerator; @@ -43,16 +43,15 @@ public ClickHousePlanOptimizerProvider( ClickHouseClient clickHouseClient, FunctionMetadataManager functionManager, StandardFunctionResolution functionResolution, - DeterminismEvaluator determinismEvaluator, - ExpressionOptimizer expressionOptimizer, + RowExpressionService rowExpressionService, ClickHouseQueryGenerator clickhouseQueryGenerator) { this.functionManager = requireNonNull(functionManager, "functionManager is null"); this.functionResolution = requireNonNull(functionResolution, "functionResolution is null"); - this.determinismEvaluator = requireNonNull(determinismEvaluator, "determinismEvaluator is null"); - this.expressionOptimizer = requireNonNull(expressionOptimizer, "expressionOptimizer is null"); + this.rowExpressionService = requireNonNull(rowExpressionService, "rowExpressionService is null"); this.identifierQuote = clickHouseClient.getIdentifierQuote(); this.clickhouseQueryGenerator = clickhouseQueryGenerator; + this.determinismEvaluator = rowExpressionService.getDeterminismEvaluator(); } @Override @@ -68,7 +67,7 @@ public Set getPhysicalPlanOptimizers() functionManager, functionResolution, determinismEvaluator, - expressionOptimizer, + rowExpressionService, identifierQuote, getFunctionTranslators(), clickhouseQueryGenerator)); diff --git a/presto-hive-common/src/main/java/com/facebook/presto/hive/MetadataUtils.java b/presto-hive-common/src/main/java/com/facebook/presto/hive/MetadataUtils.java index 361709b7e496b..2b76980e66ab0 100644 --- a/presto-hive-common/src/main/java/com/facebook/presto/hive/MetadataUtils.java +++ b/presto-hive-common/src/main/java/com/facebook/presto/hive/MetadataUtils.java @@ -85,7 +85,7 @@ public static RowExpression getSubfieldPredicate( StandardFunctionResolution functionResolution, RowExpressionService rowExpressionService) { - SubfieldExtractor subfieldExtractor = new SubfieldExtractor(functionResolution, rowExpressionService.getExpressionOptimizer(), session); + SubfieldExtractor subfieldExtractor = new SubfieldExtractor(functionResolution, rowExpressionService.getExpressionOptimizer(session), session); return rowExpressionService.getDomainTranslator().toPredicate( layoutHandle.getDomainPredicate() diff --git a/presto-hive-common/src/main/java/com/facebook/presto/hive/rule/BaseSubfieldExtractionRewriter.java b/presto-hive-common/src/main/java/com/facebook/presto/hive/rule/BaseSubfieldExtractionRewriter.java index 070b940f3db9f..46484c8e00a06 100644 --- a/presto-hive-common/src/main/java/com/facebook/presto/hive/rule/BaseSubfieldExtractionRewriter.java +++ b/presto-hive-common/src/main/java/com/facebook/presto/hive/rule/BaseSubfieldExtractionRewriter.java @@ -217,7 +217,7 @@ public ConnectorPushdownFilterResult pushdownFilter( ExtractionResult decomposedFilter = rowExpressionService.getDomainTranslator() .fromPredicate(session, filter, new SubfieldExtractor( functionResolution, - rowExpressionService.getExpressionOptimizer(), + rowExpressionService.getExpressionOptimizer(session), session).toColumnExtractor()); if (currentLayoutHandle.isPresent()) { @@ -231,7 +231,7 @@ public ConnectorPushdownFilterResult pushdownFilter( return new ConnectorPushdownFilterResult(EMPTY_TABLE_LAYOUT, FALSE_CONSTANT); } - RowExpression optimizedRemainingExpression = rowExpressionService.getExpressionOptimizer() + RowExpression optimizedRemainingExpression = rowExpressionService.getExpressionOptimizer(session) .optimize(decomposedFilter.getRemainingExpression(), OPTIMIZED, session); if (optimizedRemainingExpression instanceof ConstantExpression) { ConstantExpression constantExpression = (ConstantExpression) optimizedRemainingExpression; @@ -439,7 +439,7 @@ private boolean isCandidate(Map bindings) // spurious query failures for partitions that would otherwise be filtered out. RowExpression optimized; try { - optimized = evaluator.getExpressionOptimizer().optimize(expression, OPTIMIZED, session, variableResolver); + optimized = evaluator.getExpressionOptimizer(session).optimize(expression, OPTIMIZED, session, variableResolver); } catch (PrestoException e) { propagateIfUnhandled(e); diff --git a/presto-hive/src/main/java/com/facebook/presto/hive/FilteringPageSource.java b/presto-hive/src/main/java/com/facebook/presto/hive/FilteringPageSource.java index 07f47603e0523..0890c00278fcd 100644 --- a/presto-hive/src/main/java/com/facebook/presto/hive/FilteringPageSource.java +++ b/presto-hive/src/main/java/com/facebook/presto/hive/FilteringPageSource.java @@ -118,7 +118,7 @@ public FilteringPageSource( columnHandle -> new VariableReferenceExpression(Optional.empty(), columnHandle.getName(), columnHandle.getHiveType().getType(typeManager)), columnHandle -> new InputReferenceExpression(Optional.empty(), columnHandle.getHiveColumnIndex(), columnHandle.getHiveType().getType(typeManager)))); - RowExpression optimizedRemainingPredicate = rowExpressionService.getExpressionOptimizer().optimize(remainingPredicate, OPTIMIZED, session); + RowExpression optimizedRemainingPredicate = rowExpressionService.getExpressionOptimizer(session).optimize(remainingPredicate, OPTIMIZED, session); if (TRUE_CONSTANT.equals(optimizedRemainingPredicate)) { this.filterFunction = null; } diff --git a/presto-hive/src/main/java/com/facebook/presto/hive/HiveMetadata.java b/presto-hive/src/main/java/com/facebook/presto/hive/HiveMetadata.java index 3541b8ee04d5c..30b6bd7577d56 100644 --- a/presto-hive/src/main/java/com/facebook/presto/hive/HiveMetadata.java +++ b/presto-hive/src/main/java/com/facebook/presto/hive/HiveMetadata.java @@ -888,7 +888,7 @@ public TableStatistics getTableStatistics(ConnectorSession session, ConnectorTab .transform(subfield -> isEntireColumn(subfield) ? subfield.getRootName() : null) .transform(allColumns::get))); - SubfieldExtractor subfieldExtractor = new SubfieldExtractor(functionResolution, rowExpressionService.getExpressionOptimizer(), session); + SubfieldExtractor subfieldExtractor = new SubfieldExtractor(functionResolution, rowExpressionService.getExpressionOptimizer(session), session); RowExpression domainPredicate = rowExpressionService.getDomainTranslator().toPredicate( hiveLayoutHandle.getDomainPredicate() diff --git a/presto-hive/src/main/java/com/facebook/presto/hive/HivePageSourceProvider.java b/presto-hive/src/main/java/com/facebook/presto/hive/HivePageSourceProvider.java index 7065dc6720811..85d00b8b9571c 100644 --- a/presto-hive/src/main/java/com/facebook/presto/hive/HivePageSourceProvider.java +++ b/presto-hive/src/main/java/com/facebook/presto/hive/HivePageSourceProvider.java @@ -129,7 +129,7 @@ public HivePageSourceProvider( this.optimizedRowExpressionCache = CacheBuilder.newBuilder() .recordStats() .maximumSize(10_000) - .build(CacheLoader.from(cacheKey -> rowExpressionService.getExpressionOptimizer().optimize(cacheKey.rowExpression, OPTIMIZED, cacheKey.session))); + .build(CacheLoader.from(cacheKey -> rowExpressionService.getExpressionOptimizer(cacheKey.session).optimize(cacheKey.rowExpression, OPTIMIZED, cacheKey.session))); } @Override 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 6cc1054b59a37..29c680aac3762 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 @@ -425,7 +425,7 @@ private static Map> collectRequiredSubfields(List outputSubfields.put(column.getHiveColumnIndex(), new HashSet<>(column.getRequiredSubfields()))); Map> predicateSubfields = new HashMap<>(); - SubfieldExtractor subfieldExtractor = new SubfieldExtractor(functionResolution, rowExpressionService.getExpressionOptimizer(), session); + SubfieldExtractor subfieldExtractor = new SubfieldExtractor(functionResolution, rowExpressionService.getExpressionOptimizer(session), session); remainingPredicate.accept( new RequiredSubfieldsExtractor(subfieldExtractor), subfield -> predicateSubfields.computeIfAbsent(columnIndices.get(subfield.getRootName()), v -> new HashSet<>()).add(subfield)); 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 d622e36da67e5..28c4fc5146388 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 @@ -524,7 +524,7 @@ private static RowType toRowType(List columns) }).collect(toList())) .build(); - private static final SubfieldExtractor SUBFIELD_EXTRACTOR = new SubfieldExtractor(FUNCTION_RESOLUTION, ROW_EXPRESSION_SERVICE.getExpressionOptimizer(), SESSION); + private static final SubfieldExtractor SUBFIELD_EXTRACTOR = new SubfieldExtractor(FUNCTION_RESOLUTION, ROW_EXPRESSION_SERVICE.getExpressionOptimizer(SESSION), SESSION); private static final TypeProvider TYPE_PROVIDER_AFTER = TypeProvider.copyOf(MISMATCH_SCHEMA_TABLE_AFTER.stream() .collect(toImmutableMap(ColumnMetadata::getName, ColumnMetadata::getType))); diff --git a/presto-hive/src/test/java/com/facebook/presto/hive/HiveTestUtils.java b/presto-hive/src/test/java/com/facebook/presto/hive/HiveTestUtils.java index a6fdaa9f73677..37b3b35139a27 100644 --- a/presto-hive/src/test/java/com/facebook/presto/hive/HiveTestUtils.java +++ b/presto-hive/src/test/java/com/facebook/presto/hive/HiveTestUtils.java @@ -126,7 +126,7 @@ public DomainTranslator getDomainTranslator() } @Override - public ExpressionOptimizer getExpressionOptimizer() + public ExpressionOptimizer getExpressionOptimizer(ConnectorSession session) { return new RowExpressionOptimizer(METADATA); } @@ -151,7 +151,7 @@ public String formatRowExpression(ConnectorSession session, RowExpression expres }; public static final FilterStatsCalculatorService FILTER_STATS_CALCULATOR_SERVICE = new ConnectorFilterStatsCalculatorService( - new FilterStatsCalculator(METADATA, new ScalarStatsCalculator(METADATA), new StatsNormalizer())); + new FilterStatsCalculator(METADATA, new ScalarStatsCalculator(METADATA, ROW_EXPRESSION_SERVICE), new StatsNormalizer())); public static final HiveClientConfig HIVE_CLIENT_CONFIG = new HiveClientConfig(); public static final MetastoreClientConfig METASTORE_CLIENT_CONFIG = new MetastoreClientConfig(); diff --git a/presto-iceberg/src/main/java/com/facebook/presto/iceberg/optimizer/IcebergMetadataOptimizer.java b/presto-iceberg/src/main/java/com/facebook/presto/iceberg/optimizer/IcebergMetadataOptimizer.java index f21d39f956473..3e35e1d6afa4a 100644 --- a/presto-iceberg/src/main/java/com/facebook/presto/iceberg/optimizer/IcebergMetadataOptimizer.java +++ b/presto-iceberg/src/main/java/com/facebook/presto/iceberg/optimizer/IcebergMetadataOptimizer.java @@ -356,7 +356,7 @@ else if (scalarFunctionName.equals("least")) { throw new PrestoException(StandardErrorCode.NOT_SUPPORTED, "unsupported function: " + scalarFunctionName); } - RowExpression reducedValue = rowExpressionService.getExpressionOptimizer().optimize( + RowExpression reducedValue = rowExpressionService.getExpressionOptimizer(connectorSession).optimize( new CallExpression( Optional.empty(), scalarFunctionName, diff --git a/presto-iceberg/src/main/java/com/facebook/presto/iceberg/optimizer/IcebergPlanOptimizer.java b/presto-iceberg/src/main/java/com/facebook/presto/iceberg/optimizer/IcebergPlanOptimizer.java index dac79f9adfafc..d8ff0d65bba81 100644 --- a/presto-iceberg/src/main/java/com/facebook/presto/iceberg/optimizer/IcebergPlanOptimizer.java +++ b/presto-iceberg/src/main/java/com/facebook/presto/iceberg/optimizer/IcebergPlanOptimizer.java @@ -154,7 +154,7 @@ public PlanNode visitFilter(FilterNode filter, RewriteContext context) //TODO we should optimize the filter expression DomainTranslator.ExtractionResult decomposedFilter = rowExpressionService.getDomainTranslator() - .fromPredicate(session, filterPredicate, new SubfieldExtractor(functionResolution, rowExpressionService.getExpressionOptimizer(), session).toColumnExtractor()); + .fromPredicate(session, filterPredicate, new SubfieldExtractor(functionResolution, rowExpressionService.getExpressionOptimizer(session), session).toColumnExtractor()); // Only pushdown the range filters which apply to entire columns, because iceberg does not accept the filters on the subfields in nested structures TupleDomain entireColumnDomain = decomposedFilter.getTupleDomain() @@ -167,7 +167,7 @@ public PlanNode visitFilter(FilterNode filter, RewriteContext context) Table icebergTable = getIcebergTable(metadata, session, tableHandle.getSchemaTableName()); // Get predicate expression on subfield - SubfieldExtractor subfieldExtractor = new SubfieldExtractor(functionResolution, rowExpressionService.getExpressionOptimizer(), session); + SubfieldExtractor subfieldExtractor = new SubfieldExtractor(functionResolution, rowExpressionService.getExpressionOptimizer(session), session); Map columnTypes = nameToColumnHandlesMapping.entrySet().stream() .collect(toImmutableMap(entry -> entry.getKey(), entry -> entry.getValue().getType())); TupleDomain subfieldTupleDomain = decomposedFilter.getTupleDomain() diff --git a/presto-main/src/main/java/com/facebook/presto/connector/ConnectorManager.java b/presto-main/src/main/java/com/facebook/presto/connector/ConnectorManager.java index 6ed7888b33d54..56f3e15d72aa6 100644 --- a/presto-main/src/main/java/com/facebook/presto/connector/ConnectorManager.java +++ b/presto-main/src/main/java/com/facebook/presto/connector/ConnectorManager.java @@ -62,12 +62,12 @@ import com.facebook.presto.split.RecordPageSourceProvider; import com.facebook.presto.split.SplitManager; import com.facebook.presto.sql.analyzer.FeaturesConfig; +import com.facebook.presto.sql.expressions.ExpressionOptimizerManager; import com.facebook.presto.sql.planner.ConnectorPlanOptimizerManager; import com.facebook.presto.sql.planner.PartitioningProviderManager; import com.facebook.presto.sql.planner.planPrinter.RowExpressionFormatter; import com.facebook.presto.sql.relational.ConnectorRowExpressionService; import com.facebook.presto.sql.relational.FunctionResolution; -import com.facebook.presto.sql.relational.RowExpressionOptimizer; import com.facebook.presto.transaction.TransactionManager; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; @@ -116,6 +116,7 @@ public class ConnectorManager private final PageIndexerFactory pageIndexerFactory; private final NodeInfo nodeInfo; private final TransactionManager transactionManager; + private final ExpressionOptimizerManager expressionOptimizerManager; private final DomainTranslator domainTranslator; private final PredicateCompiler predicateCompiler; private final DeterminismEvaluator determinismEvaluator; @@ -151,6 +152,7 @@ public ConnectorManager( PageSorter pageSorter, PageIndexerFactory pageIndexerFactory, TransactionManager transactionManager, + ExpressionOptimizerManager expressionOptimizerManager, DomainTranslator domainTranslator, PredicateCompiler predicateCompiler, DeterminismEvaluator determinismEvaluator, @@ -176,6 +178,7 @@ public ConnectorManager( this.pageIndexerFactory = requireNonNull(pageIndexerFactory, "pageIndexerFactory is null"); this.nodeInfo = requireNonNull(nodeInfo, "nodeInfo is null"); this.transactionManager = requireNonNull(transactionManager, "transactionManager is null"); + this.expressionOptimizerManager = requireNonNull(expressionOptimizerManager, "expressionOptimizerManager is null"); this.domainTranslator = requireNonNull(domainTranslator, "domainTranslator is null"); this.predicateCompiler = requireNonNull(predicateCompiler, "predicateCompiler is null"); this.determinismEvaluator = requireNonNull(determinismEvaluator, "determinismEvaluator is null"); @@ -382,7 +385,7 @@ private Connector createConnector(ConnectorId connectorId, ConnectorFactory fact pageIndexerFactory, new ConnectorRowExpressionService( domainTranslator, - new RowExpressionOptimizer(metadataManager), + expressionOptimizerManager, predicateCompiler, determinismEvaluator, new RowExpressionFormatter(metadataManager.getFunctionAndTypeManager())), diff --git a/presto-main/src/main/java/com/facebook/presto/cost/ScalarStatsCalculator.java b/presto-main/src/main/java/com/facebook/presto/cost/ScalarStatsCalculator.java index 044785ca0a440..a25351ca7a88a 100644 --- a/presto-main/src/main/java/com/facebook/presto/cost/ScalarStatsCalculator.java +++ b/presto-main/src/main/java/com/facebook/presto/cost/ScalarStatsCalculator.java @@ -23,6 +23,7 @@ import com.facebook.presto.spi.function.FunctionMetadata; import com.facebook.presto.spi.relation.CallExpression; import com.facebook.presto.spi.relation.ConstantExpression; +import com.facebook.presto.spi.relation.ExpressionOptimizerProvider; import com.facebook.presto.spi.relation.InputReferenceExpression; import com.facebook.presto.spi.relation.LambdaDefinitionExpression; import com.facebook.presto.spi.relation.RowExpression; @@ -31,11 +32,11 @@ import com.facebook.presto.spi.relation.VariableReferenceExpression; import com.facebook.presto.sql.analyzer.ExpressionAnalyzer; import com.facebook.presto.sql.analyzer.Scope; +import com.facebook.presto.sql.expressions.ExpressionOptimizerManager; import com.facebook.presto.sql.planner.ExpressionInterpreter; import com.facebook.presto.sql.planner.NoOpVariableResolver; import com.facebook.presto.sql.planner.TypeProvider; import com.facebook.presto.sql.relational.FunctionResolution; -import com.facebook.presto.sql.relational.RowExpressionOptimizer; import com.facebook.presto.sql.tree.ArithmeticBinaryExpression; import com.facebook.presto.sql.tree.ArithmeticUnaryExpression; import com.facebook.presto.sql.tree.AstVisitor; @@ -78,11 +79,18 @@ public class ScalarStatsCalculator { private final Metadata metadata; + private final ExpressionOptimizerProvider expressionOptimizerProvider; @Inject - public ScalarStatsCalculator(Metadata metadata) + public ScalarStatsCalculator(Metadata metadata, ExpressionOptimizerManager expressionOptimizerManager) + { + this(metadata, (ExpressionOptimizerProvider) expressionOptimizerManager); + } + + public ScalarStatsCalculator(Metadata metadata, ExpressionOptimizerProvider expressionOptimizerProvider) { this.metadata = requireNonNull(metadata, "metadata can not be null"); + this.expressionOptimizerProvider = requireNonNull(expressionOptimizerProvider, "expressionOptimizerManager can not be null"); } @Deprecated @@ -126,7 +134,7 @@ public VariableStatsEstimate visitCall(CallExpression call, Void context) return computeArithmeticBinaryStatistics(call, context); } - RowExpression value = new RowExpressionOptimizer(metadata).optimize(call, OPTIMIZED, session); + RowExpression value = expressionOptimizerProvider.getExpressionOptimizer(session).optimize(call, OPTIMIZED, session); if (isNull(value)) { return nullStatsEstimate(); diff --git a/presto-main/src/main/java/com/facebook/presto/sql/expressions/ExpressionOptimizerManager.java b/presto-main/src/main/java/com/facebook/presto/sql/expressions/ExpressionOptimizerManager.java index fddb974ca50f1..0d200e5555a92 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/expressions/ExpressionOptimizerManager.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/expressions/ExpressionOptimizerManager.java @@ -20,6 +20,7 @@ import com.facebook.presto.spi.ConnectorSession; import com.facebook.presto.spi.NodeManager; import com.facebook.presto.spi.relation.ExpressionOptimizer; +import com.facebook.presto.spi.relation.ExpressionOptimizerProvider; import com.facebook.presto.spi.sql.planner.ExpressionOptimizerContext; import com.facebook.presto.spi.sql.planner.ExpressionOptimizerFactory; import com.facebook.presto.sql.relational.FunctionResolution; @@ -44,6 +45,7 @@ import static java.util.Objects.requireNonNull; public class ExpressionOptimizerManager + implements ExpressionOptimizerProvider { public static final String DEFAULT_EXPRESSION_OPTIMIZER_NAME = "default"; private static final File EXPRESSION_MANAGER_CONFIGURATION_DIRECTORY = new File("etc/expression-manager/"); @@ -114,6 +116,7 @@ public void addExpressionOptimizerFactory(ExpressionOptimizerFactory expressionO "ExpressionOptimizerFactory %s is already registered", name); } + @Override public ExpressionOptimizer getExpressionOptimizer(ConnectorSession connectorSession) { // TODO: Remove this check once we have a more appropriate abstraction for session properties retrieved from plugins diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/PlanOptimizers.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/PlanOptimizers.java index 03af41204c3c5..25607c03c9c86 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/PlanOptimizers.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/PlanOptimizers.java @@ -350,7 +350,7 @@ public PlanOptimizers( estimatedExchangesCostCalculator, new RewriteConstantArrayContainsToInExpression(metadata.getFunctionAndTypeManager()).rules()); - PlanOptimizer predicatePushDown = new StatsRecordingPlanOptimizer(optimizerStats, new PredicatePushDown(metadata, sqlParser, featuresConfig.isNativeExecutionEnabled())); + PlanOptimizer predicatePushDown = new StatsRecordingPlanOptimizer(optimizerStats, new PredicatePushDown(metadata, sqlParser, expressionOptimizerManager, featuresConfig.isNativeExecutionEnabled())); PlanOptimizer prefilterForLimitingAggregation = new StatsRecordingPlanOptimizer(optimizerStats, new PrefilterForLimitingAggregation(metadata, statsCalculator)); builder.add( @@ -731,7 +731,7 @@ public PlanOptimizers( statsCalculator, estimatedExchangesCostCalculator, ImmutableSet.of(new RemoveRedundantIdentityProjections(), new PruneRedundantProjectionAssignments())), - new PushdownSubfields(metadata)); + new PushdownSubfields(metadata, expressionOptimizerManager)); builder.add(predicatePushDown); // Run predicate push down one more time in case we can leverage new information from layouts' effective predicate builder.add(simplifyRowExpressionOptimizer); // Should be always run after PredicatePushDown diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/PredicatePushDown.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/PredicatePushDown.java index 087cab8bcc77c..b5a4edaf0351f 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/PredicatePushDown.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/PredicatePushDown.java @@ -45,6 +45,7 @@ import com.facebook.presto.spi.relation.CallExpression; import com.facebook.presto.spi.relation.ConstantExpression; import com.facebook.presto.spi.relation.ExpressionOptimizer; +import com.facebook.presto.spi.relation.ExpressionOptimizerProvider; import com.facebook.presto.spi.relation.RowExpression; import com.facebook.presto.spi.relation.VariableReferenceExpression; import com.facebook.presto.sql.parser.SqlParser; @@ -65,7 +66,6 @@ import com.facebook.presto.sql.relational.FunctionResolution; import com.facebook.presto.sql.relational.RowExpressionDeterminismEvaluator; import com.facebook.presto.sql.relational.RowExpressionDomainTranslator; -import com.facebook.presto.sql.relational.RowExpressionOptimizer; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import com.google.common.collect.ImmutableList; @@ -132,13 +132,15 @@ public class PredicatePushDown private final SqlParser sqlParser; private final RowExpressionDomainTranslator rowExpressionDomainTranslator; private final boolean nativeExecution; + private final ExpressionOptimizerProvider expressionOptimizerProvider; - public PredicatePushDown(Metadata metadata, SqlParser sqlParser, boolean nativeExecution) + public PredicatePushDown(Metadata metadata, SqlParser sqlParser, ExpressionOptimizerProvider expressionOptimizerProvider, boolean nativeExecution) { this.metadata = requireNonNull(metadata, "metadata is null"); rowExpressionDomainTranslator = new RowExpressionDomainTranslator(metadata); this.effectivePredicateExtractor = new EffectivePredicateExtractor(rowExpressionDomainTranslator, metadata.getFunctionAndTypeManager()); this.sqlParser = requireNonNull(sqlParser, "sqlParser is null"); + this.expressionOptimizerProvider = requireNonNull(expressionOptimizerProvider, "expressionOptimizerProvider is null"); this.nativeExecution = nativeExecution; } @@ -150,7 +152,7 @@ public PlanOptimizerResult optimize(PlanNode plan, Session session, TypeProvider requireNonNull(types, "types is null"); requireNonNull(idAllocator, "idAllocator is null"); - Rewriter rewriter = new Rewriter(variableAllocator, idAllocator, metadata, effectivePredicateExtractor, rowExpressionDomainTranslator, sqlParser, session, nativeExecution); + Rewriter rewriter = new Rewriter(variableAllocator, idAllocator, metadata, effectivePredicateExtractor, rowExpressionDomainTranslator, expressionOptimizerProvider, sqlParser, session, nativeExecution); PlanNode rewrittenPlan = SimplePlanRewriter.rewriteWith(rewriter, plan, TRUE_CONSTANT); return PlanOptimizerResult.optimizerResult(rewrittenPlan, rewriter.isPlanChanged()); } @@ -184,6 +186,7 @@ private static class Rewriter private final Metadata metadata; private final EffectivePredicateExtractor effectivePredicateExtractor; private final RowExpressionDomainTranslator rowExpressionDomainTranslator; + private final ExpressionOptimizerProvider expressionOptimizerProvider; private final Session session; private final boolean nativeExecution; private final ExpressionEquivalence expressionEquivalence; @@ -199,6 +202,7 @@ private Rewriter( Metadata metadata, EffectivePredicateExtractor effectivePredicateExtractor, RowExpressionDomainTranslator rowExpressionDomainTranslator, + ExpressionOptimizerProvider expressionOptimizerProvider, SqlParser sqlParser, Session session, boolean nativeExecution) @@ -208,6 +212,7 @@ private Rewriter( this.metadata = requireNonNull(metadata, "metadata is null"); this.effectivePredicateExtractor = requireNonNull(effectivePredicateExtractor, "effectivePredicateExtractor is null"); this.rowExpressionDomainTranslator = rowExpressionDomainTranslator; + this.expressionOptimizerProvider = requireNonNull(expressionOptimizerProvider, "expressionOptimizerProvider is null"); this.session = requireNonNull(session, "session is null"); this.nativeExecution = nativeExecution; this.expressionEquivalence = new ExpressionEquivalence(metadata, sqlParser); @@ -1159,7 +1164,8 @@ private RowExpression getPostJoinPredicate() } } - private InnerJoinPushDownResult processInnerJoin(RowExpression inheritedPredicate, + private InnerJoinPushDownResult processInnerJoin( + RowExpression inheritedPredicate, RowExpression leftEffectivePredicate, RowExpression rightEffectivePredicate, RowExpression joinPredicate, @@ -1283,6 +1289,7 @@ private InnerJoinPushDownResult processInnerJoin(RowExpression inheritedPredicat joinConjuncts.addAll(allInference.generateEqualitiesPartitionedBy(in(leftVariables)::apply).getScopeStraddlingEqualities()); // scope straddling equalities get dropped in as part of the join predicate return new Rewriter.InnerJoinPushDownResult( + expressionOptimizerProvider, logicalRowExpressions.combineConjuncts(leftPushDownConjuncts.build()), logicalRowExpressions.combineConjuncts(rightPushDownConjuncts.build()), logicalRowExpressions.combineConjuncts(joinConjuncts.build()), TRUE_CONSTANT); @@ -1294,13 +1301,20 @@ private static class InnerJoinPushDownResult private final RowExpression rightPredicate; private final RowExpression joinPredicate; private final RowExpression postJoinPredicate; - - private InnerJoinPushDownResult(RowExpression leftPredicate, RowExpression rightPredicate, RowExpression joinPredicate, RowExpression postJoinPredicate) + private final ExpressionOptimizerProvider expressionOptimizerProvider; + + private InnerJoinPushDownResult( + ExpressionOptimizerProvider expressionOptimizerProvider, + RowExpression leftPredicate, + RowExpression rightPredicate, + RowExpression joinPredicate, + RowExpression postJoinPredicate) { - this.leftPredicate = leftPredicate; - this.rightPredicate = rightPredicate; - this.joinPredicate = joinPredicate; - this.postJoinPredicate = postJoinPredicate; + this.expressionOptimizerProvider = requireNonNull(expressionOptimizerProvider, "expressionOptimizerProvider is null"); + this.leftPredicate = requireNonNull(leftPredicate, "leftPredicate is null"); + this.rightPredicate = requireNonNull(rightPredicate, "rightPredicate is null"); + this.joinPredicate = requireNonNull(joinPredicate, "joinPredicate is null"); + this.postJoinPredicate = requireNonNull(postJoinPredicate, "postJoinPredicate is null"); } private RowExpression getLeftPredicate() @@ -1425,7 +1439,7 @@ private boolean canConvertOuterToInner(List innerVa // Temporary implementation for joins because the SimplifyExpressions optimizers can not run properly on join clauses private RowExpression simplifyExpression(RowExpression expression) { - return new RowExpressionOptimizer(metadata).optimize(expression, ExpressionOptimizer.Level.SERIALIZABLE, session.toConnectorSession()); + return expressionOptimizerProvider.getExpressionOptimizer(session.toConnectorSession()).optimize(expression, ExpressionOptimizer.Level.SERIALIZABLE, session.toConnectorSession()); } private boolean areExpressionsEquivalent(RowExpression leftExpression, RowExpression rightExpression) @@ -1440,7 +1454,7 @@ private RowExpression nullInputEvaluator(final Collection constantNull(variable.getSourceLocation(), variable.getType())))); - return new RowExpressionOptimizer(metadata).optimize(expression, ExpressionOptimizer.Level.OPTIMIZED, session.toConnectorSession()); + return expressionOptimizerProvider.getExpressionOptimizer(session.toConnectorSession()).optimize(expression, ExpressionOptimizer.Level.OPTIMIZED, session.toConnectorSession()); } private Predicate joinEqualityExpression(final Collection leftVariables) diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/PushdownSubfields.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/PushdownSubfields.java index ae191bb75b175..077cf8f8407b5 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/PushdownSubfields.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/PushdownSubfields.java @@ -57,6 +57,7 @@ import com.facebook.presto.spi.relation.CallExpression; import com.facebook.presto.spi.relation.ConstantExpression; import com.facebook.presto.spi.relation.ExpressionOptimizer; +import com.facebook.presto.spi.relation.ExpressionOptimizerProvider; import com.facebook.presto.spi.relation.LambdaDefinitionExpression; import com.facebook.presto.spi.relation.RowExpression; import com.facebook.presto.spi.relation.SpecialFormExpression; @@ -71,7 +72,6 @@ import com.facebook.presto.sql.planner.plan.TopNRowNumberNode; import com.facebook.presto.sql.planner.plan.UnnestNode; import com.facebook.presto.sql.relational.FunctionResolution; -import com.facebook.presto.sql.relational.RowExpressionOptimizer; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; @@ -111,11 +111,13 @@ public class PushdownSubfields public static final QualifiedObjectName ELEMENT_AT = QualifiedObjectName.valueOf(DEFAULT_NAMESPACE, "element_at"); public static final QualifiedObjectName CAST = QualifiedObjectName.valueOf(DEFAULT_NAMESPACE, "$operator$cast"); private final Metadata metadata; + private final ExpressionOptimizerProvider expressionOptimizerProvider; private boolean isEnabledForTesting; - public PushdownSubfields(Metadata metadata) + public PushdownSubfields(Metadata metadata, ExpressionOptimizerProvider expressionOptimizerProvider) { this.metadata = requireNonNull(metadata, "metadata is null"); + this.expressionOptimizerProvider = requireNonNull(expressionOptimizerProvider, "expressionOptimizerProvider is null"); } @Override @@ -141,7 +143,7 @@ public PlanOptimizerResult optimize(PlanNode plan, Session session, TypeProvider return PlanOptimizerResult.optimizerResult(plan, false); } - Rewriter rewriter = new Rewriter(session, metadata); + Rewriter rewriter = new Rewriter(session, metadata, expressionOptimizerProvider); PlanNode rewrittenPlan = SimplePlanRewriter.rewriteWith(rewriter, plan, new Rewriter.Context()); return PlanOptimizerResult.optimizerResult(rewrittenPlan, rewriter.isPlanChanged()); } @@ -157,12 +159,13 @@ private static class Rewriter private static final QualifiedObjectName ARBITRARY_AGGREGATE_FUNCTION = QualifiedObjectName.valueOf(DEFAULT_NAMESPACE, "arbitrary"); private boolean planChanged; - public Rewriter(Session session, Metadata metadata) + public Rewriter(Session session, Metadata metadata, ExpressionOptimizerProvider expressionOptimizerProvider) { this.session = requireNonNull(session, "session is null"); this.metadata = requireNonNull(metadata, "metadata is null"); + requireNonNull(expressionOptimizerProvider, "expressionOptimizerProvider is null"); this.functionResolution = new FunctionResolution(metadata.getFunctionAndTypeManager().getFunctionAndTypeResolver()); - this.expressionOptimizer = new RowExpressionOptimizer(metadata); + this.expressionOptimizer = expressionOptimizerProvider.getExpressionOptimizer(session.toConnectorSession()); this.subfieldExtractor = new SubfieldExtractor( functionResolution, expressionOptimizer, diff --git a/presto-main/src/main/java/com/facebook/presto/sql/relational/ConnectorRowExpressionService.java b/presto-main/src/main/java/com/facebook/presto/sql/relational/ConnectorRowExpressionService.java index a8ab25fefc51f..ca423293bfb8e 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/relational/ConnectorRowExpressionService.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/relational/ConnectorRowExpressionService.java @@ -17,6 +17,7 @@ import com.facebook.presto.spi.relation.DeterminismEvaluator; import com.facebook.presto.spi.relation.DomainTranslator; import com.facebook.presto.spi.relation.ExpressionOptimizer; +import com.facebook.presto.spi.relation.ExpressionOptimizerProvider; import com.facebook.presto.spi.relation.PredicateCompiler; import com.facebook.presto.spi.relation.RowExpression; import com.facebook.presto.spi.relation.RowExpressionService; @@ -28,20 +29,20 @@ public final class ConnectorRowExpressionService implements RowExpressionService { private final DomainTranslator domainTranslator; - private final ExpressionOptimizer expressionOptimizer; + private final ExpressionOptimizerProvider expressionOptimizerProvider; private final PredicateCompiler predicateCompiler; private final DeterminismEvaluator determinismEvaluator; private final RowExpressionFormatter rowExpressionFormatter; public ConnectorRowExpressionService( DomainTranslator domainTranslator, - ExpressionOptimizer expressionOptimizer, + ExpressionOptimizerProvider expressionOptimizerProvider, PredicateCompiler predicateCompiler, DeterminismEvaluator determinismEvaluator, RowExpressionFormatter rowExpressionFormatter) { this.domainTranslator = requireNonNull(domainTranslator, "domainTranslator is null"); - this.expressionOptimizer = requireNonNull(expressionOptimizer, "expressionOptimizer is null"); + this.expressionOptimizerProvider = requireNonNull(expressionOptimizerProvider, "expressionOptimizerProvider is null"); this.predicateCompiler = requireNonNull(predicateCompiler, "predicateCompiler is null"); this.determinismEvaluator = requireNonNull(determinismEvaluator, "determinismEvaluator is null"); this.rowExpressionFormatter = requireNonNull(rowExpressionFormatter, "rowExpressionFormatter is null"); @@ -54,9 +55,9 @@ public DomainTranslator getDomainTranslator() } @Override - public ExpressionOptimizer getExpressionOptimizer() + public ExpressionOptimizer getExpressionOptimizer(ConnectorSession session) { - return expressionOptimizer; + return expressionOptimizerProvider.getExpressionOptimizer(session); } @Override diff --git a/presto-main/src/main/java/com/facebook/presto/testing/LocalQueryRunner.java b/presto-main/src/main/java/com/facebook/presto/testing/LocalQueryRunner.java index abb75f1a108e9..a01b7af8d57a4 100644 --- a/presto-main/src/main/java/com/facebook/presto/testing/LocalQueryRunner.java +++ b/presto-main/src/main/java/com/facebook/presto/testing/LocalQueryRunner.java @@ -463,7 +463,7 @@ private LocalQueryRunner(Session defaultSession, FeaturesConfig featuresConfig, expressionOptimizerManager = new ExpressionOptimizerManager(new PluginNodeManager(nodeManager, nodeInfo.getEnvironment()), getFunctionAndTypeManager()); this.statsNormalizer = new StatsNormalizer(); - this.scalarStatsCalculator = new ScalarStatsCalculator(metadata); + this.scalarStatsCalculator = new ScalarStatsCalculator(metadata, expressionOptimizerManager); this.filterStatsCalculator = new FilterStatsCalculator(metadata, scalarStatsCalculator, statsNormalizer); this.historyBasedPlanStatisticsManager = new HistoryBasedPlanStatisticsManager(objectMapper, createTestingSessionPropertyManager(), metadata, new HistoryBasedOptimizationConfig(), featuresConfig, new NodeVersion("1")); this.fragmentStatsProvider = new FragmentStatsProvider(); @@ -498,6 +498,7 @@ private LocalQueryRunner(Session defaultSession, FeaturesConfig featuresConfig, pageSorter, pageIndexerFactory, transactionManager, + expressionOptimizerManager, new RowExpressionDomainTranslator(metadata), new RowExpressionPredicateCompiler(metadata), new RowExpressionDeterminismEvaluator(metadata.getFunctionAndTypeManager()), diff --git a/presto-main/src/main/java/com/facebook/presto/testing/TestingConnectorContext.java b/presto-main/src/main/java/com/facebook/presto/testing/TestingConnectorContext.java index 7cef5e6c1cd2f..e7f69f06d1e7f 100644 --- a/presto-main/src/main/java/com/facebook/presto/testing/TestingConnectorContext.java +++ b/presto-main/src/main/java/com/facebook/presto/testing/TestingConnectorContext.java @@ -41,6 +41,7 @@ import com.facebook.presto.spi.relation.DeterminismEvaluator; import com.facebook.presto.spi.relation.DomainTranslator; import com.facebook.presto.spi.relation.ExpressionOptimizer; +import com.facebook.presto.spi.relation.ExpressionOptimizerProvider; import com.facebook.presto.spi.relation.PredicateCompiler; import com.facebook.presto.spi.relation.RowExpression; import com.facebook.presto.spi.relation.RowExpressionService; @@ -66,7 +67,8 @@ public class TestingConnectorContext private final DomainTranslator domainTranslator = new RowExpressionDomainTranslator(metadata); private final PredicateCompiler predicateCompiler = new RowExpressionPredicateCompiler(metadata); private final DeterminismEvaluator determinismEvaluator = new RowExpressionDeterminismEvaluator(functionAndTypeManager); - private final FilterStatsCalculatorService filterStatsCalculatorService = new ConnectorFilterStatsCalculatorService(new FilterStatsCalculator(metadata, new ScalarStatsCalculator(metadata), new StatsNormalizer())); + private final ExpressionOptimizerProvider expressionOptimizerProvider = (ConnectorSession session) -> new RowExpressionOptimizer(metadata); + private final FilterStatsCalculatorService filterStatsCalculatorService = new ConnectorFilterStatsCalculatorService(new FilterStatsCalculator(metadata, new ScalarStatsCalculator(metadata, expressionOptimizerProvider), new StatsNormalizer())); private final BlockEncodingSerde blockEncodingSerde = new BlockEncodingManager(); @Override @@ -117,7 +119,7 @@ public DomainTranslator getDomainTranslator() } @Override - public ExpressionOptimizer getExpressionOptimizer() + public ExpressionOptimizer getExpressionOptimizer(ConnectorSession session) { return new RowExpressionOptimizer(metadata); } diff --git a/presto-main/src/test/java/com/facebook/presto/cost/AbstractTestComparisonStatsCalculator.java b/presto-main/src/test/java/com/facebook/presto/cost/AbstractTestComparisonStatsCalculator.java index 66c2ceef405fd..865cf0d018e8b 100644 --- a/presto-main/src/test/java/com/facebook/presto/cost/AbstractTestComparisonStatsCalculator.java +++ b/presto-main/src/test/java/com/facebook/presto/cost/AbstractTestComparisonStatsCalculator.java @@ -18,6 +18,7 @@ import com.facebook.presto.common.type.VarcharType; import com.facebook.presto.metadata.MetadataManager; import com.facebook.presto.spi.relation.VariableReferenceExpression; +import com.facebook.presto.sql.InMemoryExpressionOptimizerProvider; import com.facebook.presto.sql.planner.TypeProvider; import com.facebook.presto.sql.tree.Cast; import com.facebook.presto.sql.tree.ComparisonExpression; @@ -82,7 +83,7 @@ public void setUp() throws Exception { MetadataManager metadata = MetadataManager.createTestMetadataManager(); - filterStatsCalculator = new FilterStatsCalculator(metadata, new ScalarStatsCalculator(metadata), new StatsNormalizer()); + filterStatsCalculator = new FilterStatsCalculator(metadata, new ScalarStatsCalculator(metadata, new InMemoryExpressionOptimizerProvider(metadata)), new StatsNormalizer()); uStats = VariableStatsEstimate.builder() .setAverageRowSize(8.0) diff --git a/presto-main/src/test/java/com/facebook/presto/cost/AbstractTestFilterStatsCalculator.java b/presto-main/src/test/java/com/facebook/presto/cost/AbstractTestFilterStatsCalculator.java index c8f919326f92d..aef0e39f5629d 100644 --- a/presto-main/src/test/java/com/facebook/presto/cost/AbstractTestFilterStatsCalculator.java +++ b/presto-main/src/test/java/com/facebook/presto/cost/AbstractTestFilterStatsCalculator.java @@ -18,6 +18,7 @@ import com.facebook.presto.metadata.MetadataManager; import com.facebook.presto.spi.relation.RowExpression; import com.facebook.presto.spi.relation.VariableReferenceExpression; +import com.facebook.presto.sql.InMemoryExpressionOptimizerProvider; import com.facebook.presto.sql.TestingRowExpressionTranslator; import com.facebook.presto.sql.planner.TypeProvider; import com.facebook.presto.sql.tree.Expression; @@ -146,7 +147,7 @@ public void setUp() .build()); MetadataManager metadata = MetadataManager.createTestMetadataManager(); - statsCalculator = new FilterStatsCalculator(metadata, new ScalarStatsCalculator(metadata), new StatsNormalizer()); + statsCalculator = new FilterStatsCalculator(metadata, new ScalarStatsCalculator(metadata, new InMemoryExpressionOptimizerProvider(metadata)), new StatsNormalizer()); translator = new TestingRowExpressionTranslator(MetadataManager.createTestMetadataManager()); } diff --git a/presto-main/src/test/java/com/facebook/presto/cost/TestConnectorFilterStatsCalculatorService.java b/presto-main/src/test/java/com/facebook/presto/cost/TestConnectorFilterStatsCalculatorService.java index 584f55140e3a7..8c8a9fe1acc02 100644 --- a/presto-main/src/test/java/com/facebook/presto/cost/TestConnectorFilterStatsCalculatorService.java +++ b/presto-main/src/test/java/com/facebook/presto/cost/TestConnectorFilterStatsCalculatorService.java @@ -24,6 +24,7 @@ import com.facebook.presto.spi.statistics.DoubleRange; import com.facebook.presto.spi.statistics.Estimate; import com.facebook.presto.spi.statistics.TableStatistics; +import com.facebook.presto.sql.InMemoryExpressionOptimizerProvider; import com.facebook.presto.sql.TestingRowExpressionTranslator; import com.facebook.presto.sql.planner.TypeProvider; import com.facebook.presto.sql.tree.Expression; @@ -56,7 +57,12 @@ public void setUp() { session = testSessionBuilder().build(); MetadataManager metadata = MetadataManager.createTestMetadataManager(); - FilterStatsCalculator statsCalculator = new FilterStatsCalculator(metadata, new ScalarStatsCalculator(metadata), new StatsNormalizer()); + FilterStatsCalculator statsCalculator = new FilterStatsCalculator( + metadata, + new ScalarStatsCalculator( + metadata, + new InMemoryExpressionOptimizerProvider(metadata)), + new StatsNormalizer()); statsCalculatorService = new ConnectorFilterStatsCalculatorService(statsCalculator); xStats = ColumnStatistics.builder() .setDistinctValuesCount(Estimate.of(40)) diff --git a/presto-main/src/test/java/com/facebook/presto/cost/TestJoinStatsRule.java b/presto-main/src/test/java/com/facebook/presto/cost/TestJoinStatsRule.java index 0f642ae517561..5d757b68d1e56 100644 --- a/presto-main/src/test/java/com/facebook/presto/cost/TestJoinStatsRule.java +++ b/presto-main/src/test/java/com/facebook/presto/cost/TestJoinStatsRule.java @@ -18,8 +18,10 @@ import com.facebook.presto.metadata.MetadataManager; import com.facebook.presto.spi.plan.EquiJoinClause; import com.facebook.presto.spi.plan.JoinType; +import com.facebook.presto.spi.relation.ExpressionOptimizerProvider; import com.facebook.presto.spi.relation.RowExpression; import com.facebook.presto.spi.relation.VariableReferenceExpression; +import com.facebook.presto.sql.InMemoryExpressionOptimizerProvider; import com.google.common.collect.ImmutableList; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; @@ -90,8 +92,10 @@ public class TestJoinStatsRule private static final MetadataManager METADATA = createTestMetadataManager(); private static final StatsNormalizer NORMALIZER = new StatsNormalizer(); + + private static final ExpressionOptimizerProvider EXPRESSION_OPTIMIZER_PROVIDER = new InMemoryExpressionOptimizerProvider(METADATA); private static final JoinStatsRule JOIN_STATS_RULE = new JoinStatsRule( - new FilterStatsCalculator(METADATA, new ScalarStatsCalculator(METADATA), NORMALIZER), + new FilterStatsCalculator(METADATA, new ScalarStatsCalculator(METADATA, EXPRESSION_OPTIMIZER_PROVIDER), NORMALIZER), NORMALIZER, 1.0); diff --git a/presto-main/src/test/java/com/facebook/presto/cost/TestScalarStatsCalculator.java b/presto-main/src/test/java/com/facebook/presto/cost/TestScalarStatsCalculator.java index c7951ffbeebb1..afe69f74e8fe7 100644 --- a/presto-main/src/test/java/com/facebook/presto/cost/TestScalarStatsCalculator.java +++ b/presto-main/src/test/java/com/facebook/presto/cost/TestScalarStatsCalculator.java @@ -18,6 +18,7 @@ import com.facebook.presto.metadata.MetadataManager; import com.facebook.presto.spi.relation.RowExpression; import com.facebook.presto.spi.relation.VariableReferenceExpression; +import com.facebook.presto.sql.InMemoryExpressionOptimizerProvider; import com.facebook.presto.sql.TestingRowExpressionTranslator; import com.facebook.presto.sql.parser.SqlParser; import com.facebook.presto.sql.planner.LiteralEncoder; @@ -68,9 +69,10 @@ public class TestScalarStatsCalculator @BeforeClass public void setUp() { - calculator = new ScalarStatsCalculator(MetadataManager.createTestMetadataManager()); + MetadataManager metadata = createTestMetadataManager(); + calculator = new ScalarStatsCalculator(metadata, new InMemoryExpressionOptimizerProvider(metadata)); session = testSessionBuilder().build(); - translator = new TestingRowExpressionTranslator(MetadataManager.createTestMetadataManager()); + translator = new TestingRowExpressionTranslator(metadata); } @Test diff --git a/presto-main/src/test/java/com/facebook/presto/sql/InMemoryExpressionOptimizerProvider.java b/presto-main/src/test/java/com/facebook/presto/sql/InMemoryExpressionOptimizerProvider.java new file mode 100644 index 0000000000000..95b0d9a09d5b8 --- /dev/null +++ b/presto-main/src/test/java/com/facebook/presto/sql/InMemoryExpressionOptimizerProvider.java @@ -0,0 +1,39 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.facebook.presto.sql; + +import com.facebook.presto.metadata.Metadata; +import com.facebook.presto.spi.ConnectorSession; +import com.facebook.presto.spi.relation.ExpressionOptimizer; +import com.facebook.presto.spi.relation.ExpressionOptimizerProvider; +import com.facebook.presto.sql.relational.RowExpressionOptimizer; + +import static java.util.Objects.requireNonNull; + +public class InMemoryExpressionOptimizerProvider + implements ExpressionOptimizerProvider +{ + private final Metadata metadata; + + public InMemoryExpressionOptimizerProvider(Metadata metadata) + { + this.metadata = requireNonNull(metadata, "metadata is null"); + } + + @Override + public ExpressionOptimizer getExpressionOptimizer(ConnectorSession session) + { + return new RowExpressionOptimizer(metadata); + } +} diff --git a/presto-main/src/test/java/com/facebook/presto/sql/planner/TestPredicatePushdown.java b/presto-main/src/test/java/com/facebook/presto/sql/planner/TestPredicatePushdown.java index df925d425befc..f3aaca8d2d19f 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/planner/TestPredicatePushdown.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/planner/TestPredicatePushdown.java @@ -18,6 +18,7 @@ import com.facebook.presto.spi.plan.EquiJoinClause; import com.facebook.presto.spi.plan.FilterNode; import com.facebook.presto.spi.plan.WindowNode; +import com.facebook.presto.sql.InMemoryExpressionOptimizerProvider; import com.facebook.presto.sql.planner.assertions.BasePlanTest; import com.facebook.presto.sql.planner.assertions.PlanMatchPattern; import com.facebook.presto.sql.planner.iterative.rule.test.RuleTester; @@ -476,7 +477,7 @@ public void testNoPushdownWithTry() public void testPredicatePushDownCanReduceInnerToCrossJoin() { RuleTester tester = new RuleTester(); - tester.assertThat(new PredicatePushDown(tester.getMetadata(), tester.getSqlParser(), false)) + tester.assertThat(new PredicatePushDown(tester.getMetadata(), tester.getSqlParser(), new InMemoryExpressionOptimizerProvider(tester.getMetadata()), false)) .on(p -> p.join(INNER, p.filter(p.comparison(OperatorType.EQUAL, p.variable("a1"), constant(1L, INTEGER)), @@ -509,7 +510,7 @@ public void testPredicatePushDownCanReduceInnerToCrossJoin() public void testPredicatePushdownDoesNotAddProjectsBetweenJoinNodes() { RuleTester tester = new RuleTester(); - PredicatePushDown predicatePushDownOptimizer = new PredicatePushDown(tester.getMetadata(), tester.getSqlParser(), false); + PredicatePushDown predicatePushDownOptimizer = new PredicatePushDown(tester.getMetadata(), tester.getSqlParser(), new InMemoryExpressionOptimizerProvider(tester.getMetadata()), false); tester.assertThat(predicatePushDownOptimizer) .on("SELECT 1 " + @@ -589,7 +590,7 @@ public void testPredicatePushdownDoesNotAddProjectsBetweenJoinNodes() public void testDomainFiltersCanBeInferredForLargeDisjunctiveFilters() { RuleTester tester = new RuleTester(emptyList(), ImmutableMap.of(GENERATE_DOMAIN_FILTERS, "true")); - PredicatePushDown predicatePushDownOptimizer = new PredicatePushDown(tester.getMetadata(), tester.getSqlParser(), false); + PredicatePushDown predicatePushDownOptimizer = new PredicatePushDown(tester.getMetadata(), tester.getSqlParser(), new InMemoryExpressionOptimizerProvider(tester.getMetadata()), false); // For Inner Join tester.assertThat(predicatePushDownOptimizer) diff --git a/presto-main/src/test/java/com/facebook/presto/sql/planner/optimizations/TestReorderWindows.java b/presto-main/src/test/java/com/facebook/presto/sql/planner/optimizations/TestReorderWindows.java index e35960c601fd8..1ea58b5627d57 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/planner/optimizations/TestReorderWindows.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/planner/optimizations/TestReorderWindows.java @@ -15,6 +15,7 @@ import com.facebook.presto.common.block.SortOrder; import com.facebook.presto.spi.plan.WindowNode; +import com.facebook.presto.sql.InMemoryExpressionOptimizerProvider; import com.facebook.presto.sql.planner.RuleStatsRecorder; import com.facebook.presto.sql.planner.assertions.BasePlanTest; import com.facebook.presto.sql.planner.assertions.ExpectedValueProvider; @@ -322,7 +323,7 @@ private void assertUnitPlan(@Language("SQL") String sql, PlanMatchPattern patter { List optimizers = ImmutableList.of( new UnaliasSymbolReferences(getMetadata().getFunctionAndTypeManager()), - new PredicatePushDown(getMetadata(), getQueryRunner().getSqlParser(), false), + new PredicatePushDown(getMetadata(), getQueryRunner().getSqlParser(), new InMemoryExpressionOptimizerProvider(getMetadata()), false), new IterativeOptimizer( getMetadata(), new RuleStatsRecorder(), diff --git a/presto-parquet/src/main/java/com/facebook/presto/parquet/rule/ParquetDereferencePushDown.java b/presto-parquet/src/main/java/com/facebook/presto/parquet/rule/ParquetDereferencePushDown.java index bd4d89c4fb034..1dcafec04678c 100644 --- a/presto-parquet/src/main/java/com/facebook/presto/parquet/rule/ParquetDereferencePushDown.java +++ b/presto-parquet/src/main/java/com/facebook/presto/parquet/rule/ParquetDereferencePushDown.java @@ -328,7 +328,7 @@ public PlanNode visitProject(ProjectNode project, RewriteContext context) Map dereferenceToNestedColumnMap = extractDereferences( baseColumnHandles, session, - rowExpressionService.getExpressionOptimizer(), + rowExpressionService.getExpressionOptimizer(session), new HashSet<>(project.getAssignments().getExpressions())); if (dereferenceToNestedColumnMap.isEmpty()) { return visitPlan(project, context); diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/relation/ExpressionOptimizerProvider.java b/presto-spi/src/main/java/com/facebook/presto/spi/relation/ExpressionOptimizerProvider.java new file mode 100644 index 0000000000000..13c8cde41ed4a --- /dev/null +++ b/presto-spi/src/main/java/com/facebook/presto/spi/relation/ExpressionOptimizerProvider.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.relation; + +import com.facebook.presto.spi.ConnectorSession; + +public interface ExpressionOptimizerProvider +{ + ExpressionOptimizer getExpressionOptimizer(ConnectorSession session); +} diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/relation/RowExpressionService.java b/presto-spi/src/main/java/com/facebook/presto/spi/relation/RowExpressionService.java index 12710f71b0f76..88d80abfcb366 100644 --- a/presto-spi/src/main/java/com/facebook/presto/spi/relation/RowExpressionService.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/relation/RowExpressionService.java @@ -19,10 +19,11 @@ * A set of services/utilities that are helpful for connectors to operate on row expressions */ public interface RowExpressionService + extends ExpressionOptimizerProvider { DomainTranslator getDomainTranslator(); - ExpressionOptimizer getExpressionOptimizer(); + ExpressionOptimizer getExpressionOptimizer(ConnectorSession session); PredicateCompiler getPredicateCompiler();