4646import com .facebook .presto .spi .relation .RowExpression ;
4747import com .facebook .presto .spi .relation .VariableReferenceExpression ;
4848import com .facebook .presto .spi .statistics .TableStatistics ;
49+ import com .facebook .presto .sql .expressions .ExpressionOptimizerManager ;
4950import com .facebook .presto .sql .planner .TypeProvider ;
5051import com .facebook .presto .sql .planner .VariablesExtractor ;
5152import com .facebook .presto .sql .planner .plan .SimplePlanRewriter ;
6465import java .util .Set ;
6566
6667import static com .facebook .presto .spi .plan .ProjectNode .Locality .LOCAL ;
67- import static com .facebook .presto .sql . planner . RowExpressionInterpreter . evaluateConstantRowExpression ;
68+ import static com .facebook .presto .spi . relation . ExpressionOptimizer . Level . EVALUATED ;
6869import static com .facebook .presto .sql .relational .Expressions .call ;
6970import static com .facebook .presto .sql .relational .Expressions .constant ;
71+ import static com .google .common .base .Verify .verify ;
7072import static com .google .common .collect .ImmutableList .toImmutableList ;
7173import static com .google .common .collect .Iterables .getOnlyElement ;
7274import static java .util .Objects .requireNonNull ;
@@ -81,12 +83,13 @@ public class MetadataQueryOptimizer
8183 private final Set <QualifiedObjectName > allowedFunctions ;
8284 private final Map <QualifiedObjectName , QualifiedObjectName > aggregationScalarMapping ;
8385 private final Metadata metadata ;
86+ private final ExpressionOptimizerManager expressionOptimizerManager ;
8487
85- public MetadataQueryOptimizer (Metadata metadata )
88+ public MetadataQueryOptimizer (Metadata metadata , ExpressionOptimizerManager expressionOptimizerManager )
8689 {
87- requireNonNull (metadata , "metadata is null" );
90+ this .metadata = requireNonNull (metadata , "metadata is null" );
91+ this .expressionOptimizerManager = requireNonNull (expressionOptimizerManager , "expressionOptimizerManager is null" );
8892
89- this .metadata = metadata ;
9093 CatalogSchemaName defaultNamespace = metadata .getFunctionAndTypeManager ().getDefaultNamespace ();
9194 this .allowedFunctions = ImmutableSet .of (
9295 QualifiedObjectName .valueOf (defaultNamespace , "max" ),
@@ -104,7 +107,7 @@ public PlanOptimizerResult optimize(PlanNode plan, Session session, TypeProvider
104107 if (!SystemSessionProperties .isOptimizeMetadataQueries (session ) && !SystemSessionProperties .isOptimizeMetadataQueriesIgnoreStats (session )) {
105108 return PlanOptimizerResult .optimizerResult (plan , false );
106109 }
107- Optimizer optimizer = new Optimizer (session , metadata , idAllocator );
110+ Optimizer optimizer = new Optimizer (session , metadata , idAllocator , expressionOptimizerManager );
108111 PlanNode rewrittenPlan = SimplePlanRewriter .rewriteWith (optimizer , plan , null );
109112 return PlanOptimizerResult .optimizerResult (rewrittenPlan , optimizer .isPlanChanged ());
110113 }
@@ -130,16 +133,18 @@ private static class Optimizer
130133 private final int metastoreCallNumThreshold ;
131134 private boolean planChanged ;
132135 private final MetadataQueryOptimizer metadataQueryOptimizer ;
136+ private final ExpressionOptimizerManager expressionOptimizerManager ;
133137
134- private Optimizer (Session session , Metadata metadata , PlanNodeIdAllocator idAllocator )
138+ private Optimizer (Session session , Metadata metadata , PlanNodeIdAllocator idAllocator , ExpressionOptimizerManager expressionOptimizerManager )
135139 {
136140 this .session = session ;
137141 this .metadata = metadata ;
138142 this .idAllocator = idAllocator ;
139143 this .determinismEvaluator = new RowExpressionDeterminismEvaluator (metadata );
140144 this .ignoreMetadataStats = SystemSessionProperties .isOptimizeMetadataQueriesIgnoreStats (session );
141145 this .metastoreCallNumThreshold = SystemSessionProperties .getOptimizeMetadataQueriesCallThreshold (session );
142- this .metadataQueryOptimizer = new MetadataQueryOptimizer (metadata );
146+ this .metadataQueryOptimizer = new MetadataQueryOptimizer (metadata , expressionOptimizerManager );
147+ this .expressionOptimizerManager = expressionOptimizerManager ;
143148 }
144149
145150 public boolean isPlanChanged ()
@@ -374,15 +379,17 @@ private RowExpression evaluateMinMax(FunctionMetadata aggregationFunctionMetadat
374379 List <RowExpression > reducedArguments = new ArrayList <>();
375380 // We fold for every 100 values because GREATEST/LEAST has argument count limit
376381 for (List <RowExpression > partitionedArguments : Lists .partition (arguments , 100 )) {
377- Object reducedValue = evaluateConstantRowExpression (
382+ RowExpression expression = expressionOptimizerManager . getExpressionOptimizer ( connectorSession ). optimize (
378383 call (
379384 metadata .getFunctionAndTypeManager (),
380385 scalarFunctionName ,
381386 returnType ,
382387 partitionedArguments ),
383- metadata .getFunctionAndTypeManager (),
384- connectorSession );
385- reducedArguments .add (constant (reducedValue , returnType ));
388+ EVALUATED ,
389+ connectorSession ,
390+ i -> i );
391+ verify (expression instanceof ConstantExpression , "Expected constant expression" );
392+ reducedArguments .add (expression );
386393 }
387394 arguments = reducedArguments ;
388395 }
0 commit comments