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() {