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);

Reply via email to