This is an automated email from the ASF dual-hosted git repository.

jackietien pushed a commit to branch ty/TableModelGrammar
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/ty/TableModelGrammar by this 
push:
     new b778b0f97d4 Fix cnf problem and output node column index
b778b0f97d4 is described below

commit b778b0f97d458e8adfc4a3e72c23d7d7f3fd8cb1
Author: Beyyes <[email protected]>
AuthorDate: Wed Jul 31 10:46:08 2024 +0800

    Fix cnf problem and output node column index
---
 .../alignbydevice/IoTDBAlignByDeviceTableIT.java   | 42 +++++++++++++++++++
 .../queryengine/common/header/DatasetHeader.java   | 18 ++++++++
 .../plan/planner/TableOperatorGenerator.java       | 27 +-----------
 .../planner/distribution/DistributionPlanner.java  |  3 +-
 .../plan/planner/plan/DistributedQueryPlan.java    | 20 +++------
 .../PredicateCombineIntoTableScanChecker.java      |  3 +-
 .../PredicatePushIntoMetadataChecker.java          |  3 +-
 .../distribute/TableDistributedPlanner.java        | 49 ++++++++++++----------
 .../optimizations/PushPredicateIntoTableScan.java  |  6 +--
 .../plan/relational/analyzer/AnalyzerTest.java     | 45 ++++++++++++++++----
 10 files changed, 135 insertions(+), 81 deletions(-)

diff --git 
a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceTableIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceTableIT.java
index 952def9147e..f09183f5032 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceTableIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceTableIT.java
@@ -288,6 +288,48 @@ public class IoTDBAlignByDeviceTableIT {
         DATABASE_NAME);
   }
 
+  @Test
+  public void predicateCannotNormalizedTest() {
+    String[] expectedHeader = new String[] {"time", "device_id", "s0", "s1", 
"s2"};
+    String[] retArray =
+        new String[] {
+          "1970-01-01T00:00:00.001Z,d0,101,1101,null,",
+          "1970-01-01T00:00:00.002Z,d0,10000,40000,2.22,",
+          "1970-01-01T00:00:00.050Z,d0,10000,50000,null,",
+          "1970-01-01T00:00:00.100Z,d0,99,199,null,",
+          "1970-01-01T00:00:00.101Z,d0,99,199,null,",
+          "1970-01-01T00:00:00.103Z,d0,99,199,null,",
+          "1970-01-01T00:00:00.105Z,d0,99,199,11.11,",
+          "1970-01-01T00:00:01.000Z,d0,22222,55555,1000.11,",
+        };
+    tableResultSetEqualTest(
+        "select time, device_id, s0,s1,s2 from vehicle where (((\"time\" > 10) 
AND (\"s1\" > 190)) OR (\"s2\" > 190.0) OR ((\"time\" < 4) AND (\"s1\" > 100))) 
order by device_id, time",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
+  }
+
+  @Test
+  public void duplicateProjectionsTest() {
+    String[] expectedHeader = new String[] {"Time", "device_id", "_col2", 
"_col3", "alias"};
+    String[] retArray =
+        new String[] {
+          "1970-01-01T00:00:00.001Z,d0,1102.0,1102.0,1102.0,",
+          "1970-01-01T00:00:00.002Z,d0,40001.0,40001.0,40001.0,",
+          "1970-01-01T00:00:00.050Z,d0,50001.0,50001.0,50001.0,",
+          "1970-01-01T00:00:00.100Z,d0,200.0,200.0,200.0,",
+          "1970-01-01T00:00:00.101Z,d0,200.0,200.0,200.0,",
+          "1970-01-01T00:00:00.103Z,d0,200.0,200.0,200.0,",
+          "1970-01-01T00:00:00.105Z,d0,200.0,200.0,200.0,",
+          "1970-01-01T00:00:01.000Z,d0,55556.0,55556.0,55556.0,",
+        };
+    tableResultSetEqualTest(
+        "select Time, device_id, s1+1, s1+1, s1+1 as alias from vehicle where 
(((\"time\" > 10) AND (\"s1\" > 190)) OR (\"s2\" > 190.0) OR ((\"time\" < 4) 
AND (\"s1\" > 100))) order by device_id, time",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
+  }
+
   //
   //  @Test
   //  public void aggregateTest() {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/header/DatasetHeader.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/header/DatasetHeader.java
index 312645b1c03..9f263da4904 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/header/DatasetHeader.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/header/DatasetHeader.java
@@ -19,6 +19,9 @@
 
 package org.apache.iotdb.db.queryengine.common.header;
 
+import org.apache.iotdb.db.queryengine.plan.relational.planner.Symbol;
+import org.apache.iotdb.db.queryengine.plan.relational.planner.node.OutputNode;
+
 import com.google.common.primitives.Bytes;
 import org.apache.tsfile.enums.TSDataType;
 
@@ -72,6 +75,21 @@ public class DatasetHeader {
     }
   }
 
+  public void setTableColumnToTsBlockIndexMap(OutputNode outputNode) {
+    List<Symbol> outputSymbols = outputNode.getChild().getOutputSymbols();
+    Map<Symbol, Integer> outputSymbolsIndexMap = new 
HashMap<>(outputSymbols.size());
+    for (int i = 0; i < outputSymbols.size(); i++) {
+      outputSymbolsIndexMap.put(outputSymbols.get(i), i);
+    }
+
+    this.columnToTsBlockIndexMap = new HashMap<>();
+    for (int i = 0; i < outputNode.getOutputColumnNames().size(); i++) {
+      columnToTsBlockIndexMap.put(
+          outputNode.getOutputColumnNames().get(i),
+          outputSymbolsIndexMap.get(outputNode.getOutputSymbols().get(i)));
+    }
+  }
+
   public List<String> getRespColumns() {
     if (respColumns == null) {
       respColumns = new ArrayList<>();
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java
index f0eba711d0c..4e98c208fa0 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java
@@ -521,32 +521,7 @@ public class TableOperatorGenerator extends 
PlanVisitor<Operator, LocalExecution
 
   @Override
   public Operator visitOutput(OutputNode node, LocalExecutionPlanContext 
context) {
-    TypeProvider typeProvider = context.getTypeProvider();
-    Optional<Expression> predicate;
-    Operator inputOperator;
-    List<TSDataType> inputDataTypes;
-    Map<Symbol, List<InputLocation>> inputLocations;
-    if (node.getChild() instanceof FilterNode) {
-      FilterNode filterNode = (FilterNode) node.getChild();
-      predicate = Optional.of(filterNode.getPredicate());
-      inputOperator = filterNode.getChild().accept(this, context);
-      inputDataTypes = getInputColumnTypes(filterNode, typeProvider);
-      inputLocations = makeLayout(filterNode.getChildren());
-    } else {
-      predicate = Optional.empty();
-      inputOperator = node.getChild().accept(this, context);
-      inputDataTypes = getInputColumnTypes(node, typeProvider);
-      inputLocations = makeLayout(node.getChildren());
-    }
-
-    return constructFilterAndProjectOperator(
-        predicate,
-        inputOperator,
-        
node.getOutputSymbols().stream().map(Symbol::toSymbolReference).toArray(Expression[]::new),
-        inputDataTypes,
-        inputLocations,
-        node.getPlanNodeId(),
-        context);
+    return node.getChild().accept(this, context);
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/DistributionPlanner.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/DistributionPlanner.java
index dd0974ac635..2fd9ee783a7 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/DistributionPlanner.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/DistributionPlanner.java
@@ -218,8 +218,7 @@ public class DistributionPlanner {
       setSinkForRootInstance(subPlan, fragmentInstances);
     }
 
-    return new DistributedQueryPlan(
-        logicalPlan.getContext(), subPlan, subPlan.getPlanFragmentList(), 
fragmentInstances);
+    return new DistributedQueryPlan(subPlan, fragmentInstances);
   }
 
   // Convert fragment to detailed instance
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/DistributedQueryPlan.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/DistributedQueryPlan.java
index cedc99669a7..0a9135ff9f3 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/DistributedQueryPlan.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/DistributedQueryPlan.java
@@ -18,39 +18,29 @@
  */
 package org.apache.iotdb.db.queryengine.plan.planner.plan;
 
-import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
+import org.apache.iotdb.commons.utils.TestOnly;
 
 import java.util.List;
+import java.util.stream.Collectors;
 
 public class DistributedQueryPlan {
-  private final MPPQueryContext context;
   private final SubPlan rootSubPlan;
-  private final List<PlanFragment> fragments;
   private final List<FragmentInstance> instances;
 
-  public DistributedQueryPlan(
-      MPPQueryContext context,
-      SubPlan rootSubPlan,
-      List<PlanFragment> fragments,
-      List<FragmentInstance> instances) {
-    this.context = context;
+  public DistributedQueryPlan(SubPlan rootSubPlan, List<FragmentInstance> 
instances) {
     this.rootSubPlan = rootSubPlan;
-    this.fragments = fragments;
     this.instances = instances;
   }
 
+  @TestOnly
   public List<PlanFragment> getFragments() {
-    return fragments;
+    return 
instances.stream().map(FragmentInstance::getFragment).collect(Collectors.toList());
   }
 
   public SubPlan getRootSubPlan() {
     return rootSubPlan;
   }
 
-  public MPPQueryContext getContext() {
-    return context;
-  }
-
   public List<FragmentInstance> getInstances() {
     return instances;
   }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/PredicateCombineIntoTableScanChecker.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/PredicateCombineIntoTableScanChecker.java
index 755c0217507..91ce64398ef 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/PredicateCombineIntoTableScanChecker.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/PredicateCombineIntoTableScanChecker.java
@@ -82,8 +82,7 @@ public class PredicateCombineIntoTableScanChecker extends 
PredicateVisitor<Boole
   @Override
   protected Boolean visitLogicalExpression(LogicalExpression node, Void 
context) {
     if (node.getOperator() == LogicalExpression.Operator.AND) {
-      throw new IllegalStateException(
-          "Shouldn't have AND operator in 
PredicateCombineIntoTableScanChecker.");
+      return false;
     }
 
     List<Expression> children = node.getTerms();
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/PredicatePushIntoMetadataChecker.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/PredicatePushIntoMetadataChecker.java
index ce2abed5127..7c9c066b2d1 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/PredicatePushIntoMetadataChecker.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/PredicatePushIntoMetadataChecker.java
@@ -85,8 +85,7 @@ public class PredicatePushIntoMetadataChecker extends 
PredicateVisitor<Boolean,
   @Override
   protected Boolean visitLogicalExpression(LogicalExpression node, Void 
context) {
     if (node.getOperator() == LogicalExpression.Operator.AND) {
-      throw new IllegalStateException(
-          "Shouldn't have AND operator in PredicatePushIntoMetadataChecker.");
+      return false;
     }
     List<Expression> children = node.getTerms();
     for (Expression child : children) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributedPlanner.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributedPlanner.java
index 51e53ef093e..bc6426f8b35 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributedPlanner.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributedPlanner.java
@@ -34,6 +34,7 @@ import 
org.apache.iotdb.db.queryengine.plan.relational.planner.iterative.Iterati
 import 
org.apache.iotdb.db.queryengine.plan.relational.planner.iterative.RuleStatsRecorder;
 import 
org.apache.iotdb.db.queryengine.plan.relational.planner.iterative.rule.MergeLimitOverProjectWithMergeSort;
 import 
org.apache.iotdb.db.queryengine.plan.relational.planner.iterative.rule.MergeLimitWithMergeSort;
+import org.apache.iotdb.db.queryengine.plan.relational.planner.node.OutputNode;
 import 
org.apache.iotdb.db.queryengine.plan.relational.planner.optimizations.PlanOptimizer;
 import 
org.apache.iotdb.db.queryengine.plan.relational.planner.optimizations.SortElimination;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Query;
@@ -76,34 +77,15 @@ public class TableDistributedPlanner {
     TableDistributedPlanGenerator.PlanContext planContext =
         new TableDistributedPlanGenerator.PlanContext();
     PlanNode outputNodeWithExchange = 
generateDistributedPlanWithOptimize(planContext);
+
     if (analysis.getStatement() instanceof Query) {
       analysis
           .getRespDatasetHeader()
-          
.setColumnToTsBlockIndexMap(outputNodeWithExchange.getOutputColumnNames());
+          .setTableColumnToTsBlockIndexMap((OutputNode) 
outputNodeWithExchange);
     }
     adjustUpStream(outputNodeWithExchange, planContext);
 
-    // generate subPlan
-    SubPlan subPlan =
-        new SubPlanGenerator()
-            .splitToSubPlan(logicalQueryPlan.getContext().getQueryId(), 
outputNodeWithExchange);
-    subPlan.getPlanFragment().setRoot(true);
-
-    // generate fragment instances
-    List<FragmentInstance> fragmentInstances =
-        mppQueryContext.getQueryType() == QueryType.READ
-            ? new TableModelQueryFragmentPlanner(subPlan, analysis, 
mppQueryContext).plan()
-            : new WriteFragmentParallelPlanner(
-                    subPlan, analysis, mppQueryContext, 
WritePlanNode::splitByPartition)
-                .parallelPlan();
-
-    // only execute this step for READ operation
-    if (mppQueryContext.getQueryType() == QueryType.READ) {
-      setSinkForRootInstance(subPlan, fragmentInstances);
-    }
-
-    return new DistributedQueryPlan(
-        logicalQueryPlan.getContext(), subPlan, subPlan.getPlanFragmentList(), 
fragmentInstances);
+    return generateDistributedPlan(outputNodeWithExchange);
   }
 
   public PlanNode generateDistributedPlanWithOptimize(
@@ -140,6 +122,29 @@ public class TableDistributedPlanner {
     return new 
AddExchangeNodes(mppQueryContext).addExchangeNodes(distributedPlan, 
planContext);
   }
 
+  private DistributedQueryPlan generateDistributedPlan(PlanNode 
outputNodeWithExchange) {
+    // generate subPlan
+    SubPlan subPlan =
+        new SubPlanGenerator()
+            .splitToSubPlan(logicalQueryPlan.getContext().getQueryId(), 
outputNodeWithExchange);
+    subPlan.getPlanFragment().setRoot(true);
+
+    // generate fragment instances
+    List<FragmentInstance> fragmentInstances =
+        mppQueryContext.getQueryType() == QueryType.READ
+            ? new TableModelQueryFragmentPlanner(subPlan, analysis, 
mppQueryContext).plan()
+            : new WriteFragmentParallelPlanner(
+                    subPlan, analysis, mppQueryContext, 
WritePlanNode::splitByPartition)
+                .parallelPlan();
+
+    // only execute this step for READ operation
+    if (mppQueryContext.getQueryType() == QueryType.READ) {
+      setSinkForRootInstance(subPlan, fragmentInstances);
+    }
+
+    return new DistributedQueryPlan(subPlan, fragmentInstances);
+  }
+
   public void setSinkForRootInstance(SubPlan subPlan, List<FragmentInstance> 
instances) {
     FragmentInstance rootInstance = null;
     for (FragmentInstance instance : instances) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushPredicateIntoTableScan.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushPredicateIntoTableScan.java
index 4d4c6152493..0fc783013ce 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushPredicateIntoTableScan.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushPredicateIntoTableScan.java
@@ -129,14 +129,14 @@ public class PushPredicateIntoTableScan implements 
PlanOptimizer {
 
       if (node.getPredicate() != null) {
 
+        predicate = node.getPredicate();
+
         // when exist diff function, predicate can not be pushed down into 
TableScanNode
-        if (containsDiffFunction(node.getPredicate())) {
+        if (containsDiffFunction(predicate)) {
           node.setChild(node.getChild().accept(this, context));
           return node;
         }
 
-        predicate = node.getPredicate();
-
         if (node.getChild() instanceof TableScanNode) {
           // child of FilterNode is TableScanNode, means FilterNode must get 
from where clause
           return combineFilterAndScan((TableScanNode) node.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 50dab345fe0..26c726f39ed 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
@@ -117,6 +117,7 @@ public class AnalyzerTest {
           "db",
           IClientSession.SqlDialect.TABLE);
   Metadata metadata = new TestMatadata();
+  WarningCollector warningCollector = NOOP;
   String sql;
   Analysis actualAnalysis;
   MPPQueryContext context;
@@ -777,8 +778,7 @@ public class AnalyzerTest {
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
     actualAnalysis = analyzeSQL(sql, metadata);
     logicalQueryPlan =
-        new LogicalPlanner(context, metadata, sessionInfo, 
WarningCollector.NOOP)
-            .plan(actualAnalysis);
+        new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
     rootNode = logicalQueryPlan.getRootNode();
     assertTrue(rootNode.getChildren().get(0) instanceof OffsetNode);
     OffsetNode offsetNode = (OffsetNode) rootNode.getChildren().get(0);
@@ -792,8 +792,7 @@ public class AnalyzerTest {
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
     actualAnalysis = analyzeSQL(sql, metadata);
     logicalQueryPlan =
-        new LogicalPlanner(context, metadata, sessionInfo, 
WarningCollector.NOOP)
-            .plan(actualAnalysis);
+        new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
     rootNode = logicalQueryPlan.getRootNode();
     assertTrue(rootNode.getChildren().get(0) instanceof ProjectNode);
     assertTrue(getChildrenNode(rootNode, 2) instanceof OffsetNode);
@@ -804,15 +803,43 @@ public class AnalyzerTest {
   }
 
   @Test
-  public void sortTest() {
-    // when TableScan locates multi regions, use default MergeSortNode
-    sql = "SELECT * FROM table1 ";
+  public void predicateCannotNormalizedTest() {
+    sql = "SELECT * FROM table1 where (time > 1 and s1 > 1 or s2 < 7) or (time 
< 10 and s1 > 4)";
     context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
     actualAnalysis = analyzeSQL(sql, metadata);
     logicalQueryPlan =
-        new LogicalPlanner(context, metadata, sessionInfo, 
WarningCollector.NOOP)
-            .plan(actualAnalysis);
+        new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
     rootNode = logicalQueryPlan.getRootNode();
+    assertTrue(rootNode instanceof OutputNode);
+    assertTrue(getChildrenNode(rootNode, 1) instanceof FilterNode);
+    assertEquals(
+        "(((\"time\" > 1) AND (\"s1\" > 1)) OR (\"s2\" < 7) OR ((\"time\" < 
10) AND (\"s1\" > 4)))",
+        ((FilterNode) getChildrenNode(rootNode, 1)).getPredicate().toString());
+    assertTrue(getChildrenNode(rootNode, 2) instanceof TableScanNode);
+  }
+
+  @Test
+  public void duplicateProjectionsTest() {
+    sql = "SELECT Time,time,s1+1,S1+1,tag1,TAG1 FROM table1";
+    context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
+    actualAnalysis = analyzeSQL(sql, metadata);
+    logicalQueryPlan =
+        new LogicalPlanner(context, metadata, sessionInfo, 
warningCollector).plan(actualAnalysis);
+    rootNode = logicalQueryPlan.getRootNode();
+    distributionPlanner = new TableDistributedPlanner(actualAnalysis, 
logicalQueryPlan, context);
+    distributedQueryPlan = distributionPlanner.plan();
+    assertEquals(
+        0, 
actualAnalysis.getRespDatasetHeader().getColumnNameIndexMap().get("Time").intValue());
+    assertEquals(
+        0, 
actualAnalysis.getRespDatasetHeader().getColumnNameIndexMap().get("time").intValue());
+    assertEquals(
+        2, 
actualAnalysis.getRespDatasetHeader().getColumnNameIndexMap().get("_col2").intValue());
+    assertEquals(
+        2, 
actualAnalysis.getRespDatasetHeader().getColumnNameIndexMap().get("_col3").intValue());
+    assertEquals(
+        1, 
actualAnalysis.getRespDatasetHeader().getColumnNameIndexMap().get("tag1").intValue());
+    assertEquals(
+        1, 
actualAnalysis.getRespDatasetHeader().getColumnNameIndexMap().get("TAG1").intValue());
   }
 
   private Metadata mockMetadataForInsertion() {

Reply via email to