Skip to content

Commit c176c21

Browse files
committed
PredicateWithUncorrelatedScalarSubqueryReconstructor part
1 parent 4478ec5 commit c176c21

File tree

7 files changed

+165
-56
lines changed

7 files changed

+165
-56
lines changed

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/QueryPlanner.java

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,9 @@ public class QueryPlanner {
125125
private final Optional<TranslationMap> outerContext;
126126
private final Map<NodeRef<Node>, RelationPlan> recursiveSubqueries;
127127

128+
private final PredicateWithUncorrelatedScalarSubqueryReconstructor
129+
predicateWithUncorrelatedScalarSubqueryReconstructor;
130+
128131
// private final Map<NodeRef<LambdaArgumentDeclaration>, Symbol> lambdaDeclarationToSymbolMap;
129132
// private final SubqueryPlanner subqueryPlanner;
130133

@@ -134,13 +137,18 @@ public QueryPlanner(
134137
MPPQueryContext queryContext,
135138
Optional<TranslationMap> outerContext,
136139
SessionInfo session,
137-
Map<NodeRef<Node>, RelationPlan> recursiveSubqueries) {
140+
Map<NodeRef<Node>, RelationPlan> recursiveSubqueries,
141+
PredicateWithUncorrelatedScalarSubqueryReconstructor
142+
predicateWithUncorrelatedScalarSubqueryReconstructor) {
138143
requireNonNull(analysis, "analysis is null");
139144
requireNonNull(symbolAllocator, "symbolAllocator is null");
140145
requireNonNull(queryContext, "queryContext is null");
141146
requireNonNull(outerContext, "outerContext is null");
142147
requireNonNull(session, "session is null");
143148
requireNonNull(recursiveSubqueries, "recursiveSubqueries is null");
149+
requireNonNull(
150+
predicateWithUncorrelatedScalarSubqueryReconstructor,
151+
"predicateWithUncorrelatedScalarSubqueryReconstructor is null");
144152

145153
this.analysis = analysis;
146154
this.symbolAllocator = symbolAllocator;
@@ -150,8 +158,16 @@ public QueryPlanner(
150158
this.outerContext = outerContext;
151159
this.subqueryPlanner =
152160
new SubqueryPlanner(
153-
analysis, symbolAllocator, queryContext, outerContext, session, recursiveSubqueries);
161+
analysis,
162+
symbolAllocator,
163+
queryContext,
164+
outerContext,
165+
session,
166+
recursiveSubqueries,
167+
predicateWithUncorrelatedScalarSubqueryReconstructor);
154168
this.recursiveSubqueries = recursiveSubqueries;
169+
this.predicateWithUncorrelatedScalarSubqueryReconstructor =
170+
predicateWithUncorrelatedScalarSubqueryReconstructor;
155171
}
156172

157173
public RelationPlan plan(Query query) {
@@ -297,6 +313,9 @@ public RelationPlan plan(QuerySpecification node) {
297313
builder = limit(builder, node.getLimit(), orderingScheme);
298314

299315
builder = builder.appendProjections(outputs, symbolAllocator, queryContext);
316+
for (Expression expr : expressions) {
317+
predicateWithUncorrelatedScalarSubqueryReconstructor.clearShadowExpression(expr);
318+
}
300319

301320
return new RelationPlan(
302321
builder.getRoot(), analysis.getScope(node), computeOutputs(builder, outputs), outerContext);
@@ -351,6 +370,9 @@ private PlanBuilder planWindowFunctions(
351370

352371
subPlan = subqueryPlanner.handleSubqueries(subPlan, inputs, analysis.getSubqueries(node));
353372
subPlan = subPlan.appendProjections(inputs, symbolAllocator, queryContext);
373+
for (Expression input : inputs) {
374+
predicateWithUncorrelatedScalarSubqueryReconstructor.clearShadowExpression(input);
375+
}
354376

355377
// Add projection to coerce inputs to their site-specific types.
356378
// This is important because the same lexical expression may need to be coerced
@@ -735,7 +757,13 @@ private static List<Symbol> computeOutputs(
735757
private PlanBuilder planQueryBody(QueryBody queryBody) {
736758
RelationPlan relationPlan =
737759
new RelationPlanner(
738-
analysis, symbolAllocator, queryContext, outerContext, session, recursiveSubqueries)
760+
analysis,
761+
symbolAllocator,
762+
queryContext,
763+
outerContext,
764+
session,
765+
recursiveSubqueries,
766+
predicateWithUncorrelatedScalarSubqueryReconstructor)
739767
.process(queryBody, null);
740768

741769
return newPlanBuilder(relationPlan, analysis);
@@ -750,7 +778,8 @@ private PlanBuilder planFrom(QuerySpecification node) {
750778
queryContext,
751779
outerContext,
752780
session,
753-
recursiveSubqueries)
781+
recursiveSubqueries,
782+
predicateWithUncorrelatedScalarSubqueryReconstructor)
754783
.process(node.getFrom().orElse(null), null);
755784
return newPlanBuilder(relationPlan, analysis);
756785
} else {
@@ -768,8 +797,7 @@ private PlanBuilder filter(PlanBuilder subPlan, Expression predicate, Node node)
768797
subPlan.withNewRoot(
769798
new FilterNode(
770799
queryIdAllocator.genPlanNodeId(), subPlan.getRoot(), subPlan.rewrite(predicate)));
771-
PredicateWithUncorrelatedScalarSubqueryReconstructor.getInstance()
772-
.clearShadowExpression(predicate);
800+
predicateWithUncorrelatedScalarSubqueryReconstructor.clearShadowExpression(predicate);
773801
return planBuilder;
774802
}
775803

@@ -806,6 +834,9 @@ private PlanBuilder aggregate(PlanBuilder subPlan, QuerySpecification node) {
806834
List<Expression> inputs = inputBuilder.build();
807835
subPlan = subqueryPlanner.handleSubqueries(subPlan, inputs, analysis.getSubqueries(node));
808836
subPlan = subPlan.appendProjections(inputs, symbolAllocator, queryContext);
837+
for (Expression input : inputs) {
838+
predicateWithUncorrelatedScalarSubqueryReconstructor.clearShadowExpression(input);
839+
}
809840

810841
Function<Expression, Expression> rewrite = subPlan.getTranslations()::rewrite;
811842

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/RelationPlanner.java

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl;
5555
import org.apache.iotdb.db.queryengine.plan.relational.metadata.TreeDeviceViewSchema;
5656
import org.apache.iotdb.db.queryengine.plan.relational.planner.ir.IrUtils;
57+
import org.apache.iotdb.db.queryengine.plan.relational.planner.ir.PredicateWithUncorrelatedScalarSubqueryReconstructor;
5758
import org.apache.iotdb.db.queryengine.plan.relational.planner.node.CteScanNode;
5859
import org.apache.iotdb.db.queryengine.plan.relational.planner.node.DeviceTableScanNode;
5960
import org.apache.iotdb.db.queryengine.plan.relational.planner.node.ExceptNode;
@@ -189,41 +190,58 @@ public class RelationPlanner extends AstVisitor<RelationPlan, Void> {
189190
private final SubqueryPlanner subqueryPlanner;
190191
private final Map<NodeRef<Node>, RelationPlan> recursiveSubqueries;
191192

193+
private final PredicateWithUncorrelatedScalarSubqueryReconstructor
194+
predicateWithUncorrelatedScalarSubqueryReconstructor;
195+
192196
public RelationPlanner(
193197
final Analysis analysis,
194198
final SymbolAllocator symbolAllocator,
195199
final MPPQueryContext queryContext,
196200
final Optional<TranslationMap> outerContext,
197201
final SessionInfo sessionInfo,
198-
final Map<NodeRef<Node>, RelationPlan> recursiveSubqueries) {
202+
final Map<NodeRef<Node>, RelationPlan> recursiveSubqueries,
203+
PredicateWithUncorrelatedScalarSubqueryReconstructor
204+
predicateWithUncorrelatedScalarSubqueryReconstructor) {
199205
requireNonNull(analysis, "analysis is null");
200206
requireNonNull(symbolAllocator, "symbolAllocator is null");
201207
requireNonNull(queryContext, "queryContext is null");
202208
requireNonNull(outerContext, "outerContext is null");
203209
requireNonNull(sessionInfo, "session is null");
204210
requireNonNull(recursiveSubqueries, "recursiveSubqueries is null");
211+
requireNonNull(
212+
predicateWithUncorrelatedScalarSubqueryReconstructor,
213+
"predicateWithUncorrelatedScalarSubqueryReconstructor is null");
205214

206215
this.analysis = analysis;
207216
this.symbolAllocator = symbolAllocator;
208217
this.queryContext = queryContext;
209218
this.idAllocator = queryContext.getQueryId();
210219
this.outerContext = outerContext;
211220
this.sessionInfo = sessionInfo;
221+
this.predicateWithUncorrelatedScalarSubqueryReconstructor =
222+
predicateWithUncorrelatedScalarSubqueryReconstructor;
212223
this.subqueryPlanner =
213224
new SubqueryPlanner(
214225
analysis,
215226
symbolAllocator,
216227
queryContext,
217228
outerContext,
218229
sessionInfo,
219-
recursiveSubqueries);
230+
recursiveSubqueries,
231+
predicateWithUncorrelatedScalarSubqueryReconstructor);
220232
this.recursiveSubqueries = recursiveSubqueries;
221233
}
222234

223235
@Override
224236
protected RelationPlan visitQuery(final Query node, final Void context) {
225237
return new QueryPlanner(
226-
analysis, symbolAllocator, queryContext, outerContext, sessionInfo, recursiveSubqueries)
238+
analysis,
239+
symbolAllocator,
240+
queryContext,
241+
outerContext,
242+
sessionInfo,
243+
recursiveSubqueries,
244+
predicateWithUncorrelatedScalarSubqueryReconstructor)
227245
.plan(node);
228246
}
229247

@@ -384,7 +402,13 @@ private RelationPlan processPhysicalTable(Table table, Scope scope) {
384402
protected RelationPlan visitQuerySpecification(
385403
final QuerySpecification node, final Void context) {
386404
return new QueryPlanner(
387-
analysis, symbolAllocator, queryContext, outerContext, sessionInfo, recursiveSubqueries)
405+
analysis,
406+
symbolAllocator,
407+
queryContext,
408+
outerContext,
409+
sessionInfo,
410+
recursiveSubqueries,
411+
predicateWithUncorrelatedScalarSubqueryReconstructor)
388412
.plan(node);
389413
}
390414

@@ -911,11 +935,10 @@ protected RelationPlan visitPatternRecognitionRelation(
911935
.forEach(outputLayout::add);
912936
}
913937

938+
List<Expression> expressions =
939+
extractPatternRecognitionExpressions(node.getVariableDefinitions(), node.getMeasures());
914940
planBuilder =
915-
subqueryPlanner.handleSubqueries(
916-
planBuilder,
917-
extractPatternRecognitionExpressions(node.getVariableDefinitions(), node.getMeasures()),
918-
analysis.getSubqueries(node));
941+
subqueryPlanner.handleSubqueries(planBuilder, expressions, analysis.getSubqueries(node));
919942

920943
PatternRecognitionComponents components =
921944
planPatternRecognitionComponents(
@@ -928,6 +951,10 @@ protected RelationPlan visitPatternRecognitionRelation(
928951

929952
outputLayout.addAll(components.getMeasureOutputs());
930953

954+
for (Expression expr : expressions) {
955+
predicateWithUncorrelatedScalarSubqueryReconstructor.clearShadowExpression(expr);
956+
}
957+
931958
if (!oneRowOutput) {
932959
Set<Symbol> inputSymbolsOnOutput = ImmutableSet.copyOf(outputLayout.build());
933960
subPlan.getFieldMappings().stream()

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/SubqueryPlanner.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,27 +81,36 @@ class SubqueryPlanner {
8181
private final MPPQueryContext plannerContext;
8282
private final SessionInfo session;
8383
private final Map<NodeRef<Node>, RelationPlan> recursiveSubqueries;
84+
private final PredicateWithUncorrelatedScalarSubqueryReconstructor
85+
predicateWithUncorrelatedScalarSubqueryReconstructor;
8486

8587
SubqueryPlanner(
8688
Analysis analysis,
8789
SymbolAllocator symbolAllocator,
8890
MPPQueryContext plannerContext,
8991
Optional<TranslationMap> outerContext,
9092
SessionInfo session,
91-
Map<NodeRef<Node>, RelationPlan> recursiveSubqueries) {
93+
Map<NodeRef<Node>, RelationPlan> recursiveSubqueries,
94+
PredicateWithUncorrelatedScalarSubqueryReconstructor
95+
predicateWithUncorrelatedScalarSubqueryReconstructor) {
9296
requireNonNull(analysis, "analysis is null");
9397
requireNonNull(symbolAllocator, "symbolAllocator is null");
9498
requireNonNull(plannerContext, "plannerContext is null");
9599
requireNonNull(outerContext, "outerContext is null");
96100
requireNonNull(session, "session is null");
97101
requireNonNull(recursiveSubqueries, "recursiveSubqueries is null");
102+
requireNonNull(
103+
predicateWithUncorrelatedScalarSubqueryReconstructor,
104+
"predicateWithUncorrelatedScalarSubqueryReconstructor is null");
98105

99106
this.analysis = analysis;
100107
this.symbolAllocator = symbolAllocator;
101108
this.idAllocator = plannerContext.getQueryId();
102109
this.plannerContext = plannerContext;
103110
this.session = session;
104111
this.recursiveSubqueries = recursiveSubqueries;
112+
this.predicateWithUncorrelatedScalarSubqueryReconstructor =
113+
predicateWithUncorrelatedScalarSubqueryReconstructor;
105114
}
106115

107116
public PlanBuilder handleSubqueries(
@@ -157,7 +166,7 @@ public PlanBuilder handleSubqueries(
157166

158167
private void tryFoldUncorrelatedScalarSubqueryInPredicate(
159168
Expression expression, MPPQueryContext context) {
160-
PredicateWithUncorrelatedScalarSubqueryReconstructor.getInstance()
169+
predicateWithUncorrelatedScalarSubqueryReconstructor
161170
.reconstructPredicateWithUncorrelatedScalarSubquery(context, analysis, expression);
162171
}
163172

@@ -219,6 +228,7 @@ private PlanBuilder planInPredicate(
219228
subPlan =
220229
planInPredicate(
221230
subPlan, value, subquery, output, predicate, analysis.getPredicateCoercions(predicate));
231+
predicateWithUncorrelatedScalarSubqueryReconstructor.clearShadowExpression(value);
222232

223233
return new PlanBuilder(
224234
subPlan
@@ -355,7 +365,8 @@ private RelationPlan planSubquery(Expression subquery, TranslationMap outerConte
355365
plannerContext,
356366
Optional.of(outerContext),
357367
session,
358-
recursiveSubqueries)
368+
recursiveSubqueries,
369+
predicateWithUncorrelatedScalarSubqueryReconstructor)
359370
.process(subquery, null);
360371
}
361372

@@ -385,6 +396,7 @@ private PlanBuilder planQuantifiedComparison(
385396
subPlan =
386397
planQuantifiedComparison(
387398
subPlan, operator, quantifier, value, subquery, output, predicateCoercions);
399+
predicateWithUncorrelatedScalarSubqueryReconstructor.clearShadowExpression(value);
388400
return new PlanBuilder(
389401
subPlan
390402
.getTranslations()
@@ -399,6 +411,7 @@ private PlanBuilder planQuantifiedComparison(
399411
subPlan =
400412
planInPredicate(
401413
subPlan, value, subquery, output, quantifiedComparison, predicateCoercions);
414+
predicateWithUncorrelatedScalarSubqueryReconstructor.clearShadowExpression(value);
402415
return new PlanBuilder(
403416
subPlan
404417
.getTranslations()

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/TableLogicalPlanner.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import org.apache.iotdb.db.queryengine.plan.relational.metadata.QualifiedObjectName;
5151
import org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl;
5252
import org.apache.iotdb.db.queryengine.plan.relational.metadata.TableSchema;
53+
import org.apache.iotdb.db.queryengine.plan.relational.planner.ir.PredicateWithUncorrelatedScalarSubqueryReconstructor;
5354
import org.apache.iotdb.db.queryengine.plan.relational.planner.node.ExplainAnalyzeNode;
5455
import org.apache.iotdb.db.queryengine.plan.relational.planner.node.FilterNode;
5556
import org.apache.iotdb.db.queryengine.plan.relational.planner.node.IntoNode;
@@ -115,6 +116,9 @@ public class TableLogicalPlanner {
115116
private final Metadata metadata;
116117
private final WarningCollector warningCollector;
117118

119+
private PredicateWithUncorrelatedScalarSubqueryReconstructor
120+
predicateWithUncorrelatedScalarSubqueryReconstructor;
121+
118122
@TestOnly
119123
public TableLogicalPlanner(
120124
MPPQueryContext queryContext,
@@ -145,6 +149,16 @@ public TableLogicalPlanner(
145149
this.symbolAllocator = requireNonNull(symbolAllocator, "symbolAllocator is null");
146150
this.warningCollector = requireNonNull(warningCollector, "warningCollector is null");
147151
this.planOptimizers = planOptimizers;
152+
this.predicateWithUncorrelatedScalarSubqueryReconstructor =
153+
new PredicateWithUncorrelatedScalarSubqueryReconstructor();
154+
}
155+
156+
@TestOnly
157+
public void setPredicateWithUncorrelatedScalarSubqueryReconstructor(
158+
PredicateWithUncorrelatedScalarSubqueryReconstructor
159+
predicateWithUncorrelatedScalarSubqueryReconstructor) {
160+
this.predicateWithUncorrelatedScalarSubqueryReconstructor =
161+
predicateWithUncorrelatedScalarSubqueryReconstructor;
148162
}
149163

150164
public LogicalQueryPlan plan(final Analysis analysis) {
@@ -389,7 +403,13 @@ private RelationPlan createRelationPlan(Analysis analysis, Delete statement) {
389403

390404
private RelationPlanner getRelationPlanner(Analysis analysis) {
391405
return new RelationPlanner(
392-
analysis, symbolAllocator, queryContext, Optional.empty(), sessionInfo, ImmutableMap.of());
406+
analysis,
407+
symbolAllocator,
408+
queryContext,
409+
Optional.empty(),
410+
sessionInfo,
411+
ImmutableMap.of(),
412+
predicateWithUncorrelatedScalarSubqueryReconstructor);
393413
}
394414

395415
private PlanNode planCreateOrUpdateDevice(

0 commit comments

Comments
 (0)