This is an automated email from the ASF dual-hosted git repository. caogaofei pushed a commit to branch ty/TableModelGrammar in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit c818ecda1afa85d252daad3a98307bbfaf115889 Author: Beyyes <[email protected]> AuthorDate: Tue Apr 16 09:25:22 2024 +0800 add optimizer --- .../plan/relational/planner/PlanBuilder.java | 37 +++++++++++++--------- .../plan/relational/planner/QueryPlanner.java | 26 +++++++++------ .../distribute/RelationalDistributionPlanner.java | 3 ++ .../IndexScan.java} | 19 ++++------- .../RemoveRedundantIdentityProjections.java | 1 + .../plan/relational/analyzer/AnalyzerTest.java | 5 ++- 6 files changed, 52 insertions(+), 39 deletions(-) diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PlanBuilder.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PlanBuilder.java index a34e17dbf85..49f93ed3e66 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PlanBuilder.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PlanBuilder.java @@ -24,8 +24,10 @@ import org.apache.iotdb.db.relational.sql.tree.Expression; import com.google.common.collect.ImmutableMap; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import static java.util.Objects.requireNonNull; @@ -65,26 +67,31 @@ public class PlanBuilder { } public <T extends Expression> PlanBuilder appendProjections( - Iterable<T> expressions, SymbolAllocator symbolAllocator, QueryId idAllocator) { + Iterable<T> expressions, + Analysis analysis, + SymbolAllocator symbolAllocator, + QueryId idAllocator) { Assignments.Builder projections = Assignments.builder(); // add an identity projection for underlying plan projections.putIdentities(root.getOutputSymbols()); - Map<ScopeAware<Expression>, Symbol> mappings = new HashMap<>(); - // for (T expression : expressions) { - // // Skip any expressions that have already been translated and recorded in the - // translation map, or that are duplicated in the list of exp - // if (!mappings.containsKey(scopeAwareKey(expression, translations.getAnalysis(), - // translations.getScope())) && !alreadyHasTranslation.test(translations, - // expression)) { - // Symbol symbol = symbolAllocator.newSymbol("expr", - // translations.getAnalysis().getType(expression)); - // projections.put(symbol, rewriter.apply(translations, expression)); - // mappings.put(scopeAwareKey(expression, translations.getAnalysis(), - // translations.getScope()), symbol); - // } - // } + Set<String> set = new HashSet<>(); + for (Symbol symbol : root.getOutputSymbols()) { + set.add(symbol.toString()); + } + + Map<Expression, Symbol> mappings = new HashMap<>(); + for (T expression : expressions) { + // Skip any expressions that have already been translated and recorded in the + // translation map, or that are duplicated in the list of exp + if (!mappings.containsKey(expression) && !set.contains(expression.toString())) { + set.add(expression.toString()); + Symbol symbol = symbolAllocator.newSymbol("expr", analysis.getType(expression)); + projections.put(symbol, expression); + mappings.put(expression, symbol); + } + } return new PlanBuilder(new ProjectNode(idAllocator.genPlanNodeId(), root, projections.build())); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/QueryPlanner.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/QueryPlanner.java index 768cd3ca4b5..c92fbdaa66c 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/QueryPlanner.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/QueryPlanner.java @@ -83,21 +83,25 @@ public class QueryPlanner { List<Expression> orderBy = analysis.getOrderByExpressions(query); // builder = subqueryPlanner.handleSubqueries(builder, orderBy, analysis.getSubqueries(query)); + // TODO result is :input[0], :input[1], :input[2] List<Analysis.SelectExpression> selectExpressions = analysis.getSelectExpressions(query); List<Expression> outputs = selectExpressions.stream() .map(Analysis.SelectExpression::getExpression) .collect(toImmutableList()); - builder = - builder.appendProjections(Iterables.concat(orderBy, outputs), symbolAllocator, idAllocator); + if (orderBy.size() > 0) { + builder = + builder.appendProjections( + Iterables.concat(orderBy, outputs), analysis, symbolAllocator, idAllocator); + } Optional<OrderingScheme> orderingScheme = orderingScheme(builder, query.getOrderBy(), analysis.getOrderByExpressions(query)); builder = sort(builder, orderingScheme); builder = offset(builder, query.getOffset()); builder = limit(builder, query.getLimit(), orderingScheme); - builder = builder.appendProjections(outputs, symbolAllocator, idAllocator); + builder = builder.appendProjections(outputs, analysis, symbolAllocator, idAllocator); return new RelationPlan( builder.getRoot(), analysis.getScope(query), computeOutputs(builder, outputs)); @@ -121,7 +125,7 @@ public class QueryPlanner { if (hasExpressionsToUnfold(selectExpressions)) { // pre-project the folded expressions to preserve any non-deterministic semantics of functions // that might be referenced - builder = builder.appendProjections(expressions, symbolAllocator, idAllocator); + builder = builder.appendProjections(expressions, analysis, symbolAllocator, idAllocator); } List<Expression> outputs = outputExpressions(selectExpressions); @@ -133,13 +137,14 @@ public class QueryPlanner { // translated // aggregations are visible. List<Expression> orderByAggregates = analysis.getOrderByAggregates(node.getOrderBy().get()); - builder = builder.appendProjections(orderByAggregates, symbolAllocator, idAllocator); + builder = + builder.appendProjections(orderByAggregates, analysis, symbolAllocator, idAllocator); } // Add projections for the outputs of SELECT, but stack them on top of the ones from the FROM // clause so both are visible // when resolving the ORDER BY clause. - builder = builder.appendProjections(outputs, symbolAllocator, idAllocator); + builder = builder.appendProjections(outputs, analysis, symbolAllocator, idAllocator); // The new scope is the composite of the fields from the FROM and SELECT clause (local nested // scopes). Fields from the bottom of @@ -156,8 +161,11 @@ public class QueryPlanner { List<Expression> orderBy = analysis.getOrderByExpressions(node); // TODO this appendProjections may be removed - builder = - builder.appendProjections(Iterables.concat(orderBy, outputs), symbolAllocator, idAllocator); + if (orderBy.size() > 0) { + builder = + builder.appendProjections( + Iterables.concat(orderBy, outputs), analysis, symbolAllocator, idAllocator); + } // TODO handle distinct @@ -166,7 +174,7 @@ public class QueryPlanner { builder = sort(builder, orderingScheme); builder = offset(builder, node.getOffset()); builder = limit(builder, node.getLimit(), orderingScheme); - builder = builder.appendProjections(outputs, symbolAllocator, idAllocator); + builder = builder.appendProjections(outputs, analysis, symbolAllocator, idAllocator); return new RelationPlan( builder.getRoot(), analysis.getScope(node), computeOutputs(builder, outputs)); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/RelationalDistributionPlanner.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/RelationalDistributionPlanner.java index 0c85ad78cde..de946fb8c33 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/RelationalDistributionPlanner.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/RelationalDistributionPlanner.java @@ -13,6 +13,7 @@ */ package org.apache.iotdb.db.queryengine.plan.relational.planner.distribute; +import org.apache.iotdb.db.queryengine.common.MPPQueryContext; import org.apache.iotdb.db.queryengine.plan.planner.plan.DistributedQueryPlan; import org.apache.iotdb.db.queryengine.plan.planner.plan.LogicalQueryPlan; import org.apache.iotdb.db.queryengine.plan.relational.analyzer.Analysis; @@ -20,10 +21,12 @@ import org.apache.iotdb.db.queryengine.plan.relational.analyzer.Analysis; public class RelationalDistributionPlanner { private final Analysis analysis; private final LogicalQueryPlan logicalQueryPlan; + private final MPPQueryContext context; public RelationalDistributionPlanner(Analysis analysis, LogicalQueryPlan logicalQueryPlan) { this.analysis = analysis; this.logicalQueryPlan = logicalQueryPlan; + this.context = null; } public DistributedQueryPlan planFragments() { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/RelationalDistributionPlanner.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/IndexScan.java similarity index 58% copy from iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/RelationalDistributionPlanner.java copy to iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/IndexScan.java index 0c85ad78cde..21a54da4e73 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/RelationalDistributionPlanner.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/IndexScan.java @@ -11,22 +11,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.iotdb.db.queryengine.plan.relational.planner.distribute; -import org.apache.iotdb.db.queryengine.plan.planner.plan.DistributedQueryPlan; -import org.apache.iotdb.db.queryengine.plan.planner.plan.LogicalQueryPlan; -import org.apache.iotdb.db.queryengine.plan.relational.analyzer.Analysis; +package org.apache.iotdb.db.queryengine.plan.relational.planner.optimizations; -public class RelationalDistributionPlanner { - private final Analysis analysis; - private final LogicalQueryPlan logicalQueryPlan; +import org.apache.iotdb.db.queryengine.common.MPPQueryContext; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode; +import org.apache.iotdb.db.queryengine.plan.relational.analyzer.Analysis; - public RelationalDistributionPlanner(Analysis analysis, LogicalQueryPlan logicalQueryPlan) { - this.analysis = analysis; - this.logicalQueryPlan = logicalQueryPlan; - } +public class IndexScan implements RelationalPlanOptimizer { - public DistributedQueryPlan planFragments() { + @Override + public PlanNode optimize(PlanNode planNode, Analysis analysis, MPPQueryContext context) { return null; } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/RemoveRedundantIdentityProjections.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/RemoveRedundantIdentityProjections.java index d7366dfe9df..34da737fd93 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/RemoveRedundantIdentityProjections.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/RemoveRedundantIdentityProjections.java @@ -45,6 +45,7 @@ public class RemoveRedundantIdentityProjections implements RelationalPlanOptimiz @Override public PlanNode visitProject(ProjectNode projectNode, RewriterContext context) { + // TODO change the impl using the method of context.getParent() if (projectNode.getOutputSymbols().equals(projectNode.getChild().getOutputSymbols())) { if (context.getParent() instanceof SingleChildProcessNode) { ((SingleChildProcessNode) context.getParent()).setChild(projectNode.getChild()); diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java index 143bd906fbe..ca45289fae1 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java @@ -135,9 +135,8 @@ public class AnalyzerTest { @Test public void testSingleTableQuery() throws IoTDBException { // no sort - String sql = - "SELECT tag1 as tt, tag2, attr1, s1+1 FROM table1 " - + "WHERE time>1 AND tag1='A' OR s2>3 OFFSET 10 LIMIT 5"; + String sql = "SELECT tag1 as tt, tag2, attr1, s1+1 FROM table1 "; + // + "WHERE time>1 AND tag1='A' OR s2>3"; Metadata metadata = new TestMatadata(); Analysis actualAnalysis = analyzeSQL(sql, metadata);
