46
46
import com .facebook .presto .spi .relation .RowExpression ;
47
47
import com .facebook .presto .spi .relation .VariableReferenceExpression ;
48
48
import com .facebook .presto .spi .statistics .TableStatistics ;
49
+ import com .facebook .presto .sql .expressions .ExpressionOptimizerManager ;
49
50
import com .facebook .presto .sql .planner .TypeProvider ;
50
51
import com .facebook .presto .sql .planner .VariablesExtractor ;
51
52
import com .facebook .presto .sql .planner .plan .SimplePlanRewriter ;
64
65
import java .util .Set ;
65
66
66
67
import 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 ;
68
69
import static com .facebook .presto .sql .relational .Expressions .call ;
69
70
import static com .facebook .presto .sql .relational .Expressions .constant ;
71
+ import static com .google .common .base .Verify .verify ;
70
72
import static com .google .common .collect .ImmutableList .toImmutableList ;
71
73
import static com .google .common .collect .Iterables .getOnlyElement ;
72
74
import static java .util .Objects .requireNonNull ;
@@ -81,12 +83,13 @@ public class MetadataQueryOptimizer
81
83
private final Set <QualifiedObjectName > allowedFunctions ;
82
84
private final Map <QualifiedObjectName , QualifiedObjectName > aggregationScalarMapping ;
83
85
private final Metadata metadata ;
86
+ private final ExpressionOptimizerManager expressionOptimizerManager ;
84
87
85
- public MetadataQueryOptimizer (Metadata metadata )
88
+ public MetadataQueryOptimizer (Metadata metadata , ExpressionOptimizerManager expressionOptimizerManager )
86
89
{
87
- requireNonNull (metadata , "metadata is null" );
90
+ this .metadata = requireNonNull (metadata , "metadata is null" );
91
+ this .expressionOptimizerManager = requireNonNull (expressionOptimizerManager , "expressionOptimizerManager is null" );
88
92
89
- this .metadata = metadata ;
90
93
CatalogSchemaName defaultNamespace = metadata .getFunctionAndTypeManager ().getDefaultNamespace ();
91
94
this .allowedFunctions = ImmutableSet .of (
92
95
QualifiedObjectName .valueOf (defaultNamespace , "max" ),
@@ -104,7 +107,7 @@ public PlanOptimizerResult optimize(PlanNode plan, Session session, TypeProvider
104
107
if (!SystemSessionProperties .isOptimizeMetadataQueries (session ) && !SystemSessionProperties .isOptimizeMetadataQueriesIgnoreStats (session )) {
105
108
return PlanOptimizerResult .optimizerResult (plan , false );
106
109
}
107
- Optimizer optimizer = new Optimizer (session , metadata , idAllocator );
110
+ Optimizer optimizer = new Optimizer (session , metadata , idAllocator , expressionOptimizerManager );
108
111
PlanNode rewrittenPlan = SimplePlanRewriter .rewriteWith (optimizer , plan , null );
109
112
return PlanOptimizerResult .optimizerResult (rewrittenPlan , optimizer .isPlanChanged ());
110
113
}
@@ -130,16 +133,18 @@ private static class Optimizer
130
133
private final int metastoreCallNumThreshold ;
131
134
private boolean planChanged ;
132
135
private final MetadataQueryOptimizer metadataQueryOptimizer ;
136
+ private final ExpressionOptimizerManager expressionOptimizerManager ;
133
137
134
- private Optimizer (Session session , Metadata metadata , PlanNodeIdAllocator idAllocator )
138
+ private Optimizer (Session session , Metadata metadata , PlanNodeIdAllocator idAllocator , ExpressionOptimizerManager expressionOptimizerManager )
135
139
{
136
140
this .session = session ;
137
141
this .metadata = metadata ;
138
142
this .idAllocator = idAllocator ;
139
143
this .determinismEvaluator = new RowExpressionDeterminismEvaluator (metadata );
140
144
this .ignoreMetadataStats = SystemSessionProperties .isOptimizeMetadataQueriesIgnoreStats (session );
141
145
this .metastoreCallNumThreshold = SystemSessionProperties .getOptimizeMetadataQueriesCallThreshold (session );
142
- this .metadataQueryOptimizer = new MetadataQueryOptimizer (metadata );
146
+ this .metadataQueryOptimizer = new MetadataQueryOptimizer (metadata , expressionOptimizerManager );
147
+ this .expressionOptimizerManager = expressionOptimizerManager ;
143
148
}
144
149
145
150
public boolean isPlanChanged ()
@@ -374,15 +379,17 @@ private RowExpression evaluateMinMax(FunctionMetadata aggregationFunctionMetadat
374
379
List <RowExpression > reducedArguments = new ArrayList <>();
375
380
// We fold for every 100 values because GREATEST/LEAST has argument count limit
376
381
for (List <RowExpression > partitionedArguments : Lists .partition (arguments , 100 )) {
377
- Object reducedValue = evaluateConstantRowExpression (
382
+ RowExpression expression = expressionOptimizerManager . getExpressionOptimizer ( connectorSession ). optimize (
378
383
call (
379
384
metadata .getFunctionAndTypeManager (),
380
385
scalarFunctionName ,
381
386
returnType ,
382
387
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 );
386
393
}
387
394
arguments = reducedArguments ;
388
395
}
0 commit comments