This is an automated email from the ASF dual-hosted git repository.
zyk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new 743c5fd1e9 [IOTDB-4272]Fix count timeseries with template (#7174)
743c5fd1e9 is described below
commit 743c5fd1e9e490cadebf550cc3e9e31eb120f163
Author: Marcos_Zyk <[email protected]>
AuthorDate: Wed Aug 31 08:40:05 2022 +0800
[IOTDB-4272]Fix count timeseries with template (#7174)
[IOTDB-4272]Fix count timeseries with template (#7174)
---
.../iotdb/db/it/schema/IoTDBSchemaTemplateIT.java | 28 ++++++++++++----
.../schemaregion/rocksdb/RSchemaRegion.java | 7 ++++
.../db/metadata/mtree/MTreeBelowSGMemoryImpl.java | 10 ++++++
.../db/metadata/schemaregion/ISchemaRegion.java | 4 +++
.../schemaregion/SchemaRegionMemoryImpl.java | 7 ++++
.../schemaregion/SchemaRegionSchemaFileImpl.java | 7 ++++
.../operator/schema/TimeSeriesCountOperator.java | 9 ++++--
.../iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java | 14 +++++---
.../config/executor/ClusterConfigTaskExecutor.java | 2 +-
.../executor/StandaloneConfigTaskExecutor.java | 2 +-
.../db/mpp/plan/planner/LogicalPlanBuilder.java | 15 +++++++--
.../db/mpp/plan/planner/LogicalPlanVisitor.java | 11 ++++---
.../db/mpp/plan/planner/OperatorTreeGenerator.java | 3 +-
.../node/metedata/read/TimeSeriesCountNode.java | 37 ++++++++++++++++++++--
.../plan/statement/metadata/CountStatement.java | 16 +++++-----
.../mpp/execution/operator/OperatorMemoryTest.java | 3 +-
.../operator/schema/CountMergeOperatorTest.java | 7 ++--
.../operator/schema/SchemaCountOperatorTest.java | 7 ++--
18 files changed, 150 insertions(+), 39 deletions(-)
diff --git
a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBSchemaTemplateIT.java
b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBSchemaTemplateIT.java
index c430152578..180622956d 100644
---
a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBSchemaTemplateIT.java
+++
b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBSchemaTemplateIT.java
@@ -119,6 +119,11 @@ public class IoTDBSchemaTemplateIT {
}
Assert.assertTrue(expectedResult.isEmpty());
+ try (ResultSet resultSet = statement.executeQuery("COUNT TIMESERIES
root.sg1.**")) {
+ resultSet.next();
+ Assert.assertEquals(4, resultSet.getInt(1));
+ }
+
expectedResult = new HashSet<>(Arrays.asList("root.sg1.d1,false",
"root.sg1.d2,true"));
try (ResultSet resultSet = statement.executeQuery("SHOW DEVICES")) {
@@ -184,6 +189,11 @@ public class IoTDBSchemaTemplateIT {
}
Assert.assertTrue(expectedResult.isEmpty());
+ try (ResultSet resultSet = statement.executeQuery("COUNT TIMESERIES
root.sg1.**")) {
+ resultSet.next();
+ Assert.assertEquals(4, resultSet.getInt(1));
+ }
+
expectedResult = new HashSet<>(Arrays.asList("root.sg1.d1,false",
"root.sg1.d2,true"));
try (ResultSet resultSet = statement.executeQuery("SHOW DEVICES")) {
@@ -271,9 +281,11 @@ public class IoTDBSchemaTemplateIT {
new String[] {"root.sg1.d1", "root.sg2.d2", "root.sg1.d2",
"root.sg2.d1"};
Set<String> expectedResultSet = new
HashSet<>(Arrays.asList(expectedResult));
try (ResultSet resultSet = statement.executeQuery("SHOW PATHS SET SCHEMA
TEMPLATE t1")) {
+ String resultRecord;
while (resultSet.next()) {
-
Assert.assertTrue(expectedResultSet.contains(resultSet.getString("paths")));
- expectedResultSet.remove(resultSet.getString("paths"));
+ resultRecord = resultSet.getString(1);
+ Assert.assertTrue(expectedResultSet.contains(resultRecord));
+ expectedResultSet.remove(resultRecord);
}
}
Assert.assertEquals(0, expectedResultSet.size());
@@ -281,9 +293,11 @@ public class IoTDBSchemaTemplateIT {
expectedResult = new String[] {"root.sg3.d1", "root.sg3.d2"};
expectedResultSet = new HashSet<>(Arrays.asList(expectedResult));
try (ResultSet resultSet = statement.executeQuery("SHOW PATHS SET SCHEMA
TEMPLATE t2")) {
+ String resultRecord;
while (resultSet.next()) {
-
Assert.assertTrue(expectedResultSet.contains(resultSet.getString("paths")));
- expectedResultSet.remove(resultSet.getString("paths"));
+ resultRecord = resultSet.getString(1);
+ Assert.assertTrue(expectedResultSet.contains(resultRecord));
+ expectedResultSet.remove(resultRecord);
}
}
Assert.assertEquals(0, expectedResultSet.size());
@@ -291,9 +305,11 @@ public class IoTDBSchemaTemplateIT {
expectedResult = new String[] {"root.sg1.d2", "root.sg2.d1"};
expectedResultSet = new HashSet<>(Arrays.asList(expectedResult));
try (ResultSet resultSet = statement.executeQuery("SHOW PATHS USING SCHEMA
TEMPLATE t1")) {
+ String resultRecord;
while (resultSet.next()) {
-
Assert.assertTrue(expectedResultSet.contains(resultSet.getString("paths")));
- expectedResultSet.remove(resultSet.getString("paths"));
+ resultRecord = resultSet.getString(1);
+ Assert.assertTrue(expectedResultSet.contains(resultRecord));
+ expectedResultSet.remove(resultRecord);
}
}
Assert.assertEquals(0, expectedResultSet.size());
diff --git
a/schema-engine-rocksdb/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/RSchemaRegion.java
b/schema-engine-rocksdb/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/RSchemaRegion.java
index 5bde0ccce4..f82465708f 100644
---
a/schema-engine-rocksdb/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/RSchemaRegion.java
+++
b/schema-engine-rocksdb/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/RSchemaRegion.java
@@ -856,6 +856,13 @@ public class RSchemaRegion implements ISchemaRegion {
return getCountByNodeType(new Character[] {NODE_TYPE_MEASUREMENT},
pathPattern.getNodes());
}
+ @Override
+ public int getAllTimeseriesCount(
+ PartialPath pathPattern, Map<Integer, Template> templateMap, boolean
isPrefixMatch)
+ throws MetadataException {
+ throw new UnsupportedOperationException();
+ }
+
@Override
public int getAllTimeseriesCount(
PartialPath pathPattern, boolean isPrefixMatch, String key, String
value, boolean isContains)
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGMemoryImpl.java
b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGMemoryImpl.java
index 67a020654b..b0710e2de4 100644
---
a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGMemoryImpl.java
+++
b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGMemoryImpl.java
@@ -863,6 +863,16 @@ public class MTreeBelowSGMemoryImpl implements
IMTreeBelowSG {
return counter.getCount();
}
+ public int getAllTimeseriesCount(
+ PartialPath pathPattern, Map<Integer, Template> templateMap, boolean
isPrefixMatch)
+ throws MetadataException {
+ CounterTraverser counter = new MeasurementCounter(storageGroupMNode,
pathPattern, store);
+ counter.setPrefixMatch(isPrefixMatch);
+ counter.setTemplateMap(templateMap);
+ counter.traverse();
+ return counter.getCount();
+ }
+
/**
* Get the count of timeseries matching the given path.
*
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/ISchemaRegion.java
b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/ISchemaRegion.java
index 4ff65c3117..860d5b2005 100644
---
a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/ISchemaRegion.java
+++
b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/ISchemaRegion.java
@@ -142,6 +142,10 @@ public interface ISchemaRegion {
int getAllTimeseriesCount(PartialPath pathPattern, boolean isPrefixMatch)
throws MetadataException;
+ int getAllTimeseriesCount(
+ PartialPath pathPattern, Map<Integer, Template> templateMap, boolean
isPrefixMatch)
+ throws MetadataException;
+
int getAllTimeseriesCount(
PartialPath pathPattern, boolean isPrefixMatch, String key, String
value, boolean isContains)
throws MetadataException;
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionMemoryImpl.java
b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionMemoryImpl.java
index 31208132e3..6c3e308799 100644
---
a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionMemoryImpl.java
+++
b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionMemoryImpl.java
@@ -962,6 +962,13 @@ public class SchemaRegionMemoryImpl implements
ISchemaRegion {
return mtree.getAllTimeseriesCount(pathPattern, isPrefixMatch);
}
+ @Override
+ public int getAllTimeseriesCount(
+ PartialPath pathPattern, Map<Integer, Template> templateMap, boolean
isPrefixMatch)
+ throws MetadataException {
+ return mtree.getAllTimeseriesCount(pathPattern, templateMap,
isPrefixMatch);
+ }
+
@Override
public int getAllTimeseriesCount(
PartialPath pathPattern, boolean isPrefixMatch, String key, String
value, boolean isContains)
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionSchemaFileImpl.java
b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionSchemaFileImpl.java
index 68fa31a77e..2194b4126a 100644
---
a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionSchemaFileImpl.java
+++
b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionSchemaFileImpl.java
@@ -900,6 +900,13 @@ public class SchemaRegionSchemaFileImpl implements
ISchemaRegion {
return mtree.getAllTimeseriesCount(pathPattern, isPrefixMatch);
}
+ @Override
+ public int getAllTimeseriesCount(
+ PartialPath pathPattern, Map<Integer, Template> templateMap, boolean
isPrefixMatch)
+ throws MetadataException {
+ throw new UnsupportedOperationException();
+ }
+
@Override
public int getAllTimeseriesCount(
PartialPath pathPattern, boolean isPrefixMatch, String key, String
value, boolean isContains)
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/TimeSeriesCountOperator.java
b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/TimeSeriesCountOperator.java
index 299961a561..6412f1ca21 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/TimeSeriesCountOperator.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/TimeSeriesCountOperator.java
@@ -21,6 +21,7 @@ package org.apache.iotdb.db.mpp.execution.operator.schema;
import org.apache.iotdb.commons.exception.MetadataException;
import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.db.metadata.template.Template;
import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
import org.apache.iotdb.db.mpp.execution.driver.SchemaDriverContext;
@@ -32,6 +33,7 @@ import org.apache.iotdb.tsfile.read.common.block.TsBlock;
import org.apache.iotdb.tsfile.read.common.block.TsBlockBuilder;
import java.util.List;
+import java.util.Map;
import java.util.stream.Collectors;
public class TimeSeriesCountOperator implements SourceOperator {
@@ -42,6 +44,7 @@ public class TimeSeriesCountOperator implements
SourceOperator {
private final String key;
private final String value;
private final boolean isContains;
+ private final Map<Integer, Template> templateMap;
private boolean isFinished;
@@ -59,7 +62,8 @@ public class TimeSeriesCountOperator implements
SourceOperator {
boolean isPrefixPath,
String key,
String value,
- boolean isContains) {
+ boolean isContains,
+ Map<Integer, Template> templateMap) {
this.sourceId = sourceId;
this.operatorContext = operatorContext;
this.partialPath = partialPath;
@@ -67,6 +71,7 @@ public class TimeSeriesCountOperator implements
SourceOperator {
this.key = key;
this.value = value;
this.isContains = isContains;
+ this.templateMap = templateMap;
this.outputDataTypes =
ColumnHeaderConstant.countTimeSeriesColumnHeaders.stream()
.map(ColumnHeader::getColumnType)
@@ -93,7 +98,7 @@ public class TimeSeriesCountOperator implements
SourceOperator {
count =
((SchemaDriverContext)
operatorContext.getInstanceContext().getDriverContext())
.getSchemaRegion()
- .getAllTimeseriesCount(partialPath, isPrefixPath);
+ .getAllTimeseriesCount(partialPath, templateMap, isPrefixPath);
}
} catch (MetadataException e) {
throw new RuntimeException(e.getMessage(), e);
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
index 8d271db790..db93582836 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
@@ -1495,7 +1495,7 @@ public class AnalyzeVisitor extends
StatementVisitor<Analysis, MPPQueryContext>
PathPatternTree patternTree = new PathPatternTree();
patternTree.appendPathPattern(
-
countDevicesStatement.getPartialPath().concatNode(IoTDBConstant.ONE_LEVEL_PATH_WILDCARD));
+
countDevicesStatement.getPathPattern().concatNode(IoTDBConstant.ONE_LEVEL_PATH_WILDCARD));
SchemaPartition schemaPartitionInfo =
partitionFetcher.getSchemaPartition(patternTree);
analysis.setSchemaPartitionInfo(schemaPartitionInfo);
@@ -1510,10 +1510,14 @@ public class AnalyzeVisitor extends
StatementVisitor<Analysis, MPPQueryContext>
analysis.setStatement(countTimeSeriesStatement);
PathPatternTree patternTree = new PathPatternTree();
- patternTree.appendPathPattern(countTimeSeriesStatement.getPartialPath());
+ patternTree.appendPathPattern(countTimeSeriesStatement.getPathPattern());
SchemaPartition schemaPartitionInfo =
partitionFetcher.getSchemaPartition(patternTree);
-
analysis.setSchemaPartitionInfo(schemaPartitionInfo);
+
+ Map<Integer, Template> templateMap =
+
schemaFetcher.checkAllRelatedTemplate(countTimeSeriesStatement.getPathPattern());
+ analysis.setRelatedTemplateInfo(templateMap);
+
analysis.setRespDatasetHeader(DatasetHeaderFactory.getCountTimeSeriesHeader());
return analysis;
}
@@ -1525,7 +1529,7 @@ public class AnalyzeVisitor extends
StatementVisitor<Analysis, MPPQueryContext>
analysis.setStatement(countLevelTimeSeriesStatement);
PathPatternTree patternTree = new PathPatternTree();
-
patternTree.appendPathPattern(countLevelTimeSeriesStatement.getPartialPath());
+
patternTree.appendPathPattern(countLevelTimeSeriesStatement.getPathPattern());
SchemaPartition schemaPartitionInfo =
partitionFetcher.getSchemaPartition(patternTree);
analysis.setSchemaPartitionInfo(schemaPartitionInfo);
@@ -1539,7 +1543,7 @@ public class AnalyzeVisitor extends
StatementVisitor<Analysis, MPPQueryContext>
analysis.setStatement(countStatement);
PathPatternTree patternTree = new PathPatternTree();
- patternTree.appendPathPattern(countStatement.getPartialPath());
+ patternTree.appendPathPattern(countStatement.getPathPattern());
SchemaNodeManagementPartition schemaNodeManagementPartition =
partitionFetcher.getSchemaNodeManagementPartitionWithLevel(
patternTree, countStatement.getLevel());
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java
index 1c360da030..ea28bf04ff 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java
@@ -162,7 +162,7 @@ public class ClusterConfigTaskExecutor implements
IConfigTaskExecutor {
SettableFuture<ConfigTaskResult> future = SettableFuture.create();
int storageGroupNum;
List<String> storageGroupPathPattern =
- Arrays.asList(countStorageGroupStatement.getPartialPath().getNodes());
+ Arrays.asList(countStorageGroupStatement.getPathPattern().getNodes());
try (ConfigNodeClient client =
CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.partitionRegionId)) {
TCountStorageGroupResp resp =
client.countMatchedStorageGroups(storageGroupPathPattern);
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/StandaloneConfigTaskExecutor.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/StandaloneConfigTaskExecutor.java
index 00878ba358..44b1db9243 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/StandaloneConfigTaskExecutor.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/StandaloneConfigTaskExecutor.java
@@ -145,7 +145,7 @@ public class StandaloneConfigTaskExecutor implements
IConfigTaskExecutor {
storageGroupNum =
LocalConfigNode.getInstance()
.getStorageGroupNum(
- countStorageGroupStatement.getPartialPath(),
+ countStorageGroupStatement.getPathPattern(),
countStorageGroupStatement.isPrefixPath());
// build TSBlock
CountStorageGroupTask.buildTSBlock(storageGroupNum, future);
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanBuilder.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanBuilder.java
index 589cc3d95e..afa7e34806 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanBuilder.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanBuilder.java
@@ -762,10 +762,21 @@ public class LogicalPlanBuilder {
}
public LogicalPlanBuilder planTimeSeriesCountSource(
- PartialPath partialPath, boolean prefixPath, String key, String value,
boolean isContains) {
+ PartialPath partialPath,
+ boolean prefixPath,
+ String key,
+ String value,
+ boolean isContains,
+ Map<Integer, Template> templateMap) {
this.root =
new TimeSeriesCountNode(
- context.getQueryId().genPlanNodeId(), partialPath, prefixPath,
key, value, isContains);
+ context.getQueryId().genPlanNodeId(),
+ partialPath,
+ prefixPath,
+ key,
+ value,
+ isContains,
+ templateMap);
return this;
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanVisitor.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanVisitor.java
index 8dda44bedd..87d59a3e2e 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanVisitor.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanVisitor.java
@@ -581,7 +581,7 @@ public class LogicalPlanVisitor extends
StatementVisitor<PlanNode, MPPQueryConte
LogicalPlanBuilder planBuilder = new LogicalPlanBuilder(context);
return planBuilder
.planDevicesCountSource(
- countDevicesStatement.getPartialPath(),
countDevicesStatement.isPrefixPath())
+ countDevicesStatement.getPathPattern(),
countDevicesStatement.isPrefixPath())
.planCountMerge()
.getRoot();
}
@@ -592,11 +592,12 @@ public class LogicalPlanVisitor extends
StatementVisitor<PlanNode, MPPQueryConte
LogicalPlanBuilder planBuilder = new LogicalPlanBuilder(context);
return planBuilder
.planTimeSeriesCountSource(
- countTimeSeriesStatement.getPartialPath(),
+ countTimeSeriesStatement.getPathPattern(),
countTimeSeriesStatement.isPrefixPath(),
countTimeSeriesStatement.getKey(),
countTimeSeriesStatement.getValue(),
- countTimeSeriesStatement.isContains())
+ countTimeSeriesStatement.isContains(),
+ analysis.getRelatedTemplateInfo())
.planCountMerge()
.getRoot();
}
@@ -607,7 +608,7 @@ public class LogicalPlanVisitor extends
StatementVisitor<PlanNode, MPPQueryConte
LogicalPlanBuilder planBuilder = new LogicalPlanBuilder(context);
return planBuilder
.planLevelTimeSeriesCountSource(
- countLevelTimeSeriesStatement.getPartialPath(),
+ countLevelTimeSeriesStatement.getPathPattern(),
countLevelTimeSeriesStatement.isPrefixPath(),
countLevelTimeSeriesStatement.getLevel(),
countLevelTimeSeriesStatement.getKey(),
@@ -621,7 +622,7 @@ public class LogicalPlanVisitor extends
StatementVisitor<PlanNode, MPPQueryConte
public PlanNode visitCountNodes(CountNodesStatement countStatement,
MPPQueryContext context) {
LogicalPlanBuilder planBuilder = new LogicalPlanBuilder(context);
return planBuilder
- .planNodePathsSchemaSource(countStatement.getPartialPath(),
countStatement.getLevel())
+ .planNodePathsSchemaSource(countStatement.getPathPattern(),
countStatement.getLevel())
.planSchemaQueryMerge(false)
.planNodeManagementMemoryMerge(analysis.getMatchedNodes())
.planNodePathsCount()
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/OperatorTreeGenerator.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/OperatorTreeGenerator.java
index 07a8e37051..06dd05b6fa 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/OperatorTreeGenerator.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/OperatorTreeGenerator.java
@@ -535,7 +535,8 @@ public class OperatorTreeGenerator extends
PlanVisitor<Operator, LocalExecutionP
node.isPrefixPath(),
node.getKey(),
node.getValue(),
- node.isContains());
+ node.isContains(),
+ node.getTemplateMap());
}
@Override
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/TimeSeriesCountNode.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/TimeSeriesCountNode.java
index 429ff4beab..85eeac3c80 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/TimeSeriesCountNode.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/TimeSeriesCountNode.java
@@ -21,6 +21,7 @@ package
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.read;
import org.apache.iotdb.commons.exception.IllegalPathException;
import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.db.metadata.template.Template;
import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
@@ -31,7 +32,9 @@ import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
import java.io.DataOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.stream.Collectors;
public class TimeSeriesCountNode extends SchemaQueryScanNode {
@@ -40,17 +43,21 @@ public class TimeSeriesCountNode extends
SchemaQueryScanNode {
private final String value;
private final boolean isContains;
+ private final Map<Integer, Template> templateMap;
+
public TimeSeriesCountNode(
PlanNodeId id,
PartialPath partialPath,
boolean isPrefixPath,
String key,
String value,
- boolean isContains) {
+ boolean isContains,
+ Map<Integer, Template> templateMap) {
super(id, partialPath, isPrefixPath);
this.key = key;
this.value = value;
this.isContains = isContains;
+ this.templateMap = templateMap;
}
public String getKey() {
@@ -65,9 +72,14 @@ public class TimeSeriesCountNode extends SchemaQueryScanNode
{
return isContains;
}
+ public Map<Integer, Template> getTemplateMap() {
+ return templateMap;
+ }
+
@Override
public PlanNode clone() {
- return new TimeSeriesCountNode(getPlanNodeId(), path, isPrefixPath, key,
value, isContains);
+ return new TimeSeriesCountNode(
+ getPlanNodeId(), path, isPrefixPath, key, value, isContains,
templateMap);
}
@Override
@@ -85,6 +97,10 @@ public class TimeSeriesCountNode extends SchemaQueryScanNode
{
ReadWriteIOUtils.write(key, byteBuffer);
ReadWriteIOUtils.write(value, byteBuffer);
ReadWriteIOUtils.write(isContains, byteBuffer);
+ ReadWriteIOUtils.write(templateMap.size(), byteBuffer);
+ for (Template template : templateMap.values()) {
+ template.serialize(byteBuffer);
+ }
}
@Override
@@ -95,6 +111,10 @@ public class TimeSeriesCountNode extends
SchemaQueryScanNode {
ReadWriteIOUtils.write(key, stream);
ReadWriteIOUtils.write(value, stream);
ReadWriteIOUtils.write(isContains, stream);
+ ReadWriteIOUtils.write(templateMap.size(), stream);
+ for (Template template : templateMap.values()) {
+ template.serialize(stream);
+ }
}
public static PlanNode deserialize(ByteBuffer buffer) {
@@ -109,7 +129,18 @@ public class TimeSeriesCountNode extends
SchemaQueryScanNode {
String key = ReadWriteIOUtils.readString(buffer);
String value = ReadWriteIOUtils.readString(buffer);
boolean isContains = ReadWriteIOUtils.readBool(buffer);
+
+ int templateNum = ReadWriteIOUtils.readInt(buffer);
+ Map<Integer, Template> templateMap = new HashMap<>();
+ Template template;
+ for (int i = 0; i < templateNum; i++) {
+ template = new Template();
+ template.deserialize(buffer);
+ templateMap.put(template.getId(), template);
+ }
+
PlanNodeId planNodeId = PlanNodeId.deserialize(buffer);
- return new TimeSeriesCountNode(planNodeId, path, isPrefixPath, key, value,
isContains);
+ return new TimeSeriesCountNode(
+ planNodeId, path, isPrefixPath, key, value, isContains, templateMap);
}
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/CountStatement.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/CountStatement.java
index db730e8c72..0460fee43f 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/CountStatement.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/CountStatement.java
@@ -33,23 +33,23 @@ import java.util.List;
* <p>COUNT {STORAGE GROUP | DEVICES | TIMESERIES | NODES} [prefixPath] [GROUP
BY] LEVEL = level
*/
public class CountStatement extends ShowStatement {
- protected PartialPath partialPath;
+ protected PartialPath pathPattern;
- public CountStatement(PartialPath partialPath) {
- this.partialPath = partialPath;
+ public CountStatement(PartialPath pathPattern) {
+ this.pathPattern = pathPattern;
setType(StatementType.COUNT);
}
- public PartialPath getPartialPath() {
- return partialPath;
+ public PartialPath getPathPattern() {
+ return pathPattern;
}
- public void setPartialPath(PartialPath partialPath) {
- this.partialPath = partialPath;
+ public void setPathPattern(PartialPath pathPattern) {
+ this.pathPattern = pathPattern;
}
@Override
public List<PartialPath> getPaths() {
- return Collections.singletonList(partialPath);
+ return Collections.singletonList(pathPattern);
}
}
diff --git
a/server/src/test/java/org/apache/iotdb/db/mpp/execution/operator/OperatorMemoryTest.java
b/server/src/test/java/org/apache/iotdb/db/mpp/execution/operator/OperatorMemoryTest.java
index 247eb0fc32..ffb8eae2e5 100644
---
a/server/src/test/java/org/apache/iotdb/db/mpp/execution/operator/OperatorMemoryTest.java
+++
b/server/src/test/java/org/apache/iotdb/db/mpp/execution/operator/OperatorMemoryTest.java
@@ -779,7 +779,8 @@ public class OperatorMemoryTest {
false,
null,
null,
- false);
+ false,
+ Collections.emptyMap());
assertEquals(4L, operator.calculateMaxPeekMemory());
assertEquals(4L, operator.calculateMaxReturnSize());
diff --git
a/server/src/test/java/org/apache/iotdb/db/mpp/execution/operator/schema/CountMergeOperatorTest.java
b/server/src/test/java/org/apache/iotdb/db/mpp/execution/operator/schema/CountMergeOperatorTest.java
index 9264d38a9a..d0e63e49bb 100644
---
a/server/src/test/java/org/apache/iotdb/db/mpp/execution/operator/schema/CountMergeOperatorTest.java
+++
b/server/src/test/java/org/apache/iotdb/db/mpp/execution/operator/schema/CountMergeOperatorTest.java
@@ -45,6 +45,7 @@ import org.junit.Test;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
import java.util.concurrent.ExecutorService;
@@ -106,7 +107,8 @@ public class CountMergeOperatorTest {
true,
null,
null,
- false);
+ false,
+ Collections.emptyMap());
TsBlock tsBlock = null;
while (timeSeriesCountOperator.hasNext()) {
tsBlock = timeSeriesCountOperator.next();
@@ -121,7 +123,8 @@ public class CountMergeOperatorTest {
false,
null,
null,
- false);
+ false,
+ Collections.emptyMap());
tsBlock = timeSeriesCountOperator2.next();
assertFalse(timeSeriesCountOperator2.hasNext());
assertTrue(timeSeriesCountOperator2.isFinished());
diff --git
a/server/src/test/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaCountOperatorTest.java
b/server/src/test/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaCountOperatorTest.java
index f664633ba7..12c073ab2c 100644
---
a/server/src/test/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaCountOperatorTest.java
+++
b/server/src/test/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaCountOperatorTest.java
@@ -44,6 +44,7 @@ import org.junit.Test;
import java.io.IOException;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import java.util.concurrent.ExecutorService;
@@ -146,7 +147,8 @@ public class SchemaCountOperatorTest {
true,
null,
null,
- false);
+ false,
+ Collections.emptyMap());
TsBlock tsBlock = null;
while (timeSeriesCountOperator.hasNext()) {
tsBlock = timeSeriesCountOperator.next();
@@ -161,7 +163,8 @@ public class SchemaCountOperatorTest {
false,
null,
null,
- false);
+ false,
+ Collections.emptyMap());
tsBlock = timeSeriesCountOperator2.next();
assertFalse(timeSeriesCountOperator2.hasNext());
assertTrue(timeSeriesCountOperator2.isFinished());