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

Reply via email to