You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by lt...@apache.org on 2019/04/16 12:26:51 UTC

[incubator-iotdb] branch cluster_read created (now b01ef72)

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

lta pushed a change to branch cluster_read
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git.


      at b01ef72  add reader processor

This branch includes the following new commits:

     new 6f2b6a2  Merge branch 'cluster' of github.com:apache/incubator-iotdb into cluster
     new 41143c7  Merge branch 'cluster' of github.com:apache/incubator-iotdb into cluster
     new 17c9a23  reorganize aggeFunc code
     new 1d6c7a3  reorganize query dataset code
     new 1229ce6  reorganize package
     new 9bfb04a  initial query module
     new ba0389f  remove threadlocal in TSServiceClusterImpl
     new f150b84  add Query Manager
     new 2134f33  update
     new a76806f  update
     new fda20cc  add query manager
     new e285a9d  Merge branch 'cluster' of github.com:apache/incubator-iotdb into cluster
     new c0aea2c  merge conflicts
     new e0439b6  add single query manager
     new d4863aa  add ClusterRpcReaderUtils
     new 446cec9  add query series data processor
     new de28b3e  transfer physical plans implement Serializable
     new 65eab8e  manage package
     new b01ef72  add reader processor

The 19 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[incubator-iotdb] 15/19: add ClusterRpcReaderUtils

Posted by lt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

lta pushed a commit to branch cluster_read
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git

commit d4863aad7f439c31bd967780aff9094ede628fde
Author: lta <li...@163.com>
AuthorDate: Tue Apr 16 16:17:00 2019 +0800

    add ClusterRpcReaderUtils
---
 .../org/apache/iotdb/cluster/entity/Server.java    | 14 +--
 .../cluster/entity/raft/DataStateMachine.java      |  2 +-
 .../cluster/entity/raft/MetadataStateManchine.java |  2 +-
 .../cluster/qp/executor/AbstractQPExecutor.java    | 17 ++--
 .../executor/ClusterQueryProcessExecutor.java      | 57 ++++++++++---
 .../cluster/qp/executor/NonQueryExecutor.java      |  8 +-
 .../cluster/qp/executor/QueryMetadataExecutor.java | 38 ++++-----
 .../apache/iotdb/cluster/qp/task/BatchQPTask.java  |  2 +-
 .../executor/ClusterExecutorWithTimeGenerator.java |  5 +-
 .../ClusterExecutorWithoutTimeGenerator.java       |  6 +-
 .../executor/ClusterQueryRouter.java               | 41 ++++++---
 .../factory/ClusterRpcReaderFactory.java           | 31 -------
 .../manager/ClusterSingleQueryManager.java         | 37 ++++----
 .../manager/IClusterSingleQueryManager.java        |  5 +-
 .../reader/ClusterRpcBatchDataReader.java          | 29 ++++++-
 .../reader/ClusterSeriesReader.java                |  2 +-
 .../iotdb/cluster/rpc/raft/NodeAsClient.java       |  8 +-
 .../rpc/raft/impl/RaftNodeAsClientManager.java     | 13 ++-
 .../DataGroupNonQueryAsyncProcessor.java           |  7 +-
 .../MetaGroupNonQueryAsyncProcessor.java           |  7 +-
 .../QueryMetadataAsyncProcessor.java               |  7 +-
 .../QueryMetadataInStringAsyncProcessor.java       |  7 +-
 .../QueryPathsAsyncProcessor.java                  |  7 +-
 .../QuerySeriesTypeAsyncProcessor.java             |  7 +-
 .../QueryTimeSeriesAsyncProcessor.java             |  7 +-
 .../rpc/raft/request/BasicQueryRequest.java        |  4 +
 .../{ => nonquery}/DataGroupNonQueryRequest.java   |  5 +-
 .../{ => nonquery}/MetaGroupNonQueryRequest.java   |  5 +-
 .../QuerySeriesDataRequest.java}                   | 27 ++++--
 .../Stage.java}                                    | 13 +--
 .../QueryMetadataInStringRequest.java              |  6 +-
 .../{ => querymetadata}/QueryMetadataRequest.java  |  6 +-
 .../{ => querymetadata}/QueryPathsRequest.java     |  6 +-
 .../QuerySeriesTypeRequest.java                    |  6 +-
 .../QueryStorageGroupRequest.java                  |  6 +-
 .../QueryTimeSeriesRequest.java                    |  6 +-
 .../{ => nonquery}/DataGroupNonQueryResponse.java  |  4 +-
 .../{ => nonquery}/MetaGroupNonQueryResponse.java  |  4 +-
 .../querydata/QuerySeriesDataResponse.java         | 69 +++++++++++++++
 .../QueryMetadataInStringResponse.java             |  4 +-
 .../{ => querymetadata}/QueryMetadataResponse.java |  3 +-
 .../{ => querymetadata}/QueryPathsResponse.java    |  3 +-
 .../QuerySeriesTypeResponse.java                   |  3 +-
 .../QueryStorageGroupResponse.java                 |  3 +-
 .../QueryTimeSeriesResponse.java                   |  3 +-
 .../cluster/service/TSServiceClusterImpl.java      | 18 ++--
 .../org/apache/iotdb/cluster/utils/RaftUtils.java  |  2 +-
 .../cluster/utils/query/ClusterRpcReaderUtils.java | 99 ++++++++++++++++++++++
 .../query/QueryTask.java}                          | 39 ++++-----
 .../apache/iotdb/cluster/utils/RaftUtilsTest.java  |  2 +-
 .../db/qp/executor/IQueryProcessExecutor.java      |  1 -
 .../iotdb/db/qp/executor/OverflowQPExecutor.java   |  6 +-
 .../iotdb/db/qp/executor/QueryProcessExecutor.java |  9 +-
 .../apache/iotdb/tsfile/read/common/BatchData.java |  4 +-
 54 files changed, 490 insertions(+), 242 deletions(-)

diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/entity/Server.java b/cluster/src/main/java/org/apache/iotdb/cluster/entity/Server.java
index a4c02cd..1f0e4e3 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/entity/Server.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/entity/Server.java
@@ -32,13 +32,13 @@ import org.apache.iotdb.cluster.entity.metadata.MetadataHolder;
 import org.apache.iotdb.cluster.entity.raft.DataPartitionRaftHolder;
 import org.apache.iotdb.cluster.entity.raft.MetadataRaftHolder;
 import org.apache.iotdb.cluster.rpc.raft.impl.RaftNodeAsClientManager;
-import org.apache.iotdb.cluster.rpc.raft.processor.DataGroupNonQueryAsyncProcessor;
-import org.apache.iotdb.cluster.rpc.raft.processor.MetaGroupNonQueryAsyncProcessor;
-import org.apache.iotdb.cluster.rpc.raft.processor.QueryMetadataAsyncProcessor;
-import org.apache.iotdb.cluster.rpc.raft.processor.QueryMetadataInStringAsyncProcessor;
-import org.apache.iotdb.cluster.rpc.raft.processor.QueryPathsAsyncProcessor;
-import org.apache.iotdb.cluster.rpc.raft.processor.QuerySeriesTypeAsyncProcessor;
-import org.apache.iotdb.cluster.rpc.raft.processor.QueryTimeSeriesAsyncProcessor;
+import org.apache.iotdb.cluster.rpc.raft.processor.nonquery.DataGroupNonQueryAsyncProcessor;
+import org.apache.iotdb.cluster.rpc.raft.processor.nonquery.MetaGroupNonQueryAsyncProcessor;
+import org.apache.iotdb.cluster.rpc.raft.processor.querymetadata.QueryMetadataAsyncProcessor;
+import org.apache.iotdb.cluster.rpc.raft.processor.querymetadata.QueryMetadataInStringAsyncProcessor;
+import org.apache.iotdb.cluster.rpc.raft.processor.querymetadata.QueryPathsAsyncProcessor;
+import org.apache.iotdb.cluster.rpc.raft.processor.querymetadata.QuerySeriesTypeAsyncProcessor;
+import org.apache.iotdb.cluster.rpc.raft.processor.querymetadata.QueryTimeSeriesAsyncProcessor;
 import org.apache.iotdb.cluster.utils.RaftUtils;
 import org.apache.iotdb.cluster.utils.hash.PhysicalNode;
 import org.apache.iotdb.cluster.utils.hash.Router;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/entity/raft/DataStateMachine.java b/cluster/src/main/java/org/apache/iotdb/cluster/entity/raft/DataStateMachine.java
index ebac074..e74db12 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/entity/raft/DataStateMachine.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/entity/raft/DataStateMachine.java
@@ -31,7 +31,7 @@ import java.nio.ByteBuffer;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicLong;
 import org.apache.iotdb.cluster.rpc.raft.closure.ResponseClosure;
-import org.apache.iotdb.cluster.rpc.raft.request.DataGroupNonQueryRequest;
+import org.apache.iotdb.cluster.rpc.raft.request.nonquery.DataGroupNonQueryRequest;
 import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
 import org.apache.iotdb.cluster.utils.RaftUtils;
 import org.apache.iotdb.db.exception.PathErrorException;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/entity/raft/MetadataStateManchine.java b/cluster/src/main/java/org/apache/iotdb/cluster/entity/raft/MetadataStateManchine.java
index 9592718..b45ab9c 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/entity/raft/MetadataStateManchine.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/entity/raft/MetadataStateManchine.java
@@ -32,7 +32,7 @@ import java.util.List;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicLong;
 import org.apache.iotdb.cluster.rpc.raft.closure.ResponseClosure;
-import org.apache.iotdb.cluster.rpc.raft.request.MetaGroupNonQueryRequest;
+import org.apache.iotdb.cluster.rpc.raft.request.nonquery.MetaGroupNonQueryRequest;
 import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
 import org.apache.iotdb.cluster.utils.RaftUtils;
 import org.apache.iotdb.db.exception.PathErrorException;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/AbstractQPExecutor.java b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/AbstractQPExecutor.java
index e5df083..810cc6e 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/AbstractQPExecutor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/AbstractQPExecutor.java
@@ -70,12 +70,17 @@ public abstract class AbstractQPExecutor {
   /**
    * ReadMetadataConsistencyLevel: 1 Strong consistency, 2 Weak consistency
    */
-  protected int readMetadataConsistencyLevel = CLUSTER_CONFIG.getReadMetadataConsistencyLevel();
+  private ThreadLocal<Integer> readMetadataConsistencyLevel = new ThreadLocal<>();
 
   /**
    * ReadDataConsistencyLevel: 1 Strong consistency, 2 Weak consistency
    */
-  private int readDataConsistencyLevel = CLUSTER_CONFIG.getReadDataConsistencyLevel();
+  private ThreadLocal<Integer> readDataConsistencyLevel = new ThreadLocal<>();
+
+  public AbstractQPExecutor() {
+    readMetadataConsistencyLevel.set(CLUSTER_CONFIG.getReadMetadataConsistencyLevel());
+    readDataConsistencyLevel.set(CLUSTER_CONFIG.getReadDataConsistencyLevel());
+  }
 
   /**
    * Async handle QPTask by QPTask and leader id
@@ -141,7 +146,7 @@ public abstract class AbstractQPExecutor {
 
   public void setReadMetadataConsistencyLevel(int level) throws ConsistencyLevelException {
     if (level <= ClusterConstant.MAX_CONSISTENCY_LEVEL) {
-      this.readMetadataConsistencyLevel = level;
+      readMetadataConsistencyLevel.set(level);
     } else {
       throw new ConsistencyLevelException(String.format("Consistency level %d not support", level));
     }
@@ -149,17 +154,17 @@ public abstract class AbstractQPExecutor {
 
   public void setReadDataConsistencyLevel(int level) throws ConsistencyLevelException {
     if (level <= ClusterConstant.MAX_CONSISTENCY_LEVEL) {
-      this.readDataConsistencyLevel = level;
+      readDataConsistencyLevel.set(level);
     } else {
       throw new ConsistencyLevelException(String.format("Consistency level %d not support", level));
     }
   }
 
   public int getReadMetadataConsistencyLevel() {
-    return readMetadataConsistencyLevel;
+    return readMetadataConsistencyLevel.get();
   }
 
   public int getReadDataConsistencyLevel() {
-    return readDataConsistencyLevel;
+    return readDataConsistencyLevel.get();
   }
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterQueryProcessExecutor.java b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/ClusterQueryProcessExecutor.java
similarity index 67%
rename from cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterQueryProcessExecutor.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/ClusterQueryProcessExecutor.java
index e7e58f8..1b82583 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterQueryProcessExecutor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/ClusterQueryProcessExecutor.java
@@ -16,18 +16,22 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.query.coordinatornode.executor;
+package org.apache.iotdb.cluster.qp.executor;
 
 import java.io.IOException;
 import java.util.List;
 import java.util.Map;
-import org.apache.iotdb.cluster.qp.executor.QueryMetadataExecutor;
+import org.apache.iotdb.cluster.query.coordinatornode.executor.ClusterQueryRouter;
 import org.apache.iotdb.db.exception.FileNodeManagerException;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.exception.ProcessorException;
 import org.apache.iotdb.db.qp.constant.SQLConstant;
-import org.apache.iotdb.db.qp.executor.QueryProcessExecutor;
+import org.apache.iotdb.db.qp.executor.IQueryProcessExecutor;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.db.qp.physical.crud.AggregationPlan;
+import org.apache.iotdb.db.qp.physical.crud.FillQueryPlan;
+import org.apache.iotdb.db.qp.physical.crud.GroupByPlan;
+import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
 import org.apache.iotdb.db.query.context.QueryContext;
 import org.apache.iotdb.db.query.executor.IEngineQueryRouter;
 import org.apache.iotdb.db.query.fill.IFill;
@@ -35,34 +39,64 @@ import org.apache.iotdb.tsfile.exception.filter.QueryFilterOptimizationException
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.Path;
 import org.apache.iotdb.tsfile.read.expression.IExpression;
+import org.apache.iotdb.tsfile.read.expression.QueryExpression;
 import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
 import org.apache.iotdb.tsfile.utils.Pair;
 
-public class ClusterQueryProcessExecutor extends QueryProcessExecutor {
+public class ClusterQueryProcessExecutor extends AbstractQPExecutor implements IQueryProcessExecutor {
 
-  private IEngineQueryRouter queryRouter = new ClusterQueryRouter();
+  private ThreadLocal<Integer> fetchSize = new ThreadLocal<>();
+  private ClusterQueryRouter clusterQueryRouter = new ClusterQueryRouter();
 
   private QueryMetadataExecutor queryMetadataExecutor = new QueryMetadataExecutor();
 
   @Override
+  public QueryDataSet processQuery(QueryPlan queryPlan, QueryContext context)
+      throws IOException, FileNodeManagerException, PathErrorException,
+      QueryFilterOptimizationException, ProcessorException {
+
+    QueryExpression queryExpression = QueryExpression.create().setSelectSeries(queryPlan.getPaths())
+        .setExpression(queryPlan.getExpression());
+    clusterQueryRouter.setReadDataConsistencyLevel(getReadDataConsistencyLevel());
+    if (queryPlan instanceof GroupByPlan) {
+      GroupByPlan groupByPlan = (GroupByPlan) queryPlan;
+      return groupBy(groupByPlan.getPaths(), groupByPlan.getAggregations(),
+          groupByPlan.getExpression(), groupByPlan.getUnit(), groupByPlan.getOrigin(),
+          groupByPlan.getIntervals(), context);
+    }
+
+    if (queryPlan instanceof AggregationPlan) {
+      return aggregate(queryPlan.getPaths(), queryPlan.getAggregations(),
+          queryPlan.getExpression(), context);
+    }
+
+    if (queryPlan instanceof FillQueryPlan) {
+      FillQueryPlan fillQueryPlan = (FillQueryPlan) queryPlan;
+      return fill(queryPlan.getPaths(), fillQueryPlan.getQueryTime(),
+          fillQueryPlan.getFillType(), context);
+    }
+    return clusterQueryRouter.query(queryExpression, context);
+  }
+
+  @Override
   public QueryDataSet aggregate(List<Path> paths, List<String> aggres, IExpression expression,
       QueryContext context)
       throws ProcessorException, IOException, PathErrorException, FileNodeManagerException, QueryFilterOptimizationException {
-    return queryRouter.aggregate(paths, aggres, expression, context);
+    return clusterQueryRouter.aggregate(paths, aggres, expression, context);
   }
 
   @Override
   public QueryDataSet groupBy(List<Path> paths, List<String> aggres, IExpression expression,
       long unit, long origin, List<Pair<Long, Long>> intervals, QueryContext context)
       throws ProcessorException, IOException, PathErrorException, FileNodeManagerException, QueryFilterOptimizationException {
-    return queryRouter.groupBy(paths, aggres, expression, unit, origin, intervals, context);
+    return clusterQueryRouter.groupBy(paths, aggres, expression, unit, origin, intervals, context);
   }
 
   @Override
   public QueryDataSet fill(List<Path> fillPaths, long queryTime, Map<TSDataType, IFill> fillTypes,
       QueryContext context)
       throws ProcessorException, IOException, PathErrorException, FileNodeManagerException {
-    return queryRouter.fill(fillPaths, queryTime, fillTypes, context);
+    return clusterQueryRouter.fill(fillPaths, queryTime, fillTypes, context);
   }
 
   @Override
@@ -111,11 +145,6 @@ public class ClusterQueryProcessExecutor extends QueryProcessExecutor {
   }
 
   @Override
-  public IEngineQueryRouter getQueryRouter() {
-    return queryRouter;
-  }
-
-  @Override
   public boolean update(Path path, long startTime, long endTime, String value)
       throws ProcessorException {
     throw new UnsupportedOperationException();
@@ -144,6 +173,6 @@ public class ClusterQueryProcessExecutor extends QueryProcessExecutor {
 
   @Override
   public boolean processNonQuery(PhysicalPlan plan) throws ProcessorException {
-    return false;
+    throw new UnsupportedOperationException();
   }
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/NonQueryExecutor.java b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/NonQueryExecutor.java
index ecafe4e..b6247c8 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/NonQueryExecutor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/NonQueryExecutor.java
@@ -38,11 +38,11 @@ import org.apache.iotdb.cluster.qp.task.BatchQPTask;
 import org.apache.iotdb.cluster.qp.task.QPTask;
 import org.apache.iotdb.cluster.qp.task.SingleQPTask;
 import org.apache.iotdb.cluster.rpc.raft.request.BasicRequest;
-import org.apache.iotdb.cluster.rpc.raft.request.DataGroupNonQueryRequest;
-import org.apache.iotdb.cluster.rpc.raft.request.MetaGroupNonQueryRequest;
+import org.apache.iotdb.cluster.rpc.raft.request.nonquery.DataGroupNonQueryRequest;
+import org.apache.iotdb.cluster.rpc.raft.request.nonquery.MetaGroupNonQueryRequest;
 import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
-import org.apache.iotdb.cluster.rpc.raft.response.DataGroupNonQueryResponse;
-import org.apache.iotdb.cluster.rpc.raft.response.MetaGroupNonQueryResponse;
+import org.apache.iotdb.cluster.rpc.raft.response.nonquery.DataGroupNonQueryResponse;
+import org.apache.iotdb.cluster.rpc.raft.response.nonquery.MetaGroupNonQueryResponse;
 import org.apache.iotdb.cluster.service.TSServiceClusterImpl.BatchResult;
 import org.apache.iotdb.cluster.utils.QPExecutorUtils;
 import org.apache.iotdb.cluster.utils.RaftUtils;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/QueryMetadataExecutor.java b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/QueryMetadataExecutor.java
index aea0656..82325e1 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/QueryMetadataExecutor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/QueryMetadataExecutor.java
@@ -32,19 +32,19 @@ import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.entity.raft.MetadataRaftHolder;
 import org.apache.iotdb.cluster.entity.raft.RaftService;
 import org.apache.iotdb.cluster.exception.RaftConnectionException;
-import org.apache.iotdb.cluster.rpc.raft.request.QueryMetadataInStringRequest;
-import org.apache.iotdb.cluster.rpc.raft.request.QueryMetadataRequest;
-import org.apache.iotdb.cluster.rpc.raft.request.QueryPathsRequest;
-import org.apache.iotdb.cluster.rpc.raft.request.QuerySeriesTypeRequest;
-import org.apache.iotdb.cluster.rpc.raft.request.QueryStorageGroupRequest;
-import org.apache.iotdb.cluster.rpc.raft.request.QueryTimeSeriesRequest;
+import org.apache.iotdb.cluster.rpc.raft.request.querymetadata.QueryMetadataInStringRequest;
+import org.apache.iotdb.cluster.rpc.raft.request.querymetadata.QueryMetadataRequest;
+import org.apache.iotdb.cluster.rpc.raft.request.querymetadata.QueryPathsRequest;
+import org.apache.iotdb.cluster.rpc.raft.request.querymetadata.QuerySeriesTypeRequest;
+import org.apache.iotdb.cluster.rpc.raft.request.querymetadata.QueryStorageGroupRequest;
+import org.apache.iotdb.cluster.rpc.raft.request.querymetadata.QueryTimeSeriesRequest;
 import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
-import org.apache.iotdb.cluster.rpc.raft.response.QueryMetadataInStringResponse;
-import org.apache.iotdb.cluster.rpc.raft.response.QueryMetadataResponse;
-import org.apache.iotdb.cluster.rpc.raft.response.QueryPathsResponse;
-import org.apache.iotdb.cluster.rpc.raft.response.QuerySeriesTypeResponse;
-import org.apache.iotdb.cluster.rpc.raft.response.QueryStorageGroupResponse;
-import org.apache.iotdb.cluster.rpc.raft.response.QueryTimeSeriesResponse;
+import org.apache.iotdb.cluster.rpc.raft.response.querymetadata.QueryMetadataInStringResponse;
+import org.apache.iotdb.cluster.rpc.raft.response.querymetadata.QueryMetadataResponse;
+import org.apache.iotdb.cluster.rpc.raft.response.querymetadata.QueryPathsResponse;
+import org.apache.iotdb.cluster.rpc.raft.response.querymetadata.QuerySeriesTypeResponse;
+import org.apache.iotdb.cluster.rpc.raft.response.querymetadata.QueryStorageGroupResponse;
+import org.apache.iotdb.cluster.rpc.raft.response.querymetadata.QueryTimeSeriesResponse;
 import org.apache.iotdb.cluster.utils.QPExecutorUtils;
 import org.apache.iotdb.cluster.utils.RaftUtils;
 import org.apache.iotdb.db.exception.PathErrorException;
@@ -125,7 +125,7 @@ public class QueryMetadataExecutor extends AbstractQPExecutor {
   private void handleTimseriesQuery(String groupId, List<String> pathList, List<List<String>> res)
       throws ProcessorException, InterruptedException {
     QueryTimeSeriesRequest request = new QueryTimeSeriesRequest(groupId,
-        readMetadataConsistencyLevel, pathList);
+        getReadMetadataConsistencyLevel(), pathList);
     SingleQPTask task = new SingleQPTask(false, request);
 
     LOGGER.debug("Execute show timeseries {} statement for group {}.", pathList, groupId);
@@ -152,7 +152,7 @@ public class QueryMetadataExecutor extends AbstractQPExecutor {
     List<SingleQPTask> taskList = new ArrayList<>();
     for (String groupId : groupIdSet) {
       QueryMetadataInStringRequest request = new QueryMetadataInStringRequest(groupId,
-          readMetadataConsistencyLevel);
+          getReadMetadataConsistencyLevel());
       SingleQPTask task = new SingleQPTask(false, request);
       taskList.add(task);
 
@@ -191,7 +191,7 @@ public class QueryMetadataExecutor extends AbstractQPExecutor {
     List<SingleQPTask> taskList = new ArrayList<>();
     for (String groupId : groupIdSet) {
       QueryMetadataRequest request = new QueryMetadataRequest(groupId,
-          readMetadataConsistencyLevel);
+          getReadMetadataConsistencyLevel());
       SingleQPTask task = new SingleQPTask(false, request);
       taskList.add(task);
 
@@ -235,7 +235,7 @@ public class QueryMetadataExecutor extends AbstractQPExecutor {
     } else {
       String groupId = router.getGroupIdBySG(storageGroupList.get(0));
       QuerySeriesTypeRequest request = new QuerySeriesTypeRequest(groupId,
-          readMetadataConsistencyLevel, path);
+          getReadMetadataConsistencyLevel(), path);
       SingleQPTask task = new SingleQPTask(false, request);
 
       LOGGER.debug("Execute get series type for {} statement for group {}.", path, groupId);
@@ -284,7 +284,7 @@ public class QueryMetadataExecutor extends AbstractQPExecutor {
   private void handlePathsQuery(String groupId, List<String> pathList, List<String> res)
       throws ProcessorException, InterruptedException {
     QueryPathsRequest request = new QueryPathsRequest(groupId,
-        readMetadataConsistencyLevel, pathList);
+        getReadMetadataConsistencyLevel(), pathList);
     SingleQPTask task = new SingleQPTask(false, request);
 
     LOGGER.debug("Execute get paths for {} statement for group {}.", pathList, groupId);
@@ -325,10 +325,10 @@ public class QueryMetadataExecutor extends AbstractQPExecutor {
   private Set<String> queryStorageGroupLocally() throws InterruptedException {
     final byte[] reqContext = RaftUtils.createRaftRequestContext();
     QueryStorageGroupRequest request = new QueryStorageGroupRequest(
-        ClusterConfig.METADATA_GROUP_ID, readMetadataConsistencyLevel);
+        ClusterConfig.METADATA_GROUP_ID, getReadMetadataConsistencyLevel());
     SingleQPTask task = new SingleQPTask(false, request);
     MetadataRaftHolder metadataHolder = (MetadataRaftHolder) server.getMetadataHolder();
-    if (readMetadataConsistencyLevel == ClusterConstant.WEAK_CONSISTENCY_LEVEL) {
+    if (getReadMetadataConsistencyLevel() == ClusterConstant.WEAK_CONSISTENCY_LEVEL) {
       QueryStorageGroupResponse response;
       try {
         response = QueryStorageGroupResponse
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/BatchQPTask.java b/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/BatchQPTask.java
index d224bae..43edd67 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/BatchQPTask.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/BatchQPTask.java
@@ -30,7 +30,7 @@ import org.apache.iotdb.cluster.concurrent.pool.QPTaskManager;
 import org.apache.iotdb.cluster.exception.RaftConnectionException;
 import org.apache.iotdb.cluster.qp.executor.NonQueryExecutor;
 import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
-import org.apache.iotdb.cluster.rpc.raft.response.DataGroupNonQueryResponse;
+import org.apache.iotdb.cluster.rpc.raft.response.nonquery.DataGroupNonQueryResponse;
 import org.apache.iotdb.cluster.service.TSServiceClusterImpl.BatchResult;
 import org.apache.iotdb.cluster.utils.QPExecutorUtils;
 import org.apache.iotdb.cluster.utils.RaftUtils;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithTimeGenerator.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithTimeGenerator.java
index d1ca472..68a14c8 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithTimeGenerator.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithTimeGenerator.java
@@ -40,10 +40,13 @@ public class ClusterExecutorWithTimeGenerator {
 
   private QueryExpression queryExpression;
   private IClusterSingleQueryManager queryManager;
+  private int readDataConsistencyLevel;
 
-  ClusterExecutorWithTimeGenerator(QueryExpression queryExpression, IClusterSingleQueryManager queryManager) {
+  ClusterExecutorWithTimeGenerator(QueryExpression queryExpression,
+      IClusterSingleQueryManager queryManager, int readDataConsistencyLevel) {
     this.queryExpression = queryExpression;
     this.queryManager = queryManager;
+    this.readDataConsistencyLevel = readDataConsistencyLevel;
   }
 
   /**
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithoutTimeGenerator.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithoutTimeGenerator.java
index 7bd8008..65b7d8f 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithoutTimeGenerator.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithoutTimeGenerator.java
@@ -46,11 +46,13 @@ import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
 public class ClusterExecutorWithoutTimeGenerator {
   private QueryExpression queryExpression;
   private ClusterSingleQueryManager queryManager;
+  private int readDataConsistencyLevel;
 
   public ClusterExecutorWithoutTimeGenerator(QueryExpression queryExpression,
-      ClusterSingleQueryManager queryManager) {
+      ClusterSingleQueryManager queryManager, int readDataConsistencyLevel) {
     this.queryExpression = queryExpression;
     this.queryManager = queryManager;
+    this.readDataConsistencyLevel = readDataConsistencyLevel;
   }
 
   /**
@@ -126,7 +128,9 @@ public class ClusterExecutorWithoutTimeGenerator {
         ClusterSeriesReader reader = selectPathReaders.get(path.toString());
         readersOfSelectedSeries.add(reader);
         dataTypes.add(reader.getDataType());
+
       } else {
+        // can read series locally.
         QueryDataSource queryDataSource = QueryResourceManager.getInstance()
             .getQueryDataSource(path,
                 context);
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterQueryRouter.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterQueryRouter.java
index 8fa1a95..da5a395 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterQueryRouter.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterQueryRouter.java
@@ -21,10 +21,10 @@ package org.apache.iotdb.cluster.query.coordinatornode.executor;
 import java.io.IOException;
 import java.util.List;
 import java.util.Map;
+import org.apache.iotdb.cluster.exception.RaftConnectionException;
 import org.apache.iotdb.cluster.query.coordinatornode.manager.ClusterRpcQueryManager;
 import org.apache.iotdb.cluster.query.coordinatornode.manager.ClusterSingleQueryManager;
 import org.apache.iotdb.cluster.query.coordinatornode.manager.ClusterSingleQueryManager.QueryType;
-import org.apache.iotdb.cluster.query.coordinatornode.manager.IClusterSingleQueryManager;
 import org.apache.iotdb.db.exception.FileNodeManagerException;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.exception.ProcessorException;
@@ -43,38 +43,43 @@ import org.apache.iotdb.tsfile.utils.Pair;
 
 public class ClusterQueryRouter implements IEngineQueryRouter {
 
+  private ThreadLocal<Integer> readDataConsistencyLevel = new ThreadLocal<>();
+
   @Override
   public QueryDataSet query(QueryExpression queryExpression, QueryContext context)
       throws FileNodeManagerException, PathErrorException {
 
     ClusterSingleQueryManager queryManager = ClusterRpcQueryManager.getInstance()
         .getSingleQuery(context.getJobId());
-    if (queryExpression.hasQueryFilter()) {
-      try {
+    try {
+      if (queryExpression.hasQueryFilter()) {
+
         IExpression optimizedExpression = ExpressionOptimizer.getInstance()
             .optimize(queryExpression.getExpression(), queryExpression.getSelectedSeries());
         queryExpression.setExpression(optimizedExpression);
 
         if (optimizedExpression.getType() == ExpressionType.GLOBAL_TIME) {
-          queryManager.init(QueryType.GLOBAL_TIME);
+          queryManager.init(QueryType.GLOBAL_TIME, getReadDataConsistencyLevel());
           ClusterExecutorWithoutTimeGenerator engineExecutor =
-              new ClusterExecutorWithoutTimeGenerator(queryExpression, queryManager);
+              new ClusterExecutorWithoutTimeGenerator(queryExpression, queryManager,
+                  getReadDataConsistencyLevel());
           return engineExecutor.executeWithGlobalTimeFilter(context);
         } else {
-          queryManager.init(QueryType.FILTER);
+          queryManager.init(QueryType.FILTER, getReadDataConsistencyLevel());
           ClusterExecutorWithTimeGenerator engineExecutor = new ClusterExecutorWithTimeGenerator(
-              queryExpression, queryManager);
+              queryExpression, queryManager, getReadDataConsistencyLevel());
           return engineExecutor.execute(context);
         }
 
-      } catch (QueryFilterOptimizationException e) {
-        throw new FileNodeManagerException(e);
+      } else {
+        queryManager.init(QueryType.NO_FILTER, getReadDataConsistencyLevel());
+        ClusterExecutorWithoutTimeGenerator engineExecutor =
+            new ClusterExecutorWithoutTimeGenerator(queryExpression, queryManager,
+                getReadDataConsistencyLevel());
+        return engineExecutor.executeWithoutFilter(context);
       }
-    } else {
-      queryManager.init(QueryType.NO_FILTER);
-      ClusterExecutorWithoutTimeGenerator engineExecutor =
-          new ClusterExecutorWithoutTimeGenerator(queryExpression, queryManager);
-      return engineExecutor.executeWithoutFilter(context);
+    } catch (QueryFilterOptimizationException | IOException | RaftConnectionException e) {
+      throw new FileNodeManagerException(e);
     }
   }
 
@@ -98,4 +103,12 @@ public class ClusterQueryRouter implements IEngineQueryRouter {
       QueryContext context) throws FileNodeManagerException, PathErrorException, IOException {
     return null;
   }
+
+  public int getReadDataConsistencyLevel() {
+    return readDataConsistencyLevel.get();
+  }
+
+  public void setReadDataConsistencyLevel(int readDataConsistencyLevel) {
+    this.readDataConsistencyLevel.set(readDataConsistencyLevel);
+  }
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/factory/ClusterRpcReaderFactory.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/factory/ClusterRpcReaderFactory.java
deleted file mode 100644
index 27444af..0000000
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/factory/ClusterRpcReaderFactory.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.iotdb.cluster.query.coordinatornode.factory;
-
-import com.alipay.sofa.jraft.entity.PeerId;
-import java.util.Map;
-import org.apache.iotdb.cluster.query.coordinatornode.reader.ClusterSeriesReader;
-import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
-
-public class ClusterRpcReaderFactory {
-
-  public static Map<String, ClusterSeriesReader> createClusterSeriesReader(String groupId, PeerId peerId, QueryPlan queryPlan){
-return null;
-  }
-}
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterSingleQueryManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterSingleQueryManager.java
index 90c1ac5..d350a7c 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterSingleQueryManager.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterSingleQueryManager.java
@@ -19,16 +19,19 @@
 package org.apache.iotdb.cluster.query.coordinatornode.manager;
 
 import com.alipay.sofa.jraft.entity.PeerId;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
-import org.apache.iotdb.cluster.query.coordinatornode.factory.ClusterRpcReaderFactory;
+import org.apache.iotdb.cluster.exception.RaftConnectionException;
+import org.apache.iotdb.cluster.query.PathType;
 import org.apache.iotdb.cluster.query.coordinatornode.reader.ClusterSeriesReader;
 import org.apache.iotdb.cluster.utils.QPExecutorUtils;
 import org.apache.iotdb.cluster.utils.RaftUtils;
 import org.apache.iotdb.cluster.utils.hash.Router;
+import org.apache.iotdb.cluster.utils.query.ClusterRpcReaderUtils;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
@@ -37,7 +40,7 @@ import org.apache.iotdb.tsfile.read.common.Path;
 public class ClusterSingleQueryManager implements IClusterSingleQueryManager {
 
   /**
-   * Query job id assigned by QueryResourceManager.
+   * Query job id assigned by QueryResourceManager of coordinator node.
    */
   private long jobId;
 
@@ -63,6 +66,8 @@ public class ClusterSingleQueryManager implements IClusterSingleQueryManager {
    */
   private Map<String, QueryPlan> filterPathPlans = new HashMap<>();
 
+  private Map<String, ClusterSeriesReader> filterPathReaders = new HashMap<>();
+
   public ClusterSingleQueryManager(long jobId,
       QueryPlan queryPlan) {
     this.jobId = jobId;
@@ -70,7 +75,8 @@ public class ClusterSingleQueryManager implements IClusterSingleQueryManager {
   }
 
   @Override
-  public void init(QueryType queryType) throws PathErrorException {
+  public void init(QueryType queryType, int readDataConsistencyLevel)
+      throws PathErrorException, IOException, RaftConnectionException {
     switch (queryType) {
       case NO_FILTER:
         divideNoFilterPhysicalPlan();
@@ -84,8 +90,8 @@ public class ClusterSingleQueryManager implements IClusterSingleQueryManager {
       default:
         throw new UnsupportedOperationException();
     }
-    initSelectedPathPlan();
-    initFilterPathPlan();
+    initSelectedPathPlan(readDataConsistencyLevel);
+    initFilterPathPlan(readDataConsistencyLevel);
   }
 
   public enum QueryType {
@@ -127,26 +133,25 @@ public class ClusterSingleQueryManager implements IClusterSingleQueryManager {
   /**
    * Init select path
    */
-  private void initSelectedPathPlan(){
-    if(!selectPathPlans.isEmpty()){
-      for(Entry<String, QueryPlan> entry: selectPathPlans.entrySet()){
+  private void initSelectedPathPlan(int readDataConsistencyLevel)
+      throws IOException, RaftConnectionException {
+    if (!selectPathPlans.isEmpty()) {
+      for (Entry<String, QueryPlan> entry : selectPathPlans.entrySet()) {
         String groupId = entry.getKey();
         QueryPlan queryPlan = entry.getValue();
-        if(!canHandleQueryLocally(groupId)) {
+        if (!canHandleQueryLocally(groupId)) {
           PeerId randomPeer = RaftUtils.getRandomPeerID(groupId);
           readerNodes.put(groupId, randomPeer);
-          Map<String, ClusterSeriesReader> selectPathReaders = ClusterRpcReaderFactory
-              .createClusterSeriesReader(groupId, randomPeer, queryPlan);
-          for (Path path : queryPlan.getPaths()) {
-            selectPathReaders.put(path.getFullPath(), selectPathReaders.get(path.getFullPath()));
-          }
+          this.selectPathReaders = ClusterRpcReaderUtils
+              .createClusterSeriesReader(groupId, randomPeer, queryPlan, readDataConsistencyLevel,
+                  PathType.SELECT_PATH);
         }
       }
     }
   }
 
-  private void initFilterPathPlan(){
-    if(!filterPathPlans.isEmpty()){
+  private void initFilterPathPlan(int readDataConsistencyLevel) {
+    if (!filterPathPlans.isEmpty()) {
 
     }
   }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/IClusterSingleQueryManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/IClusterSingleQueryManager.java
index dc84d32..bc70e65 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/IClusterSingleQueryManager.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/IClusterSingleQueryManager.java
@@ -19,6 +19,8 @@
 package org.apache.iotdb.cluster.query.coordinatornode.manager;
 
 import com.alipay.sofa.jraft.entity.PeerId;
+import java.io.IOException;
+import org.apache.iotdb.cluster.exception.RaftConnectionException;
 import org.apache.iotdb.cluster.query.coordinatornode.manager.ClusterSingleQueryManager.QueryType;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
@@ -33,7 +35,8 @@ public interface IClusterSingleQueryManager {
    * @param queryType
    */
   void init(
-      QueryType queryType) throws PathErrorException;
+      QueryType queryType, int readDataConsistencyLevel)
+      throws PathErrorException, IOException, RaftConnectionException;
 
   /**
    * Get physical plan of select path
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterRpcBatchDataReader.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterRpcBatchDataReader.java
index 5b75c9d..ba36416 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterRpcBatchDataReader.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterRpcBatchDataReader.java
@@ -18,19 +18,42 @@
  */
 package org.apache.iotdb.cluster.query.coordinatornode.reader;
 
+import com.alipay.sofa.jraft.entity.PeerId;
 import java.io.IOException;
 import org.apache.iotdb.cluster.query.PathType;
 import org.apache.iotdb.db.query.reader.IBatchReader;
-import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.BatchData;
 
 public class ClusterRpcBatchDataReader implements IBatchReader {
 
-  private String PeerId;
-  private String jobId;
+  /**
+   * Remote query node
+   */
+  private PeerId peerId;
+
+  /**
+   * Job id in remote query node
+   */
+  private long jobId;
+
+  /**
+   * Path type
+   */
   private PathType type;
+
+  /**
+   * Batch data
+   */
   private BatchData batchData;
 
+  public ClusterRpcBatchDataReader(PeerId peerId, long jobId,
+      PathType type, BatchData batchData) {
+    this.peerId = peerId;
+    this.jobId = jobId;
+    this.type = type;
+    this.batchData = batchData;
+  }
+
   @Override
   public boolean hasNext() throws IOException {
     return false;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterSeriesReader.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterSeriesReader.java
index 438559e..3d022f8 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterSeriesReader.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterSeriesReader.java
@@ -40,7 +40,7 @@ public class ClusterSeriesReader implements IPointReader {
 
   @Override
   public TimeValuePair current() throws IOException {
-    return null;
+    throw new IOException("current() in ClusterSeriesReader is an empty method.");
   }
 
   @Override
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/NodeAsClient.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/NodeAsClient.java
index ed38584..cc89abb 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/NodeAsClient.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/NodeAsClient.java
@@ -22,6 +22,7 @@ import com.alipay.sofa.jraft.entity.PeerId;
 import org.apache.iotdb.cluster.exception.RaftConnectionException;
 import org.apache.iotdb.cluster.qp.task.SingleQPTask;
 import org.apache.iotdb.cluster.rpc.raft.request.BasicRequest;
+import org.apache.iotdb.cluster.utils.query.QueryTask;
 
 /**
  * Handle the request and process the result as a client with the current node
@@ -38,11 +39,10 @@ public interface NodeAsClient {
 
   /**
    * Synchronous processing requests
-   *  @param clientService client rpc service handle
-   * @param leader leader node of the target group
-   * @param qpTask single QPTask to be executed
+   * @param peerId leader node of the target group
+   *
    */
-  void syncHandleRequest(BasicRequest request, PeerId leader, SingleQPTask qpTask)
+  QueryTask syncHandleRequest(BasicRequest request, PeerId peerId)
       throws RaftConnectionException;
 
   /**
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/impl/RaftNodeAsClientManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/impl/RaftNodeAsClientManager.java
index af77a1c..658b7a8 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/impl/RaftNodeAsClientManager.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/impl/RaftNodeAsClientManager.java
@@ -34,6 +34,7 @@ import org.apache.iotdb.cluster.qp.task.SingleQPTask;
 import org.apache.iotdb.cluster.rpc.raft.NodeAsClient;
 import org.apache.iotdb.cluster.rpc.raft.request.BasicRequest;
 import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
+import org.apache.iotdb.cluster.utils.query.QueryTask;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -214,17 +215,13 @@ public class RaftNodeAsClientManager {
     }
 
     @Override
-    public void syncHandleRequest(BasicRequest request, PeerId leader,
-        SingleQPTask qpTask)
-        throws RaftConnectionException {
+    public QueryTask syncHandleRequest(BasicRequest request, PeerId peerId) {
       try {
         BasicResponse response = (BasicResponse) boltClientService.getRpcClient()
-            .invokeSync(leader.getEndpoint().toString(), request, TASK_TIMEOUT_MS);
-        qpTask.run(response);
+            .invokeSync(peerId.getEndpoint().toString(), request, TASK_TIMEOUT_MS);
+        return new QueryTask(response, TaskState.FINISH);
       } catch (RemotingException | InterruptedException e) {
-        qpTask.setTaskState(TaskState.EXCEPTION);
-        qpTask.run(null);
-        throw new RaftConnectionException(e);
+        return new QueryTask(null, TaskState.EXCEPTION);
       } finally {
         releaseClient();
       }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/DataGroupNonQueryAsyncProcessor.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/nonquery/DataGroupNonQueryAsyncProcessor.java
similarity index 90%
rename from cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/DataGroupNonQueryAsyncProcessor.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/nonquery/DataGroupNonQueryAsyncProcessor.java
index fb00c0d..de2d2ab 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/DataGroupNonQueryAsyncProcessor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/nonquery/DataGroupNonQueryAsyncProcessor.java
@@ -16,16 +16,17 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.rpc.raft.processor;
+package org.apache.iotdb.cluster.rpc.raft.processor.nonquery;
 
 import com.alipay.remoting.AsyncContext;
 import com.alipay.remoting.BizContext;
 import com.alipay.sofa.jraft.entity.PeerId;
 import org.apache.iotdb.cluster.entity.raft.DataPartitionRaftHolder;
 import org.apache.iotdb.cluster.entity.raft.RaftService;
-import org.apache.iotdb.cluster.rpc.raft.request.DataGroupNonQueryRequest;
+import org.apache.iotdb.cluster.rpc.raft.processor.BasicAsyncUserProcessor;
+import org.apache.iotdb.cluster.rpc.raft.request.nonquery.DataGroupNonQueryRequest;
 import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
-import org.apache.iotdb.cluster.rpc.raft.response.DataGroupNonQueryResponse;
+import org.apache.iotdb.cluster.rpc.raft.response.nonquery.DataGroupNonQueryResponse;
 import org.apache.iotdb.cluster.utils.RaftUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/MetaGroupNonQueryAsyncProcessor.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/nonquery/MetaGroupNonQueryAsyncProcessor.java
similarity index 89%
rename from cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/MetaGroupNonQueryAsyncProcessor.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/nonquery/MetaGroupNonQueryAsyncProcessor.java
index d6f6270..9f09bbb 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/MetaGroupNonQueryAsyncProcessor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/nonquery/MetaGroupNonQueryAsyncProcessor.java
@@ -16,16 +16,17 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.rpc.raft.processor;
+package org.apache.iotdb.cluster.rpc.raft.processor.nonquery;
 
 import com.alipay.remoting.AsyncContext;
 import com.alipay.remoting.BizContext;
 import com.alipay.sofa.jraft.entity.PeerId;
 import org.apache.iotdb.cluster.entity.raft.MetadataRaftHolder;
 import org.apache.iotdb.cluster.entity.raft.RaftService;
-import org.apache.iotdb.cluster.rpc.raft.request.MetaGroupNonQueryRequest;
+import org.apache.iotdb.cluster.rpc.raft.processor.BasicAsyncUserProcessor;
+import org.apache.iotdb.cluster.rpc.raft.request.nonquery.MetaGroupNonQueryRequest;
 import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
-import org.apache.iotdb.cluster.rpc.raft.response.MetaGroupNonQueryResponse;
+import org.apache.iotdb.cluster.rpc.raft.response.nonquery.MetaGroupNonQueryResponse;
 import org.apache.iotdb.cluster.utils.RaftUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/QueryMetadataAsyncProcessor.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/querymetadata/QueryMetadataAsyncProcessor.java
similarity index 91%
rename from cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/QueryMetadataAsyncProcessor.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/querymetadata/QueryMetadataAsyncProcessor.java
index 176fa33..36e657c 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/QueryMetadataAsyncProcessor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/querymetadata/QueryMetadataAsyncProcessor.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.rpc.raft.processor;
+package org.apache.iotdb.cluster.rpc.raft.processor.querymetadata;
 
 import com.alipay.remoting.AsyncContext;
 import com.alipay.remoting.BizContext;
@@ -25,8 +25,9 @@ import com.alipay.sofa.jraft.closure.ReadIndexClosure;
 import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.entity.raft.DataPartitionRaftHolder;
 import org.apache.iotdb.cluster.entity.raft.RaftService;
-import org.apache.iotdb.cluster.rpc.raft.request.QueryMetadataRequest;
-import org.apache.iotdb.cluster.rpc.raft.response.QueryMetadataResponse;
+import org.apache.iotdb.cluster.rpc.raft.processor.BasicAsyncUserProcessor;
+import org.apache.iotdb.cluster.rpc.raft.request.querymetadata.QueryMetadataRequest;
+import org.apache.iotdb.cluster.rpc.raft.response.querymetadata.QueryMetadataResponse;
 import org.apache.iotdb.cluster.utils.RaftUtils;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.metadata.MManager;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/QueryMetadataInStringAsyncProcessor.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/querymetadata/QueryMetadataInStringAsyncProcessor.java
similarity index 90%
rename from cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/QueryMetadataInStringAsyncProcessor.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/querymetadata/QueryMetadataInStringAsyncProcessor.java
index b80f4ae..8771eea 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/QueryMetadataInStringAsyncProcessor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/querymetadata/QueryMetadataInStringAsyncProcessor.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.rpc.raft.processor;
+package org.apache.iotdb.cluster.rpc.raft.processor.querymetadata;
 
 import com.alipay.remoting.AsyncContext;
 import com.alipay.remoting.BizContext;
@@ -25,8 +25,9 @@ import com.alipay.sofa.jraft.closure.ReadIndexClosure;
 import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.entity.raft.DataPartitionRaftHolder;
 import org.apache.iotdb.cluster.entity.raft.RaftService;
-import org.apache.iotdb.cluster.rpc.raft.request.QueryMetadataInStringRequest;
-import org.apache.iotdb.cluster.rpc.raft.response.QueryMetadataInStringResponse;
+import org.apache.iotdb.cluster.rpc.raft.processor.BasicAsyncUserProcessor;
+import org.apache.iotdb.cluster.rpc.raft.request.querymetadata.QueryMetadataInStringRequest;
+import org.apache.iotdb.cluster.rpc.raft.response.querymetadata.QueryMetadataInStringResponse;
 import org.apache.iotdb.cluster.utils.RaftUtils;
 import org.apache.iotdb.db.metadata.MManager;
 
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/QueryPathsAsyncProcessor.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/querymetadata/QueryPathsAsyncProcessor.java
similarity index 92%
rename from cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/QueryPathsAsyncProcessor.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/querymetadata/QueryPathsAsyncProcessor.java
index f54aba0..8e1e47b 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/QueryPathsAsyncProcessor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/querymetadata/QueryPathsAsyncProcessor.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.rpc.raft.processor;
+package org.apache.iotdb.cluster.rpc.raft.processor.querymetadata;
 
 import com.alipay.remoting.AsyncContext;
 import com.alipay.remoting.BizContext;
@@ -25,8 +25,9 @@ import com.alipay.sofa.jraft.closure.ReadIndexClosure;
 import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.entity.raft.DataPartitionRaftHolder;
 import org.apache.iotdb.cluster.entity.raft.RaftService;
-import org.apache.iotdb.cluster.rpc.raft.request.QueryPathsRequest;
-import org.apache.iotdb.cluster.rpc.raft.response.QueryPathsResponse;
+import org.apache.iotdb.cluster.rpc.raft.processor.BasicAsyncUserProcessor;
+import org.apache.iotdb.cluster.rpc.raft.request.querymetadata.QueryPathsRequest;
+import org.apache.iotdb.cluster.rpc.raft.response.querymetadata.QueryPathsResponse;
 import org.apache.iotdb.cluster.utils.RaftUtils;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.metadata.MManager;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/QuerySeriesTypeAsyncProcessor.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/querymetadata/QuerySeriesTypeAsyncProcessor.java
similarity index 91%
rename from cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/QuerySeriesTypeAsyncProcessor.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/querymetadata/QuerySeriesTypeAsyncProcessor.java
index f0a4fc6..9e4b1c7 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/QuerySeriesTypeAsyncProcessor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/querymetadata/QuerySeriesTypeAsyncProcessor.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.rpc.raft.processor;
+package org.apache.iotdb.cluster.rpc.raft.processor.querymetadata;
 
 import com.alipay.remoting.AsyncContext;
 import com.alipay.remoting.BizContext;
@@ -25,8 +25,9 @@ import com.alipay.sofa.jraft.closure.ReadIndexClosure;
 import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.entity.raft.DataPartitionRaftHolder;
 import org.apache.iotdb.cluster.entity.raft.RaftService;
-import org.apache.iotdb.cluster.rpc.raft.request.QuerySeriesTypeRequest;
-import org.apache.iotdb.cluster.rpc.raft.response.QuerySeriesTypeResponse;
+import org.apache.iotdb.cluster.rpc.raft.processor.BasicAsyncUserProcessor;
+import org.apache.iotdb.cluster.rpc.raft.request.querymetadata.QuerySeriesTypeRequest;
+import org.apache.iotdb.cluster.rpc.raft.response.querymetadata.QuerySeriesTypeResponse;
 import org.apache.iotdb.cluster.utils.RaftUtils;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.metadata.MManager;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/QueryTimeSeriesAsyncProcessor.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/querymetadata/QueryTimeSeriesAsyncProcessor.java
similarity index 92%
rename from cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/QueryTimeSeriesAsyncProcessor.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/querymetadata/QueryTimeSeriesAsyncProcessor.java
index c41fdcf..593f99d 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/QueryTimeSeriesAsyncProcessor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/querymetadata/QueryTimeSeriesAsyncProcessor.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.rpc.raft.processor;
+package org.apache.iotdb.cluster.rpc.raft.processor.querymetadata;
 
 import com.alipay.remoting.AsyncContext;
 import com.alipay.remoting.BizContext;
@@ -25,8 +25,9 @@ import com.alipay.sofa.jraft.closure.ReadIndexClosure;
 import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.entity.raft.DataPartitionRaftHolder;
 import org.apache.iotdb.cluster.entity.raft.RaftService;
-import org.apache.iotdb.cluster.rpc.raft.request.QueryTimeSeriesRequest;
-import org.apache.iotdb.cluster.rpc.raft.response.QueryTimeSeriesResponse;
+import org.apache.iotdb.cluster.rpc.raft.processor.BasicAsyncUserProcessor;
+import org.apache.iotdb.cluster.rpc.raft.request.querymetadata.QueryTimeSeriesRequest;
+import org.apache.iotdb.cluster.rpc.raft.response.querymetadata.QueryTimeSeriesResponse;
 import org.apache.iotdb.cluster.utils.RaftUtils;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.metadata.MManager;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/BasicQueryRequest.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/BasicQueryRequest.java
index 2cf613f..0e4ea6d 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/BasicQueryRequest.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/BasicQueryRequest.java
@@ -30,6 +30,10 @@ public abstract class BasicQueryRequest extends BasicRequest {
     this.readConsistencyLevel = readConsistencyLevel;
   }
 
+  public BasicQueryRequest(String groupID) {
+    super(groupID);
+  }
+
   public int getReadConsistencyLevel() {
     return readConsistencyLevel;
   }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/DataGroupNonQueryRequest.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/nonquery/DataGroupNonQueryRequest.java
similarity index 86%
copy from cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/DataGroupNonQueryRequest.java
copy to cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/nonquery/DataGroupNonQueryRequest.java
index c1bcf5f..9a5df22 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/DataGroupNonQueryRequest.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/nonquery/DataGroupNonQueryRequest.java
@@ -16,17 +16,18 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.rpc.raft.request;
+package org.apache.iotdb.cluster.rpc.raft.request.nonquery;
 
 import java.io.IOException;
 import java.io.Serializable;
 import java.util.List;
+import org.apache.iotdb.cluster.rpc.raft.request.BasicRequest;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 
 /**
  * Handle request to data group
  */
-public class DataGroupNonQueryRequest extends BasicRequest implements Serializable {
+public class DataGroupNonQueryRequest extends BasicRequest {
 
 
   public DataGroupNonQueryRequest(String groupID, List<PhysicalPlan> physicalPlanBytes)
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/MetaGroupNonQueryRequest.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/nonquery/MetaGroupNonQueryRequest.java
similarity index 86%
rename from cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/MetaGroupNonQueryRequest.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/nonquery/MetaGroupNonQueryRequest.java
index 69625ff..7b90e68 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/MetaGroupNonQueryRequest.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/nonquery/MetaGroupNonQueryRequest.java
@@ -16,17 +16,18 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.rpc.raft.request;
+package org.apache.iotdb.cluster.rpc.raft.request.nonquery;
 
 import java.io.IOException;
 import java.io.Serializable;
 import java.util.List;
+import org.apache.iotdb.cluster.rpc.raft.request.BasicRequest;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 
 /**
  * Handle request to metadata group leader
  */
-public class MetaGroupNonQueryRequest extends BasicRequest implements Serializable {
+public class MetaGroupNonQueryRequest extends BasicRequest {
 
   public MetaGroupNonQueryRequest(String groupID, List<PhysicalPlan> plans)
       throws IOException {
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/DataGroupNonQueryRequest.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querydata/QuerySeriesDataRequest.java
similarity index 56%
rename from cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/DataGroupNonQueryRequest.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querydata/QuerySeriesDataRequest.java
index c1bcf5f..fd27997 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/DataGroupNonQueryRequest.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querydata/QuerySeriesDataRequest.java
@@ -16,23 +16,34 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.rpc.raft.request;
+package org.apache.iotdb.cluster.rpc.raft.request.querydata;
 
 import java.io.IOException;
-import java.io.Serializable;
 import java.util.List;
+import org.apache.iotdb.cluster.query.PathType;
+import org.apache.iotdb.cluster.rpc.raft.request.BasicQueryRequest;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 
-/**
- * Handle request to data group
- */
-public class DataGroupNonQueryRequest extends BasicRequest implements Serializable {
+public class QuerySeriesDataRequest extends BasicQueryRequest {
 
+  private Stage stage;
+  private PathType pathType;
+  private List<String> paths;
 
-  public DataGroupNonQueryRequest(String groupID, List<PhysicalPlan> physicalPlanBytes)
+  public QuerySeriesDataRequest(String groupID, int readConsistencyLevel,
+      List<PhysicalPlan> physicalPlanBytes, PathType pathType)
       throws IOException {
-    super(groupID);
+    super(groupID, readConsistencyLevel);
     init(physicalPlanBytes);
+    stage = Stage.INITIAL;
+    this.pathType = pathType;
   }
 
+  public QuerySeriesDataRequest(String groupID, List<String> paths, PathType pathType)
+      throws IOException {
+    super(groupID);
+    this.paths = paths;
+    stage = Stage.READ_DATA;
+    this.pathType = pathType;
+  }
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/QueryMetadataRequest.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querydata/Stage.java
similarity index 73%
copy from cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/QueryMetadataRequest.java
copy to cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querydata/Stage.java
index 2628fb6..53d2e2a 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/QueryMetadataRequest.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querydata/Stage.java
@@ -16,13 +16,8 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.rpc.raft.request;
+package org.apache.iotdb.cluster.rpc.raft.request.querydata;
 
-import java.io.Serializable;
-
-public class QueryMetadataRequest extends BasicQueryRequest implements Serializable {
-
-  public QueryMetadataRequest(String groupID, int readConsistencyLevel) {
-    super(groupID, readConsistencyLevel);
-  }
-}
\ No newline at end of file
+public enum Stage {
+  INITIAL, READ_DATA
+}
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/QueryMetadataInStringRequest.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QueryMetadataInStringRequest.java
similarity index 87%
rename from cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/QueryMetadataInStringRequest.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QueryMetadataInStringRequest.java
index 18471a6..0e23dab 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/QueryMetadataInStringRequest.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QueryMetadataInStringRequest.java
@@ -16,11 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.rpc.raft.request;
+package org.apache.iotdb.cluster.rpc.raft.request.querymetadata;
 
-import java.io.Serializable;
+import org.apache.iotdb.cluster.rpc.raft.request.BasicQueryRequest;
 
-public class QueryMetadataInStringRequest extends BasicQueryRequest implements Serializable {
+public class QueryMetadataInStringRequest extends BasicQueryRequest {
 
   public QueryMetadataInStringRequest(String groupID, int readConsistencyLevel) {
     super(groupID, readConsistencyLevel);
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/QueryMetadataRequest.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QueryMetadataRequest.java
similarity index 82%
rename from cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/QueryMetadataRequest.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QueryMetadataRequest.java
index 2628fb6..3958775 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/QueryMetadataRequest.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QueryMetadataRequest.java
@@ -16,11 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.rpc.raft.request;
+package org.apache.iotdb.cluster.rpc.raft.request.querymetadata;
 
-import java.io.Serializable;
+import org.apache.iotdb.cluster.rpc.raft.request.BasicQueryRequest;
 
-public class QueryMetadataRequest extends BasicQueryRequest implements Serializable {
+public class QueryMetadataRequest extends BasicQueryRequest {
 
   public QueryMetadataRequest(String groupID, int readConsistencyLevel) {
     super(groupID, readConsistencyLevel);
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/QueryPathsRequest.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QueryPathsRequest.java
similarity index 84%
rename from cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/QueryPathsRequest.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QueryPathsRequest.java
index 2c600f4..49355ea 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/QueryPathsRequest.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QueryPathsRequest.java
@@ -16,12 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.rpc.raft.request;
+package org.apache.iotdb.cluster.rpc.raft.request.querymetadata;
 
-import java.io.Serializable;
 import java.util.List;
+import org.apache.iotdb.cluster.rpc.raft.request.BasicQueryRequest;
 
-public class QueryPathsRequest extends BasicQueryRequest implements Serializable {
+public class QueryPathsRequest extends BasicQueryRequest {
 
   private List<String> path;
 
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/QuerySeriesTypeRequest.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QuerySeriesTypeRequest.java
similarity index 84%
rename from cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/QuerySeriesTypeRequest.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QuerySeriesTypeRequest.java
index c486576..4f700dc 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/QuerySeriesTypeRequest.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QuerySeriesTypeRequest.java
@@ -16,11 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.rpc.raft.request;
+package org.apache.iotdb.cluster.rpc.raft.request.querymetadata;
 
-import java.io.Serializable;
+import org.apache.iotdb.cluster.rpc.raft.request.BasicQueryRequest;
 
-public class QuerySeriesTypeRequest extends BasicQueryRequest implements Serializable {
+public class QuerySeriesTypeRequest extends BasicQueryRequest {
 
   private String path;
 
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/QueryStorageGroupRequest.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QueryStorageGroupRequest.java
similarity index 88%
rename from cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/QueryStorageGroupRequest.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QueryStorageGroupRequest.java
index 037924f..2bcf187 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/QueryStorageGroupRequest.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QueryStorageGroupRequest.java
@@ -16,11 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.rpc.raft.request;
+package org.apache.iotdb.cluster.rpc.raft.request.querymetadata;
 
-import java.io.Serializable;
+import org.apache.iotdb.cluster.rpc.raft.request.BasicQueryRequest;
 
-public class QueryStorageGroupRequest extends BasicQueryRequest implements Serializable {
+public class QueryStorageGroupRequest extends BasicQueryRequest {
 
   public QueryStorageGroupRequest(String groupID, int readConsistencyLevel) {
     super(groupID, readConsistencyLevel);
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/QueryTimeSeriesRequest.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QueryTimeSeriesRequest.java
similarity index 84%
rename from cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/QueryTimeSeriesRequest.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QueryTimeSeriesRequest.java
index 0106f18..0bad4fc 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/QueryTimeSeriesRequest.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QueryTimeSeriesRequest.java
@@ -16,12 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.rpc.raft.request;
+package org.apache.iotdb.cluster.rpc.raft.request.querymetadata;
 
-import java.io.Serializable;
 import java.util.List;
+import org.apache.iotdb.cluster.rpc.raft.request.BasicQueryRequest;
 
-public class QueryTimeSeriesRequest extends BasicQueryRequest implements Serializable {
+public class QueryTimeSeriesRequest extends BasicQueryRequest {
 
   private List<String> path;
 
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/DataGroupNonQueryResponse.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/nonquery/DataGroupNonQueryResponse.java
similarity index 92%
rename from cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/DataGroupNonQueryResponse.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/nonquery/DataGroupNonQueryResponse.java
index 074f452..0950c0d 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/DataGroupNonQueryResponse.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/nonquery/DataGroupNonQueryResponse.java
@@ -16,7 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.rpc.raft.response;
+package org.apache.iotdb.cluster.rpc.raft.response.nonquery;
+
+import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
 
 /**
  * Handle response from data group leader
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/MetaGroupNonQueryResponse.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/nonquery/MetaGroupNonQueryResponse.java
similarity index 91%
rename from cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/MetaGroupNonQueryResponse.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/nonquery/MetaGroupNonQueryResponse.java
index f662e35..2ec1165 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/MetaGroupNonQueryResponse.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/nonquery/MetaGroupNonQueryResponse.java
@@ -16,7 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.rpc.raft.response;
+package org.apache.iotdb.cluster.rpc.raft.response.nonquery;
+
+import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
 
 /**
  * Handle response from metadata group leader
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querydata/QuerySeriesDataResponse.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querydata/QuerySeriesDataResponse.java
new file mode 100644
index 0000000..9f62617
--- /dev/null
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querydata/QuerySeriesDataResponse.java
@@ -0,0 +1,69 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.cluster.rpc.raft.response.querydata;
+
+import java.util.Map;
+import org.apache.iotdb.cluster.query.PathType;
+import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.tsfile.read.common.BatchData;
+
+public class QuerySeriesDataResponse extends BasicResponse {
+
+  private long jobId;
+  private PathType pathType;
+  private Map<String, TSDataType> seriesType;
+  private Map<String, BatchData> seriesBatchData;
+
+  public QuerySeriesDataResponse(String groupId, PathType pathType) {
+    super(groupId, false, null, null);
+    this.pathType = pathType;
+  }
+
+  public QuerySeriesDataResponse setJobId(long jobId) {
+    this.jobId = jobId;
+    return this;
+  }
+
+  public QuerySeriesDataResponse setSeriesType(Map<String, TSDataType> seriesType) {
+    this.seriesType = seriesType;
+    return this;
+  }
+
+  public QuerySeriesDataResponse seySeriesBatchData(Map<String, BatchData> seriesBatchData) {
+    this.seriesBatchData = seriesBatchData;
+    return this;
+  }
+
+  public long getJobId() {
+    return jobId;
+  }
+
+  public PathType getPathType() {
+    return pathType;
+  }
+
+  public Map<String, TSDataType> getSeriesType() {
+    return seriesType;
+  }
+
+  public Map<String, BatchData> getSeriesBatchData() {
+    return seriesBatchData;
+  }
+}
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/QueryMetadataInStringResponse.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QueryMetadataInStringResponse.java
similarity index 92%
rename from cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/QueryMetadataInStringResponse.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QueryMetadataInStringResponse.java
index a3a963a..8967ea1 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/QueryMetadataInStringResponse.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QueryMetadataInStringResponse.java
@@ -16,7 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.rpc.raft.response;
+package org.apache.iotdb.cluster.rpc.raft.response.querymetadata;
+
+import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
 
 public class QueryMetadataInStringResponse extends BasicResponse {
 
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/QueryMetadataResponse.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QueryMetadataResponse.java
similarity index 92%
rename from cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/QueryMetadataResponse.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QueryMetadataResponse.java
index 6c21798..3f0ad51 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/QueryMetadataResponse.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QueryMetadataResponse.java
@@ -16,8 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.rpc.raft.response;
+package org.apache.iotdb.cluster.rpc.raft.response.querymetadata;
 
+import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
 import org.apache.iotdb.db.metadata.Metadata;
 
 public class QueryMetadataResponse extends BasicResponse {
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/QueryPathsResponse.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QueryPathsResponse.java
similarity index 92%
rename from cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/QueryPathsResponse.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QueryPathsResponse.java
index 29d659a..47f51f7 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/QueryPathsResponse.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QueryPathsResponse.java
@@ -16,10 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.rpc.raft.response;
+package org.apache.iotdb.cluster.rpc.raft.response.querymetadata;
 
 import java.util.ArrayList;
 import java.util.List;
+import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
 
 public class QueryPathsResponse extends BasicResponse {
 
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/QuerySeriesTypeResponse.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QuerySeriesTypeResponse.java
similarity index 92%
rename from cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/QuerySeriesTypeResponse.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QuerySeriesTypeResponse.java
index e86e108..d772365 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/QuerySeriesTypeResponse.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QuerySeriesTypeResponse.java
@@ -16,8 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.rpc.raft.response;
+package org.apache.iotdb.cluster.rpc.raft.response.querymetadata;
 
+import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
 public class QuerySeriesTypeResponse extends BasicResponse {
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/QueryStorageGroupResponse.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QueryStorageGroupResponse.java
similarity index 92%
rename from cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/QueryStorageGroupResponse.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QueryStorageGroupResponse.java
index 6abff89..4668e6d 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/QueryStorageGroupResponse.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QueryStorageGroupResponse.java
@@ -16,9 +16,10 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.rpc.raft.response;
+package org.apache.iotdb.cluster.rpc.raft.response.querymetadata;
 
 import java.util.Set;
+import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
 
 public class QueryStorageGroupResponse extends BasicResponse {
 
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/QueryTimeSeriesResponse.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QueryTimeSeriesResponse.java
similarity index 92%
rename from cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/QueryTimeSeriesResponse.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QueryTimeSeriesResponse.java
index edeb4c4..2950b1f 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/QueryTimeSeriesResponse.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QueryTimeSeriesResponse.java
@@ -16,10 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.rpc.raft.response;
+package org.apache.iotdb.cluster.rpc.raft.response.querymetadata;
 
 import java.util.ArrayList;
 import java.util.List;
+import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
 
 public class QueryTimeSeriesResponse extends BasicResponse {
 
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java b/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java
index 79b2acd..d978f7a 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java
@@ -31,7 +31,7 @@ import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.exception.ConsistencyLevelException;
 import org.apache.iotdb.cluster.qp.executor.NonQueryExecutor;
 import org.apache.iotdb.cluster.qp.executor.QueryMetadataExecutor;
-import org.apache.iotdb.cluster.query.coordinatornode.executor.ClusterQueryProcessExecutor;
+import org.apache.iotdb.cluster.qp.executor.ClusterQueryProcessExecutor;
 import org.apache.iotdb.cluster.query.coordinatornode.manager.ClusterRpcQueryManager;
 import org.apache.iotdb.db.auth.AuthException;
 import org.apache.iotdb.db.conf.IoTDBConstant;
@@ -65,11 +65,13 @@ public class TSServiceClusterImpl extends TSServiceImpl {
 
   private static final Logger LOGGER = LoggerFactory.getLogger(TSServiceClusterImpl.class);
 
-  private ClusterRpcQueryManager queryManager = ClusterRpcQueryManager.getInstance();
-  private QueryProcessor processor = new QueryProcessor(new ClusterQueryProcessExecutor());
+  private ClusterQueryProcessExecutor queryDataExecutor = new ClusterQueryProcessExecutor();
   private NonQueryExecutor nonQueryExecutor = new NonQueryExecutor();
   private QueryMetadataExecutor queryMetadataExecutor = new QueryMetadataExecutor();
 
+  private ClusterRpcQueryManager queryManager = ClusterRpcQueryManager.getInstance();
+  private QueryProcessor queryProcessor = new QueryProcessor(queryDataExecutor);
+
   public TSServiceClusterImpl() throws IOException {
     super();
   }
@@ -126,7 +128,7 @@ public class TSServiceClusterImpl extends TSServiceImpl {
       /** find all valid physical plans **/
       for (int i = 0; i < statements.size(); i++) {
         try {
-          PhysicalPlan plan = processor
+          PhysicalPlan plan = queryProcessor
               .parseSQLToPhysicalPlan(statements.get(i), zoneIds.get());
           plan.setProposer(username.get());
 
@@ -242,13 +244,13 @@ public class TSServiceClusterImpl extends TSServiceImpl {
       if (Pattern.matches(ClusterConstant.SET_READ_METADATA_CONSISTENCY_LEVEL_PATTERN, statement)) {
         String[] splits = statement.split("\\s+");
         int level = Integer.parseInt(splits[splits.length - 1]);
-        nonQueryExecutor.setReadMetadataConsistencyLevel(level);
+        queryMetadataExecutor.setReadMetadataConsistencyLevel(level);
         return true;
       } else if (Pattern
           .matches(ClusterConstant.SET_READ_DATA_CONSISTENCY_LEVEL_PATTERN, statement)) {
         String[] splits = statement.split("\\s+");
         int level = Integer.parseInt(splits[splits.length - 1]);
-        nonQueryExecutor.setReadDataConsistencyLevel(level);
+        queryDataExecutor.setReadDataConsistencyLevel(level);
         return true;
       } else {
         return false;
@@ -295,7 +297,7 @@ public class TSServiceClusterImpl extends TSServiceImpl {
       throws PathErrorException, QueryFilterOptimizationException, FileNodeManagerException,
       ProcessorException, IOException {
     PhysicalPlan physicalPlan = queryStatus.get().get(statement);
-    processor.getExecutor().setFetchSize(fetchSize);
+    queryProcessor.getExecutor().setFetchSize(fetchSize);
 
     long jobId = QueryResourceManager.getInstance().assignJobId();
     QueryContext context = new QueryContext(jobId);
@@ -303,7 +305,7 @@ public class TSServiceClusterImpl extends TSServiceImpl {
     contextMapLocal.get().put(req.queryId, context);
 
     queryManager.addSingleQuery(jobId, (QueryPlan) physicalPlan);
-    QueryDataSet queryDataSet = processor.getExecutor().processQuery((QueryPlan) physicalPlan,
+    QueryDataSet queryDataSet = queryProcessor.getExecutor().processQuery((QueryPlan) physicalPlan,
         context);
     queryRet.get().put(statement, queryDataSet);
     return queryDataSet;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/utils/RaftUtils.java b/cluster/src/main/java/org/apache/iotdb/cluster/utils/RaftUtils.java
index 5c3f3cb..d2d5429 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/utils/RaftUtils.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/utils/RaftUtils.java
@@ -47,7 +47,7 @@ import org.apache.iotdb.cluster.rpc.raft.closure.ResponseClosure;
 import org.apache.iotdb.cluster.rpc.raft.impl.RaftNodeAsClientManager;
 import org.apache.iotdb.cluster.rpc.raft.request.BasicRequest;
 import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
-import org.apache.iotdb.cluster.rpc.raft.response.MetaGroupNonQueryResponse;
+import org.apache.iotdb.cluster.rpc.raft.response.nonquery.MetaGroupNonQueryResponse;
 import org.apache.iotdb.cluster.utils.hash.PhysicalNode;
 import org.apache.iotdb.cluster.utils.hash.Router;
 import org.slf4j.Logger;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/utils/query/ClusterRpcReaderUtils.java b/cluster/src/main/java/org/apache/iotdb/cluster/utils/query/ClusterRpcReaderUtils.java
new file mode 100644
index 0000000..35ff3fb
--- /dev/null
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/utils/query/ClusterRpcReaderUtils.java
@@ -0,0 +1,99 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.cluster.utils.query;
+
+import com.alipay.sofa.jraft.entity.PeerId;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import org.apache.iotdb.cluster.config.ClusterDescriptor;
+import org.apache.iotdb.cluster.exception.RaftConnectionException;
+import org.apache.iotdb.cluster.qp.task.QPTask.TaskState;
+import org.apache.iotdb.cluster.query.PathType;
+import org.apache.iotdb.cluster.query.coordinatornode.reader.ClusterRpcBatchDataReader;
+import org.apache.iotdb.cluster.query.coordinatornode.reader.ClusterSeriesReader;
+import org.apache.iotdb.cluster.rpc.raft.NodeAsClient;
+import org.apache.iotdb.cluster.rpc.raft.request.BasicRequest;
+import org.apache.iotdb.cluster.rpc.raft.request.querydata.QuerySeriesDataRequest;
+import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
+import org.apache.iotdb.cluster.rpc.raft.response.querydata.QuerySeriesDataResponse;
+import org.apache.iotdb.cluster.utils.RaftUtils;
+import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
+import org.apache.iotdb.db.query.reader.IBatchReader;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.tsfile.read.common.BatchData;
+
+public class ClusterRpcReaderUtils {
+
+  /**
+   * Count limit to redo a task
+   */
+  private static final int TASK_MAX_RETRY = ClusterDescriptor.getInstance().getConfig()
+      .getQpTaskRedoCount();
+
+  public static Map<String, ClusterSeriesReader> createClusterSeriesReader(String groupId,
+      PeerId peerId, QueryPlan queryPlan, int readDataConsistencyLevel, PathType pathType)
+      throws IOException, RaftConnectionException {
+
+    /** handle request **/
+    List<PhysicalPlan> physicalPlanList = new ArrayList<>();
+    physicalPlanList.add(queryPlan);
+    BasicRequest request = new QuerySeriesDataRequest(groupId, readDataConsistencyLevel,
+        physicalPlanList, pathType);
+    QuerySeriesDataResponse response = (QuerySeriesDataResponse) handleQueryRequest(request, peerId,
+        0);
+
+    /** create cluster series reader **/
+    Map<String, ClusterSeriesReader> allSeriesReader = new HashMap<>();
+    Map<String, TSDataType> seriesType = response.getSeriesType();
+    Map<String, BatchData> seriesBatchData = response.getSeriesBatchData();
+    long jobId = response.getJobId();
+    for (Entry<String, TSDataType> entry : seriesType.entrySet()) {
+      String seriesPath = entry.getKey();
+      TSDataType dataType = entry.getValue();
+      IBatchReader batchDataReader = new ClusterRpcBatchDataReader(peerId, jobId,
+          PathType.SELECT_PATH, seriesBatchData.get(seriesPath));
+      ClusterSeriesReader seriesReader = new ClusterSeriesReader(batchDataReader, seriesPath,
+          dataType);
+      allSeriesReader.put(seriesPath, seriesReader);
+    }
+    return allSeriesReader;
+  }
+
+  private static BasicResponse handleQueryRequest(BasicRequest request, PeerId peerId,
+      int taskRetryNum)
+      throws RaftConnectionException {
+    if (taskRetryNum > TASK_MAX_RETRY) {
+      throw new RaftConnectionException(
+          String.format("Query request retries reach the upper bound %s",
+              TASK_MAX_RETRY));
+    }
+    NodeAsClient nodeAsClient = RaftUtils.getRaftNodeAsClient();
+    QueryTask queryTask = nodeAsClient.syncHandleRequest(request, peerId);
+    if (queryTask.getState() == TaskState.FINISH) {
+      return queryTask.getBasicResponse();
+    } else {
+      return handleQueryRequest(request, peerId, taskRetryNum + 1);
+    }
+  }
+}
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterRpcBatchDataReader.java b/cluster/src/main/java/org/apache/iotdb/cluster/utils/query/QueryTask.java
similarity index 54%
copy from cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterRpcBatchDataReader.java
copy to cluster/src/main/java/org/apache/iotdb/cluster/utils/query/QueryTask.java
index 5b75c9d..69f72b2 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterRpcBatchDataReader.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/utils/query/QueryTask.java
@@ -16,33 +16,34 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.query.coordinatornode.reader;
+package org.apache.iotdb.cluster.utils.query;
 
-import java.io.IOException;
-import org.apache.iotdb.cluster.query.PathType;
-import org.apache.iotdb.db.query.reader.IBatchReader;
-import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
-import org.apache.iotdb.tsfile.read.common.BatchData;
+import org.apache.iotdb.cluster.qp.task.QPTask.TaskState;
+import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
 
-public class ClusterRpcBatchDataReader implements IBatchReader {
+public class QueryTask {
+  private BasicResponse basicResponse;
+  private TaskState state;
 
-  private String PeerId;
-  private String jobId;
-  private PathType type;
-  private BatchData batchData;
+  public QueryTask(BasicResponse basicResponse,
+      TaskState state) {
+    this.basicResponse = basicResponse;
+    this.state = state;
+  }
 
-  @Override
-  public boolean hasNext() throws IOException {
-    return false;
+  public BasicResponse getBasicResponse() {
+    return basicResponse;
   }
 
-  @Override
-  public BatchData nextBatch() throws IOException {
-    return null;
+  public void setBasicResponse(BasicResponse basicResponse) {
+    this.basicResponse = basicResponse;
   }
 
-  @Override
-  public void close() throws IOException {
+  public TaskState getState() {
+    return state;
+  }
 
+  public void setState(TaskState state) {
+    this.state = state;
   }
 }
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/utils/RaftUtilsTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/utils/RaftUtilsTest.java
index d35746d..85a692d 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/utils/RaftUtilsTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/utils/RaftUtilsTest.java
@@ -40,7 +40,7 @@ import org.apache.iotdb.cluster.entity.raft.RaftService;
 import org.apache.iotdb.cluster.qp.task.QPTask;
 import org.apache.iotdb.cluster.qp.task.SingleQPTask;
 import org.apache.iotdb.cluster.rpc.raft.request.BasicRequest;
-import org.apache.iotdb.cluster.rpc.raft.request.DataGroupNonQueryRequest;
+import org.apache.iotdb.cluster.rpc.raft.request.nonquery.DataGroupNonQueryRequest;
 import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
 import org.apache.iotdb.cluster.utils.hash.PhysicalNode;
 import org.apache.iotdb.cluster.utils.hash.Router;
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/IQueryProcessExecutor.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/IQueryProcessExecutor.java
index 68cde76..44d0a58 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/IQueryProcessExecutor.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/IQueryProcessExecutor.java
@@ -140,5 +140,4 @@ public interface IQueryProcessExecutor {
 
   void setFetchSize(int fetchSize);
 
-  IEngineQueryRouter getQueryRouter();
 }
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/OverflowQPExecutor.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/OverflowQPExecutor.java
index 58702d8..9a4566e 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/OverflowQPExecutor.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/OverflowQPExecutor.java
@@ -185,14 +185,14 @@ public class OverflowQPExecutor extends QueryProcessExecutor {
       QueryContext context)
       throws ProcessorException, FileNodeManagerException, QueryFilterOptimizationException,
       PathErrorException, IOException {
-    return getQueryRouter().aggregate(paths, aggres, expression, context);
+    return queryRouter.aggregate(paths, aggres, expression, context);
   }
 
   @Override
   public QueryDataSet fill(List<Path> fillPaths, long queryTime, Map<TSDataType, IFill> fillTypes,
       QueryContext context)
       throws ProcessorException, IOException, PathErrorException, FileNodeManagerException {
-    return getQueryRouter().fill(fillPaths, queryTime, fillTypes, context);
+    return queryRouter.fill(fillPaths, queryTime, fillTypes, context);
   }
 
   @Override
@@ -200,7 +200,7 @@ public class OverflowQPExecutor extends QueryProcessExecutor {
       long unit, long origin, List<Pair<Long, Long>> intervals, QueryContext context)
       throws ProcessorException, FileNodeManagerException, QueryFilterOptimizationException,
       PathErrorException, IOException {
-    return getQueryRouter().groupBy(paths, aggres, expression, unit, origin, intervals, context);
+    return queryRouter.groupBy(paths, aggres, expression, unit, origin, intervals, context);
   }
 
   @Override
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/QueryProcessExecutor.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/QueryProcessExecutor.java
index 54c750b..bef0328 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/QueryProcessExecutor.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/QueryProcessExecutor.java
@@ -43,7 +43,7 @@ import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
 public abstract class QueryProcessExecutor implements IQueryProcessExecutor {
 
   protected ThreadLocal<Integer> fetchSize = new ThreadLocal<>();
-  private IEngineQueryRouter queryRouter = new EngineQueryRouter();
+  protected IEngineQueryRouter queryRouter = new EngineQueryRouter();
 
   @Override
   public QueryDataSet processQuery(QueryPlan queryPlan, QueryContext context)
@@ -69,7 +69,7 @@ public abstract class QueryProcessExecutor implements IQueryProcessExecutor {
       return fill(queryPlan.getPaths(), fillQueryPlan.getQueryTime(),
           fillQueryPlan.getFillType(), context);
     }
-    return getQueryRouter().query(queryExpression, context);
+    return queryRouter.query(queryExpression, context);
   }
 
   @Override
@@ -86,11 +86,6 @@ public abstract class QueryProcessExecutor implements IQueryProcessExecutor {
   }
 
   @Override
-  public IEngineQueryRouter getQueryRouter() {
-    return queryRouter;
-  }
-
-  @Override
   public boolean delete(List<Path> paths, long deleteTime) throws ProcessorException {
     try {
       boolean result = true;
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/BatchData.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/BatchData.java
index fac4765..aeb789e 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/BatchData.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/BatchData.java
@@ -18,6 +18,7 @@
  */
 package org.apache.iotdb.tsfile.read.common;
 
+import java.io.Serializable;
 import java.util.ArrayList;
 import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
 import org.apache.iotdb.tsfile.exception.write.UnSupportedDataTypeException;
@@ -28,8 +29,9 @@ import org.apache.iotdb.tsfile.utils.Binary;
  * <code>BatchData</code> is a self-defined data structure which is optimized for different type of
  * values. This class can be viewed as a collection which is more efficient than ArrayList.
  */
-public class BatchData {
+public class BatchData implements Serializable {
 
+  private static final long serialVersionUID = -4620310601188394839L;
   private int timeCapacity = 1;
   private int valueCapacity = 1;
   private int emptyTimeCapacity = 1;


[incubator-iotdb] 04/19: reorganize query dataset code

Posted by lt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

lta pushed a commit to branch cluster_read
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git

commit 1d6c7a3426c4a0c05ca65b2348ce8f09b3025175
Author: lta <li...@163.com>
AuthorDate: Fri Apr 12 20:31:24 2019 +0800

    reorganize query dataset code
---
 .../groupby/GroupByEngineDataSet.java                      |  4 ++--
 .../groupby/GroupByWithOnlyTimeFilterDataSet.java}         |  8 ++++----
 .../groupby/GroupByWithValueFilterDataSet.java}            |  8 ++++----
 .../iotdb/db/query/executor/AggregateEngineExecutor.java   |  2 +-
 .../apache/iotdb/db/query/executor/EngineQueryRouter.java  | 10 ++++------
 .../query/{aggregation => factory}/AggreFuncFactory.java   |  3 ++-
 .../iotdb/db/query/executor/GroupByEngineDataSetTest.java  | 14 +++++++-------
 7 files changed, 24 insertions(+), 25 deletions(-)

diff --git a/iotdb/src/main/java/org/apache/iotdb/db/query/executor/groupby/GroupByEngineDataSet.java b/iotdb/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByEngineDataSet.java
similarity index 97%
rename from iotdb/src/main/java/org/apache/iotdb/db/query/executor/groupby/GroupByEngineDataSet.java
rename to iotdb/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByEngineDataSet.java
index f7ecea8..cd1b95b 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/query/executor/groupby/GroupByEngineDataSet.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByEngineDataSet.java
@@ -17,14 +17,14 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.query.executor.groupby;
+package org.apache.iotdb.db.query.dataset.groupby;
 
 import java.util.ArrayList;
 import java.util.List;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.exception.ProcessorException;
 import org.apache.iotdb.db.metadata.MManager;
-import org.apache.iotdb.db.query.aggregation.AggreFuncFactory;
+import org.apache.iotdb.db.query.factory.AggreFuncFactory;
 import org.apache.iotdb.db.query.aggregation.AggreResultData;
 import org.apache.iotdb.db.query.aggregation.AggregateFunction;
 import org.apache.iotdb.tsfile.exception.write.UnSupportedDataTypeException;
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/query/executor/groupby/GroupByWithOnlyTimeFilterDataSetDataSet.java b/iotdb/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByWithOnlyTimeFilterDataSet.java
similarity index 97%
rename from iotdb/src/main/java/org/apache/iotdb/db/query/executor/groupby/GroupByWithOnlyTimeFilterDataSetDataSet.java
rename to iotdb/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByWithOnlyTimeFilterDataSet.java
index e82b567..e2688ba 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/query/executor/groupby/GroupByWithOnlyTimeFilterDataSetDataSet.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByWithOnlyTimeFilterDataSet.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.query.executor.groupby;
+package org.apache.iotdb.db.query.dataset.groupby;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -45,7 +45,7 @@ import org.apache.iotdb.tsfile.read.expression.impl.GlobalTimeExpression;
 import org.apache.iotdb.tsfile.read.filter.basic.Filter;
 import org.apache.iotdb.tsfile.utils.Pair;
 
-public class GroupByWithOnlyTimeFilterDataSetDataSet extends GroupByEngineDataSet {
+public class GroupByWithOnlyTimeFilterDataSet extends GroupByEngineDataSet {
 
   protected List<IPointReader> unSequenceReaderList;
   protected List<IAggregateReader> sequenceReaderList;
@@ -56,7 +56,7 @@ public class GroupByWithOnlyTimeFilterDataSetDataSet extends GroupByEngineDataSe
   /**
    * constructor.
    */
-  public GroupByWithOnlyTimeFilterDataSetDataSet(long jobId, List<Path> paths, long unit,
+  public GroupByWithOnlyTimeFilterDataSet(long jobId, List<Path> paths, long unit,
       long origin, List<Pair<Long, Long>> mergedIntervals) {
     super(jobId, paths, unit, origin, mergedIntervals);
     this.unSequenceReaderList = new ArrayList<>();
@@ -103,7 +103,7 @@ public class GroupByWithOnlyTimeFilterDataSetDataSet extends GroupByEngineDataSe
   public RowRecord next() throws IOException {
     if (!hasCachedTimeInterval) {
       throw new IOException("need to call hasNext() before calling next() "
-          + "in GroupByWithOnlyTimeFilterDataSetDataSet.");
+          + "in GroupByWithOnlyTimeFilterDataSet.");
     }
     hasCachedTimeInterval = false;
     RowRecord record = new RowRecord(startTime);
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/query/executor/groupby/GroupByWithValueFilterDataSetDataSet.java b/iotdb/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByWithValueFilterDataSet.java
similarity index 94%
rename from iotdb/src/main/java/org/apache/iotdb/db/query/executor/groupby/GroupByWithValueFilterDataSetDataSet.java
rename to iotdb/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByWithValueFilterDataSet.java
index 7a6b3d2..f7ffa29 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/query/executor/groupby/GroupByWithValueFilterDataSetDataSet.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByWithValueFilterDataSet.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.query.executor.groupby;
+package org.apache.iotdb.db.query.dataset.groupby;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -38,7 +38,7 @@ import org.apache.iotdb.tsfile.read.expression.IExpression;
 import org.apache.iotdb.tsfile.read.query.timegenerator.TimeGenerator;
 import org.apache.iotdb.tsfile.utils.Pair;
 
-public class GroupByWithValueFilterDataSetDataSet extends GroupByEngineDataSet {
+public class GroupByWithValueFilterDataSet extends GroupByEngineDataSet {
 
   private List<EngineReaderByTimeStamp> allDataReaderList;
   private TimeGenerator timestampGenerator;
@@ -59,7 +59,7 @@ public class GroupByWithValueFilterDataSetDataSet extends GroupByEngineDataSet {
   /**
    * constructor.
    */
-  public GroupByWithValueFilterDataSetDataSet(long jobId, List<Path> paths, long unit, long origin,
+  public GroupByWithValueFilterDataSet(long jobId, List<Path> paths, long unit, long origin,
       List<Pair<Long, Long>> mergedIntervals) {
     super(jobId, paths, unit, origin, mergedIntervals);
     this.allDataReaderList = new ArrayList<>();
@@ -85,7 +85,7 @@ public class GroupByWithValueFilterDataSetDataSet extends GroupByEngineDataSet {
   public RowRecord next() throws IOException {
     if (!hasCachedTimeInterval) {
       throw new IOException("need to call hasNext() before calling next()"
-          + " in GroupByWithOnlyTimeFilterDataSetDataSet.");
+          + " in GroupByWithOnlyTimeFilterDataSet.");
     }
     hasCachedTimeInterval = false;
     for (AggregateFunction function : functions) {
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/query/executor/AggregateEngineExecutor.java b/iotdb/src/main/java/org/apache/iotdb/db/query/executor/AggregateEngineExecutor.java
index ba76c2f..508a787 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/query/executor/AggregateEngineExecutor.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/query/executor/AggregateEngineExecutor.java
@@ -28,7 +28,7 @@ import org.apache.iotdb.db.exception.FileNodeManagerException;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.exception.ProcessorException;
 import org.apache.iotdb.db.metadata.MManager;
-import org.apache.iotdb.db.query.aggregation.AggreFuncFactory;
+import org.apache.iotdb.db.query.factory.AggreFuncFactory;
 import org.apache.iotdb.db.query.aggregation.AggreResultData;
 import org.apache.iotdb.db.query.aggregation.AggregateFunction;
 import org.apache.iotdb.db.query.aggregation.impl.LastAggrFunc;
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/query/executor/EngineQueryRouter.java b/iotdb/src/main/java/org/apache/iotdb/db/query/executor/EngineQueryRouter.java
index 96ad5ad..c18e798 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/query/executor/EngineQueryRouter.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/query/executor/EngineQueryRouter.java
@@ -27,8 +27,8 @@ import org.apache.iotdb.db.exception.FileNodeManagerException;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.exception.ProcessorException;
 import org.apache.iotdb.db.query.context.QueryContext;
-import org.apache.iotdb.db.query.executor.groupby.GroupByWithOnlyTimeFilterDataSetDataSet;
-import org.apache.iotdb.db.query.executor.groupby.GroupByWithValueFilterDataSetDataSet;
+import org.apache.iotdb.db.query.dataset.groupby.GroupByWithOnlyTimeFilterDataSet;
+import org.apache.iotdb.db.query.dataset.groupby.GroupByWithValueFilterDataSet;
 import org.apache.iotdb.db.query.fill.IFill;
 import org.apache.iotdb.tsfile.exception.filter.QueryFilterOptimizationException;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
@@ -49,8 +49,6 @@ import org.apache.iotdb.tsfile.utils.Pair;
  */
 public class EngineQueryRouter {
 
-
-
   /**
    * execute physical plan.
    */
@@ -164,12 +162,12 @@ public class EngineQueryRouter {
     IExpression optimizedExpression = ExpressionOptimizer.getInstance()
         .optimize(expression, selectedSeries);
     if (optimizedExpression.getType() == ExpressionType.GLOBAL_TIME) {
-      GroupByWithOnlyTimeFilterDataSetDataSet groupByEngine = new GroupByWithOnlyTimeFilterDataSetDataSet(
+      GroupByWithOnlyTimeFilterDataSet groupByEngine = new GroupByWithOnlyTimeFilterDataSet(
           nextJobId, selectedSeries, unit, origin, mergedIntervalList);
       groupByEngine.initGroupBy(context, aggres, optimizedExpression);
       return groupByEngine;
     } else {
-      GroupByWithValueFilterDataSetDataSet groupByEngine = new GroupByWithValueFilterDataSetDataSet(
+      GroupByWithValueFilterDataSet groupByEngine = new GroupByWithValueFilterDataSet(
           nextJobId,
           selectedSeries, unit, origin, mergedIntervalList);
       groupByEngine.initGroupBy(context, aggres, optimizedExpression);
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/AggreFuncFactory.java b/iotdb/src/main/java/org/apache/iotdb/db/query/factory/AggreFuncFactory.java
similarity index 96%
rename from iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/AggreFuncFactory.java
rename to iotdb/src/main/java/org/apache/iotdb/db/query/factory/AggreFuncFactory.java
index c2d1883..495d853 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/AggreFuncFactory.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/query/factory/AggreFuncFactory.java
@@ -17,9 +17,10 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.query.aggregation;
+package org.apache.iotdb.db.query.factory;
 
 import org.apache.iotdb.db.exception.ProcessorException;
+import org.apache.iotdb.db.query.aggregation.AggregateFunction;
 import org.apache.iotdb.db.query.aggregation.impl.CountAggrFunc;
 import org.apache.iotdb.db.query.aggregation.impl.FirstAggrFunc;
 import org.apache.iotdb.db.query.aggregation.impl.LastAggrFunc;
diff --git a/iotdb/src/test/java/org/apache/iotdb/db/query/executor/GroupByEngineDataSetTest.java b/iotdb/src/test/java/org/apache/iotdb/db/query/executor/GroupByEngineDataSetTest.java
index b4f808d..066f05f 100644
--- a/iotdb/src/test/java/org/apache/iotdb/db/query/executor/GroupByEngineDataSetTest.java
+++ b/iotdb/src/test/java/org/apache/iotdb/db/query/executor/GroupByEngineDataSetTest.java
@@ -20,8 +20,8 @@ package org.apache.iotdb.db.query.executor;
 
 import java.util.ArrayList;
 import java.util.List;
-import org.apache.iotdb.db.query.executor.groupby.GroupByEngineDataSet;
-import org.apache.iotdb.db.query.executor.groupby.GroupByWithValueFilterDataSetDataSet;
+import org.apache.iotdb.db.query.dataset.groupby.GroupByEngineDataSet;
+import org.apache.iotdb.db.query.dataset.groupby.GroupByWithValueFilterDataSet;
 import org.apache.iotdb.tsfile.utils.Pair;
 import org.junit.Assert;
 import org.junit.Test;
@@ -39,7 +39,7 @@ public class GroupByEngineDataSetTest {
 
     long[] startTimeArray = {805, 810, 830};
     long[] endTimeArray = {810, 830, 850};
-    GroupByEngineDataSet groupByEngine = new GroupByWithValueFilterDataSetDataSet(jobId, null, unit, startTimePoint, pairList);
+    GroupByEngineDataSet groupByEngine = new GroupByWithValueFilterDataSet(jobId, null, unit, startTimePoint, pairList);
     int cnt = 0;
     while (groupByEngine.hasNext()){
       Pair pair = groupByEngine.nextTimePartition();
@@ -64,7 +64,7 @@ public class GroupByEngineDataSetTest {
 
     long[] startTimeArray = {805, 810, 830, 850, 1200, 1210};
     long[] endTimeArray = {810, 830, 850, 870, 1210, 1230};
-    GroupByEngineDataSet groupByEngine = new GroupByWithValueFilterDataSetDataSet(jobId, null, unit, startTimePoint, pairList);
+    GroupByEngineDataSet groupByEngine = new GroupByWithValueFilterDataSet(jobId, null, unit, startTimePoint, pairList);
     int cnt = 0;
     while (groupByEngine.hasNext()){
       Pair pair = groupByEngine.nextTimePartition();
@@ -89,7 +89,7 @@ public class GroupByEngineDataSetTest {
 
     long[] startTimeArray = {805, 820, 850, 860, 1200, 1220};
     long[] endTimeArray = {820, 840, 860, 880, 1220, 1240};
-    GroupByEngineDataSet groupByEngine = new GroupByWithValueFilterDataSetDataSet(jobId, null, unit, startTimePoint, pairList);
+    GroupByEngineDataSet groupByEngine = new GroupByWithValueFilterDataSet(jobId, null, unit, startTimePoint, pairList);
     int cnt = 0;
     while (groupByEngine.hasNext()){
       Pair pair = groupByEngine.nextTimePartition();
@@ -114,7 +114,7 @@ public class GroupByEngineDataSetTest {
 
     long[] startTimeArray = {805, 1200};
     long[] endTimeArray = {900, 1300};
-    GroupByEngineDataSet groupByEngine = new GroupByWithValueFilterDataSetDataSet(jobId, null, unit, startTimePoint, pairList);
+    GroupByEngineDataSet groupByEngine = new GroupByWithValueFilterDataSet(jobId, null, unit, startTimePoint, pairList);
     int cnt = 0;
     while (groupByEngine.hasNext()){
       Pair pair = groupByEngine.nextTimePartition();
@@ -139,7 +139,7 @@ public class GroupByEngineDataSetTest {
 
     long[] startTimeArray = {50, 585, 590};
     long[] endTimeArray = {110, 590, 670};
-    GroupByEngineDataSet groupByEngine = new GroupByWithValueFilterDataSetDataSet(jobId, null, unit, startTimePoint, pairList);
+    GroupByEngineDataSet groupByEngine = new GroupByWithValueFilterDataSet(jobId, null, unit, startTimePoint, pairList);
     int cnt = 0;
     while (groupByEngine.hasNext()){
       Pair pair = groupByEngine.nextTimePartition();


[incubator-iotdb] 09/19: update

Posted by lt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

lta pushed a commit to branch cluster_read
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git

commit 2134f33f64a86ece98d34caf5091a06e67b80ce3
Author: lta <li...@163.com>
AuthorDate: Mon Apr 15 18:05:13 2019 +0800

    update
---
 .../manager/ClusterRpcQueryManager.java            | 20 ++++++++-
 .../manager/IClusterQueryManager.java              | 49 +++++++++++++++++++++-
 .../cluster/service/TSServiceClusterImpl.java      | 43 +++++++++++++++++++
 .../org/apache/iotdb/db/service/TSServiceImpl.java |  4 +-
 4 files changed, 111 insertions(+), 5 deletions(-)

diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterRpcQueryManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterRpcQueryManager.java
index c289796..3df1ef6 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterRpcQueryManager.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterRpcQueryManager.java
@@ -22,16 +22,34 @@ import java.util.HashMap;
 import java.util.Map;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 
-public class ClusterRpcQueryManager {
+public class ClusterRpcQueryManager implements IClusterQueryManager{
 
   Map<Long, Map<String, PhysicalPlan>> selectPathPlan = new HashMap<>();
   Map<Long, Map<String, PhysicalPlan>> filterPathPlan = new HashMap<>();
 
   private ClusterRpcQueryManager(){
+  }
+
+  @Override
+  public void registerQuery(Long jobId, PhysicalPlan plan) {
+
+  }
 
+  @Override
+  public PhysicalPlan getSelectPathPhysicalPlan(Long jobId, String fullPath) {
+    return selectPathPlan.get(jobId).get(fullPath);
   }
 
+  @Override
+  public PhysicalPlan getFilterPathPhysicalPlan(Long jobId, String fullPath) {
+    return filterPathPlan.get(jobId).get(fullPath);
+  }
 
+  @Override
+  public void remove(Long jobId) {
+    selectPathPlan.remove(jobId);
+    filterPathPlan.remove(jobId);
+  }
 
   public static final ClusterRpcQueryManager getInstance() {
     return ClusterRpcQueryManagerHolder.INSTANCE;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/IClusterQueryManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/IClusterQueryManager.java
index 6ce56f0..a7a1418 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/IClusterQueryManager.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/IClusterQueryManager.java
@@ -1,10 +1,55 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.iotdb.cluster.query.coordinatornode.manager;
 
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 
 public interface IClusterQueryManager {
 
-  void registerQuery(Long);
+  /**
+   * Register a query, divide physical plan into several sub physical plans according to timeseries
+   * full path.
+   *
+   * @param jobId Query job id assigned by QueryResourceManager.
+   * @param plan Physical plan parsed by QueryProcessor
+   */
+  void registerQuery(Long jobId, PhysicalPlan plan);
 
-  PhysicalPlan getPhysicalPlan();
+  /**
+   * Get physical plan of select path
+   *
+   * @param jobId Query job id assigned by QueryResourceManager.
+   * @param path Timeseries full path in select paths
+   */
+  PhysicalPlan getSelectPathPhysicalPlan(Long jobId, String path);
+
+  /**
+   * Get physical plan of filter path
+   *
+   * @param jobId Query job id assigned by QueryResourceManager.
+   * @param path Timeseries full path in filter
+   */
+  PhysicalPlan getFilterPathPhysicalPlan(Long jobId, String path);
+
+
+  /**
+   * Remove resource of a job id
+   */
+  void remove(Long jobId);
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java b/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java
index 4013fa5..d33b759 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java
@@ -25,6 +25,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -35,6 +36,7 @@ import org.apache.iotdb.cluster.qp.executor.QueryMetadataExecutor;
 import org.apache.iotdb.cluster.query.coordinatornode.executor.QueryProcessorExecutor;
 import org.apache.iotdb.db.auth.AuthException;
 import org.apache.iotdb.db.conf.IoTDBConstant;
+import org.apache.iotdb.db.exception.FileNodeManagerException;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.exception.ProcessorException;
 import org.apache.iotdb.db.metadata.MManager;
@@ -43,15 +45,19 @@ import org.apache.iotdb.db.qp.QueryProcessor;
 import org.apache.iotdb.db.qp.logical.Operator;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
+import org.apache.iotdb.db.query.context.QueryContext;
 import org.apache.iotdb.db.query.control.QueryResourceManager;
 import org.apache.iotdb.db.service.TSServiceImpl;
+import org.apache.iotdb.service.rpc.thrift.TSCloseOperationReq;
 import org.apache.iotdb.service.rpc.thrift.TSExecuteBatchStatementReq;
 import org.apache.iotdb.service.rpc.thrift.TSExecuteBatchStatementResp;
 import org.apache.iotdb.service.rpc.thrift.TSExecuteStatementReq;
 import org.apache.iotdb.service.rpc.thrift.TSExecuteStatementResp;
+import org.apache.iotdb.service.rpc.thrift.TSFetchResultsReq;
 import org.apache.iotdb.service.rpc.thrift.TSHandleIdentifier;
 import org.apache.iotdb.service.rpc.thrift.TSOperationHandle;
 import org.apache.iotdb.service.rpc.thrift.TS_StatusCode;
+import org.apache.iotdb.tsfile.exception.filter.QueryFilterOptimizationException;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.Path;
 import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
@@ -291,6 +297,43 @@ public class TSServiceClusterImpl extends TSServiceImpl {
     }
   }
 
+  @Override
+  public void releaseQueryResource(TSCloseOperationReq req) throws FileNodeManagerException {
+    Map<String, Long> queryStatus =
+    if (contextMap == null) {
+      return;
+    }
+    if (req == null || req.queryId == -1) {
+      // end query for all the query tokens created by current thread
+      for (QueryContext context : contextMap.values()) {
+        QueryResourceManager.getInstance().endQueryForGivenJob(context.getJobId());
+      }
+    } else {
+      QueryResourceManager.getInstance()
+          .endQueryForGivenJob(contextMap.remove(req.queryId).getJobId());
+    }
+  }
+
+  @Override
+  public QueryDataSet createNewDataSet(String statement, int fetchSize, TSFetchResultsReq req)
+      throws PathErrorException, QueryFilterOptimizationException, FileNodeManagerException,
+      ProcessorException, IOException {
+    PhysicalPlan physicalPlan = queryStatus.get().get(statement);
+    processor.getExecutor().setFetchSize(fetchSize);
+
+    QueryContext context = new QueryContext(QueryResourceManager.getInstance().assignJobId());
+    Map<Long, QueryContext> contextMap = contextMapLocal.get();
+    if (contextMap == null) {
+      contextMap = new HashMap<>();
+      contextMapLocal.set(contextMap);
+    }
+    contextMap.put(req.queryId, context);
+
+    QueryDataSet queryDataSet = processor.getExecutor().processQuery((QueryPlan) physicalPlan,
+        context);
+    queryRet.get().put(statement, queryDataSet);
+    return queryDataSet;
+  }
   /**
    * Close cluster service
    */
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java b/iotdb/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
index 298db9c..f48a7d8 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
@@ -198,7 +198,7 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
     return new TSCloseOperationResp(new TS_Status(TS_StatusCode.SUCCESS_STATUS));
   }
 
-  private void releaseQueryResource(TSCloseOperationReq req) throws FileNodeManagerException {
+  public void releaseQueryResource(TSCloseOperationReq req) throws FileNodeManagerException {
     Map<Long, QueryContext> contextMap = contextMapLocal.get();
     if (contextMap == null) {
       return;
@@ -691,7 +691,7 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
     }
   }
 
-  private QueryDataSet createNewDataSet(String statement, int fetchSize, TSFetchResultsReq req)
+  public QueryDataSet createNewDataSet(String statement, int fetchSize, TSFetchResultsReq req)
       throws PathErrorException, QueryFilterOptimizationException, FileNodeManagerException,
       ProcessorException, IOException {
     PhysicalPlan physicalPlan = queryStatus.get().get(statement);


[incubator-iotdb] 16/19: add query series data processor

Posted by lt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

lta pushed a commit to branch cluster_read
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git

commit 446cec98fd748105ba4c73728e655d62f2b307b6
Author: lta <li...@163.com>
AuthorDate: Tue Apr 16 19:02:17 2019 +0800

    add query series data processor
---
 .../iotdb/cluster/config/ClusterConstant.java      |   2 +
 .../org/apache/iotdb/cluster/entity/Server.java    |  29 ++++-
 .../cluster/qp/executor/NonQueryExecutor.java      |   5 +-
 .../executor/ClusterExecutorWithTimeGenerator.java |   6 +-
 .../ClusterExecutorWithoutTimeGenerator.java       |   6 +-
 .../executor/ClusterQueryRouter.java               |   6 +-
 .../manager/ClusterRpcQueryManager.java            |   8 +-
 ...ager.java => ClusterRpcSingleQueryManager.java} |   4 +-
 ...ger.java => IClusterRpcSingleQueryManager.java} |   4 +-
 .../manager/ClusterLocalQueryManager.java          |  74 +++++++++++
 .../manager/ClusterLocalSingleQueryManager.java    | 142 +++++++++++++++++++++
 .../querydata/QuerySeriesDataSyncProcessor.java    |  62 +++++++++
 .../request/querydata/QuerySeriesDataRequest.java  |  36 +++++-
 .../cluster/rpc/raft/request/querydata/Stage.java  |   2 +-
 .../querydata/QuerySeriesDataResponse.java         |  25 ++--
 .../org/apache/iotdb/cluster/utils/RaftUtils.java  |  41 +++++-
 .../cluster/utils/query/ClusterRpcReaderUtils.java |  14 +-
 .../dataset/EngineDataSetWithoutTimeGenerator.java |   4 +
 18 files changed, 422 insertions(+), 48 deletions(-)

diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/config/ClusterConstant.java b/cluster/src/main/java/org/apache/iotdb/cluster/config/ClusterConstant.java
index 5aca9b0..b78ce56 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/config/ClusterConstant.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/config/ClusterConstant.java
@@ -37,4 +37,6 @@ public class ClusterConstant {
    */
   public static final int CLOSE_QP_SUB_TASK_BLOCK_TIMEOUT = 1000;
 
+  public static final int BATCH_READ_SIZE = 1000;
+
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/entity/Server.java b/cluster/src/main/java/org/apache/iotdb/cluster/entity/Server.java
index 1f0e4e3..acd57f8 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/entity/Server.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/entity/Server.java
@@ -34,6 +34,7 @@ import org.apache.iotdb.cluster.entity.raft.MetadataRaftHolder;
 import org.apache.iotdb.cluster.rpc.raft.impl.RaftNodeAsClientManager;
 import org.apache.iotdb.cluster.rpc.raft.processor.nonquery.DataGroupNonQueryAsyncProcessor;
 import org.apache.iotdb.cluster.rpc.raft.processor.nonquery.MetaGroupNonQueryAsyncProcessor;
+import org.apache.iotdb.cluster.rpc.raft.processor.querydata.QuerySeriesDataSyncProcessor;
 import org.apache.iotdb.cluster.rpc.raft.processor.querymetadata.QueryMetadataAsyncProcessor;
 import org.apache.iotdb.cluster.rpc.raft.processor.querymetadata.QueryMetadataInStringAsyncProcessor;
 import org.apache.iotdb.cluster.rpc.raft.processor.querymetadata.QueryPathsAsyncProcessor;
@@ -95,13 +96,9 @@ public class Server {
     RpcServer rpcServer = new RpcServer(serverId.getPort());
     RaftRpcServerFactory.addRaftRequestProcessors(rpcServer);
 
-    rpcServer.registerUserProcessor(new DataGroupNonQueryAsyncProcessor());
-    rpcServer.registerUserProcessor(new MetaGroupNonQueryAsyncProcessor());
-    rpcServer.registerUserProcessor(new QueryTimeSeriesAsyncProcessor());
-    rpcServer.registerUserProcessor(new QueryMetadataInStringAsyncProcessor());
-    rpcServer.registerUserProcessor(new QueryMetadataAsyncProcessor());
-    rpcServer.registerUserProcessor(new QuerySeriesTypeAsyncProcessor());
-    rpcServer.registerUserProcessor(new QueryPathsAsyncProcessor());
+    registerNonQueryProcessor(rpcServer);
+    registerQueryMetadataProcessor(rpcServer);
+    registerQueryDataProcessor(rpcServer);
 
     metadataHolder = new MetadataRaftHolder(peerIds, serverId, rpcServer, true);
     metadataHolder.init();
@@ -127,6 +124,24 @@ public class Server {
 
   }
 
+  private void registerNonQueryProcessor(RpcServer rpcServer) {
+    rpcServer.registerUserProcessor(new DataGroupNonQueryAsyncProcessor());
+    rpcServer.registerUserProcessor(new MetaGroupNonQueryAsyncProcessor());
+  }
+
+  private void registerQueryMetadataProcessor(RpcServer rpcServer) {
+    rpcServer.registerUserProcessor(new QueryTimeSeriesAsyncProcessor());
+    rpcServer.registerUserProcessor(new QueryMetadataInStringAsyncProcessor());
+    rpcServer.registerUserProcessor(new QueryMetadataAsyncProcessor());
+    rpcServer.registerUserProcessor(new QuerySeriesTypeAsyncProcessor());
+    rpcServer.registerUserProcessor(new QueryPathsAsyncProcessor());
+    rpcServer.registerUserProcessor(new QuerySeriesTypeAsyncProcessor());
+  }
+
+  private void registerQueryDataProcessor(RpcServer rpcServer) {
+    rpcServer.registerUserProcessor(new QuerySeriesDataSyncProcessor());
+  }
+
   public void stop() throws ProcessorException {
     QPTaskManager.getInstance().close(true, ClusterConstant.CLOSE_QP_SUB_TASK_BLOCK_TIMEOUT);
     iotdb.deactivate();
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/NonQueryExecutor.java b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/NonQueryExecutor.java
index b6247c8..1420370 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/NonQueryExecutor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/NonQueryExecutor.java
@@ -100,10 +100,13 @@ public class NonQueryExecutor extends AbstractQPExecutor {
    * @param batchResult batch result
    */
   public void processBatch(PhysicalPlan[] physicalPlans, BatchResult batchResult)
-      throws InterruptedException {
+      throws InterruptedException, ProcessorException {
 
     Status nullReadTaskStatus = Status.OK();
     RaftUtils.handleNullReadToMetaGroup(nullReadTaskStatus);
+    if(!nullReadTaskStatus.isOk()){
+      throw new ProcessorException("Null read while processing batch failed");
+    }
     nullReaderEnable = false;
 
     /** 1. Classify physical plans by group id **/
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithTimeGenerator.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithTimeGenerator.java
index 68a14c8..6c0354a 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithTimeGenerator.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithTimeGenerator.java
@@ -21,7 +21,7 @@ package org.apache.iotdb.cluster.query.coordinatornode.executor;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
-import org.apache.iotdb.cluster.query.coordinatornode.manager.IClusterSingleQueryManager;
+import org.apache.iotdb.cluster.query.coordinatornode.manager.IClusterRpcSingleQueryManager;
 import org.apache.iotdb.db.exception.FileNodeManagerException;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.metadata.MManager;
@@ -39,11 +39,11 @@ import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
 public class ClusterExecutorWithTimeGenerator {
 
   private QueryExpression queryExpression;
-  private IClusterSingleQueryManager queryManager;
+  private IClusterRpcSingleQueryManager queryManager;
   private int readDataConsistencyLevel;
 
   ClusterExecutorWithTimeGenerator(QueryExpression queryExpression,
-      IClusterSingleQueryManager queryManager, int readDataConsistencyLevel) {
+      IClusterRpcSingleQueryManager queryManager, int readDataConsistencyLevel) {
     this.queryExpression = queryExpression;
     this.queryManager = queryManager;
     this.readDataConsistencyLevel = readDataConsistencyLevel;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithoutTimeGenerator.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithoutTimeGenerator.java
index 65b7d8f..e52e604 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithoutTimeGenerator.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithoutTimeGenerator.java
@@ -22,7 +22,7 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import org.apache.iotdb.cluster.query.coordinatornode.manager.ClusterSingleQueryManager;
+import org.apache.iotdb.cluster.query.coordinatornode.manager.ClusterRpcSingleQueryManager;
 import org.apache.iotdb.cluster.query.coordinatornode.reader.ClusterSeriesReader;
 import org.apache.iotdb.db.engine.querycontext.QueryDataSource;
 import org.apache.iotdb.db.exception.FileNodeManagerException;
@@ -45,11 +45,11 @@ import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
 
 public class ClusterExecutorWithoutTimeGenerator {
   private QueryExpression queryExpression;
-  private ClusterSingleQueryManager queryManager;
+  private ClusterRpcSingleQueryManager queryManager;
   private int readDataConsistencyLevel;
 
   public ClusterExecutorWithoutTimeGenerator(QueryExpression queryExpression,
-      ClusterSingleQueryManager queryManager, int readDataConsistencyLevel) {
+      ClusterRpcSingleQueryManager queryManager, int readDataConsistencyLevel) {
     this.queryExpression = queryExpression;
     this.queryManager = queryManager;
     this.readDataConsistencyLevel = readDataConsistencyLevel;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterQueryRouter.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterQueryRouter.java
index da5a395..6f07e58 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterQueryRouter.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterQueryRouter.java
@@ -23,8 +23,8 @@ import java.util.List;
 import java.util.Map;
 import org.apache.iotdb.cluster.exception.RaftConnectionException;
 import org.apache.iotdb.cluster.query.coordinatornode.manager.ClusterRpcQueryManager;
-import org.apache.iotdb.cluster.query.coordinatornode.manager.ClusterSingleQueryManager;
-import org.apache.iotdb.cluster.query.coordinatornode.manager.ClusterSingleQueryManager.QueryType;
+import org.apache.iotdb.cluster.query.coordinatornode.manager.ClusterRpcSingleQueryManager;
+import org.apache.iotdb.cluster.query.coordinatornode.manager.ClusterRpcSingleQueryManager.QueryType;
 import org.apache.iotdb.db.exception.FileNodeManagerException;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.exception.ProcessorException;
@@ -49,7 +49,7 @@ public class ClusterQueryRouter implements IEngineQueryRouter {
   public QueryDataSet query(QueryExpression queryExpression, QueryContext context)
       throws FileNodeManagerException, PathErrorException {
 
-    ClusterSingleQueryManager queryManager = ClusterRpcQueryManager.getInstance()
+    ClusterRpcSingleQueryManager queryManager = ClusterRpcQueryManager.getInstance()
         .getSingleQuery(context.getJobId());
     try {
       if (queryExpression.hasQueryFilter()) {
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterRpcQueryManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterRpcQueryManager.java
index f33fe05..bdebd1a 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterRpcQueryManager.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterRpcQueryManager.java
@@ -27,21 +27,21 @@ import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
 public class ClusterRpcQueryManager{
 
   /**
-   * Key is group id, value is manager of a client query.
+   * Key is job id, value is manager of a client query.
    */
-  ConcurrentHashMap<Long, ClusterSingleQueryManager> singleQueryManagerMap = new ConcurrentHashMap<>();
+  ConcurrentHashMap<Long, ClusterRpcSingleQueryManager> singleQueryManagerMap = new ConcurrentHashMap<>();
 
   /**
    * Add a query
    */
   public void addSingleQuery(long jobId, QueryPlan physicalPlan){
-    singleQueryManagerMap.put(jobId, new ClusterSingleQueryManager(jobId, physicalPlan));
+    singleQueryManagerMap.put(jobId, new ClusterRpcSingleQueryManager(jobId, physicalPlan));
   }
 
   /**
    * Get query manager by group id
    */
-  public ClusterSingleQueryManager getSingleQuery(long jobId) {
+  public ClusterRpcSingleQueryManager getSingleQuery(long jobId) {
     return singleQueryManagerMap.get(jobId);
   }
 
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterSingleQueryManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterRpcSingleQueryManager.java
similarity index 98%
rename from cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterSingleQueryManager.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterRpcSingleQueryManager.java
index d350a7c..ae982a1 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterSingleQueryManager.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterRpcSingleQueryManager.java
@@ -37,7 +37,7 @@ import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
 import org.apache.iotdb.tsfile.read.common.Path;
 
-public class ClusterSingleQueryManager implements IClusterSingleQueryManager {
+public class ClusterRpcSingleQueryManager implements IClusterRpcSingleQueryManager {
 
   /**
    * Query job id assigned by QueryResourceManager of coordinator node.
@@ -68,7 +68,7 @@ public class ClusterSingleQueryManager implements IClusterSingleQueryManager {
 
   private Map<String, ClusterSeriesReader> filterPathReaders = new HashMap<>();
 
-  public ClusterSingleQueryManager(long jobId,
+  public ClusterRpcSingleQueryManager(long jobId,
       QueryPlan queryPlan) {
     this.jobId = jobId;
     this.queryPlan = queryPlan;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/IClusterSingleQueryManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/IClusterRpcSingleQueryManager.java
similarity index 96%
rename from cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/IClusterSingleQueryManager.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/IClusterRpcSingleQueryManager.java
index bc70e65..01cdb8a 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/IClusterSingleQueryManager.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/IClusterRpcSingleQueryManager.java
@@ -21,14 +21,14 @@ package org.apache.iotdb.cluster.query.coordinatornode.manager;
 import com.alipay.sofa.jraft.entity.PeerId;
 import java.io.IOException;
 import org.apache.iotdb.cluster.exception.RaftConnectionException;
-import org.apache.iotdb.cluster.query.coordinatornode.manager.ClusterSingleQueryManager.QueryType;
+import org.apache.iotdb.cluster.query.coordinatornode.manager.ClusterRpcSingleQueryManager.QueryType;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 
 /**
  * Manage a single query.
  */
-public interface IClusterSingleQueryManager {
+public interface IClusterRpcSingleQueryManager {
 
   /**
    * Divide physical plan into several sub physical plans according to timeseries full path.
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/querynode/manager/ClusterLocalQueryManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/querynode/manager/ClusterLocalQueryManager.java
new file mode 100644
index 0000000..f23e70e
--- /dev/null
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/querynode/manager/ClusterLocalQueryManager.java
@@ -0,0 +1,74 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.cluster.query.querynode.manager;
+
+import java.io.IOException;
+import java.util.concurrent.ConcurrentHashMap;
+import org.apache.iotdb.cluster.rpc.raft.request.querydata.QuerySeriesDataRequest;
+import org.apache.iotdb.cluster.rpc.raft.response.querydata.QuerySeriesDataResponse;
+import org.apache.iotdb.db.exception.FileNodeManagerException;
+import org.apache.iotdb.db.exception.PathErrorException;
+import org.apache.iotdb.db.exception.ProcessorException;
+import org.apache.iotdb.db.query.control.QueryResourceManager;
+import org.apache.iotdb.tsfile.exception.filter.QueryFilterOptimizationException;
+
+public class ClusterLocalQueryManager {
+
+  /**
+   * Key is job id, value is manager of a client query.
+   */
+  ConcurrentHashMap<Long, ClusterLocalSingleQueryManager> singleQueryManagerMap = new ConcurrentHashMap<>();
+
+  private ClusterLocalQueryManager() {
+  }
+
+  public void createQueryDataSet(QuerySeriesDataRequest request, QuerySeriesDataResponse response)
+      throws IOException, FileNodeManagerException, PathErrorException, ProcessorException, QueryFilterOptimizationException {
+    long jobId = QueryResourceManager.getInstance().assignJobId();
+    response.setJobId(jobId);
+    ClusterLocalSingleQueryManager localQueryManager = new ClusterLocalSingleQueryManager(jobId);
+    localQueryManager.init(request, response);
+    singleQueryManagerMap.put(jobId, localQueryManager);
+  }
+
+  public void readBatchData(QuerySeriesDataRequest request, QuerySeriesDataResponse response)
+      throws IOException {
+    long jobId = request.getJobId();
+    singleQueryManagerMap.get(jobId).readBatchData(request, response);
+  }
+
+  public void close(long jobId) throws FileNodeManagerException {
+    if(singleQueryManagerMap.containsKey(jobId)){
+      singleQueryManagerMap.remove(jobId).close();
+    }
+  }
+
+  public static final ClusterLocalQueryManager getInstance() {
+    return ClusterLocalQueryManager.ClusterLocalQueryManagerHolder.INSTANCE;
+  }
+
+  private static class ClusterLocalQueryManagerHolder {
+
+    private static final ClusterLocalQueryManager INSTANCE = new ClusterLocalQueryManager();
+
+    private ClusterLocalQueryManagerHolder() {
+
+    }
+  }
+}
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/querynode/manager/ClusterLocalSingleQueryManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/querynode/manager/ClusterLocalSingleQueryManager.java
new file mode 100644
index 0000000..cf9c9f5
--- /dev/null
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/querynode/manager/ClusterLocalSingleQueryManager.java
@@ -0,0 +1,142 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.cluster.query.querynode.manager;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.apache.iotdb.cluster.config.ClusterConstant;
+import org.apache.iotdb.cluster.rpc.raft.request.querydata.QuerySeriesDataRequest;
+import org.apache.iotdb.cluster.rpc.raft.response.querydata.QuerySeriesDataResponse;
+import org.apache.iotdb.db.exception.FileNodeManagerException;
+import org.apache.iotdb.db.exception.PathErrorException;
+import org.apache.iotdb.db.exception.ProcessorException;
+import org.apache.iotdb.db.qp.executor.OverflowQPExecutor;
+import org.apache.iotdb.db.qp.executor.QueryProcessExecutor;
+import org.apache.iotdb.db.qp.physical.crud.AggregationPlan;
+import org.apache.iotdb.db.qp.physical.crud.GroupByPlan;
+import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
+import org.apache.iotdb.db.query.context.QueryContext;
+import org.apache.iotdb.db.query.control.QueryResourceManager;
+import org.apache.iotdb.db.query.dataset.EngineDataSetWithoutTimeGenerator;
+import org.apache.iotdb.db.query.reader.IPointReader;
+import org.apache.iotdb.db.utils.TimeValuePair;
+import org.apache.iotdb.db.writelog.transfer.PhysicalPlanLogTransfer;
+import org.apache.iotdb.tsfile.exception.filter.QueryFilterOptimizationException;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.tsfile.read.common.BatchData;
+import org.apache.iotdb.tsfile.read.common.Path;
+import org.apache.iotdb.tsfile.read.expression.ExpressionType;
+
+public class ClusterLocalSingleQueryManager {
+
+  private long jobId;
+
+  /**
+   * Key is series full path, value is reader of series
+   */
+  private Map<String, IPointReader> seriesReaders = new HashMap<>();
+
+  /**
+   * Key is series full path, value is data type of series
+   */
+  private Map<String, TSDataType> dataTypeMap = new HashMap<>();
+
+  private QueryProcessExecutor queryProcessExecutor = new OverflowQPExecutor();
+
+  public ClusterLocalSingleQueryManager(long jobId) {
+    this.jobId = jobId;
+  }
+
+  /**
+   * Init create series reader.
+   */
+  public void init(QuerySeriesDataRequest request, QuerySeriesDataResponse response)
+      throws IOException, PathErrorException, FileNodeManagerException, ProcessorException, QueryFilterOptimizationException {
+    List<byte[]> planBytes = request.getPhysicalPlanBytes();
+    for (byte[] planByte : planBytes) {
+      QueryPlan plan = (QueryPlan) PhysicalPlanLogTransfer.logToOperator(planByte);
+      if (plan instanceof GroupByPlan) {
+        throw new UnsupportedOperationException();
+      } else if (plan instanceof AggregationPlan) {
+        throw new UnsupportedOperationException();
+      } else {
+        QueryContext context = new QueryContext(jobId);
+        if (plan.getExpression() == null
+            || plan.getExpression().getType() == ExpressionType.GLOBAL_TIME) {
+          handleDataSetWithoutTimeGenerator(plan, context, request, response);
+        } else {
+          throw new UnsupportedOperationException();
+        }
+
+      }
+    }
+  }
+
+  private void handleDataSetWithoutTimeGenerator(QueryPlan plan, QueryContext context,
+      QuerySeriesDataRequest request, QuerySeriesDataResponse response)
+      throws PathErrorException, QueryFilterOptimizationException, FileNodeManagerException, ProcessorException, IOException {
+    EngineDataSetWithoutTimeGenerator queryDataSet = (EngineDataSetWithoutTimeGenerator) queryProcessExecutor
+        .processQuery(plan, context);
+    List<Path> paths = plan.getPaths();
+    List<IPointReader> readers = queryDataSet.getReaders();
+    List<TSDataType> dataTypes = queryDataSet.getDataTypes();
+    for (int i = 0; i < paths.size(); i++) {
+      String fullPath = paths.get(i).getFullPath();
+      IPointReader reader = readers.get(i);
+      seriesReaders.put(fullPath, reader);
+      dataTypeMap.put(fullPath, dataTypes.get(i));
+    }
+    response.setSeriesType(dataTypes);
+    readBatchData(request, response);
+  }
+
+  /**
+   * Read batch data
+   */
+  public void readBatchData(QuerySeriesDataRequest request, QuerySeriesDataResponse response)
+      throws IOException {
+    List<String> paths = request.getPaths();
+    List<BatchData> batchDataList = new ArrayList<>();
+    for (String fullPath : paths) {
+      BatchData batchData = new BatchData(dataTypeMap.get(fullPath));
+      IPointReader reader = seriesReaders.get(fullPath);
+      for (int i = 0; i < ClusterConstant.BATCH_READ_SIZE; i++) {
+        if (reader.hasNext()) {
+          TimeValuePair pair = reader.next();
+          batchData.putTime(pair.getTimestamp());
+          batchData.putAnObject(pair.getValue().getValue());
+        } else {
+          break;
+        }
+      }
+      batchDataList.add(batchData);
+    }
+    response.setSeriesBatchData(batchDataList);
+  }
+
+  /**
+   * Release query resource
+   */
+  public void close() throws FileNodeManagerException {
+    QueryResourceManager.getInstance().endQueryForGivenJob(jobId);
+  }
+}
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/querydata/QuerySeriesDataSyncProcessor.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/querydata/QuerySeriesDataSyncProcessor.java
new file mode 100644
index 0000000..d2064ba
--- /dev/null
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/querydata/QuerySeriesDataSyncProcessor.java
@@ -0,0 +1,62 @@
+package org.apache.iotdb.cluster.rpc.raft.processor.querydata;
+
+import com.alipay.remoting.BizContext;
+import com.alipay.sofa.jraft.Status;
+import org.apache.iotdb.cluster.config.ClusterConstant;
+import org.apache.iotdb.cluster.query.PathType;
+import org.apache.iotdb.cluster.query.querynode.manager.ClusterLocalQueryManager;
+import org.apache.iotdb.cluster.rpc.raft.processor.BasicSyncUserProcessor;
+import org.apache.iotdb.cluster.rpc.raft.request.querydata.QuerySeriesDataRequest;
+import org.apache.iotdb.cluster.rpc.raft.request.querydata.Stage;
+import org.apache.iotdb.cluster.rpc.raft.response.querydata.QuerySeriesDataResponse;
+import org.apache.iotdb.cluster.utils.RaftUtils;
+import org.apache.iotdb.db.exception.ProcessorException;
+
+public class QuerySeriesDataSyncProcessor extends
+    BasicSyncUserProcessor<QuerySeriesDataRequest> {
+
+  @Override
+  public Object handleRequest(BizContext bizContext, QuerySeriesDataRequest request)
+      throws Exception {
+    Stage stage = request.getStage();
+    String groupId = request.getGroupID();
+    PathType pathType = request.getPathType();
+    QuerySeriesDataResponse response = new QuerySeriesDataResponse(groupId, pathType);
+    switch (stage) {
+      case INITIAL:
+        handleNullRead(request.getReadConsistencyLevel(), groupId);
+        ClusterLocalQueryManager.getInstance().createQueryDataSet(request, response);
+        break;
+      case READ_DATA:
+        ClusterLocalQueryManager.getInstance().readBatchData(request, response);
+        break;
+      case CLOSE:
+        ClusterLocalQueryManager.getInstance().close(request.getJobId());
+        break;
+      default:
+        throw new UnsupportedOperationException();
+    }
+    return response;
+  }
+
+  /**
+   * It's necessary to do null read while creating query data set with a strong consistency level.
+   *
+   * @param readConsistencyLevel read concistency level
+   * @param groupId group id
+   */
+  private void handleNullRead(int readConsistencyLevel, String groupId) throws ProcessorException {
+    if (readConsistencyLevel == ClusterConstant.STRONG_CONSISTENCY_LEVEL) {
+      Status nullReadTaskStatus = Status.OK();
+      RaftUtils.handleNullReadToDataGroup(nullReadTaskStatus, groupId);
+      if (!nullReadTaskStatus.isOk()) {
+        throw new ProcessorException("Null read to data group failed");
+      }
+    }
+  }
+
+  @Override
+  public String interest() {
+    return QuerySeriesDataSyncProcessor.class.getName();
+  }
+}
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querydata/QuerySeriesDataRequest.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querydata/QuerySeriesDataRequest.java
index fd27997..4974c46 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querydata/QuerySeriesDataRequest.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querydata/QuerySeriesDataRequest.java
@@ -27,6 +27,7 @@ import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 public class QuerySeriesDataRequest extends BasicQueryRequest {
 
   private Stage stage;
+  private long jobId;
   private PathType pathType;
   private List<String> paths;
 
@@ -39,11 +40,44 @@ public class QuerySeriesDataRequest extends BasicQueryRequest {
     this.pathType = pathType;
   }
 
-  public QuerySeriesDataRequest(String groupID, List<String> paths, PathType pathType)
+  public QuerySeriesDataRequest(String groupID, long jobId, List<String> paths, PathType pathType)
       throws IOException {
     super(groupID);
     this.paths = paths;
     stage = Stage.READ_DATA;
+    this.jobId = jobId;
     this.pathType = pathType;
   }
+
+  public Stage getStage() {
+    return stage;
+  }
+
+  public void setStage(Stage stage) {
+    this.stage = stage;
+  }
+
+  public PathType getPathType() {
+    return pathType;
+  }
+
+  public void setPathType(PathType pathType) {
+    this.pathType = pathType;
+  }
+
+  public List<String> getPaths() {
+    return paths;
+  }
+
+  public void setPaths(List<String> paths) {
+    this.paths = paths;
+  }
+
+  public long getJobId() {
+    return jobId;
+  }
+
+  public void setJobId(long jobId) {
+    this.jobId = jobId;
+  }
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querydata/Stage.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querydata/Stage.java
index 53d2e2a..0687927 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querydata/Stage.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querydata/Stage.java
@@ -19,5 +19,5 @@
 package org.apache.iotdb.cluster.rpc.raft.request.querydata;
 
 public enum Stage {
-  INITIAL, READ_DATA
+  INITIAL, READ_DATA, CLOSE
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querydata/QuerySeriesDataResponse.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querydata/QuerySeriesDataResponse.java
index 9f62617..b77a3f3 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querydata/QuerySeriesDataResponse.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querydata/QuerySeriesDataResponse.java
@@ -18,7 +18,7 @@
  */
 package org.apache.iotdb.cluster.rpc.raft.response.querydata;
 
-import java.util.Map;
+import java.util.List;
 import org.apache.iotdb.cluster.query.PathType;
 import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
@@ -28,27 +28,30 @@ public class QuerySeriesDataResponse extends BasicResponse {
 
   private long jobId;
   private PathType pathType;
-  private Map<String, TSDataType> seriesType;
-  private Map<String, BatchData> seriesBatchData;
+  private List<TSDataType> seriesType;
+  private List<BatchData> seriesBatchData;
 
   public QuerySeriesDataResponse(String groupId, PathType pathType) {
     super(groupId, false, null, null);
     this.pathType = pathType;
   }
 
-  public QuerySeriesDataResponse setJobId(long jobId) {
+  public void setJobId(long jobId) {
     this.jobId = jobId;
-    return this;
   }
 
-  public QuerySeriesDataResponse setSeriesType(Map<String, TSDataType> seriesType) {
+  public void setPathType(PathType pathType) {
+    this.pathType = pathType;
+  }
+
+  public void setSeriesType(
+      List<TSDataType> seriesType) {
     this.seriesType = seriesType;
-    return this;
   }
 
-  public QuerySeriesDataResponse seySeriesBatchData(Map<String, BatchData> seriesBatchData) {
+  public void setSeriesBatchData(
+      List<BatchData> seriesBatchData) {
     this.seriesBatchData = seriesBatchData;
-    return this;
   }
 
   public long getJobId() {
@@ -59,11 +62,11 @@ public class QuerySeriesDataResponse extends BasicResponse {
     return pathType;
   }
 
-  public Map<String, TSDataType> getSeriesType() {
+  public List<TSDataType> getSeriesType() {
     return seriesType;
   }
 
-  public Map<String, BatchData> getSeriesBatchData() {
+  public List<BatchData> getSeriesBatchData() {
     return seriesBatchData;
   }
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/utils/RaftUtils.java b/cluster/src/main/java/org/apache/iotdb/cluster/utils/RaftUtils.java
index d2d5429..f007027 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/utils/RaftUtils.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/utils/RaftUtils.java
@@ -47,6 +47,7 @@ import org.apache.iotdb.cluster.rpc.raft.closure.ResponseClosure;
 import org.apache.iotdb.cluster.rpc.raft.impl.RaftNodeAsClientManager;
 import org.apache.iotdb.cluster.rpc.raft.request.BasicRequest;
 import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
+import org.apache.iotdb.cluster.rpc.raft.response.nonquery.DataGroupNonQueryResponse;
 import org.apache.iotdb.cluster.rpc.raft.response.nonquery.MetaGroupNonQueryResponse;
 import org.apache.iotdb.cluster.utils.hash.PhysicalNode;
 import org.apache.iotdb.cluster.utils.hash.Router;
@@ -273,18 +274,16 @@ public class RaftUtils {
 
   /**
    * Handle null-read process in metadata group if the request is to set path.
-   *
-   * @param status status to return result if this node is leader of the data group
    */
   public static void handleNullReadToMetaGroup(Status status) {
     SingleQPTask nullReadTask = new SingleQPTask(false, null);
     handleNullReadToMetaGroup(status, server, nullReadTask);
   }
 
-  public static void handleNullReadToMetaGroup(Status status, Server server,
+  private static void handleNullReadToMetaGroup(Status status, Server server,
       SingleQPTask nullReadTask) {
     try {
-      LOGGER.debug("Handle null-read in meta group for adding path request.");
+      LOGGER.debug("Handle null-read in meta group for metadata request.");
       final byte[] reqContext = RaftUtils.createRaftRequestContext();
       MetadataRaftHolder metadataRaftHolder = (MetadataRaftHolder) server.getMetadataHolder();
       ((RaftService) metadataRaftHolder.getService()).getNode()
@@ -307,6 +306,40 @@ public class RaftUtils {
     }
   }
 
+  /**
+   * Handle null-read process in data group while reading process
+   */
+  public static void handleNullReadToDataGroup(Status status, String groupId) {
+    SingleQPTask nullReadTask = new SingleQPTask(false, null);
+    handleNullReadToDataGroup(status, server, nullReadTask, groupId);
+  }
+
+  private static void handleNullReadToDataGroup(Status status, Server server,
+      SingleQPTask nullReadTask, String groupId) {
+    try {
+      LOGGER.debug("Handle null-read in data group for reading.");
+      final byte[] reqContext = RaftUtils.createRaftRequestContext();
+      DataPartitionRaftHolder dataPartitionRaftHolder = (DataPartitionRaftHolder) server.getDataPartitionHolder(groupId);
+      ((RaftService) dataPartitionRaftHolder.getService()).getNode()
+          .readIndex(reqContext, new ReadIndexClosure() {
+            @Override
+            public void run(Status status, long index, byte[] reqCtx) {
+              BasicResponse response = DataGroupNonQueryResponse
+                  .createEmptyResponse(groupId);
+              if (!status.isOk()) {
+                status.setCode(-1);
+                status.setErrorMsg(status.getErrorMsg());
+              }
+              nullReadTask.run(response);
+            }
+          });
+      nullReadTask.await();
+    } catch (InterruptedException e) {
+      status.setCode(-1);
+      status.setErrorMsg(e.getMessage());
+    }
+  }
+
   public static Status createErrorStatus(String errorMsg){
     Status status = new Status();
     status.setErrorMsg(errorMsg);
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/utils/query/ClusterRpcReaderUtils.java b/cluster/src/main/java/org/apache/iotdb/cluster/utils/query/ClusterRpcReaderUtils.java
index 35ff3fb..510112c 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/utils/query/ClusterRpcReaderUtils.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/utils/query/ClusterRpcReaderUtils.java
@@ -42,6 +42,7 @@ import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
 import org.apache.iotdb.db.query.reader.IBatchReader;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.BatchData;
+import org.apache.iotdb.tsfile.read.common.Path;
 
 public class ClusterRpcReaderUtils {
 
@@ -65,14 +66,15 @@ public class ClusterRpcReaderUtils {
 
     /** create cluster series reader **/
     Map<String, ClusterSeriesReader> allSeriesReader = new HashMap<>();
-    Map<String, TSDataType> seriesType = response.getSeriesType();
-    Map<String, BatchData> seriesBatchData = response.getSeriesBatchData();
+    List<Path> paths = queryPlan.getPaths();
+    List<TSDataType> seriesType = response.getSeriesType();
+    List<BatchData> seriesBatchData = response.getSeriesBatchData();
     long jobId = response.getJobId();
-    for (Entry<String, TSDataType> entry : seriesType.entrySet()) {
-      String seriesPath = entry.getKey();
-      TSDataType dataType = entry.getValue();
+    for (int i =0 ; i < paths.size(); i++) {
+      String seriesPath = paths.get(i).getFullPath();
+      TSDataType dataType = seriesType.get(i);
       IBatchReader batchDataReader = new ClusterRpcBatchDataReader(peerId, jobId,
-          PathType.SELECT_PATH, seriesBatchData.get(seriesPath));
+          pathType, seriesBatchData.get(i));
       ClusterSeriesReader seriesReader = new ClusterSeriesReader(batchDataReader, seriesPath,
           dataType);
       allSeriesReader.put(seriesPath, seriesReader);
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/query/dataset/EngineDataSetWithoutTimeGenerator.java b/iotdb/src/main/java/org/apache/iotdb/db/query/dataset/EngineDataSetWithoutTimeGenerator.java
index 73fc71f..bc9bb08 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/query/dataset/EngineDataSetWithoutTimeGenerator.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/query/dataset/EngineDataSetWithoutTimeGenerator.java
@@ -154,4 +154,8 @@ public class EngineDataSetWithoutTimeGenerator extends QueryDataSet {
     timeSet.remove(t);
     return t;
   }
+
+  public List<IPointReader> getReaders() {
+    return readers;
+  }
 }


[incubator-iotdb] 19/19: add reader processor

Posted by lt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

lta pushed a commit to branch cluster_read
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git

commit b01ef72e8fc743ddffc1ae49155041fbd65e261d
Author: lta <li...@163.com>
AuthorDate: Tue Apr 16 20:26:28 2019 +0800

    add reader processor
---
 .../iotdb/cluster/config/ClusterConstant.java      |  5 ++--
 .../query/reader/ClusterRpcBatchDataReader.java    | 32 ++++++++++++++++++++--
 2 files changed, 32 insertions(+), 5 deletions(-)

diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/config/ClusterConstant.java b/cluster/src/main/java/org/apache/iotdb/cluster/config/ClusterConstant.java
index b78ce56..dfc9a44 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/config/ClusterConstant.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/config/ClusterConstant.java
@@ -20,8 +20,7 @@ package org.apache.iotdb.cluster.config;
 
 public class ClusterConstant {
 
-  private ClusterConstant(){
-
+  private ClusterConstant() {
   }
 
   public static final String SET_READ_METADATA_CONSISTENCY_LEVEL_PATTERN = "set\\s+read\\s+metadata\\s+level\\s+to\\s+\\d+";
@@ -37,6 +36,6 @@ public class ClusterConstant {
    */
   public static final int CLOSE_QP_SUB_TASK_BLOCK_TIMEOUT = 1000;
 
-  public static final int BATCH_READ_SIZE = 1000;
+  public static final int BATCH_READ_SIZE = 10000;
 
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/ClusterRpcBatchDataReader.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/ClusterRpcBatchDataReader.java
index c656490..aa4962b 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/ClusterRpcBatchDataReader.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/ClusterRpcBatchDataReader.java
@@ -20,6 +20,8 @@ package org.apache.iotdb.cluster.query.reader;
 
 import com.alipay.sofa.jraft.entity.PeerId;
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 import org.apache.iotdb.cluster.query.PathType;
 import org.apache.iotdb.db.query.reader.IBatchReader;
 import org.apache.iotdb.tsfile.read.common.BatchData;
@@ -42,23 +44,41 @@ public class ClusterRpcBatchDataReader implements IBatchReader {
   private PathType type;
 
   /**
+   * Current batch data
+   */
+  private BatchData currentBatchData;
+
+  /**
    * Batch data
    */
-  private BatchData batchData;
+  private List<BatchData> batchDataList;
+
+  private boolean remoteDataFinish;
 
   public ClusterRpcBatchDataReader(PeerId peerId, long jobId,
       PathType type, BatchData batchData) {
     this.peerId = peerId;
     this.jobId = jobId;
     this.type = type;
-    this.batchData = batchData;
+    this.batchDataList = new ArrayList<>();
+    this.batchDataList.add(batchData);
+    this.remoteDataFinish = false;
   }
 
   @Override
   public boolean hasNext() throws IOException {
+    if(currentBatchData == null || !currentBatchData.hasNext()){
+      updateCurrentBatchData();
+    }
     return false;
   }
 
+  private void updateCurrentBatchData(){
+    if(!batchDataList.isEmpty()){
+      currentBatchData = batchDataList.remove(0);
+    }
+  }
+
   @Override
   public BatchData nextBatch() throws IOException {
     return null;
@@ -68,4 +88,12 @@ public class ClusterRpcBatchDataReader implements IBatchReader {
   public void close() throws IOException {
 
   }
+
+  public boolean isRemoteDataFinish() {
+    return remoteDataFinish;
+  }
+
+  public void setRemoteDataFinish(boolean remoteDataFinish) {
+    this.remoteDataFinish = remoteDataFinish;
+  }
 }


[incubator-iotdb] 07/19: remove threadlocal in TSServiceClusterImpl

Posted by lt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

lta pushed a commit to branch cluster_read
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git

commit ba0389fca23c4426cb628546ef40206a479349f8
Author: lta <li...@163.com>
AuthorDate: Mon Apr 15 13:55:05 2019 +0800

    remove threadlocal in TSServiceClusterImpl
---
 ...sterQPExecutor.java => AbstractQPExecutor.java} | 10 ++---
 .../cluster/qp/executor/NonQueryExecutor.java      |  7 ++--
 .../cluster/qp/executor/QueryMetadataExecutor.java |  2 +-
 .../apache/iotdb/cluster/qp/task/MultiQPTask.java  |  4 +-
 .../apache/iotdb/cluster/qp/task/SingleQPTask.java |  4 +-
 .../executor/ClusterQueryRouter.java               |  2 +-
 .../executor/QueryProcessorExecutor.java           |  2 +-
 .../cluster/service/TSServiceClusterImpl.java      | 44 ++++++++--------------
 ...ecutorTest.java => AbstractQPExecutorTest.java} |  7 +---
 .../org/apache/iotdb/db/service/TSServiceImpl.java |  7 +---
 10 files changed, 37 insertions(+), 52 deletions(-)

diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/AbstractClusterQPExecutor.java b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/AbstractQPExecutor.java
similarity index 98%
rename from cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/AbstractClusterQPExecutor.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/AbstractQPExecutor.java
index 1a3cfe3..654d13c 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/AbstractClusterQPExecutor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/AbstractQPExecutor.java
@@ -45,9 +45,9 @@ import org.apache.iotdb.db.metadata.MManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public abstract class AbstractClusterQPExecutor {
+public abstract class AbstractQPExecutor {
 
-  private static final Logger LOGGER = LoggerFactory.getLogger(AbstractClusterQPExecutor.class);
+  private static final Logger LOGGER = LoggerFactory.getLogger(AbstractQPExecutor.class);
 
   private static final ClusterConfig CLUSTER_CONFIG = ClusterDescriptor.getInstance().getConfig();
 
@@ -69,7 +69,7 @@ public abstract class AbstractClusterQPExecutor {
   /**
    * The task in progress.
    */
-  protected QPTask currentTask;
+  protected ThreadLocal<QPTask> currentTask;
 
   /**
    * Count limit to redo a single task
@@ -235,8 +235,8 @@ public abstract class AbstractClusterQPExecutor {
   }
 
   public void shutdown() {
-    if (currentTask != null) {
-      currentTask.shutdown();
+    if (currentTask.get() != null) {
+      currentTask.get().shutdown();
     }
   }
 
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/NonQueryExecutor.java b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/NonQueryExecutor.java
index f9fa3a9..071c096 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/NonQueryExecutor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/NonQueryExecutor.java
@@ -29,6 +29,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
+import java.util.concurrent.CountDownLatch;
 import org.apache.iotdb.cluster.qp.task.BatchQPTask;
 import org.apache.iotdb.cluster.qp.task.QPTask;
 import org.apache.iotdb.cluster.qp.task.SingleQPTask;
@@ -60,7 +61,7 @@ import org.slf4j.LoggerFactory;
 /**
  * Handle distributed non-query logic
  */
-public class NonQueryExecutor extends AbstractClusterQPExecutor {
+public class NonQueryExecutor extends AbstractQPExecutor {
 
   private static final Logger LOGGER = LoggerFactory.getLogger(NonQueryExecutor.class);
 
@@ -162,7 +163,7 @@ public class NonQueryExecutor extends AbstractClusterQPExecutor {
 
     /** 3. Execute Multiple Sub Tasks **/
     BatchQPTask task = new BatchQPTask(subTaskMap.size(), batchResult, subTaskMap, planIndexMap);
-    currentTask = task;
+    currentTask.set(task);
     task.execute(this);
     task.await();
     batchResult.setAllSuccessful(task.isAllSuccessful());
@@ -299,7 +300,7 @@ public class NonQueryExecutor extends AbstractClusterQPExecutor {
       request = new DataGroupNonQueryRequest(groupId, plans);
     }
     SingleQPTask qpTask = new SingleQPTask(false, request);
-    currentTask = qpTask;
+    currentTask.set(qpTask);
 
     /** Check if the plan can be executed locally. **/
     if (canHandleNonQueryByGroupId(groupId)) {
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/QueryMetadataExecutor.java b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/QueryMetadataExecutor.java
index 73e3181..f1098f8 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/QueryMetadataExecutor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/QueryMetadataExecutor.java
@@ -57,7 +57,7 @@ import org.slf4j.LoggerFactory;
 /**
  * Handle < show timeseries <path> > logic
  */
-public class QueryMetadataExecutor extends AbstractClusterQPExecutor {
+public class QueryMetadataExecutor extends AbstractQPExecutor {
 
   private static final Logger LOGGER = LoggerFactory.getLogger(QueryMetadataExecutor.class);
   private static final String DOUB_SEPARATOR = "\\.";
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/MultiQPTask.java b/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/MultiQPTask.java
index f53a2a2..86e2b74 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/MultiQPTask.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/MultiQPTask.java
@@ -43,6 +43,8 @@ public abstract class MultiQPTask extends QPTask {
         taskThread.interrupt();
       }
     }
-    this.taskCountDownLatch.countDown();
+    while(taskCountDownLatch.getCount()!=0) {
+      this.taskCountDownLatch.countDown();
+    }
   }
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/SingleQPTask.java b/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/SingleQPTask.java
index 7896ca3..805834e 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/SingleQPTask.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/SingleQPTask.java
@@ -57,6 +57,8 @@ public class SingleQPTask extends QPTask {
 
   @Override
   public void shutdown() {
-    this.taskCountDownLatch.countDown();
+    if (taskCountDownLatch.getCount() != 0) {
+      this.taskCountDownLatch.countDown();
+    }
   }
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/executor/ClusterQueryRouter.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterQueryRouter.java
similarity index 96%
rename from cluster/src/main/java/org/apache/iotdb/cluster/query/executor/ClusterQueryRouter.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterQueryRouter.java
index 0f797fc..8fc030a 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/executor/ClusterQueryRouter.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterQueryRouter.java
@@ -1,4 +1,4 @@
-package org.apache.iotdb.cluster.query.executor;
+package org.apache.iotdb.cluster.query.coordinatornode.executor;
 
 import java.io.IOException;
 import java.util.List;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/executor/QueryProcessorExecutor.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/QueryProcessorExecutor.java
similarity index 97%
rename from cluster/src/main/java/org/apache/iotdb/cluster/query/executor/QueryProcessorExecutor.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/QueryProcessorExecutor.java
index ecd5f61..8531512 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/executor/QueryProcessorExecutor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/QueryProcessorExecutor.java
@@ -1,4 +1,4 @@
-package org.apache.iotdb.cluster.query.executor;
+package org.apache.iotdb.cluster.query.coordinatornode.executor;
 
 import java.io.IOException;
 import java.util.List;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java b/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java
index 7d6516e..3a1561e 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java
@@ -18,7 +18,6 @@
  */
 package org.apache.iotdb.cluster.service;
 
-import com.alipay.sofa.jraft.util.OnlyForTest;
 import java.io.IOException;
 import java.sql.Statement;
 import java.util.Arrays;
@@ -30,7 +29,7 @@ import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.exception.ConsistencyLevelException;
 import org.apache.iotdb.cluster.qp.executor.NonQueryExecutor;
 import org.apache.iotdb.cluster.qp.executor.QueryMetadataExecutor;
-import org.apache.iotdb.cluster.query.executor.QueryProcessorExecutor;
+import org.apache.iotdb.cluster.query.coordinatornode.executor.QueryProcessorExecutor;
 import org.apache.iotdb.db.auth.AuthException;
 import org.apache.iotdb.db.conf.IoTDBConstant;
 import org.apache.iotdb.db.exception.PathErrorException;
@@ -56,20 +55,14 @@ public class TSServiceClusterImpl extends TSServiceImpl {
   private static final Logger LOGGER = LoggerFactory.getLogger(TSServiceClusterImpl.class);
 
   private QueryProcessor processor = new QueryProcessor(new QueryProcessorExecutor());
-  private ThreadLocal<NonQueryExecutor> nonQueryExecutor = new ThreadLocal<>();
-  private ThreadLocal<QueryMetadataExecutor> queryMetadataExecutor = new ThreadLocal<>();
+  private NonQueryExecutor nonQueryExecutor = new NonQueryExecutor();
+  private QueryMetadataExecutor queryMetadataExecutor = new QueryMetadataExecutor();
 
   public TSServiceClusterImpl() throws IOException {
     super();
   }
 
   @Override
-  public void initClusterService() {
-    nonQueryExecutor.set(new NonQueryExecutor());
-    queryMetadataExecutor.set(new QueryMetadataExecutor());
-  }
-
-  @Override
   public TSExecuteBatchStatementResp executeBatchStatement(TSExecuteBatchStatementReq req)
       throws TException {
     try {
@@ -99,7 +92,7 @@ public class TSServiceClusterImpl extends TSServiceImpl {
             result = resultTemp;
             physicalPlans = physicalPlansTemp;
             BatchResult batchResult = new BatchResult(isAllSuccessful, batchErrorMessage, result);
-            nonQueryExecutor.get().processBatch(physicalPlans, batchResult);
+            nonQueryExecutor.processBatch(physicalPlans, batchResult);
             return getTSBathExecuteStatementResp(TS_StatusCode.ERROR_STATUS,
                 "statement is query :" + statements.get(i), Arrays.stream(result).boxed().collect(
                     Collectors.toList()));
@@ -133,7 +126,7 @@ public class TSServiceClusterImpl extends TSServiceImpl {
       }
 
       BatchResult batchResult = new BatchResult(isAllSuccessful, batchErrorMessage, result);
-      nonQueryExecutor.get().processBatch(physicalPlans, batchResult);
+      nonQueryExecutor.processBatch(physicalPlans, batchResult);
       batchErrorMessage = batchResult.batchErrorMessage;
       isAllSuccessful = batchResult.isAllSuccessful;
 
@@ -202,13 +195,13 @@ public class TSServiceClusterImpl extends TSServiceImpl {
       if (Pattern.matches(ClusterConstant.SET_READ_METADATA_CONSISTENCY_LEVEL_PATTERN, statement)) {
         String[] splits = statement.split("\\s+");
         int level = Integer.parseInt(splits[splits.length - 1]);
-        nonQueryExecutor.get().setReadMetadataConsistencyLevel(level);
+        nonQueryExecutor.setReadMetadataConsistencyLevel(level);
         return true;
       } else if (Pattern
           .matches(ClusterConstant.SET_READ_DATA_CONSISTENCY_LEVEL_PATTERN, statement)) {
         String[] splits = statement.split("\\s+");
         int level = Integer.parseInt(splits[splits.length - 1]);
-        nonQueryExecutor.get().setReadDataConsistencyLevel(level);
+        nonQueryExecutor.setReadDataConsistencyLevel(level);
         return true;
       } else {
         return false;
@@ -220,7 +213,7 @@ public class TSServiceClusterImpl extends TSServiceImpl {
 
   @Override
   protected boolean executeNonQuery(PhysicalPlan plan) throws ProcessorException {
-    return nonQueryExecutor.get().processNonQuery(plan);
+    return nonQueryExecutor.processNonQuery(plan);
   }
 
   /**
@@ -228,46 +221,41 @@ public class TSServiceClusterImpl extends TSServiceImpl {
    */
   @Override
   public void closeClusterService() {
-    nonQueryExecutor.get().shutdown();
-    queryMetadataExecutor.get().shutdown();
+    nonQueryExecutor.shutdown();
+    queryMetadataExecutor.shutdown();
   }
 
   @Override
   protected Set<String> getAllStorageGroups() throws InterruptedException {
-    return queryMetadataExecutor.get().processStorageGroupQuery();
+    return queryMetadataExecutor.processStorageGroupQuery();
   }
 
   @Override
   protected List<List<String>> getTimeSeriesForPath(String path)
       throws PathErrorException, InterruptedException, ProcessorException {
-    return queryMetadataExecutor.get().processTimeSeriesQuery(path);
+    return queryMetadataExecutor.processTimeSeriesQuery(path);
   }
 
   @Override
   protected String getMetadataInString()
       throws InterruptedException, ProcessorException {
-    return queryMetadataExecutor.get().processMetadataInStringQuery();
+    return queryMetadataExecutor.processMetadataInStringQuery();
   }
 
   @Override
   protected Metadata getMetadata()
       throws InterruptedException, ProcessorException, PathErrorException {
-    return queryMetadataExecutor.get().processMetadataQuery();
+    return queryMetadataExecutor.processMetadataQuery();
   }
 
   @Override
   protected TSDataType getSeriesType(String path) throws PathErrorException, InterruptedException, ProcessorException {
-    return queryMetadataExecutor.get().processSeriesTypeQuery(path);
+    return queryMetadataExecutor.processSeriesTypeQuery(path);
   }
 
   @Override
   protected List<String> getPaths(String path)
       throws PathErrorException, InterruptedException, ProcessorException {
-    return queryMetadataExecutor.get().processPathsQuery(path);
-  }
-
-  @OnlyForTest
-  public NonQueryExecutor getNonQueryExecutor() {
-    return nonQueryExecutor.get();
+    return queryMetadataExecutor.processPathsQuery(path);
   }
 }
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/qp/AbstractClusterQPExecutorTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/qp/AbstractQPExecutorTest.java
similarity index 96%
rename from cluster/src/test/java/org/apache/iotdb/cluster/qp/AbstractClusterQPExecutorTest.java
rename to cluster/src/test/java/org/apache/iotdb/cluster/qp/AbstractQPExecutorTest.java
index 7959423..e9dd05a 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/qp/AbstractClusterQPExecutorTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/qp/AbstractQPExecutorTest.java
@@ -31,21 +31,18 @@ import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
-public class AbstractClusterQPExecutorTest {
+public class AbstractQPExecutorTest {
 
   private static final ClusterConfig CLUSTER_CONFIG = ClusterDescriptor.getInstance().getConfig();
 
   private TSServiceClusterImpl impl;
 
-  private NonQueryExecutor executor;
+  private NonQueryExecutor executor = new NonQueryExecutor();
 
   @Before
   public void setUp() throws Exception {
     EnvironmentUtils.envSetUp();
     impl = new TSServiceClusterImpl();
-    impl.initClusterService();
-
-    executor = impl.getNonQueryExecutor();
   }
 
   @After
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java b/iotdb/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
index c0e711b..fd1a994 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
@@ -118,9 +118,8 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
     LOGGER.info("{}: receive open session request from username {}", IoTDBConstant.GLOBAL_DB_NAME,
         req.getUsername());
 
-    initClusterService();
     boolean status;
-    IAuthorizer authorizer = null;
+    IAuthorizer authorizer;
     try {
       authorizer = LocalFileAuthorizer.getInstance();
     } catch (AuthException e) {
@@ -160,10 +159,6 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
     queryRet.set(new HashMap<>());
   }
 
-  public void initClusterService() {
-
-  }
-
   @Override
   public TSCloseSessionResp closeSession(TSCloseSessionReq req) throws TException {
     LOGGER.info("{}: receive close session", IoTDBConstant.GLOBAL_DB_NAME);


[incubator-iotdb] 10/19: update

Posted by lt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

lta pushed a commit to branch cluster_read
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git

commit a76806fb5b83c753cd8c70f0f52801d36b2dcd80
Author: lta <li...@163.com>
AuthorDate: Mon Apr 15 18:30:34 2019 +0800

    update
---
 .../cluster/service/TSServiceClusterImpl.java      | 68 +++++++++++-----------
 .../org/apache/iotdb/db/service/TSServiceImpl.java |  6 +-
 2 files changed, 38 insertions(+), 36 deletions(-)

diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java b/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java
index d33b759..de5aef0 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java
@@ -19,9 +19,7 @@
 package org.apache.iotdb.cluster.service;
 
 import java.io.IOException;
-import java.nio.ByteBuffer;
 import java.sql.Statement;
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
@@ -34,6 +32,7 @@ import org.apache.iotdb.cluster.exception.ConsistencyLevelException;
 import org.apache.iotdb.cluster.qp.executor.NonQueryExecutor;
 import org.apache.iotdb.cluster.qp.executor.QueryMetadataExecutor;
 import org.apache.iotdb.cluster.query.coordinatornode.executor.QueryProcessorExecutor;
+import org.apache.iotdb.cluster.query.coordinatornode.manager.ClusterRpcQueryManager;
 import org.apache.iotdb.db.auth.AuthException;
 import org.apache.iotdb.db.conf.IoTDBConstant;
 import org.apache.iotdb.db.exception.FileNodeManagerException;
@@ -42,20 +41,14 @@ import org.apache.iotdb.db.exception.ProcessorException;
 import org.apache.iotdb.db.metadata.MManager;
 import org.apache.iotdb.db.metadata.Metadata;
 import org.apache.iotdb.db.qp.QueryProcessor;
-import org.apache.iotdb.db.qp.logical.Operator;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
-import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
 import org.apache.iotdb.db.query.context.QueryContext;
 import org.apache.iotdb.db.query.control.QueryResourceManager;
 import org.apache.iotdb.db.service.TSServiceImpl;
 import org.apache.iotdb.service.rpc.thrift.TSCloseOperationReq;
 import org.apache.iotdb.service.rpc.thrift.TSExecuteBatchStatementReq;
 import org.apache.iotdb.service.rpc.thrift.TSExecuteBatchStatementResp;
-import org.apache.iotdb.service.rpc.thrift.TSExecuteStatementReq;
-import org.apache.iotdb.service.rpc.thrift.TSExecuteStatementResp;
 import org.apache.iotdb.service.rpc.thrift.TSFetchResultsReq;
-import org.apache.iotdb.service.rpc.thrift.TSHandleIdentifier;
-import org.apache.iotdb.service.rpc.thrift.TSOperationHandle;
 import org.apache.iotdb.service.rpc.thrift.TS_StatusCode;
 import org.apache.iotdb.tsfile.exception.filter.QueryFilterOptimizationException;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
@@ -79,12 +72,7 @@ public class TSServiceClusterImpl extends TSServiceImpl {
   /**
    * Key is query statement, Value is corresponding job id which is assigned in <class>QueryResourceManager</class>
    */
-  private ThreadLocal<HashMap<String, Long>> queryStatus = new ThreadLocal<>();
-
-  /**
-   * Key is job id, Value is QueryDataSet
-   */
-  private ThreadLocal<HashMap<Long, QueryDataSet>> queryRet = new ThreadLocal<>();
+  private ThreadLocal<HashMap<String, Long>> queryJobIdMap = new ThreadLocal<>();
 
   public TSServiceClusterImpl() throws IOException {
     super();
@@ -290,7 +278,7 @@ public class TSServiceClusterImpl extends TSServiceImpl {
   @Override
   public void recordANewQuery(String statement, PhysicalPlan physicalPlan) {
     long jobId = QueryResourceManager.getInstance().assignJobId();
-    queryStatus.get().put(statement, jobId);
+    queryJobIdMap.get().put(statement, jobId);
     // refresh current queryRet for statement
     if (queryRet.get().containsKey(statement)) {
       queryRet.get().remove(statement);
@@ -299,7 +287,7 @@ public class TSServiceClusterImpl extends TSServiceImpl {
 
   @Override
   public void releaseQueryResource(TSCloseOperationReq req) throws FileNodeManagerException {
-    Map<String, Long> queryStatus =
+    Map<Long, QueryContext> contextMap = contextMapLocal.get();
     if (contextMap == null) {
       return;
     }
@@ -307,32 +295,46 @@ public class TSServiceClusterImpl extends TSServiceImpl {
       // end query for all the query tokens created by current thread
       for (QueryContext context : contextMap.values()) {
         QueryResourceManager.getInstance().endQueryForGivenJob(context.getJobId());
+        ClusterRpcQueryManager.getInstance().remove(context.getJobId());
       }
     } else {
-      QueryResourceManager.getInstance()
-          .endQueryForGivenJob(contextMap.remove(req.queryId).getJobId());
+      long jobId = contextMap.remove(req.queryId).getJobId();
+      QueryResourceManager.getInstance().endQueryForGivenJob(jobId);
+      ClusterRpcQueryManager.getInstance().remove(jobId);
     }
   }
 
   @Override
-  public QueryDataSet createNewDataSet(String statement, int fetchSize, TSFetchResultsReq req)
-      throws PathErrorException, QueryFilterOptimizationException, FileNodeManagerException,
-      ProcessorException, IOException {
-    PhysicalPlan physicalPlan = queryStatus.get().get(statement);
-    processor.getExecutor().setFetchSize(fetchSize);
+  public void clearAllStatusForCurrentRequest() {
+    if (this.queryRet.get() != null) {
+      this.queryRet.get().clear();
+    }
 
-    QueryContext context = new QueryContext(QueryResourceManager.getInstance().assignJobId());
-    Map<Long, QueryContext> contextMap = contextMapLocal.get();
-    if (contextMap == null) {
-      contextMap = new HashMap<>();
-      contextMapLocal.set(contextMap);
+    if (this.queryJobIdMap.get() != null) {
+      this.queryJobIdMap.get().clear();
     }
-    contextMap.put(req.queryId, context);
+  }
+
 
-    QueryDataSet queryDataSet = processor.getExecutor().processQuery((QueryPlan) physicalPlan,
-        context);
-    queryRet.get().put(statement, queryDataSet);
-    return queryDataSet;
+  @Override
+  public QueryDataSet createNewDataSet(String statement, int fetchSize, TSFetchResultsReq req)
+      throws PathErrorException, QueryFilterOptimizationException, FileNodeManagerException,
+      ProcessorException, IOException {
+//    PhysicalPlan physicalPlan = queryJobIdMap.get().get(statement);
+//    processor.getExecutor().setFetchSize(fetchSize);
+//
+//    QueryContext context = new QueryContext(QueryResourceManager.getInstance().assignJobId());
+//    Map<Long, QueryContext> contextMap = contextMapLocal.get();
+//    if (contextMap == null) {
+//      contextMap = new HashMap<>();
+//      contextMapLocal.set(contextMap);
+//    }
+//    contextMap.put(req.queryId, context);
+//
+//    QueryDataSet queryDataSet = processor.getExecutor().processQuery((QueryPlan) physicalPlan,
+//        context);
+//    queryRet.get().put(statement, queryDataSet);
+//    return queryDataSet;
   }
   /**
    * Close cluster service
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java b/iotdb/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
index f48a7d8..bbe67a0 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
@@ -104,10 +104,10 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
   // login is failed.
   protected ThreadLocal<String> username = new ThreadLocal<>();
   private ThreadLocal<HashMap<String, PhysicalPlan>> queryStatus = new ThreadLocal<>();
-  private ThreadLocal<HashMap<String, QueryDataSet>> queryRet = new ThreadLocal<>();
+  protected ThreadLocal<HashMap<String, QueryDataSet>> queryRet = new ThreadLocal<>();
   protected ThreadLocal<ZoneId> zoneIds = new ThreadLocal<>();
   private IoTDBConfig config = IoTDBDescriptor.getInstance().getConfig();
-  private ThreadLocal<Map<Long, QueryContext>> contextMapLocal = new ThreadLocal<>();
+  protected ThreadLocal<Map<Long, QueryContext>> contextMapLocal = new ThreadLocal<>();
 
   public TSServiceImpl() throws IOException {
     // do nothing because there is no need
@@ -214,7 +214,7 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
     }
   }
 
-  private void clearAllStatusForCurrentRequest() {
+  public void clearAllStatusForCurrentRequest() {
     if (this.queryRet.get() != null) {
       this.queryRet.get().clear();
     }


[incubator-iotdb] 17/19: transfer physical plans implement Serializable

Posted by lt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

lta pushed a commit to branch cluster_read
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git

commit de28b3ecac58dc9a9920900ffc5f9cb877819a1d
Author: lta <li...@163.com>
AuthorDate: Tue Apr 16 19:48:05 2019 +0800

    transfer physical plans implement Serializable
---
 .../cluster/entity/raft/DataStateMachine.java      |  2 +-
 .../cluster/entity/raft/MetadataStateManchine.java |  2 +-
 .../manager/ClusterRpcSingleQueryManager.java      |  6 ++++
 .../manager/ClusterLocalQueryManager.java          |  2 +-
 .../manager/ClusterLocalSingleQueryManager.java    | 15 +++++----
 ...BasicRequest.java => BasicNonQueryRequest.java} | 27 +++++-----------
 .../rpc/raft/request/BasicQueryRequest.java        |  1 +
 .../cluster/rpc/raft/request/BasicRequest.java     | 21 -------------
 .../request/nonquery/DataGroupNonQueryRequest.java |  6 ++--
 .../request/nonquery/MetaGroupNonQueryRequest.java |  7 +++--
 .../request/querydata/QuerySeriesDataRequest.java  | 36 ++++++++++++++++++++--
 .../QueryMetadataInStringRequest.java              |  2 ++
 .../querymetadata/QueryMetadataRequest.java        |  2 ++
 .../request/querymetadata/QueryPathsRequest.java   |  1 +
 .../querymetadata/QuerySeriesTypeRequest.java      |  1 +
 .../querymetadata/QueryStorageGroupRequest.java    |  2 ++
 .../querymetadata/QueryTimeSeriesRequest.java      |  1 +
 .../nonquery/DataGroupNonQueryResponse.java        |  2 ++
 .../nonquery/MetaGroupNonQueryResponse.java        |  2 ++
 .../querydata/QuerySeriesDataResponse.java         |  1 +
 .../QueryMetadataInStringResponse.java             |  1 +
 .../querymetadata/QueryMetadataResponse.java       |  1 +
 .../response/querymetadata/QueryPathsResponse.java |  1 +
 .../querymetadata/QuerySeriesTypeResponse.java     |  1 +
 .../querymetadata/QueryStorageGroupResponse.java   |  1 +
 .../querymetadata/QueryTimeSeriesResponse.java     |  1 +
 .../org/apache/iotdb/cluster/utils/RaftUtils.java  |  5 +--
 .../cluster/utils/query/ClusterRpcReaderUtils.java |  1 -
 .../apache/iotdb/db/qp/physical/PhysicalPlan.java  |  4 ++-
 .../iotdb/db/qp/physical/crud/AggregationPlan.java |  1 +
 .../iotdb/db/qp/physical/crud/DeletePlan.java      |  1 +
 .../iotdb/db/qp/physical/crud/FillQueryPlan.java   |  1 +
 .../iotdb/db/qp/physical/crud/GroupByPlan.java     |  1 +
 .../iotdb/db/qp/physical/crud/InsertPlan.java      |  1 +
 .../iotdb/db/qp/physical/crud/QueryPlan.java       |  1 +
 .../iotdb/db/qp/physical/crud/UpdatePlan.java      |  1 +
 .../iotdb/db/qp/physical/sys/AuthorPlan.java       |  1 +
 .../iotdb/db/qp/physical/sys/LoadDataPlan.java     |  1 +
 .../iotdb/db/qp/physical/sys/MetadataPlan.java     |  1 +
 .../iotdb/db/qp/physical/sys/PropertyPlan.java     |  1 +
 .../{writelog => qp/physical}/transfer/Codec.java  |  3 +-
 .../physical}/transfer/CodecInstances.java         |  2 +-
 .../physical}/transfer/PhysicalPlanCodec.java      | 14 +--------
 .../transfer/PhysicalPlanLogTransfer.java          |  2 +-
 .../physical}/transfer/SystemLogOperator.java      |  2 +-
 .../apache/iotdb/db/writelog/io/RAFLogReader.java  |  2 +-
 .../db/writelog/node/ExclusiveWriteLogNode.java    |  2 +-
 .../transfer/PhysicalPlanLogTransferTest.java      |  2 +-
 .../org/apache/iotdb/db/tools/WalCheckerTest.java  |  2 +-
 .../apache/iotdb/db/writelog/PerformanceTest.java  |  3 +-
 .../apache/iotdb/db/writelog/WriteLogNodeTest.java |  2 +-
 .../iotdb/db/writelog/io/LogWriterReaderTest.java  |  3 +-
 .../org/apache/iotdb/tsfile/read/common/Path.java  |  4 ++-
 .../tsfile/read/expression/IBinaryExpression.java  |  2 +-
 .../iotdb/tsfile/read/expression/IExpression.java  |  2 +-
 .../read/expression/impl/BinaryExpression.java     |  5 ++-
 .../read/expression/impl/GlobalTimeExpression.java |  4 ++-
 .../expression/impl/SingleSeriesExpression.java    |  4 ++-
 .../tsfile/read/filter/operator/AndFilter.java     |  2 +-
 .../java/org/apache/iotdb/tsfile/utils/Pair.java   |  5 ++-
 60 files changed, 133 insertions(+), 100 deletions(-)

diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/entity/raft/DataStateMachine.java b/cluster/src/main/java/org/apache/iotdb/cluster/entity/raft/DataStateMachine.java
index e74db12..b8c6f43 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/entity/raft/DataStateMachine.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/entity/raft/DataStateMachine.java
@@ -41,7 +41,7 @@ import org.apache.iotdb.db.qp.executor.OverflowQPExecutor;
 import org.apache.iotdb.db.qp.logical.Operator.OperatorType;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 import org.apache.iotdb.db.qp.physical.sys.MetadataPlan;
-import org.apache.iotdb.db.writelog.transfer.PhysicalPlanLogTransfer;
+import org.apache.iotdb.db.qp.physical.transfer.PhysicalPlanLogTransfer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/entity/raft/MetadataStateManchine.java b/cluster/src/main/java/org/apache/iotdb/cluster/entity/raft/MetadataStateManchine.java
index b45ab9c..3cc9001 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/entity/raft/MetadataStateManchine.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/entity/raft/MetadataStateManchine.java
@@ -43,7 +43,7 @@ import org.apache.iotdb.db.qp.logical.Operator.OperatorType;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 import org.apache.iotdb.db.qp.physical.sys.AuthorPlan;
 import org.apache.iotdb.db.qp.physical.sys.MetadataPlan;
-import org.apache.iotdb.db.writelog.transfer.PhysicalPlanLogTransfer;
+import org.apache.iotdb.db.qp.physical.transfer.PhysicalPlanLogTransfer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterRpcSingleQueryManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterRpcSingleQueryManager.java
index ae982a1..01dcd4d 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterRpcSingleQueryManager.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterRpcSingleQueryManager.java
@@ -59,6 +59,9 @@ public class ClusterRpcSingleQueryManager implements IClusterRpcSingleQueryManag
    */
   private Map<String, QueryPlan> selectPathPlans = new HashMap<>();
 
+  /**
+   * Series reader of select paths, key is series path , value is reader
+   */
   private Map<String, ClusterSeriesReader> selectPathReaders = new HashMap<>();
 
   /**
@@ -66,6 +69,9 @@ public class ClusterRpcSingleQueryManager implements IClusterRpcSingleQueryManag
    */
   private Map<String, QueryPlan> filterPathPlans = new HashMap<>();
 
+  /**
+   * Series reader of filter paths, key is series path , value is reader
+   */
   private Map<String, ClusterSeriesReader> filterPathReaders = new HashMap<>();
 
   public ClusterRpcSingleQueryManager(long jobId,
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/querynode/manager/ClusterLocalQueryManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/querynode/manager/ClusterLocalQueryManager.java
index f23e70e..50c3c1e 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/querynode/manager/ClusterLocalQueryManager.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/querynode/manager/ClusterLocalQueryManager.java
@@ -43,7 +43,7 @@ public class ClusterLocalQueryManager {
     long jobId = QueryResourceManager.getInstance().assignJobId();
     response.setJobId(jobId);
     ClusterLocalSingleQueryManager localQueryManager = new ClusterLocalSingleQueryManager(jobId);
-    localQueryManager.init(request, response);
+    localQueryManager.createSeriesReader(request, response);
     singleQueryManagerMap.put(jobId, localQueryManager);
   }
 
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/querynode/manager/ClusterLocalSingleQueryManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/querynode/manager/ClusterLocalSingleQueryManager.java
index cf9c9f5..99f3bf9 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/querynode/manager/ClusterLocalSingleQueryManager.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/querynode/manager/ClusterLocalSingleQueryManager.java
@@ -31,6 +31,7 @@ import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.exception.ProcessorException;
 import org.apache.iotdb.db.qp.executor.OverflowQPExecutor;
 import org.apache.iotdb.db.qp.executor.QueryProcessExecutor;
+import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 import org.apache.iotdb.db.qp.physical.crud.AggregationPlan;
 import org.apache.iotdb.db.qp.physical.crud.GroupByPlan;
 import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
@@ -39,7 +40,6 @@ import org.apache.iotdb.db.query.control.QueryResourceManager;
 import org.apache.iotdb.db.query.dataset.EngineDataSetWithoutTimeGenerator;
 import org.apache.iotdb.db.query.reader.IPointReader;
 import org.apache.iotdb.db.utils.TimeValuePair;
-import org.apache.iotdb.db.writelog.transfer.PhysicalPlanLogTransfer;
 import org.apache.iotdb.tsfile.exception.filter.QueryFilterOptimizationException;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.BatchData;
@@ -69,20 +69,19 @@ public class ClusterLocalSingleQueryManager {
   /**
    * Init create series reader.
    */
-  public void init(QuerySeriesDataRequest request, QuerySeriesDataResponse response)
+  public void createSeriesReader(QuerySeriesDataRequest request, QuerySeriesDataResponse response)
       throws IOException, PathErrorException, FileNodeManagerException, ProcessorException, QueryFilterOptimizationException {
-    List<byte[]> planBytes = request.getPhysicalPlanBytes();
-    for (byte[] planByte : planBytes) {
-      QueryPlan plan = (QueryPlan) PhysicalPlanLogTransfer.logToOperator(planByte);
+    List<PhysicalPlan> plans = request.getPhysicalPlans();
+    for (PhysicalPlan plan : plans) {
       if (plan instanceof GroupByPlan) {
         throw new UnsupportedOperationException();
       } else if (plan instanceof AggregationPlan) {
         throw new UnsupportedOperationException();
       } else {
         QueryContext context = new QueryContext(jobId);
-        if (plan.getExpression() == null
-            || plan.getExpression().getType() == ExpressionType.GLOBAL_TIME) {
-          handleDataSetWithoutTimeGenerator(plan, context, request, response);
+        if (((QueryPlan) plan).getExpression() == null
+            || ((QueryPlan) plan).getExpression().getType() == ExpressionType.GLOBAL_TIME) {
+          handleDataSetWithoutTimeGenerator((QueryPlan) plan, context, request, response);
         } else {
           throw new UnsupportedOperationException();
         }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/BasicRequest.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/BasicNonQueryRequest.java
similarity index 76%
copy from cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/BasicRequest.java
copy to cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/BasicNonQueryRequest.java
index ee4d840..dc15158 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/BasicRequest.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/BasicNonQueryRequest.java
@@ -23,22 +23,20 @@ import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
-import org.apache.iotdb.db.writelog.transfer.PhysicalPlanLogTransfer;
+import org.apache.iotdb.db.qp.physical.transfer.PhysicalPlanLogTransfer;
 
-public abstract class BasicRequest implements Serializable {
-
-  private static final long serialVersionUID = 8434915845259380829L;
-
-  /**
-   * Group ID
-   */
-  private String groupID;
+public abstract class BasicNonQueryRequest extends BasicRequest{
 
+  private static final long serialVersionUID = -3082772186451384202L;
   /**
    * Serialized physical plans
    */
   private List<byte[]> physicalPlanBytes;
 
+  public BasicNonQueryRequest(String groupID) {
+    super(groupID);
+  }
+
   protected void init(List<PhysicalPlan> physicalPlanBytes) throws IOException {
     this.physicalPlanBytes = new ArrayList<>(physicalPlanBytes.size());
     for (PhysicalPlan plan : physicalPlanBytes) {
@@ -50,15 +48,4 @@ public abstract class BasicRequest implements Serializable {
     return physicalPlanBytes;
   }
 
-  public BasicRequest(String groupID) {
-    this.groupID = groupID;
-  }
-
-  public String getGroupID() {
-    return groupID;
-  }
-
-  public void setGroupID(String groupID) {
-    this.groupID = groupID;
-  }
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/BasicQueryRequest.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/BasicQueryRequest.java
index 0e4ea6d..3ceddaf 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/BasicQueryRequest.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/BasicQueryRequest.java
@@ -20,6 +20,7 @@ package org.apache.iotdb.cluster.rpc.raft.request;
 
 public abstract class BasicQueryRequest extends BasicRequest {
 
+  private static final long serialVersionUID = 2993000692822502110L;
   /**
    * Read Consistency Level
    */
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/BasicRequest.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/BasicRequest.java
index ee4d840..dd4758a 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/BasicRequest.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/BasicRequest.java
@@ -18,12 +18,7 @@
  */
 package org.apache.iotdb.cluster.rpc.raft.request;
 
-import java.io.IOException;
 import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.iotdb.db.qp.physical.PhysicalPlan;
-import org.apache.iotdb.db.writelog.transfer.PhysicalPlanLogTransfer;
 
 public abstract class BasicRequest implements Serializable {
 
@@ -34,22 +29,6 @@ public abstract class BasicRequest implements Serializable {
    */
   private String groupID;
 
-  /**
-   * Serialized physical plans
-   */
-  private List<byte[]> physicalPlanBytes;
-
-  protected void init(List<PhysicalPlan> physicalPlanBytes) throws IOException {
-    this.physicalPlanBytes = new ArrayList<>(physicalPlanBytes.size());
-    for (PhysicalPlan plan : physicalPlanBytes) {
-      this.physicalPlanBytes.add(PhysicalPlanLogTransfer.operatorToLog(plan));
-    }
-  }
-
-  public List<byte[]> getPhysicalPlanBytes() {
-    return physicalPlanBytes;
-  }
-
   public BasicRequest(String groupID) {
     this.groupID = groupID;
   }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/nonquery/DataGroupNonQueryRequest.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/nonquery/DataGroupNonQueryRequest.java
index 9a5df22..8413373 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/nonquery/DataGroupNonQueryRequest.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/nonquery/DataGroupNonQueryRequest.java
@@ -19,16 +19,16 @@
 package org.apache.iotdb.cluster.rpc.raft.request.nonquery;
 
 import java.io.IOException;
-import java.io.Serializable;
 import java.util.List;
-import org.apache.iotdb.cluster.rpc.raft.request.BasicRequest;
+import org.apache.iotdb.cluster.rpc.raft.request.BasicNonQueryRequest;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 
 /**
  * Handle request to data group
  */
-public class DataGroupNonQueryRequest extends BasicRequest {
+public class DataGroupNonQueryRequest extends BasicNonQueryRequest {
 
+  private static final long serialVersionUID = -2442407985738324604L;
 
   public DataGroupNonQueryRequest(String groupID, List<PhysicalPlan> physicalPlanBytes)
       throws IOException {
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/nonquery/MetaGroupNonQueryRequest.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/nonquery/MetaGroupNonQueryRequest.java
index 7b90e68..b29609a 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/nonquery/MetaGroupNonQueryRequest.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/nonquery/MetaGroupNonQueryRequest.java
@@ -19,15 +19,16 @@
 package org.apache.iotdb.cluster.rpc.raft.request.nonquery;
 
 import java.io.IOException;
-import java.io.Serializable;
 import java.util.List;
-import org.apache.iotdb.cluster.rpc.raft.request.BasicRequest;
+import org.apache.iotdb.cluster.rpc.raft.request.BasicNonQueryRequest;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 
 /**
  * Handle request to metadata group leader
  */
-public class MetaGroupNonQueryRequest extends BasicRequest {
+public class MetaGroupNonQueryRequest extends BasicNonQueryRequest {
+
+  private static final long serialVersionUID = 312899249719243646L;
 
   public MetaGroupNonQueryRequest(String groupID, List<PhysicalPlan> plans)
       throws IOException {
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querydata/QuerySeriesDataRequest.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querydata/QuerySeriesDataRequest.java
index 4974c46..311c7e4 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querydata/QuerySeriesDataRequest.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querydata/QuerySeriesDataRequest.java
@@ -26,17 +26,39 @@ import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 
 public class QuerySeriesDataRequest extends BasicQueryRequest {
 
+  private static final long serialVersionUID = 7132891920951977625L;
+
+  /**
+   * Request stage
+   */
   private Stage stage;
+
+  /**
+   * Corresponding jobid in remote query node
+   */
   private long jobId;
+
+  /**
+   * Type of series
+   */
   private PathType pathType;
+
+  /**
+   * Series list
+   */
   private List<String> paths;
 
+  /**
+   * Physical plan list
+   */
+  private List<PhysicalPlan> physicalPlans;
+
   public QuerySeriesDataRequest(String groupID, int readConsistencyLevel,
-      List<PhysicalPlan> physicalPlanBytes, PathType pathType)
+      List<PhysicalPlan> physicalPlans, PathType pathType)
       throws IOException {
     super(groupID, readConsistencyLevel);
-    init(physicalPlanBytes);
-    stage = Stage.INITIAL;
+    this.physicalPlans = physicalPlans;
+    this.stage = Stage.INITIAL;
     this.pathType = pathType;
   }
 
@@ -80,4 +102,12 @@ public class QuerySeriesDataRequest extends BasicQueryRequest {
   public void setJobId(long jobId) {
     this.jobId = jobId;
   }
+
+  public List<PhysicalPlan> getPhysicalPlans() {
+    return physicalPlans;
+  }
+
+  public void setPhysicalPlans(List<PhysicalPlan> physicalPlans) {
+    this.physicalPlans = physicalPlans;
+  }
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QueryMetadataInStringRequest.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QueryMetadataInStringRequest.java
index 0e23dab..c90cf80 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QueryMetadataInStringRequest.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QueryMetadataInStringRequest.java
@@ -22,6 +22,8 @@ import org.apache.iotdb.cluster.rpc.raft.request.BasicQueryRequest;
 
 public class QueryMetadataInStringRequest extends BasicQueryRequest {
 
+  private static final long serialVersionUID = -7037884610669129082L;
+
   public QueryMetadataInStringRequest(String groupID, int readConsistencyLevel) {
     super(groupID, readConsistencyLevel);
   }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QueryMetadataRequest.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QueryMetadataRequest.java
index 3958775..75ae438 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QueryMetadataRequest.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QueryMetadataRequest.java
@@ -22,6 +22,8 @@ import org.apache.iotdb.cluster.rpc.raft.request.BasicQueryRequest;
 
 public class QueryMetadataRequest extends BasicQueryRequest {
 
+  private static final long serialVersionUID = -1976805423799324348L;
+
   public QueryMetadataRequest(String groupID, int readConsistencyLevel) {
     super(groupID, readConsistencyLevel);
   }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QueryPathsRequest.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QueryPathsRequest.java
index 49355ea..b92a0e6 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QueryPathsRequest.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QueryPathsRequest.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.cluster.rpc.raft.request.BasicQueryRequest;
 
 public class QueryPathsRequest extends BasicQueryRequest {
 
+  private static final long serialVersionUID = -4334131357874435256L;
   private List<String> path;
 
   public QueryPathsRequest(String groupID, int readConsistencyLevel, List<String> path) {
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QuerySeriesTypeRequest.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QuerySeriesTypeRequest.java
index 4f700dc..e46fe66 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QuerySeriesTypeRequest.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QuerySeriesTypeRequest.java
@@ -22,6 +22,7 @@ import org.apache.iotdb.cluster.rpc.raft.request.BasicQueryRequest;
 
 public class QuerySeriesTypeRequest extends BasicQueryRequest {
 
+  private static final long serialVersionUID = -7917403708996214075L;
   private String path;
 
   public QuerySeriesTypeRequest(String groupID, int readConsistencyLevel, String path) {
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QueryStorageGroupRequest.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QueryStorageGroupRequest.java
index 2bcf187..bb3d847 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QueryStorageGroupRequest.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QueryStorageGroupRequest.java
@@ -22,6 +22,8 @@ import org.apache.iotdb.cluster.rpc.raft.request.BasicQueryRequest;
 
 public class QueryStorageGroupRequest extends BasicQueryRequest {
 
+  private static final long serialVersionUID = -1260362721166408556L;
+
   public QueryStorageGroupRequest(String groupID, int readConsistencyLevel) {
     super(groupID, readConsistencyLevel);
   }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QueryTimeSeriesRequest.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QueryTimeSeriesRequest.java
index 0bad4fc..92d2f8a 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QueryTimeSeriesRequest.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/request/querymetadata/QueryTimeSeriesRequest.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.cluster.rpc.raft.request.BasicQueryRequest;
 
 public class QueryTimeSeriesRequest extends BasicQueryRequest {
 
+  private static final long serialVersionUID = -1902657459558399385L;
   private List<String> path;
 
   public QueryTimeSeriesRequest(String groupID, int readConsistencyLevel, List<String> path) {
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/nonquery/DataGroupNonQueryResponse.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/nonquery/DataGroupNonQueryResponse.java
index 0950c0d..9d86398 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/nonquery/DataGroupNonQueryResponse.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/nonquery/DataGroupNonQueryResponse.java
@@ -25,6 +25,8 @@ import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
  */
 public class DataGroupNonQueryResponse extends BasicResponse {
 
+  private static final long serialVersionUID = -8288044965888956717L;
+
   private DataGroupNonQueryResponse(String groupId, boolean redirected, String leaderStr,
       String errorMsg) {
     super(groupId, redirected, leaderStr, errorMsg);
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/nonquery/MetaGroupNonQueryResponse.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/nonquery/MetaGroupNonQueryResponse.java
index 2ec1165..653958a 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/nonquery/MetaGroupNonQueryResponse.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/nonquery/MetaGroupNonQueryResponse.java
@@ -25,6 +25,8 @@ import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
  */
 public class MetaGroupNonQueryResponse extends BasicResponse {
 
+  private static final long serialVersionUID = -7444143717755803056L;
+
   private MetaGroupNonQueryResponse(String groupId, boolean redirected, String leaderStr,
       String errorMsg) {
     super(groupId, redirected, leaderStr, errorMsg);
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querydata/QuerySeriesDataResponse.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querydata/QuerySeriesDataResponse.java
index b77a3f3..ef57675 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querydata/QuerySeriesDataResponse.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querydata/QuerySeriesDataResponse.java
@@ -26,6 +26,7 @@ import org.apache.iotdb.tsfile.read.common.BatchData;
 
 public class QuerySeriesDataResponse extends BasicResponse {
 
+  private static final long serialVersionUID = -4783032133961145205L;
   private long jobId;
   private PathType pathType;
   private List<TSDataType> seriesType;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QueryMetadataInStringResponse.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QueryMetadataInStringResponse.java
index 8967ea1..98b8201 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QueryMetadataInStringResponse.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QueryMetadataInStringResponse.java
@@ -22,6 +22,7 @@ import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
 
 public class QueryMetadataInStringResponse extends BasicResponse {
 
+  private static final long serialVersionUID = 5704333006127833921L;
   private String metadata;
 
   private QueryMetadataInStringResponse(String groupId, boolean redirected, String leaderStr,
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QueryMetadataResponse.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QueryMetadataResponse.java
index 3f0ad51..20e09f2 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QueryMetadataResponse.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QueryMetadataResponse.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.db.metadata.Metadata;
 
 public class QueryMetadataResponse extends BasicResponse {
 
+  private static final long serialVersionUID = -3969749781116510054L;
   private Metadata metadata;
 
   private QueryMetadataResponse(String groupId, boolean redirected, String leaderStr,
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QueryPathsResponse.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QueryPathsResponse.java
index 47f51f7..171563a 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QueryPathsResponse.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QueryPathsResponse.java
@@ -24,6 +24,7 @@ import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
 
 public class QueryPathsResponse extends BasicResponse {
 
+  private static final long serialVersionUID = -8255822509893237195L;
   private List<String> paths;
 
   private QueryPathsResponse(String groupId, boolean redirected, boolean success, String leaderStr, String errorMsg) {
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QuerySeriesTypeResponse.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QuerySeriesTypeResponse.java
index d772365..eee45c6 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QuerySeriesTypeResponse.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QuerySeriesTypeResponse.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
 public class QuerySeriesTypeResponse extends BasicResponse {
 
+  private static final long serialVersionUID = 7977583965911799165L;
   private TSDataType dataType;
 
   private QuerySeriesTypeResponse(String groupId, boolean redirected, String leaderStr,
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QueryStorageGroupResponse.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QueryStorageGroupResponse.java
index 4668e6d..8a3bb11 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QueryStorageGroupResponse.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QueryStorageGroupResponse.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
 
 public class QueryStorageGroupResponse extends BasicResponse {
 
+  private static final long serialVersionUID = 248840631619860233L;
   private Set<String> storageGroups;
 
   private QueryStorageGroupResponse(boolean success, String leaderStr, String errorMsg) {
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QueryTimeSeriesResponse.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QueryTimeSeriesResponse.java
index 2950b1f..1e029e8 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QueryTimeSeriesResponse.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/response/querymetadata/QueryTimeSeriesResponse.java
@@ -24,6 +24,7 @@ import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
 
 public class QueryTimeSeriesResponse extends BasicResponse {
 
+  private static final long serialVersionUID = 8313150788331085964L;
   private List<List<String>> timeSeries;
 
   private QueryTimeSeriesResponse(String groupId, boolean redirected, boolean success, String leaderStr, String errorMsg) {
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/utils/RaftUtils.java b/cluster/src/main/java/org/apache/iotdb/cluster/utils/RaftUtils.java
index f007027..ca256e4 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/utils/RaftUtils.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/utils/RaftUtils.java
@@ -45,6 +45,7 @@ import org.apache.iotdb.cluster.entity.raft.RaftService;
 import org.apache.iotdb.cluster.rpc.raft.NodeAsClient;
 import org.apache.iotdb.cluster.rpc.raft.closure.ResponseClosure;
 import org.apache.iotdb.cluster.rpc.raft.impl.RaftNodeAsClientManager;
+import org.apache.iotdb.cluster.rpc.raft.request.BasicNonQueryRequest;
 import org.apache.iotdb.cluster.rpc.raft.request.BasicRequest;
 import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
 import org.apache.iotdb.cluster.rpc.raft.response.nonquery.DataGroupNonQueryResponse;
@@ -218,7 +219,7 @@ public class RaftUtils {
    * @param service raft service
    */
   public static void executeRaftTaskForRpcProcessor(RaftService service, AsyncContext asyncContext,
-      BasicRequest request, BasicResponse response) {
+      BasicNonQueryRequest request, BasicResponse response) {
     final Task task = new Task();
     ResponseClosure closure = new ResponseClosure(response, status -> {
       response.addResult(status.isOk());
@@ -280,7 +281,7 @@ public class RaftUtils {
     handleNullReadToMetaGroup(status, server, nullReadTask);
   }
 
-  private static void handleNullReadToMetaGroup(Status status, Server server,
+  public static void handleNullReadToMetaGroup(Status status, Server server,
       SingleQPTask nullReadTask) {
     try {
       LOGGER.debug("Handle null-read in meta group for metadata request.");
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/utils/query/ClusterRpcReaderUtils.java b/cluster/src/main/java/org/apache/iotdb/cluster/utils/query/ClusterRpcReaderUtils.java
index 510112c..77d9cb3 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/utils/query/ClusterRpcReaderUtils.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/utils/query/ClusterRpcReaderUtils.java
@@ -24,7 +24,6 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
 import org.apache.iotdb.cluster.config.ClusterDescriptor;
 import org.apache.iotdb.cluster.exception.RaftConnectionException;
 import org.apache.iotdb.cluster.qp.task.QPTask.TaskState;
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/PhysicalPlan.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/PhysicalPlan.java
index 77dd6e4..d2f7bb9 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/PhysicalPlan.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/PhysicalPlan.java
@@ -18,6 +18,7 @@
  */
 package org.apache.iotdb.db.qp.physical;
 
+import java.io.Serializable;
 import java.util.List;
 import org.apache.iotdb.db.qp.logical.Operator;
 import org.apache.iotdb.tsfile.read.common.Path;
@@ -25,8 +26,9 @@ import org.apache.iotdb.tsfile.read.common.Path;
 /**
  * This class is a abstract class for all type of PhysicalPlan.
  */
-public abstract class PhysicalPlan {
+public abstract class PhysicalPlan implements Serializable {
 
+  private static final long serialVersionUID = -6274856391535568352L;
   private boolean isQuery;
   private Operator.OperatorType operatorType;
 
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/AggregationPlan.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/AggregationPlan.java
index 43a5e28..6e5f430 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/AggregationPlan.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/AggregationPlan.java
@@ -24,6 +24,7 @@ import org.apache.iotdb.db.qp.logical.Operator;
 
 public class AggregationPlan extends QueryPlan {
 
+  private static final long serialVersionUID = -2049810573809076643L;
   private List<String> aggregations = new ArrayList<>();
 
   public AggregationPlan() {
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/DeletePlan.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/DeletePlan.java
index b89717b..ae183bf 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/DeletePlan.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/DeletePlan.java
@@ -27,6 +27,7 @@ import org.apache.iotdb.tsfile.read.common.Path;
 
 public class DeletePlan extends PhysicalPlan {
 
+  private static final long serialVersionUID = -6532570247476907037L;
   private long deleteTime;
   private List<Path> paths = new ArrayList<>();
 
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/FillQueryPlan.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/FillQueryPlan.java
index 7f0399f..4fd666d 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/FillQueryPlan.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/FillQueryPlan.java
@@ -25,6 +25,7 @@ import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
 public class FillQueryPlan extends QueryPlan {
 
+  private static final long serialVersionUID = -2091710518816582444L;
   private long queryTime;
   private Map<TSDataType, IFill> fillType;
 
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/GroupByPlan.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/GroupByPlan.java
index f4087eb..d016c36 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/GroupByPlan.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/GroupByPlan.java
@@ -24,6 +24,7 @@ import org.apache.iotdb.tsfile.utils.Pair;
 
 public class GroupByPlan extends AggregationPlan {
 
+  private static final long serialVersionUID = 8769258112457178898L;
   private long unit;
   private long origin;
   private List<Pair<Long, Long>> intervals; // show intervals
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertPlan.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertPlan.java
index 4991811..e4efaa1 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertPlan.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertPlan.java
@@ -27,6 +27,7 @@ import org.apache.iotdb.tsfile.read.common.Path;
 
 public class InsertPlan extends PhysicalPlan {
 
+  private static final long serialVersionUID = 6102845312368561515L;
   private String deviceId;
   private List<String> measurements;
   private List<String> values;
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/QueryPlan.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/QueryPlan.java
index 1a4377c..6bf7c0e 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/QueryPlan.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/QueryPlan.java
@@ -28,6 +28,7 @@ import org.apache.iotdb.tsfile.read.expression.IExpression;
 
 public class QueryPlan extends PhysicalPlan {
 
+  private static final long serialVersionUID = -5865840981549195660L;
   private List<Path> paths = null;
   private IExpression expression = null;
 
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/UpdatePlan.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/UpdatePlan.java
index 5da9c2a..60768d6 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/UpdatePlan.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/UpdatePlan.java
@@ -31,6 +31,7 @@ import org.apache.iotdb.tsfile.utils.StringContainer;
 
 public class UpdatePlan extends PhysicalPlan {
 
+  private static final long serialVersionUID = 8952248212926920033L;
   private List<Pair<Long, Long>> intervals = new ArrayList<>();
   private String value;
   private Path path;
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/sys/AuthorPlan.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/sys/AuthorPlan.java
index b4b108a..3ec812c 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/sys/AuthorPlan.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/sys/AuthorPlan.java
@@ -32,6 +32,7 @@ import org.apache.iotdb.tsfile.read.common.Path;
 
 public class AuthorPlan extends PhysicalPlan {
 
+  private static final long serialVersionUID = 6501894026593590182L;
   private final AuthorOperator.AuthorType authorType;
   private String userName;
   private String roleName;
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/sys/LoadDataPlan.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/sys/LoadDataPlan.java
index 7e2eb7a..f9b4553 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/sys/LoadDataPlan.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/sys/LoadDataPlan.java
@@ -27,6 +27,7 @@ import org.apache.iotdb.tsfile.read.common.Path;
 
 public class LoadDataPlan extends PhysicalPlan {
 
+  private static final long serialVersionUID = -6631296704227106470L;
   private final String inputFilePath;
   private final String measureType;
 
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/sys/MetadataPlan.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/sys/MetadataPlan.java
index 93a98a3..e3b71f5 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/sys/MetadataPlan.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/sys/MetadataPlan.java
@@ -32,6 +32,7 @@ import org.apache.iotdb.tsfile.read.common.Path;
 
 public class MetadataPlan extends PhysicalPlan {
 
+  private static final long serialVersionUID = -3717406842093744475L;
   private final MetadataOperator.NamespaceType namespaceType;
   private Path path;
   private TSDataType dataType;
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/sys/PropertyPlan.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/sys/PropertyPlan.java
index 2f2c591..94ec623 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/sys/PropertyPlan.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/sys/PropertyPlan.java
@@ -31,6 +31,7 @@ import org.apache.iotdb.tsfile.read.common.Path;
  */
 public class PropertyPlan extends PhysicalPlan {
 
+  private static final long serialVersionUID = -1462399624512066104L;
   private final PropertyOperator.PropertyType propertyType;
   private Path propertyPath;
   private Path metadataPath;
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/writelog/transfer/Codec.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/transfer/Codec.java
similarity index 91%
rename from iotdb/src/main/java/org/apache/iotdb/db/writelog/transfer/Codec.java
rename to iotdb/src/main/java/org/apache/iotdb/db/qp/physical/transfer/Codec.java
index 76c0598..51fc06b 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/writelog/transfer/Codec.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/transfer/Codec.java
@@ -16,10 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.db.writelog.transfer;
+package org.apache.iotdb.db.qp.physical.transfer;
 
 import java.io.IOException;
-import org.apache.iotdb.db.auth.AuthException;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 
 interface Codec<T extends PhysicalPlan> {
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/writelog/transfer/CodecInstances.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/transfer/CodecInstances.java
similarity index 99%
rename from iotdb/src/main/java/org/apache/iotdb/db/writelog/transfer/CodecInstances.java
rename to iotdb/src/main/java/org/apache/iotdb/db/qp/physical/transfer/CodecInstances.java
index 2070d6f..e549bbd 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/writelog/transfer/CodecInstances.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/transfer/CodecInstances.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.db.writelog.transfer;
+package org.apache.iotdb.db.qp.physical.transfer;
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/writelog/transfer/PhysicalPlanCodec.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/transfer/PhysicalPlanCodec.java
similarity index 78%
rename from iotdb/src/main/java/org/apache/iotdb/db/writelog/transfer/PhysicalPlanCodec.java
rename to iotdb/src/main/java/org/apache/iotdb/db/qp/physical/transfer/PhysicalPlanCodec.java
index b2189ba..11ba358 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/writelog/transfer/PhysicalPlanCodec.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/transfer/PhysicalPlanCodec.java
@@ -16,22 +16,10 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.db.writelog.transfer;
+package org.apache.iotdb.db.qp.physical.transfer;
 
 import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.HashMap;
-import java.util.List;
-import org.apache.iotdb.db.conf.IoTDBConfig;
-import org.apache.iotdb.db.conf.IoTDBDescriptor;
-import org.apache.iotdb.db.qp.physical.crud.DeletePlan;
-import org.apache.iotdb.db.qp.physical.crud.InsertPlan;
-import org.apache.iotdb.db.qp.physical.crud.UpdatePlan;
-import org.apache.iotdb.tsfile.read.common.Path;
-import org.apache.iotdb.tsfile.utils.BytesUtils;
-import org.apache.iotdb.tsfile.utils.Pair;
 
 public enum PhysicalPlanCodec {
 
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/writelog/transfer/PhysicalPlanLogTransfer.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/transfer/PhysicalPlanLogTransfer.java
similarity index 98%
rename from iotdb/src/main/java/org/apache/iotdb/db/writelog/transfer/PhysicalPlanLogTransfer.java
rename to iotdb/src/main/java/org/apache/iotdb/db/qp/physical/transfer/PhysicalPlanLogTransfer.java
index 838ddb7..6d11b11 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/writelog/transfer/PhysicalPlanLogTransfer.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/transfer/PhysicalPlanLogTransfer.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.db.writelog.transfer;
+package org.apache.iotdb.db.qp.physical.transfer;
 
 import java.io.IOException;
 import java.nio.BufferOverflowException;
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/writelog/transfer/SystemLogOperator.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/transfer/SystemLogOperator.java
similarity index 96%
rename from iotdb/src/main/java/org/apache/iotdb/db/writelog/transfer/SystemLogOperator.java
rename to iotdb/src/main/java/org/apache/iotdb/db/qp/physical/transfer/SystemLogOperator.java
index 19b4d29..3993980 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/writelog/transfer/SystemLogOperator.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/transfer/SystemLogOperator.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.db.writelog.transfer;
+package org.apache.iotdb.db.qp.physical.transfer;
 
 /**
  * To avoid conflict with org.apache.iotdb.tsfiledb.qp.constant.SQLConstant.Operator.
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/writelog/io/RAFLogReader.java b/iotdb/src/main/java/org/apache/iotdb/db/writelog/io/RAFLogReader.java
index 6700805..5ee5ad1 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/writelog/io/RAFLogReader.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/writelog/io/RAFLogReader.java
@@ -25,7 +25,7 @@ import java.io.RandomAccessFile;
 import java.util.NoSuchElementException;
 import java.util.zip.CRC32;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
-import org.apache.iotdb.db.writelog.transfer.PhysicalPlanLogTransfer;
+import org.apache.iotdb.db.qp.physical.transfer.PhysicalPlanLogTransfer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/writelog/node/ExclusiveWriteLogNode.java b/iotdb/src/main/java/org/apache/iotdb/db/writelog/node/ExclusiveWriteLogNode.java
index 2c1fd72..d8e99ae 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/writelog/node/ExclusiveWriteLogNode.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/writelog/node/ExclusiveWriteLogNode.java
@@ -36,7 +36,7 @@ import org.apache.iotdb.db.writelog.io.ILogWriter;
 import org.apache.iotdb.db.writelog.io.LogWriter;
 import org.apache.iotdb.db.writelog.recover.ExclusiveLogRecoverPerformer;
 import org.apache.iotdb.db.writelog.recover.RecoverPerformer;
-import org.apache.iotdb.db.writelog.transfer.PhysicalPlanLogTransfer;
+import org.apache.iotdb.db.qp.physical.transfer.PhysicalPlanLogTransfer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/iotdb/src/test/java/org/apache/iotdb/db/writelog/transfer/PhysicalPlanLogTransferTest.java b/iotdb/src/test/java/org/apache/iotdb/db/qp/physical/transfer/PhysicalPlanLogTransferTest.java
similarity index 99%
rename from iotdb/src/test/java/org/apache/iotdb/db/writelog/transfer/PhysicalPlanLogTransferTest.java
rename to iotdb/src/test/java/org/apache/iotdb/db/qp/physical/transfer/PhysicalPlanLogTransferTest.java
index 58e8b1f..56438d3 100644
--- a/iotdb/src/test/java/org/apache/iotdb/db/writelog/transfer/PhysicalPlanLogTransferTest.java
+++ b/iotdb/src/test/java/org/apache/iotdb/db/qp/physical/transfer/PhysicalPlanLogTransferTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.db.writelog.transfer;
+package org.apache.iotdb.db.qp.physical.transfer;
 
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
diff --git a/iotdb/src/test/java/org/apache/iotdb/db/tools/WalCheckerTest.java b/iotdb/src/test/java/org/apache/iotdb/db/tools/WalCheckerTest.java
index 0c3ca29..c66e5a5 100644
--- a/iotdb/src/test/java/org/apache/iotdb/db/tools/WalCheckerTest.java
+++ b/iotdb/src/test/java/org/apache/iotdb/db/tools/WalCheckerTest.java
@@ -32,7 +32,7 @@ import org.apache.commons.io.FileUtils;
 import org.apache.iotdb.db.exception.SysCheckException;
 import org.apache.iotdb.db.qp.physical.crud.InsertPlan;
 import org.apache.iotdb.db.writelog.io.LogWriter;
-import org.apache.iotdb.db.writelog.transfer.PhysicalPlanLogTransfer;
+import org.apache.iotdb.db.qp.physical.transfer.PhysicalPlanLogTransfer;
 import org.junit.Test;
 
 public class WalCheckerTest {
diff --git a/iotdb/src/test/java/org/apache/iotdb/db/writelog/PerformanceTest.java b/iotdb/src/test/java/org/apache/iotdb/db/writelog/PerformanceTest.java
index cc101e9..5021f2c 100644
--- a/iotdb/src/test/java/org/apache/iotdb/db/writelog/PerformanceTest.java
+++ b/iotdb/src/test/java/org/apache/iotdb/db/writelog/PerformanceTest.java
@@ -27,7 +27,6 @@ import org.apache.iotdb.db.exception.FileNodeManagerException;
 import org.apache.iotdb.db.exception.MetadataArgsErrorException;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.exception.RecoverException;
-import org.apache.iotdb.db.exception.WALOverSizedException;
 import org.apache.iotdb.db.metadata.MManager;
 import org.apache.iotdb.db.qp.physical.crud.DeletePlan;
 import org.apache.iotdb.db.qp.physical.crud.InsertPlan;
@@ -35,7 +34,7 @@ import org.apache.iotdb.db.qp.physical.crud.UpdatePlan;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
 import org.apache.iotdb.db.writelog.node.ExclusiveWriteLogNode;
 import org.apache.iotdb.db.writelog.node.WriteLogNode;
-import org.apache.iotdb.db.writelog.transfer.PhysicalPlanLogTransfer;
+import org.apache.iotdb.db.qp.physical.transfer.PhysicalPlanLogTransfer;
 import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
 import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
diff --git a/iotdb/src/test/java/org/apache/iotdb/db/writelog/WriteLogNodeTest.java b/iotdb/src/test/java/org/apache/iotdb/db/writelog/WriteLogNodeTest.java
index 6efb056..dc07bde 100644
--- a/iotdb/src/test/java/org/apache/iotdb/db/writelog/WriteLogNodeTest.java
+++ b/iotdb/src/test/java/org/apache/iotdb/db/writelog/WriteLogNodeTest.java
@@ -34,7 +34,7 @@ import org.apache.iotdb.db.qp.physical.crud.UpdatePlan;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
 import org.apache.iotdb.db.writelog.node.ExclusiveWriteLogNode;
 import org.apache.iotdb.db.writelog.node.WriteLogNode;
-import org.apache.iotdb.db.writelog.transfer.PhysicalPlanLogTransfer;
+import org.apache.iotdb.db.qp.physical.transfer.PhysicalPlanLogTransfer;
 import org.apache.iotdb.tsfile.read.common.Path;
 import org.junit.After;
 import org.junit.Before;
diff --git a/iotdb/src/test/java/org/apache/iotdb/db/writelog/io/LogWriterReaderTest.java b/iotdb/src/test/java/org/apache/iotdb/db/writelog/io/LogWriterReaderTest.java
index d68478e..5340669 100644
--- a/iotdb/src/test/java/org/apache/iotdb/db/writelog/io/LogWriterReaderTest.java
+++ b/iotdb/src/test/java/org/apache/iotdb/db/writelog/io/LogWriterReaderTest.java
@@ -25,12 +25,11 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-import org.apache.iotdb.db.exception.WALOverSizedException;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 import org.apache.iotdb.db.qp.physical.crud.DeletePlan;
 import org.apache.iotdb.db.qp.physical.crud.InsertPlan;
 import org.apache.iotdb.db.qp.physical.crud.UpdatePlan;
-import org.apache.iotdb.db.writelog.transfer.PhysicalPlanLogTransfer;
+import org.apache.iotdb.db.qp.physical.transfer.PhysicalPlanLogTransfer;
 import org.apache.iotdb.tsfile.read.common.Path;
 import org.junit.Before;
 import org.junit.Test;
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/Path.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/Path.java
index 283cbe3..54d9f73 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/Path.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/Path.java
@@ -18,6 +18,7 @@
  */
 package org.apache.iotdb.tsfile.read.common;
 
+import java.io.Serializable;
 import org.apache.iotdb.tsfile.common.constant.SystemConstant;
 import org.apache.iotdb.tsfile.utils.StringContainer;
 import org.slf4j.Logger;
@@ -31,8 +32,9 @@ import java.io.IOException;
  *
  * @author Kangrong
  */
-public class Path {
+public class Path implements Serializable {
 
+  private static final long serialVersionUID = 3405277066329298200L;
   private String measurement = null;
   private String device = null;
   private String fullPath;
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/expression/IBinaryExpression.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/expression/IBinaryExpression.java
index b97310a..9418bd9 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/expression/IBinaryExpression.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/expression/IBinaryExpression.java
@@ -21,7 +21,7 @@ package org.apache.iotdb.tsfile.read.expression;
 /**
  * @author Jinrui Zhang
  */
-public interface IBinaryExpression extends IExpression {
+public interface IBinaryExpression extends IExpression{
 
   IExpression getLeft();
 
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/expression/IExpression.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/expression/IExpression.java
index a05b842..bfb92f2 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/expression/IExpression.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/expression/IExpression.java
@@ -18,7 +18,7 @@
  */
 package org.apache.iotdb.tsfile.read.expression;
 
-public interface IExpression {
+public interface IExpression{
 
   ExpressionType getType();
 }
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/expression/impl/BinaryExpression.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/expression/impl/BinaryExpression.java
index 60e68e0..54da8b4 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/expression/impl/BinaryExpression.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/expression/impl/BinaryExpression.java
@@ -18,11 +18,14 @@
  */
 package org.apache.iotdb.tsfile.read.expression.impl;
 
+import java.io.Serializable;
 import org.apache.iotdb.tsfile.read.expression.ExpressionType;
 import org.apache.iotdb.tsfile.read.expression.IBinaryExpression;
 import org.apache.iotdb.tsfile.read.expression.IExpression;
 
-public abstract class BinaryExpression implements IBinaryExpression {
+public abstract class BinaryExpression implements IBinaryExpression, Serializable {
+
+  private static final long serialVersionUID = -711801318534904452L;
 
   public static AndExpression and(IExpression left, IExpression right) {
     return new AndExpression(left, right);
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/expression/impl/GlobalTimeExpression.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/expression/impl/GlobalTimeExpression.java
index d69a65a..7075538 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/expression/impl/GlobalTimeExpression.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/expression/impl/GlobalTimeExpression.java
@@ -18,12 +18,14 @@
  */
 package org.apache.iotdb.tsfile.read.expression.impl;
 
+import java.io.Serializable;
 import org.apache.iotdb.tsfile.read.expression.ExpressionType;
 import org.apache.iotdb.tsfile.read.expression.IUnaryExpression;
 import org.apache.iotdb.tsfile.read.filter.basic.Filter;
 
-public class GlobalTimeExpression implements IUnaryExpression {
+public class GlobalTimeExpression implements IUnaryExpression, Serializable {
 
+  private static final long serialVersionUID = 1146132942359113670L;
   private Filter filter;
 
   public GlobalTimeExpression(Filter filter) {
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/expression/impl/SingleSeriesExpression.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/expression/impl/SingleSeriesExpression.java
index b2c2b24..10f993b 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/expression/impl/SingleSeriesExpression.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/expression/impl/SingleSeriesExpression.java
@@ -18,13 +18,15 @@
  */
 package org.apache.iotdb.tsfile.read.expression.impl;
 
+import java.io.Serializable;
 import org.apache.iotdb.tsfile.read.common.Path;
 import org.apache.iotdb.tsfile.read.expression.ExpressionType;
 import org.apache.iotdb.tsfile.read.expression.IUnaryExpression;
 import org.apache.iotdb.tsfile.read.filter.basic.Filter;
 
-public class SingleSeriesExpression implements IUnaryExpression {
+public class SingleSeriesExpression implements IUnaryExpression, Serializable {
 
+  private static final long serialVersionUID = 7131207370394865228L;
   private Path seriesPath;
   private Filter filter;
 
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/AndFilter.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/AndFilter.java
index fdeed48..61bfe1e 100755
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/AndFilter.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/AndFilter.java
@@ -27,7 +27,7 @@ import org.apache.iotdb.tsfile.read.filter.basic.Filter;
  */
 public class AndFilter extends BinaryFilter {
 
-  private static final long serialVersionUID = 6705254093824897938L;
+  private static final long serialVersionUID = -8212850098906044102L;
 
   public AndFilter(Filter left, Filter right) {
     super(left, right);
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/utils/Pair.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/utils/Pair.java
index ef88272..60995db 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/utils/Pair.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/utils/Pair.java
@@ -18,6 +18,8 @@
  */
 package org.apache.iotdb.tsfile.utils;
 
+import java.io.Serializable;
+
 /**
  * Pair is a template class to represent a couple of values. It also override the Object basic
  * methods like hasnCode, equals and toString.
@@ -26,8 +28,9 @@ package org.apache.iotdb.tsfile.utils;
  * @param <R> R type
  * @author kangrong
  */
-public class Pair<L, R> {
+public class Pair<L, R> implements Serializable {
 
+  private static final long serialVersionUID = -1398609631703707002L;
   public L left;
   public R right;
 


[incubator-iotdb] 01/19: Merge branch 'cluster' of github.com:apache/incubator-iotdb into cluster

Posted by lt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

lta pushed a commit to branch cluster_read
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git

commit 6f2b6a2bd32ad9c13a22ff515ac1f8777656708b
Merge: fe0ee65 7e5c645
Author: lta <li...@163.com>
AuthorDate: Thu Apr 11 18:12:00 2019 +0800

    Merge branch 'cluster' of github.com:apache/incubator-iotdb into cluster

 .../org/apache/iotdb/cluster/utils/RaftUtils.java  |  19 +-
 .../apache/iotdb/cluster/utils/hash/Router.java    |   2 +-
 .../apache/iotdb/cluster/utils/RaftUtilsTest.java  | 237 +++++++++++++++++++++
 .../iotdb/cluster/utils/hash/RouterTest.java       |  16 +-
 4 files changed, 264 insertions(+), 10 deletions(-)


[incubator-iotdb] 08/19: add Query Manager

Posted by lt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

lta pushed a commit to branch cluster_read
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git

commit f150b840828b2defdaa73efc194b4c8b770f2689
Author: lta <li...@163.com>
AuthorDate: Mon Apr 15 16:59:55 2019 +0800

    add Query Manager
---
 .../executor/ClusterExecutorWithTimeGenerator.java |  23 +++
 .../ClusterExecutorWithoutTimeGenerator.java       | 160 +++++++++++++++++++++
 .../executor/ClusterQueryRouter.java               |  18 +++
 .../executor/QueryProcessorExecutor.java           |  60 ++++++--
 .../manager/ClusterRpcQueryManager.java            |  49 +++++++
 .../manager/IClusterQueryManager.java              |  10 ++
 .../reader/ClusterAllDataReader.java               |  18 +++
 .../reader/ClusterRpcBatchReader.java              |  18 +++
 .../cluster/service/TSServiceClusterImpl.java      | 104 ++++++++++----
 .../qp/executor/AbstractQueryProcessExecutor.java  |   4 +-
 .../db/query/executor/IEngineQueryRouter.java      |  19 ++-
 .../org/apache/iotdb/db/service/TSServiceImpl.java |  18 ++-
 12 files changed, 451 insertions(+), 50 deletions(-)

diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithTimeGenerator.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithTimeGenerator.java
new file mode 100644
index 0000000..8bbff0b
--- /dev/null
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithTimeGenerator.java
@@ -0,0 +1,23 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.cluster.query.coordinatornode.executor;
+
+public class ClusterExecutorWithTimeGenerator {
+
+}
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithoutTimeGenerator.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithoutTimeGenerator.java
new file mode 100644
index 0000000..0392bce
--- /dev/null
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithoutTimeGenerator.java
@@ -0,0 +1,160 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.cluster.query.coordinatornode.executor;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.iotdb.db.engine.querycontext.QueryDataSource;
+import org.apache.iotdb.db.exception.FileNodeManagerException;
+import org.apache.iotdb.db.exception.PathErrorException;
+import org.apache.iotdb.db.metadata.MManager;
+import org.apache.iotdb.db.query.context.QueryContext;
+import org.apache.iotdb.db.query.control.QueryResourceManager;
+import org.apache.iotdb.db.query.dataset.EngineDataSetWithoutTimeGenerator;
+import org.apache.iotdb.db.query.factory.SeriesReaderFactory;
+import org.apache.iotdb.db.query.reader.AllDataReader;
+import org.apache.iotdb.db.query.reader.IPointReader;
+import org.apache.iotdb.db.query.reader.merge.PriorityMergeReader;
+import org.apache.iotdb.db.query.reader.sequence.SequenceDataReader;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.tsfile.read.common.Path;
+import org.apache.iotdb.tsfile.read.expression.QueryExpression;
+import org.apache.iotdb.tsfile.read.expression.impl.GlobalTimeExpression;
+import org.apache.iotdb.tsfile.read.filter.basic.Filter;
+import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
+
+public class ClusterExecutorWithoutTimeGenerator {
+  private QueryExpression queryExpression;
+
+  public ClusterExecutorWithoutTimeGenerator(QueryExpression queryExpression) {
+    this.queryExpression = queryExpression;
+  }
+
+  /**
+   * with global time filter.
+   */
+  public QueryDataSet executeWithGlobalTimeFilter(QueryContext context)
+      throws FileNodeManagerException {
+
+    Filter timeFilter = ((GlobalTimeExpression) queryExpression.getExpression()).getFilter();
+
+    List<IPointReader> readersOfSelectedSeries = new ArrayList<>();
+    List<TSDataType> dataTypes = new ArrayList<>();
+
+    QueryResourceManager.getInstance()
+        .beginQueryOfGivenQueryPaths(context.getJobId(), queryExpression.getSelectedSeries());
+
+    for (Path path : queryExpression.getSelectedSeries()) {
+
+      QueryDataSource queryDataSource = QueryResourceManager.getInstance().getQueryDataSource(path,
+          context);
+
+      // add data type
+      try {
+        dataTypes.add(MManager.getInstance().getSeriesType(path.getFullPath()));
+      } catch (PathErrorException e) {
+        throw new FileNodeManagerException(e);
+      }
+
+      // sequence reader for one sealed tsfile
+      SequenceDataReader tsFilesReader;
+      try {
+        tsFilesReader = new SequenceDataReader(queryDataSource.getSeqDataSource(),
+            timeFilter, context);
+      } catch (IOException e) {
+        throw new FileNodeManagerException(e);
+      }
+
+      // unseq reader for all chunk groups in unSeqFile
+      PriorityMergeReader unSeqMergeReader;
+      try {
+        unSeqMergeReader = SeriesReaderFactory.getInstance()
+            .createUnSeqMergeReader(queryDataSource.getOverflowSeriesDataSource(), timeFilter);
+      } catch (IOException e) {
+        throw new FileNodeManagerException(e);
+      }
+
+      // merge sequence data with unsequence data.
+      readersOfSelectedSeries.add(new AllDataReader(tsFilesReader, unSeqMergeReader));
+    }
+
+    try {
+      return new EngineDataSetWithoutTimeGenerator(queryExpression.getSelectedSeries(), dataTypes,
+          readersOfSelectedSeries);
+    } catch (IOException e) {
+      throw new FileNodeManagerException(e);
+    }
+  }
+
+  /**
+   * without filter.
+   */
+  public QueryDataSet executeWithoutFilter(QueryContext context)
+      throws FileNodeManagerException {
+
+    List<IPointReader> readersOfSelectedSeries = new ArrayList<>();
+    List<TSDataType> dataTypes = new ArrayList<>();
+
+    QueryResourceManager.getInstance()
+        .beginQueryOfGivenQueryPaths(context.getJobId(), queryExpression.getSelectedSeries());
+
+    for (Path path : queryExpression.getSelectedSeries()) {
+
+      QueryDataSource queryDataSource = QueryResourceManager.getInstance().getQueryDataSource(path,
+          context);
+
+      // add data type
+      try {
+        dataTypes.add(MManager.getInstance().getSeriesType(path.getFullPath()));
+      } catch (PathErrorException e) {
+        throw new FileNodeManagerException(e);
+      }
+
+      // sequence insert data
+      SequenceDataReader tsFilesReader;
+      try {
+        tsFilesReader = new SequenceDataReader(queryDataSource.getSeqDataSource(),
+            null, context);
+      } catch (IOException e) {
+        throw new FileNodeManagerException(e);
+      }
+
+      // unseq insert data
+      PriorityMergeReader unSeqMergeReader;
+      try {
+        unSeqMergeReader = SeriesReaderFactory.getInstance()
+            .createUnSeqMergeReader(queryDataSource.getOverflowSeriesDataSource(), null);
+      } catch (IOException e) {
+        throw new FileNodeManagerException(e);
+      }
+
+      // merge sequence data with unsequence data.
+      readersOfSelectedSeries.add(new AllDataReader(tsFilesReader, unSeqMergeReader));
+    }
+
+    try {
+      return new EngineDataSetWithoutTimeGenerator(queryExpression.getSelectedSeries(), dataTypes,
+          readersOfSelectedSeries);
+    } catch (IOException e) {
+      throw new FileNodeManagerException(e);
+    }
+  }
+
+}
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterQueryRouter.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterQueryRouter.java
index 8fc030a..c0a853b 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterQueryRouter.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterQueryRouter.java
@@ -1,3 +1,21 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.iotdb.cluster.query.coordinatornode.executor;
 
 import java.io.IOException;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/QueryProcessorExecutor.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/QueryProcessorExecutor.java
index 8531512..e01e72d 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/QueryProcessorExecutor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/QueryProcessorExecutor.java
@@ -1,11 +1,31 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.iotdb.cluster.query.coordinatornode.executor;
 
 import java.io.IOException;
 import java.util.List;
 import java.util.Map;
+import org.apache.iotdb.cluster.qp.executor.QueryMetadataExecutor;
 import org.apache.iotdb.db.exception.FileNodeManagerException;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.exception.ProcessorException;
+import org.apache.iotdb.db.qp.constant.SQLConstant;
 import org.apache.iotdb.db.qp.executor.AbstractQueryProcessExecutor;
 import org.apache.iotdb.db.query.context.QueryContext;
 import org.apache.iotdb.db.query.fill.IFill;
@@ -18,16 +38,13 @@ import org.apache.iotdb.tsfile.utils.Pair;
 
 public class QueryProcessorExecutor extends AbstractQueryProcessExecutor {
 
+  private QueryMetadataExecutor queryMetadataExecutor = new QueryMetadataExecutor();
+
   public QueryProcessorExecutor() {
     super(new ClusterQueryRouter());
   }
 
   @Override
-  public TSDataType getSeriesType(Path fullPath) throws PathErrorException {
-    return null;
-  }
-
-  @Override
   public boolean judgePathExists(Path fullPath) {
     return false;
   }
@@ -56,27 +73,48 @@ public class QueryProcessorExecutor extends AbstractQueryProcessExecutor {
   @Override
   public boolean update(Path path, long startTime, long endTime, String value)
       throws ProcessorException {
-    return false;
+    throw new ProcessorException("Cluster QueryProcessorExecutor doesn't support update method.");
   }
 
   @Override
   protected boolean delete(Path path, long deleteTime) throws ProcessorException {
-    return false;
+    throw new ProcessorException("Cluster QueryProcessorExecutor doesn't support delete method.");
   }
 
   @Override
   public int insert(Path path, long insertTime, String value) throws ProcessorException {
-    return 0;
+    throw new ProcessorException("Cluster QueryProcessorExecutor doesn't support insert method.");
   }
 
   @Override
   public int multiInsert(String deviceId, long insertTime, List<String> measurementList,
       List<String> insertValues) throws ProcessorException {
-    return 0;
+    throw new ProcessorException(
+        "Cluster QueryProcessorExecutor doesn't support multiInsert method.");
   }
 
   @Override
-  public List<String> getAllPaths(String originPath) throws PathErrorException {
-    return null;
+  public TSDataType getSeriesType(Path path) throws PathErrorException {
+    if (path.equals(SQLConstant.RESERVED_TIME)) {
+      return TSDataType.INT64;
+    }
+    if (path.equals(SQLConstant.RESERVED_FREQ)) {
+      return TSDataType.FLOAT;
+    }
+    try {
+      return queryMetadataExecutor.processSeriesTypeQuery(path.getFullPath());
+    } catch (InterruptedException | ProcessorException e) {
+      throw new PathErrorException(e.getMessage());
+    }
+  }
+
+  @Override
+  public List<String> getAllPaths(String originPath)
+      throws PathErrorException {
+    try {
+      return queryMetadataExecutor.processPathsQuery(originPath);
+    } catch (InterruptedException | ProcessorException e) {
+      throw new PathErrorException(e.getMessage());
+    }
   }
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterRpcQueryManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterRpcQueryManager.java
new file mode 100644
index 0000000..c289796
--- /dev/null
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterRpcQueryManager.java
@@ -0,0 +1,49 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.cluster.query.coordinatornode.manager;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+
+public class ClusterRpcQueryManager {
+
+  Map<Long, Map<String, PhysicalPlan>> selectPathPlan = new HashMap<>();
+  Map<Long, Map<String, PhysicalPlan>> filterPathPlan = new HashMap<>();
+
+  private ClusterRpcQueryManager(){
+
+  }
+
+
+
+  public static final ClusterRpcQueryManager getInstance() {
+    return ClusterRpcQueryManagerHolder.INSTANCE;
+  }
+
+  private static class ClusterRpcQueryManagerHolder {
+
+    private static final ClusterRpcQueryManager INSTANCE = new ClusterRpcQueryManager();
+
+    private ClusterRpcQueryManagerHolder() {
+
+    }
+  }
+
+}
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/IClusterQueryManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/IClusterQueryManager.java
new file mode 100644
index 0000000..6ce56f0
--- /dev/null
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/IClusterQueryManager.java
@@ -0,0 +1,10 @@
+package org.apache.iotdb.cluster.query.coordinatornode.manager;
+
+import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+
+public interface IClusterQueryManager {
+
+  void registerQuery(Long);
+
+  PhysicalPlan getPhysicalPlan();
+}
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterAllDataReader.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterAllDataReader.java
index 62cfeb1..684ead0 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterAllDataReader.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterAllDataReader.java
@@ -1,3 +1,21 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.iotdb.cluster.query.coordinatornode.reader;
 
 import java.io.IOException;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterRpcBatchReader.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterRpcBatchReader.java
index 0ffbe14..fc9eb8c 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterRpcBatchReader.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterRpcBatchReader.java
@@ -1,3 +1,21 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.iotdb.cluster.query.coordinatornode.reader;
 
 import java.io.IOException;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java b/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java
index 3a1561e..4013fa5 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java
@@ -19,8 +19,11 @@
 package org.apache.iotdb.cluster.service;
 
 import java.io.IOException;
+import java.nio.ByteBuffer;
 import java.sql.Statement;
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Set;
 import java.util.regex.Pattern;
@@ -34,15 +37,24 @@ import org.apache.iotdb.db.auth.AuthException;
 import org.apache.iotdb.db.conf.IoTDBConstant;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.exception.ProcessorException;
+import org.apache.iotdb.db.metadata.MManager;
 import org.apache.iotdb.db.metadata.Metadata;
 import org.apache.iotdb.db.qp.QueryProcessor;
+import org.apache.iotdb.db.qp.logical.Operator;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
+import org.apache.iotdb.db.query.control.QueryResourceManager;
 import org.apache.iotdb.db.service.TSServiceImpl;
 import org.apache.iotdb.service.rpc.thrift.TSExecuteBatchStatementReq;
 import org.apache.iotdb.service.rpc.thrift.TSExecuteBatchStatementResp;
+import org.apache.iotdb.service.rpc.thrift.TSExecuteStatementReq;
+import org.apache.iotdb.service.rpc.thrift.TSExecuteStatementResp;
+import org.apache.iotdb.service.rpc.thrift.TSHandleIdentifier;
+import org.apache.iotdb.service.rpc.thrift.TSOperationHandle;
 import org.apache.iotdb.service.rpc.thrift.TS_StatusCode;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.Path;
+import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
 import org.apache.thrift.TException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -58,10 +70,55 @@ public class TSServiceClusterImpl extends TSServiceImpl {
   private NonQueryExecutor nonQueryExecutor = new NonQueryExecutor();
   private QueryMetadataExecutor queryMetadataExecutor = new QueryMetadataExecutor();
 
+  /**
+   * Key is query statement, Value is corresponding job id which is assigned in <class>QueryResourceManager</class>
+   */
+  private ThreadLocal<HashMap<String, Long>> queryStatus = new ThreadLocal<>();
+
+  /**
+   * Key is job id, Value is QueryDataSet
+   */
+  private ThreadLocal<HashMap<Long, QueryDataSet>> queryRet = new ThreadLocal<>();
+
   public TSServiceClusterImpl() throws IOException {
     super();
   }
 
+
+  @Override
+  protected Set<String> getAllStorageGroups() throws InterruptedException {
+    return queryMetadataExecutor.processStorageGroupQuery();
+  }
+
+  @Override
+  protected List<List<String>> getTimeSeriesForPath(String path)
+      throws PathErrorException, InterruptedException, ProcessorException {
+    return queryMetadataExecutor.processTimeSeriesQuery(path);
+  }
+
+  @Override
+  protected String getMetadataInString()
+      throws InterruptedException, ProcessorException {
+    return queryMetadataExecutor.processMetadataInStringQuery();
+  }
+
+  @Override
+  protected Metadata getMetadata()
+      throws InterruptedException, ProcessorException, PathErrorException {
+    return queryMetadataExecutor.processMetadataQuery();
+  }
+
+  @Override
+  protected TSDataType getSeriesType(String path) throws PathErrorException, InterruptedException, ProcessorException {
+    return queryMetadataExecutor.processSeriesTypeQuery(path);
+  }
+
+  @Override
+  protected List<String> getPaths(String path)
+      throws PathErrorException, InterruptedException, ProcessorException {
+    return queryMetadataExecutor.processPathsQuery(path);
+  }
+
   @Override
   public TSExecuteBatchStatementResp executeBatchStatement(TSExecuteBatchStatementReq req)
       throws TException {
@@ -217,45 +274,30 @@ public class TSServiceClusterImpl extends TSServiceImpl {
   }
 
   /**
-   * Close cluster service
+   * //TODO
    */
   @Override
-  public void closeClusterService() {
-    nonQueryExecutor.shutdown();
-    queryMetadataExecutor.shutdown();
-  }
-
-  @Override
-  protected Set<String> getAllStorageGroups() throws InterruptedException {
-    return queryMetadataExecutor.processStorageGroupQuery();
-  }
-
-  @Override
-  protected List<List<String>> getTimeSeriesForPath(String path)
-      throws PathErrorException, InterruptedException, ProcessorException {
-    return queryMetadataExecutor.processTimeSeriesQuery(path);
+  public void checkFileLevelSet(List<Path> paths) throws PathErrorException {
+    MManager.getInstance().checkFileLevel(paths);
   }
 
   @Override
-  protected String getMetadataInString()
-      throws InterruptedException, ProcessorException {
-    return queryMetadataExecutor.processMetadataInStringQuery();
-  }
-
-  @Override
-  protected Metadata getMetadata()
-      throws InterruptedException, ProcessorException, PathErrorException {
-    return queryMetadataExecutor.processMetadataQuery();
+  public void recordANewQuery(String statement, PhysicalPlan physicalPlan) {
+    long jobId = QueryResourceManager.getInstance().assignJobId();
+    queryStatus.get().put(statement, jobId);
+    // refresh current queryRet for statement
+    if (queryRet.get().containsKey(statement)) {
+      queryRet.get().remove(statement);
+    }
   }
 
+  /**
+   * Close cluster service
+   */
   @Override
-  protected TSDataType getSeriesType(String path) throws PathErrorException, InterruptedException, ProcessorException {
-    return queryMetadataExecutor.processSeriesTypeQuery(path);
+  public void closeClusterService() {
+    nonQueryExecutor.shutdown();
+    queryMetadataExecutor.shutdown();
   }
 
-  @Override
-  protected List<String> getPaths(String path)
-      throws PathErrorException, InterruptedException, ProcessorException {
-    return queryMetadataExecutor.processPathsQuery(path);
-  }
 }
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/AbstractQueryProcessExecutor.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/AbstractQueryProcessExecutor.java
index c9ec1b5..2e0317e 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/AbstractQueryProcessExecutor.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/AbstractQueryProcessExecutor.java
@@ -34,7 +34,6 @@ import org.apache.iotdb.db.qp.physical.crud.FillQueryPlan;
 import org.apache.iotdb.db.qp.physical.crud.GroupByPlan;
 import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
 import org.apache.iotdb.db.query.context.QueryContext;
-import org.apache.iotdb.db.query.executor.EngineQueryRouter;
 import org.apache.iotdb.db.query.executor.IEngineQueryRouter;
 import org.apache.iotdb.db.query.fill.IFill;
 import org.apache.iotdb.tsfile.exception.filter.QueryFilterOptimizationException;
@@ -195,6 +194,7 @@ public abstract class AbstractQueryProcessExecutor {
   public abstract int multiInsert(String deviceId, long insertTime, List<String> measurementList,
       List<String> insertValues) throws ProcessorException;
 
-  public abstract List<String> getAllPaths(String originPath) throws PathErrorException;
+  public abstract List<String> getAllPaths(String originPath)
+      throws PathErrorException, ProcessorException, InterruptedException;
 
 }
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/query/executor/IEngineQueryRouter.java b/iotdb/src/main/java/org/apache/iotdb/db/query/executor/IEngineQueryRouter.java
index fb30949..1d0b91b 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/query/executor/IEngineQueryRouter.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/query/executor/IEngineQueryRouter.java
@@ -1,4 +1,21 @@
-
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.iotdb.db.query.executor;
 
 import java.io.IOException;
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java b/iotdb/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
index fd1a994..298db9c 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
@@ -378,15 +378,18 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
     return MManager.getInstance().getMetadataInString();
   }
 
-  protected Metadata getMetadata() throws PathErrorException, InterruptedException, ProcessorException {
+  protected Metadata getMetadata()
+      throws PathErrorException, InterruptedException, ProcessorException {
     return MManager.getInstance().getMetadata();
   }
 
-  protected TSDataType getSeriesType(String path) throws PathErrorException, InterruptedException, ProcessorException {
+  protected TSDataType getSeriesType(String path)
+      throws PathErrorException, InterruptedException, ProcessorException {
     return MManager.getInstance().getSeriesType(path);
   }
 
-  protected List<String> getPaths(String path) throws PathErrorException, InterruptedException, ProcessorException {
+  protected List<String> getPaths(String path)
+      throws PathErrorException, InterruptedException, ProcessorException {
     return MManager.getInstance().getPaths(path);
   }
 
@@ -566,8 +569,9 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
       }
 
       // check file level set
+
       try {
-        MManager.getInstance().checkFileLevel(paths);
+        checkFileLevelSet(paths);
       } catch (PathErrorException e) {
         LOGGER.error("meet error while checking file level.", e);
         return getTSExecuteStatementResp(TS_StatusCode.ERROR_STATUS, e.getMessage());
@@ -648,6 +652,10 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
     }
   }
 
+  public void checkFileLevelSet(List<Path> paths) throws PathErrorException {
+      MManager.getInstance().checkFileLevel(paths);
+  }
+
   @Override
   public TSFetchResultsResp fetchResults(TSFetchResultsReq req) throws TException {
     try {
@@ -780,7 +788,7 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
     return executeUpdateStatement(physicalPlan);
   }
 
-  private void recordANewQuery(String statement, PhysicalPlan physicalPlan) {
+  public void recordANewQuery(String statement, PhysicalPlan physicalPlan) {
     queryStatus.get().put(statement, physicalPlan);
     // refresh current queryRet for statement
     if (queryRet.get().containsKey(statement)) {


[incubator-iotdb] 11/19: add query manager

Posted by lt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

lta pushed a commit to branch cluster_read
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git

commit fda20ccccd25d7bad0d42fbf1a03a2033eb1ed15
Author: lta <li...@163.com>
AuthorDate: Mon Apr 15 22:42:45 2019 +0800

    add query manager
---
 .../cluster/qp/executor/AbstractQPExecutor.java    |   2 +-
 .../cluster/qp/executor/QueryMetadataExecutor.java |   2 +-
 ...cutor.java => ClusterQueryProcessExecutor.java} | 102 +++++++++------
 .../manager/ClusterRpcQueryManager.java            |  47 +++----
 .../manager/ClusterSingleQueryManager.java         | 106 +++++++++++++++
 ...anager.java => IClusterSingleQueryManager.java} |  42 +++---
 .../cluster/service/TSServiceClusterImpl.java      |  50 ++++---
 .../org/apache/iotdb/db/qp/QueryProcessor.java     |  13 +-
 .../db/qp/executor/IQueryProcessExecutor.java      | 144 +++++++++++++++++++++
 .../iotdb/db/qp/executor/OverflowQPExecutor.java   |  11 +-
 ...cessExecutor.java => QueryProcessExecutor.java} | 103 ++-------------
 .../db/qp/logical/crud/BasicFunctionOperator.java  |   5 +-
 .../iotdb/db/qp/logical/crud/FilterOperator.java   |   7 +-
 .../iotdb/db/qp/physical/crud/QueryPlan.java       |   4 +-
 .../iotdb/db/qp/strategy/PhysicalGenerator.java    |   8 +-
 .../qp/strategy/optimizer/ConcatPathOptimizer.java |   7 +-
 .../org/apache/iotdb/db/service/TSServiceImpl.java |  20 ++-
 .../apache/iotdb/db/qp/utils/MemIntQpExecutor.java |   7 +-
 .../EngineDataSetWithTimeGeneratorTest.java        |   4 +-
 19 files changed, 457 insertions(+), 227 deletions(-)

diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/AbstractQPExecutor.java b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/AbstractQPExecutor.java
index 654d13c..6463ed3 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/AbstractQPExecutor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/AbstractQPExecutor.java
@@ -69,7 +69,7 @@ public abstract class AbstractQPExecutor {
   /**
    * The task in progress.
    */
-  protected ThreadLocal<QPTask> currentTask;
+  protected ThreadLocal<QPTask> currentTask = new ThreadLocal<>();
 
   /**
    * Count limit to redo a single task
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/QueryMetadataExecutor.java b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/QueryMetadataExecutor.java
index f1098f8..0702548 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/QueryMetadataExecutor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/QueryMetadataExecutor.java
@@ -227,7 +227,7 @@ public class QueryMetadataExecutor extends AbstractQPExecutor {
 
   public TSDataType processSeriesTypeQuery(String path)
       throws InterruptedException, ProcessorException, PathErrorException {
-    TSDataType dataType = null;
+    TSDataType dataType;
     List<String> storageGroupList = mManager.getAllFileNamesByPath(path);
     if (storageGroupList.size() != 1) {
       throw new PathErrorException("path " + path + " is not valid.");
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/QueryProcessorExecutor.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterQueryProcessExecutor.java
similarity index 71%
rename from cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/QueryProcessorExecutor.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterQueryProcessExecutor.java
index e01e72d..7b51a4f 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/QueryProcessorExecutor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterQueryProcessExecutor.java
@@ -26,8 +26,10 @@ import org.apache.iotdb.db.exception.FileNodeManagerException;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.exception.ProcessorException;
 import org.apache.iotdb.db.qp.constant.SQLConstant;
-import org.apache.iotdb.db.qp.executor.AbstractQueryProcessExecutor;
+import org.apache.iotdb.db.qp.executor.QueryProcessExecutor;
+import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 import org.apache.iotdb.db.query.context.QueryContext;
+import org.apache.iotdb.db.query.executor.IEngineQueryRouter;
 import org.apache.iotdb.db.query.fill.IFill;
 import org.apache.iotdb.tsfile.exception.filter.QueryFilterOptimizationException;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
@@ -36,61 +38,31 @@ import org.apache.iotdb.tsfile.read.expression.IExpression;
 import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
 import org.apache.iotdb.tsfile.utils.Pair;
 
-public class QueryProcessorExecutor extends AbstractQueryProcessExecutor {
+public class ClusterQueryProcessExecutor extends QueryProcessExecutor {
 
-  private QueryMetadataExecutor queryMetadataExecutor = new QueryMetadataExecutor();
-
-  public QueryProcessorExecutor() {
-    super(new ClusterQueryRouter());
-  }
+  private IEngineQueryRouter queryRouter = new ClusterQueryRouter();
 
-  @Override
-  public boolean judgePathExists(Path fullPath) {
-    return false;
-  }
+  private QueryMetadataExecutor queryMetadataExecutor = new QueryMetadataExecutor();
 
   @Override
   public QueryDataSet aggregate(List<Path> paths, List<String> aggres, IExpression expression,
       QueryContext context)
       throws ProcessorException, IOException, PathErrorException, FileNodeManagerException, QueryFilterOptimizationException {
-    return null;
+    return queryRouter.aggregate(paths, aggres, expression, context);
   }
 
   @Override
   public QueryDataSet groupBy(List<Path> paths, List<String> aggres, IExpression expression,
       long unit, long origin, List<Pair<Long, Long>> intervals, QueryContext context)
       throws ProcessorException, IOException, PathErrorException, FileNodeManagerException, QueryFilterOptimizationException {
-    return null;
+    return queryRouter.groupBy(paths, aggres, expression, unit, origin, intervals, context);
   }
 
   @Override
   public QueryDataSet fill(List<Path> fillPaths, long queryTime, Map<TSDataType, IFill> fillTypes,
       QueryContext context)
       throws ProcessorException, IOException, PathErrorException, FileNodeManagerException {
-    return null;
-  }
-
-  @Override
-  public boolean update(Path path, long startTime, long endTime, String value)
-      throws ProcessorException {
-    throw new ProcessorException("Cluster QueryProcessorExecutor doesn't support update method.");
-  }
-
-  @Override
-  protected boolean delete(Path path, long deleteTime) throws ProcessorException {
-    throw new ProcessorException("Cluster QueryProcessorExecutor doesn't support delete method.");
-  }
-
-  @Override
-  public int insert(Path path, long insertTime, String value) throws ProcessorException {
-    throw new ProcessorException("Cluster QueryProcessorExecutor doesn't support insert method.");
-  }
-
-  @Override
-  public int multiInsert(String deviceId, long insertTime, List<String> measurementList,
-      List<String> insertValues) throws ProcessorException {
-    throw new ProcessorException(
-        "Cluster QueryProcessorExecutor doesn't support multiInsert method.");
+    return queryRouter.fill(fillPaths, queryTime, fillTypes, context);
   }
 
   @Override
@@ -117,4 +89,60 @@ public class QueryProcessorExecutor extends AbstractQueryProcessExecutor {
       throw new PathErrorException(e.getMessage());
     }
   }
+
+  @Override
+  public boolean judgePathExists(Path fullPath) {
+    try {
+      List<List<String>> results = queryMetadataExecutor.processTimeSeriesQuery(fullPath.toString());
+      return !results.isEmpty();
+    } catch (InterruptedException | PathErrorException | ProcessorException e) {
+      return false;
+    }
+  }
+
+  @Override
+  public int getFetchSize() {
+    return fetchSize.get();
+  }
+
+  @Override
+  public void setFetchSize(int fetchSize) {
+    this.fetchSize.set(fetchSize);
+  }
+
+  public IEngineQueryRouter getQueryRouter() {
+    return queryRouter;
+  }
+
+  @Override
+  public boolean update(Path path, long startTime, long endTime, String value)
+      throws ProcessorException {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public boolean delete(List<Path> paths, long deleteTime) throws ProcessorException {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public boolean delete(Path path, long deleteTime) throws ProcessorException {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public int insert(Path path, long insertTime, String value) throws ProcessorException {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public int multiInsert(String deviceId, long insertTime, List<String> measurementList,
+      List<String> insertValues) throws ProcessorException {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public boolean processNonQuery(PhysicalPlan plan) throws ProcessorException {
+    return false;
+  }
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterRpcQueryManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterRpcQueryManager.java
index 3df1ef6..3e9a68c 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterRpcQueryManager.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterRpcQueryManager.java
@@ -18,37 +18,40 @@
  */
 package org.apache.iotdb.cluster.query.coordinatornode.manager;
 
-import java.util.HashMap;
-import java.util.Map;
-import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import java.util.concurrent.ConcurrentHashMap;
+import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
 
-public class ClusterRpcQueryManager implements IClusterQueryManager{
-
-  Map<Long, Map<String, PhysicalPlan>> selectPathPlan = new HashMap<>();
-  Map<Long, Map<String, PhysicalPlan>> filterPathPlan = new HashMap<>();
-
-  private ClusterRpcQueryManager(){
-  }
+/**
+ * Manage all query in cluster
+ */
+public class ClusterRpcQueryManager{
 
-  @Override
-  public void registerQuery(Long jobId, PhysicalPlan plan) {
+  /**
+   * Key is group id, value is manager of a client query.
+   */
+  ConcurrentHashMap<Long, IClusterSingleQueryManager> singleQueryManagerMap = new ConcurrentHashMap<>();
 
+  /**
+   * Add a query
+   */
+  public void addSingleQuery(long jobId, QueryPlan physicalPlan){
+    singleQueryManagerMap.put(jobId, new ClusterSingleQueryManager(jobId, physicalPlan));
   }
 
-  @Override
-  public PhysicalPlan getSelectPathPhysicalPlan(Long jobId, String fullPath) {
-    return selectPathPlan.get(jobId).get(fullPath);
+  /**
+   * Get query manager by group id
+   */
+  public IClusterSingleQueryManager getSingleQuery(long jobId) {
+    return singleQueryManagerMap.get(jobId);
   }
 
-  @Override
-  public PhysicalPlan getFilterPathPhysicalPlan(Long jobId, String fullPath) {
-    return filterPathPlan.get(jobId).get(fullPath);
+  public void releaseQueryResource(long jobId){
+    if(singleQueryManagerMap.containsKey(jobId)){
+     singleQueryManagerMap.remove(jobId).releaseQueryResource();
+    }
   }
 
-  @Override
-  public void remove(Long jobId) {
-    selectPathPlan.remove(jobId);
-    filterPathPlan.remove(jobId);
+  private ClusterRpcQueryManager(){
   }
 
   public static final ClusterRpcQueryManager getInstance() {
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterSingleQueryManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterSingleQueryManager.java
new file mode 100644
index 0000000..156b9a5
--- /dev/null
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterSingleQueryManager.java
@@ -0,0 +1,106 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.cluster.query.coordinatornode.manager;
+
+import com.alipay.sofa.jraft.entity.PeerId;
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
+
+public class ClusterSingleQueryManager implements IClusterSingleQueryManager {
+
+  /**
+   * Query job id assigned by QueryResourceManager.
+   */
+  private long jobId;
+
+  /**
+   * Origin query plan parsed by QueryProcessor
+   */
+  private QueryPlan originPhysicalPlan;
+
+  /**
+   * Represent selected reader nodes, key is group id and value is selected peer id
+   */
+  private Map<String, PeerId> readerNodes = new HashMap<>();
+
+  /**
+   * Physical plans of select paths which are divided from originPhysicalPlan
+   */
+  private Map<String, QueryPlan> selectPathPlans = new HashMap<>();
+
+  /**
+   * Physical plans of filter paths which are divided from originPhysicalPlan
+   */
+  private Map<String, QueryPlan> filterPathPlans = new HashMap<>();
+
+  public ClusterSingleQueryManager(long jobId,
+      QueryPlan originPhysicalPlan) {
+    this.jobId = jobId;
+    this.originPhysicalPlan = originPhysicalPlan;
+  }
+
+  @Override
+  public void dividePhysicalPlan() {
+//    List<Path>
+//    MManager.getInstance().getFileNameByPath()
+  }
+
+  @Override
+  public PhysicalPlan getSelectPathPhysicalPlan(String fullPath) {
+    return selectPathPlans.get(fullPath);
+  }
+
+  @Override
+  public PhysicalPlan getFilterPathPhysicalPlan(String fullPath) {
+    return filterPathPlans.get(fullPath);
+  }
+
+  @Override
+  public void setDataGroupReaderNode(String groupId, PeerId readerNode) {
+    readerNodes.put(groupId, readerNode);
+  }
+
+  @Override
+  public PeerId getDataGroupReaderNode(String groupId) {
+    return readerNodes.get(groupId);
+  }
+
+  @Override
+  public void releaseQueryResource() {
+
+  }
+
+  public long getJobId() {
+    return jobId;
+  }
+
+  public void setJobId(long jobId) {
+    this.jobId = jobId;
+  }
+
+  public PhysicalPlan getOriginPhysicalPlan() {
+    return originPhysicalPlan;
+  }
+
+  public void setOriginPhysicalPlan(QueryPlan originPhysicalPlan) {
+    this.originPhysicalPlan = originPhysicalPlan;
+  }
+}
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/IClusterQueryManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/IClusterSingleQueryManager.java
similarity index 54%
rename from cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/IClusterQueryManager.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/IClusterSingleQueryManager.java
index a7a1418..c5fffbc 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/IClusterQueryManager.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/IClusterSingleQueryManager.java
@@ -18,38 +18,50 @@
  */
 package org.apache.iotdb.cluster.query.coordinatornode.manager;
 
+import com.alipay.sofa.jraft.entity.PeerId;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 
-public interface IClusterQueryManager {
+/**
+ * Manage a single query.
+ */
+public interface IClusterSingleQueryManager {
 
   /**
-   * Register a query, divide physical plan into several sub physical plans according to timeseries
-   * full path.
-   *
-   * @param jobId Query job id assigned by QueryResourceManager.
-   * @param plan Physical plan parsed by QueryProcessor
+   * Divide physical plan into several sub physical plans according to timeseries full path.
    */
-  void registerQuery(Long jobId, PhysicalPlan plan);
+  void dividePhysicalPlan();
 
   /**
    * Get physical plan of select path
    *
-   * @param jobId Query job id assigned by QueryResourceManager.
-   * @param path Timeseries full path in select paths
+   * @param fullPath Timeseries full path in select paths
    */
-  PhysicalPlan getSelectPathPhysicalPlan(Long jobId, String path);
+  PhysicalPlan getSelectPathPhysicalPlan(String fullPath);
 
   /**
    * Get physical plan of filter path
    *
-   * @param jobId Query job id assigned by QueryResourceManager.
-   * @param path Timeseries full path in filter
+   * @param fullPath Timeseries full path in filter
    */
-  PhysicalPlan getFilterPathPhysicalPlan(Long jobId, String path);
+  PhysicalPlan getFilterPathPhysicalPlan(String fullPath);
 
+  /**
+   * Set reader node of a data group
+   *
+   * @param groupId data group id
+   * @param readerNode peer id
+   */
+  void setDataGroupReaderNode(String groupId, PeerId readerNode);
+
+  /**
+   * Get reader node of a data group by group id
+   * @param groupId data group id
+   * @return peer id of reader node
+   */
+  PeerId getDataGroupReaderNode(String groupId);
 
   /**
-   * Remove resource of a job id
+   * Release query resource
    */
-  void remove(Long jobId);
+  void releaseQueryResource();
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java b/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java
index de5aef0..a11fae4 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java
@@ -31,7 +31,7 @@ import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.exception.ConsistencyLevelException;
 import org.apache.iotdb.cluster.qp.executor.NonQueryExecutor;
 import org.apache.iotdb.cluster.qp.executor.QueryMetadataExecutor;
-import org.apache.iotdb.cluster.query.coordinatornode.executor.QueryProcessorExecutor;
+import org.apache.iotdb.cluster.query.coordinatornode.executor.ClusterQueryProcessExecutor;
 import org.apache.iotdb.cluster.query.coordinatornode.manager.ClusterRpcQueryManager;
 import org.apache.iotdb.db.auth.AuthException;
 import org.apache.iotdb.db.conf.IoTDBConstant;
@@ -41,7 +41,9 @@ import org.apache.iotdb.db.exception.ProcessorException;
 import org.apache.iotdb.db.metadata.MManager;
 import org.apache.iotdb.db.metadata.Metadata;
 import org.apache.iotdb.db.qp.QueryProcessor;
+import org.apache.iotdb.db.qp.executor.OverflowQPExecutor;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
 import org.apache.iotdb.db.query.context.QueryContext;
 import org.apache.iotdb.db.query.control.QueryResourceManager;
 import org.apache.iotdb.db.service.TSServiceImpl;
@@ -65,7 +67,8 @@ public class TSServiceClusterImpl extends TSServiceImpl {
 
   private static final Logger LOGGER = LoggerFactory.getLogger(TSServiceClusterImpl.class);
 
-  private QueryProcessor processor = new QueryProcessor(new QueryProcessorExecutor());
+  private ClusterRpcQueryManager queryManager = ClusterRpcQueryManager.getInstance();
+  private QueryProcessor processor = new QueryProcessor(new ClusterQueryProcessExecutor());
   private NonQueryExecutor nonQueryExecutor = new NonQueryExecutor();
   private QueryMetadataExecutor queryMetadataExecutor = new QueryMetadataExecutor();
 
@@ -268,17 +271,18 @@ public class TSServiceClusterImpl extends TSServiceImpl {
   }
 
   /**
-   * //TODO
+   * It's unnecessary to do this check. It has benn checked in transforming query physical plan.
    */
   @Override
   public void checkFileLevelSet(List<Path> paths) throws PathErrorException {
-    MManager.getInstance().checkFileLevel(paths);
   }
 
   @Override
   public void recordANewQuery(String statement, PhysicalPlan physicalPlan) {
     long jobId = QueryResourceManager.getInstance().assignJobId();
+    queryStatus.get().put(statement, physicalPlan);
     queryJobIdMap.get().put(statement, jobId);
+    queryManager.addSingleQuery(jobId, (QueryPlan) physicalPlan);
     // refresh current queryRet for statement
     if (queryRet.get().containsKey(statement)) {
       queryRet.get().remove(statement);
@@ -295,12 +299,13 @@ public class TSServiceClusterImpl extends TSServiceImpl {
       // end query for all the query tokens created by current thread
       for (QueryContext context : contextMap.values()) {
         QueryResourceManager.getInstance().endQueryForGivenJob(context.getJobId());
-        ClusterRpcQueryManager.getInstance().remove(context.getJobId());
+        queryManager.releaseQueryResource(context.getJobId());
       }
+      contextMapLocal.set(new HashMap<>());
     } else {
       long jobId = contextMap.remove(req.queryId).getJobId();
       QueryResourceManager.getInstance().endQueryForGivenJob(jobId);
-      ClusterRpcQueryManager.getInstance().remove(jobId);
+      queryManager.releaseQueryResource(jobId);
     }
   }
 
@@ -313,6 +318,10 @@ public class TSServiceClusterImpl extends TSServiceImpl {
     if (this.queryJobIdMap.get() != null) {
       this.queryJobIdMap.get().clear();
     }
+
+    if (this.queryStatus.get() != null) {
+      this.queryStatus.get().clear();
+    }
   }
 
 
@@ -320,21 +329,20 @@ public class TSServiceClusterImpl extends TSServiceImpl {
   public QueryDataSet createNewDataSet(String statement, int fetchSize, TSFetchResultsReq req)
       throws PathErrorException, QueryFilterOptimizationException, FileNodeManagerException,
       ProcessorException, IOException {
-//    PhysicalPlan physicalPlan = queryJobIdMap.get().get(statement);
-//    processor.getExecutor().setFetchSize(fetchSize);
-//
-//    QueryContext context = new QueryContext(QueryResourceManager.getInstance().assignJobId());
-//    Map<Long, QueryContext> contextMap = contextMapLocal.get();
-//    if (contextMap == null) {
-//      contextMap = new HashMap<>();
-//      contextMapLocal.set(contextMap);
-//    }
-//    contextMap.put(req.queryId, context);
-//
-//    QueryDataSet queryDataSet = processor.getExecutor().processQuery((QueryPlan) physicalPlan,
-//        context);
-//    queryRet.get().put(statement, queryDataSet);
-//    return queryDataSet;
+    PhysicalPlan physicalPlan = queryStatus.get().get(statement);
+    processor.getExecutor().setFetchSize(fetchSize);
+    long jobId = queryJobIdMap.get().get(statement);
+
+    QueryContext context = new QueryContext(jobId);
+    initContextMap();
+    contextMapLocal.get().put(req.queryId, context);
+
+    queryManager.getSingleQuery(jobId).dividePhysicalPlan();
+
+    QueryDataSet queryDataSet = processor.getExecutor().processQuery((QueryPlan) physicalPlan,
+        context);
+    queryRet.get().put(statement, queryDataSet);
+    return queryDataSet;
   }
   /**
    * Close cluster service
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/QueryProcessor.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/QueryProcessor.java
index 62f4d80..f63514d 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/QueryProcessor.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/QueryProcessor.java
@@ -27,7 +27,8 @@ import org.apache.iotdb.db.exception.qp.IllegalASTFormatException;
 import org.apache.iotdb.db.exception.qp.LogicalOperatorException;
 import org.apache.iotdb.db.exception.qp.LogicalOptimizeException;
 import org.apache.iotdb.db.exception.qp.QueryProcessorException;
-import org.apache.iotdb.db.qp.executor.AbstractQueryProcessExecutor;
+import org.apache.iotdb.db.qp.executor.IQueryProcessExecutor;
+import org.apache.iotdb.db.qp.executor.QueryProcessExecutor;
 import org.apache.iotdb.db.qp.logical.Operator;
 import org.apache.iotdb.db.qp.logical.RootOperator;
 import org.apache.iotdb.db.qp.logical.crud.FilterOperator;
@@ -49,13 +50,13 @@ import org.apache.iotdb.db.sql.parse.ParseUtils;
  */
 public class QueryProcessor {
 
-  private AbstractQueryProcessExecutor executor;
+  private IQueryProcessExecutor executor;
 
-  public QueryProcessor(AbstractQueryProcessExecutor executor) {
+  public QueryProcessor(IQueryProcessExecutor executor) {
     this.executor = executor;
   }
 
-  public AbstractQueryProcessExecutor getExecutor() {
+  public IQueryProcessExecutor getExecutor() {
     return executor;
   }
 
@@ -122,7 +123,7 @@ public class QueryProcessor {
    * @throws LogicalOptimizeException
    *             exception in logical optimizing
    */
-  private Operator logicalOptimize(Operator operator, AbstractQueryProcessExecutor executor)
+  private Operator logicalOptimize(Operator operator, IQueryProcessExecutor executor)
       throws LogicalOperatorException {
     switch (operator.getType()) {
       case AUTHOR:
@@ -156,7 +157,7 @@ public class QueryProcessor {
    * @throws LogicalOptimizeException
    *             exception in SFW optimizing
    */
-  private SFWOperator optimizeSFWOperator(SFWOperator root, AbstractQueryProcessExecutor executor)
+  private SFWOperator optimizeSFWOperator(SFWOperator root, IQueryProcessExecutor executor)
       throws LogicalOperatorException {
     ConcatPathOptimizer concatPathOptimizer = new ConcatPathOptimizer(executor);
     root = (SFWOperator) concatPathOptimizer.transform(root);
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/IQueryProcessExecutor.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/IQueryProcessExecutor.java
new file mode 100644
index 0000000..68cde76
--- /dev/null
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/IQueryProcessExecutor.java
@@ -0,0 +1,144 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.db.qp.executor;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import org.apache.iotdb.db.exception.FileNodeManagerException;
+import org.apache.iotdb.db.exception.PathErrorException;
+import org.apache.iotdb.db.exception.ProcessorException;
+import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
+import org.apache.iotdb.db.query.context.QueryContext;
+import org.apache.iotdb.db.query.executor.IEngineQueryRouter;
+import org.apache.iotdb.db.query.fill.IFill;
+import org.apache.iotdb.tsfile.exception.filter.QueryFilterOptimizationException;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.tsfile.read.common.Path;
+import org.apache.iotdb.tsfile.read.expression.IExpression;
+import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
+import org.apache.iotdb.tsfile.utils.Pair;
+
+public interface IQueryProcessExecutor {
+
+  boolean processNonQuery(PhysicalPlan plan) throws ProcessorException;
+
+  /**
+   * process query plan of qp layer, construct queryDataSet.
+   *
+   * @param queryPlan QueryPlan
+   * @return QueryDataSet
+   */
+  QueryDataSet processQuery(QueryPlan queryPlan, QueryContext context)
+      throws IOException, FileNodeManagerException, PathErrorException,
+      QueryFilterOptimizationException, ProcessorException;
+
+  /**
+   * process aggregate plan of qp layer, construct queryDataSet.
+   *
+   */
+  QueryDataSet aggregate(List<Path> paths, List<String> aggres, IExpression expression,
+      QueryContext context)
+      throws ProcessorException, IOException, PathErrorException, FileNodeManagerException, QueryFilterOptimizationException;
+
+  /**
+   * process group by plan of qp layer, construct queryDataSet.
+   */
+  QueryDataSet groupBy(List<Path> paths, List<String> aggres, IExpression expression,
+      long unit, long origin, List<Pair<Long, Long>> intervals, QueryContext context)
+      throws ProcessorException, IOException, PathErrorException, FileNodeManagerException, QueryFilterOptimizationException;
+
+  /**
+   * process fill plan of qp layer, construct queryDataSet.
+   */
+  QueryDataSet fill(List<Path> fillPaths, long queryTime, Map<TSDataType, IFill> fillTypes,
+      QueryContext context)
+      throws ProcessorException, IOException, PathErrorException, FileNodeManagerException;
+
+  /**
+   * executeWithGlobalTimeFilter update command and return whether the operator is successful.
+   *
+   * @param path : update series seriesPath
+   * @param startTime start time in update command
+   * @param endTime end time in update command
+   * @param value - in type of string
+   * @return - whether the operator is successful.
+   */
+  boolean update(Path path, long startTime, long endTime, String value)
+      throws ProcessorException;
+
+  /**
+   * executeWithGlobalTimeFilter delete command and return whether the operator is successful.
+   *
+   * @param paths : delete series paths
+   * @param deleteTime end time in delete command
+   * @return - whether the operator is successful.
+   */
+  boolean delete(List<Path> paths, long deleteTime) throws ProcessorException;
+
+  /**
+   * executeWithGlobalTimeFilter delete command and return whether the operator is successful.
+   *
+   * @param path : delete series seriesPath
+   * @param deleteTime end time in delete command
+   * @return - whether the operator is successful.
+   */
+  boolean delete(Path path, long deleteTime) throws ProcessorException;
+
+  /**
+   * insert a single value. Only used in test
+   *
+   * @param path seriesPath to be inserted
+   * @param insertTime - it's time point but not a range
+   * @param value value to be inserted
+   * @return - Operate Type.
+   */
+  int insert(Path path, long insertTime, String value) throws ProcessorException;
+
+  /**
+   * executeWithGlobalTimeFilter insert command and return whether the operator is successful.
+   *
+   * @param deviceId deviceId to be inserted
+   * @param insertTime - it's time point but not a range
+   * @param measurementList measurements to be inserted
+   * @param insertValues values to be inserted
+   * @return - Operate Type.
+   */
+  int multiInsert(String deviceId, long insertTime, List<String> measurementList,
+      List<String> insertValues) throws ProcessorException;
+
+  boolean judgePathExists(Path fullPath);
+
+  /**
+   * Get data type of series
+   */
+  TSDataType getSeriesType(Path path) throws PathErrorException;
+
+  /**
+   * Get all paths of a full path
+   */
+  List<String> getAllPaths(String originPath) throws PathErrorException;
+
+  int getFetchSize();
+
+  void setFetchSize(int fetchSize);
+
+  IEngineQueryRouter getQueryRouter();
+}
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/OverflowQPExecutor.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/OverflowQPExecutor.java
index 505bbcc..58702d8 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/OverflowQPExecutor.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/OverflowQPExecutor.java
@@ -70,7 +70,7 @@ import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class OverflowQPExecutor extends AbstractQueryProcessExecutor {
+public class OverflowQPExecutor extends QueryProcessExecutor {
 
   private static final Logger LOG = LoggerFactory.getLogger(OverflowQPExecutor.class);
 
@@ -78,7 +78,6 @@ public class OverflowQPExecutor extends AbstractQueryProcessExecutor {
   private MManager mManager = MManager.getInstance();
 
   public OverflowQPExecutor() {
-    super(new EngineQueryRouter());
     fileNodeManager = FileNodeManager.getInstance();
   }
 
@@ -186,14 +185,14 @@ public class OverflowQPExecutor extends AbstractQueryProcessExecutor {
       QueryContext context)
       throws ProcessorException, FileNodeManagerException, QueryFilterOptimizationException,
       PathErrorException, IOException {
-    return queryRouter.aggregate(paths, aggres, expression, context);
+    return getQueryRouter().aggregate(paths, aggres, expression, context);
   }
 
   @Override
   public QueryDataSet fill(List<Path> fillPaths, long queryTime, Map<TSDataType, IFill> fillTypes,
       QueryContext context)
       throws ProcessorException, IOException, PathErrorException, FileNodeManagerException {
-    return queryRouter.fill(fillPaths, queryTime, fillTypes, context);
+    return getQueryRouter().fill(fillPaths, queryTime, fillTypes, context);
   }
 
   @Override
@@ -201,7 +200,7 @@ public class OverflowQPExecutor extends AbstractQueryProcessExecutor {
       long unit, long origin, List<Pair<Long, Long>> intervals, QueryContext context)
       throws ProcessorException, FileNodeManagerException, QueryFilterOptimizationException,
       PathErrorException, IOException {
-    return queryRouter.groupBy(paths, aggres, expression, unit, origin, intervals, context);
+    return getQueryRouter().groupBy(paths, aggres, expression, unit, origin, intervals, context);
   }
 
   @Override
@@ -228,7 +227,7 @@ public class OverflowQPExecutor extends AbstractQueryProcessExecutor {
   }
 
   @Override
-  protected boolean delete(Path path, long timestamp) throws ProcessorException {
+  public boolean delete(Path path, long timestamp) throws ProcessorException {
     String deviceId = path.getDevice();
     String measurementId = path.getMeasurement();
     try {
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/AbstractQueryProcessExecutor.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/QueryProcessExecutor.java
similarity index 53%
rename from iotdb/src/main/java/org/apache/iotdb/db/qp/executor/AbstractQueryProcessExecutor.java
rename to iotdb/src/main/java/org/apache/iotdb/db/qp/executor/QueryProcessExecutor.java
index 2e0317e..54c750b 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/AbstractQueryProcessExecutor.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/QueryProcessExecutor.java
@@ -22,7 +22,6 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
 import java.util.Set;
 import org.apache.iotdb.db.exception.FileNodeManagerException;
 import org.apache.iotdb.db.exception.PathErrorException;
@@ -34,30 +33,19 @@ import org.apache.iotdb.db.qp.physical.crud.FillQueryPlan;
 import org.apache.iotdb.db.qp.physical.crud.GroupByPlan;
 import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
 import org.apache.iotdb.db.query.context.QueryContext;
+import org.apache.iotdb.db.query.executor.EngineQueryRouter;
 import org.apache.iotdb.db.query.executor.IEngineQueryRouter;
-import org.apache.iotdb.db.query.fill.IFill;
 import org.apache.iotdb.tsfile.exception.filter.QueryFilterOptimizationException;
-import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.Path;
-import org.apache.iotdb.tsfile.read.expression.IExpression;
 import org.apache.iotdb.tsfile.read.expression.QueryExpression;
 import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
-import org.apache.iotdb.tsfile.utils.Pair;
 
-public abstract class AbstractQueryProcessExecutor {
+public abstract class QueryProcessExecutor implements IQueryProcessExecutor {
 
   protected ThreadLocal<Integer> fetchSize = new ThreadLocal<>();
-  protected IEngineQueryRouter queryRouter;
+  private IEngineQueryRouter queryRouter = new EngineQueryRouter();
 
-  public AbstractQueryProcessExecutor(IEngineQueryRouter queryRouter) {
-    this.queryRouter = queryRouter;
-  }
-
-  /**
-   * process query plan of qp layer, construct queryDataSet.
-   * @param queryPlan QueryPlan
-   * @return QueryDataSet
-   */
+  @Override
   public QueryDataSet processQuery(QueryPlan queryPlan, QueryContext context)
       throws IOException, FileNodeManagerException, PathErrorException,
       QueryFilterOptimizationException, ProcessorException {
@@ -81,17 +69,10 @@ public abstract class AbstractQueryProcessExecutor {
       return fill(queryPlan.getPaths(), fillQueryPlan.getQueryTime(),
           fillQueryPlan.getFillType(), context);
     }
-    return queryRouter.query(queryExpression, context);
-  }
-
-  public abstract TSDataType getSeriesType(Path fullPath) throws PathErrorException;
-
-  public abstract boolean judgePathExists(Path fullPath);
-
-  public boolean processNonQuery(PhysicalPlan plan) throws ProcessorException {
-    throw new UnsupportedOperationException();
+    return getQueryRouter().query(queryExpression, context);
   }
 
+  @Override
   public int getFetchSize() {
     if (fetchSize.get() == null) {
       return 100;
@@ -99,42 +80,17 @@ public abstract class AbstractQueryProcessExecutor {
     return fetchSize.get();
   }
 
+  @Override
   public void setFetchSize(int fetchSize) {
     this.fetchSize.set(fetchSize);
   }
 
-  public abstract QueryDataSet aggregate(List<Path> paths, List<String> aggres,
-      IExpression expression, QueryContext context) throws ProcessorException, IOException,
-      PathErrorException, FileNodeManagerException, QueryFilterOptimizationException;
-
-  public abstract QueryDataSet groupBy(List<Path> paths, List<String> aggres,
-      IExpression expression, long unit, long origin, List<Pair<Long, Long>> intervals,
-      QueryContext context) throws ProcessorException, IOException, PathErrorException,
-      FileNodeManagerException, QueryFilterOptimizationException;
-
-  public abstract QueryDataSet fill(List<Path> fillPaths, long queryTime, Map<TSDataType,
-      IFill> fillTypes, QueryContext context)
-      throws ProcessorException, IOException, PathErrorException, FileNodeManagerException;
-
-  /**
-   * executeWithGlobalTimeFilter update command and return whether the operator is successful.
-   *
-   * @param path : update series seriesPath
-   * @param startTime start time in update command
-   * @param endTime end time in update command
-   * @param value - in type of string
-   * @return - whether the operator is successful.
-   */
-  public abstract boolean update(Path path, long startTime, long endTime, String value)
-      throws ProcessorException;
+  @Override
+  public IEngineQueryRouter getQueryRouter() {
+    return queryRouter;
+  }
 
-  /**
-   * executeWithGlobalTimeFilter delete command and return whether the operator is successful.
-   *
-   * @param paths : delete series paths
-   * @param deleteTime end time in delete command
-   * @return - whether the operator is successful.
-   */
+  @Override
   public boolean delete(List<Path> paths, long deleteTime) throws ProcessorException {
     try {
       boolean result = true;
@@ -162,39 +118,4 @@ public abstract class AbstractQueryProcessExecutor {
       throw new ProcessorException(e.getMessage());
     }
   }
-
-  /**
-   * executeWithGlobalTimeFilter delete command and return whether the operator is successful.
-   *
-   * @param path : delete series seriesPath
-   * @param deleteTime end time in delete command
-   * @return - whether the operator is successful.
-   */
-  protected abstract boolean delete(Path path, long deleteTime) throws ProcessorException;
-
-  /**
-   * insert a single value. Only used in test
-   *
-   * @param path seriesPath to be inserted
-   * @param insertTime - it's time point but not a range
-   * @param value value to be inserted
-   * @return - Operate Type.
-   */
-  public abstract int insert(Path path, long insertTime, String value) throws ProcessorException;
-
-  /**
-   * executeWithGlobalTimeFilter insert command and return whether the operator is successful.
-   *
-   * @param deviceId deviceId to be inserted
-   * @param insertTime - it's time point but not a range
-   * @param measurementList measurements to be inserted
-   * @param insertValues values to be inserted
-   * @return - Operate Type.
-   */
-  public abstract int multiInsert(String deviceId, long insertTime, List<String> measurementList,
-      List<String> insertValues) throws ProcessorException;
-
-  public abstract List<String> getAllPaths(String originPath)
-      throws PathErrorException, ProcessorException, InterruptedException;
-
 }
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/logical/crud/BasicFunctionOperator.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/logical/crud/BasicFunctionOperator.java
index a909db6..1610554 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/logical/crud/BasicFunctionOperator.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/logical/crud/BasicFunctionOperator.java
@@ -21,7 +21,8 @@ package org.apache.iotdb.db.qp.logical.crud;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.exception.qp.LogicalOperatorException;
 import org.apache.iotdb.db.qp.constant.SQLConstant;
-import org.apache.iotdb.db.qp.executor.AbstractQueryProcessExecutor;
+import org.apache.iotdb.db.qp.executor.IQueryProcessExecutor;
+import org.apache.iotdb.db.qp.executor.QueryProcessExecutor;
 import org.apache.iotdb.db.qp.logical.Operator;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.Path;
@@ -97,7 +98,7 @@ public class BasicFunctionOperator extends FunctionOperator {
 
   @Override
   protected Pair<IUnaryExpression, String> transformToSingleQueryFilter(
-      AbstractQueryProcessExecutor executor)
+      IQueryProcessExecutor executor)
       throws LogicalOperatorException, PathErrorException {
     TSDataType type = executor.getSeriesType(path);
     if (type == null) {
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/logical/crud/FilterOperator.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/logical/crud/FilterOperator.java
index 3956c57..1f38654 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/logical/crud/FilterOperator.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/logical/crud/FilterOperator.java
@@ -26,7 +26,8 @@ import java.util.List;
 import org.apache.iotdb.db.exception.qp.LogicalOperatorException;
 import org.apache.iotdb.db.exception.qp.QueryProcessorException;
 import org.apache.iotdb.db.qp.constant.SQLConstant;
-import org.apache.iotdb.db.qp.executor.AbstractQueryProcessExecutor;
+import org.apache.iotdb.db.qp.executor.IQueryProcessExecutor;
+import org.apache.iotdb.db.qp.executor.QueryProcessExecutor;
 import org.apache.iotdb.db.qp.logical.Operator;
 import org.apache.iotdb.tsfile.read.common.Path;
 import org.apache.iotdb.tsfile.read.expression.IExpression;
@@ -111,7 +112,7 @@ public class FilterOperator extends Operator implements Comparable<FilterOperato
    *
    * @return QueryFilter in TsFile
    */
-  public IExpression transformToExpression(AbstractQueryProcessExecutor executor)
+  public IExpression transformToExpression(IQueryProcessExecutor executor)
       throws QueryProcessorException {
     if (isSingle) {
       Pair<IUnaryExpression, String> ret = transformToSingleQueryFilter(executor);
@@ -149,7 +150,7 @@ public class FilterOperator extends Operator implements Comparable<FilterOperato
    * @throws QueryProcessorException exception in filter transforming
    */
   protected Pair<IUnaryExpression, String> transformToSingleQueryFilter(
-      AbstractQueryProcessExecutor executor)
+      IQueryProcessExecutor executor)
       throws QueryProcessorException {
     if (childOperators.isEmpty()) {
       throw new LogicalOperatorException(
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/QueryPlan.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/QueryPlan.java
index 5a747fa..1a4377c 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/QueryPlan.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/QueryPlan.java
@@ -20,7 +20,7 @@ package org.apache.iotdb.db.qp.physical.crud;
 
 import java.util.List;
 import org.apache.iotdb.db.exception.qp.QueryProcessorException;
-import org.apache.iotdb.db.qp.executor.AbstractQueryProcessExecutor;
+import org.apache.iotdb.db.qp.executor.IQueryProcessExecutor;
 import org.apache.iotdb.db.qp.logical.Operator;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 import org.apache.iotdb.tsfile.read.common.Path;
@@ -43,7 +43,7 @@ public class QueryPlan extends PhysicalPlan {
   /**
    * Check if all paths exist.
    */
-  public void checkPaths(AbstractQueryProcessExecutor executor) throws QueryProcessorException {
+  public void checkPaths(IQueryProcessExecutor executor) throws QueryProcessorException {
     for (Path path : paths) {
       if (!executor.judgePathExists(path)) {
         throw new QueryProcessorException("Path doesn't exist: " + path);
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
index c0cb8bb..ff13a2c 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
@@ -24,7 +24,7 @@ import org.apache.iotdb.db.auth.AuthException;
 import org.apache.iotdb.db.exception.ProcessorException;
 import org.apache.iotdb.db.exception.qp.LogicalOperatorException;
 import org.apache.iotdb.db.exception.qp.QueryProcessorException;
-import org.apache.iotdb.db.qp.executor.AbstractQueryProcessExecutor;
+import org.apache.iotdb.db.qp.executor.IQueryProcessExecutor;
 import org.apache.iotdb.db.qp.logical.Operator;
 import org.apache.iotdb.db.qp.logical.crud.BasicFunctionOperator;
 import org.apache.iotdb.db.qp.logical.crud.DeleteOperator;
@@ -57,9 +57,9 @@ import org.slf4j.LoggerFactory;
 public class PhysicalGenerator {
 
   private static final Logger logger = LoggerFactory.getLogger(PhysicalGenerator.class);
-  private AbstractQueryProcessExecutor executor;
+  private IQueryProcessExecutor executor;
 
-  public PhysicalGenerator(AbstractQueryProcessExecutor executor) {
+  public PhysicalGenerator(IQueryProcessExecutor executor) {
     this.executor = executor;
   }
 
@@ -278,7 +278,7 @@ public class PhysicalGenerator {
   }
 
   // private SingleQueryPlan constructSelectPlan(FilterOperator filterOperator, List<Path> paths,
-  // AbstractQueryProcessExecutor conf) throws QueryProcessorException {
+  // QueryProcessExecutor conf) throws QueryProcessorException {
   // FilterOperator timeFilter = null;
   // FilterOperator freqFilter = null;
   // FilterOperator valueFilter = null;
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/strategy/optimizer/ConcatPathOptimizer.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/strategy/optimizer/ConcatPathOptimizer.java
index cdc1ca3..358d20f 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/strategy/optimizer/ConcatPathOptimizer.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/strategy/optimizer/ConcatPathOptimizer.java
@@ -26,7 +26,8 @@ import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.exception.qp.LogicalOperatorException;
 import org.apache.iotdb.db.exception.qp.LogicalOptimizeException;
 import org.apache.iotdb.db.qp.constant.SQLConstant;
-import org.apache.iotdb.db.qp.executor.AbstractQueryProcessExecutor;
+import org.apache.iotdb.db.qp.executor.IQueryProcessExecutor;
+import org.apache.iotdb.db.qp.executor.QueryProcessExecutor;
 import org.apache.iotdb.db.qp.logical.Operator;
 import org.apache.iotdb.db.qp.logical.crud.BasicFunctionOperator;
 import org.apache.iotdb.db.qp.logical.crud.FilterOperator;
@@ -46,9 +47,9 @@ public class ConcatPathOptimizer implements ILogicalOptimizer {
   private static final Logger LOG = LoggerFactory.getLogger(ConcatPathOptimizer.class);
   private static final String WARNING_NO_SUFFIX_PATHS = "given SFWOperator doesn't have suffix paths, cannot concat seriesPath";
 
-  private AbstractQueryProcessExecutor executor;
+  private IQueryProcessExecutor executor;
 
-  public ConcatPathOptimizer(AbstractQueryProcessExecutor executor) {
+  public ConcatPathOptimizer(IQueryProcessExecutor executor) {
     this.executor = executor;
   }
 
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java b/iotdb/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
index bbe67a0..186c9d6 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
@@ -103,7 +103,7 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
   // Record the username for every rpc connection. Username.get() is null if
   // login is failed.
   protected ThreadLocal<String> username = new ThreadLocal<>();
-  private ThreadLocal<HashMap<String, PhysicalPlan>> queryStatus = new ThreadLocal<>();
+  protected ThreadLocal<HashMap<String, PhysicalPlan>> queryStatus = new ThreadLocal<>();
   protected ThreadLocal<HashMap<String, QueryDataSet>> queryRet = new ThreadLocal<>();
   protected ThreadLocal<ZoneId> zoneIds = new ThreadLocal<>();
   private IoTDBConfig config = IoTDBDescriptor.getInstance().getConfig();
@@ -208,6 +208,7 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
       for (QueryContext context : contextMap.values()) {
         QueryResourceManager.getInstance().endQueryForGivenJob(context.getJobId());
       }
+      contextMapLocal.set(new HashMap<>());
     } else {
       QueryResourceManager.getInstance()
           .endQueryForGivenJob(contextMap.remove(req.queryId).getJobId());
@@ -698,12 +699,9 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
     processor.getExecutor().setFetchSize(fetchSize);
 
     QueryContext context = new QueryContext(QueryResourceManager.getInstance().assignJobId());
-    Map<Long, QueryContext> contextMap = contextMapLocal.get();
-    if (contextMap == null) {
-      contextMap = new HashMap<>();
-      contextMapLocal.set(contextMap);
-    }
-    contextMap.put(req.queryId, context);
+
+    initContextMap();
+    contextMapLocal.get().put(req.queryId, context);
 
     QueryDataSet queryDataSet = processor.getExecutor().processQuery((QueryPlan) physicalPlan,
         context);
@@ -711,6 +709,14 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
     return queryDataSet;
   }
 
+  public void initContextMap(){
+    Map<Long, QueryContext> contextMap = contextMapLocal.get();
+    if (contextMap == null) {
+      contextMap = new HashMap<>();
+      contextMapLocal.set(contextMap);
+    }
+  }
+
   @Override
   public TSExecuteStatementResp executeUpdateStatement(TSExecuteStatementReq req)
       throws TException {
diff --git a/iotdb/src/test/java/org/apache/iotdb/db/qp/utils/MemIntQpExecutor.java b/iotdb/src/test/java/org/apache/iotdb/db/qp/utils/MemIntQpExecutor.java
index a8ace20..fa7301d 100644
--- a/iotdb/src/test/java/org/apache/iotdb/db/qp/utils/MemIntQpExecutor.java
+++ b/iotdb/src/test/java/org/apache/iotdb/db/qp/utils/MemIntQpExecutor.java
@@ -31,7 +31,7 @@ import org.apache.iotdb.db.exception.FileNodeManagerException;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.exception.ProcessorException;
 import org.apache.iotdb.db.qp.constant.SQLConstant;
-import org.apache.iotdb.db.qp.executor.AbstractQueryProcessExecutor;
+import org.apache.iotdb.db.qp.executor.QueryProcessExecutor;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 import org.apache.iotdb.db.qp.physical.crud.DeletePlan;
 import org.apache.iotdb.db.qp.physical.crud.InsertPlan;
@@ -51,7 +51,7 @@ import org.slf4j.LoggerFactory;
 /**
  * Implement a simple executor with a memory demo reading processor for test.
  */
-public class MemIntQpExecutor extends AbstractQueryProcessExecutor {
+public class MemIntQpExecutor extends QueryProcessExecutor {
 
   private static Logger LOG = LoggerFactory.getLogger(MemIntQpExecutor.class);
 
@@ -62,7 +62,6 @@ public class MemIntQpExecutor extends AbstractQueryProcessExecutor {
   private Map<String, List<String>> fakeAllPaths;
 
   public MemIntQpExecutor() {
-    super(new EngineQueryRouter());
     this.fetchSize.set(5);
   }
 
@@ -163,7 +162,7 @@ public class MemIntQpExecutor extends AbstractQueryProcessExecutor {
   }
 
   @Override
-  protected boolean delete(Path path, long deleteTime) {
+  public boolean delete(Path path, long deleteTime) {
     if (!demoMemDataBase.containsKey(path.toString())) {
       return true;
     }
diff --git a/iotdb/src/test/java/org/apache/iotdb/db/query/dataset/EngineDataSetWithTimeGeneratorTest.java b/iotdb/src/test/java/org/apache/iotdb/db/query/dataset/EngineDataSetWithTimeGeneratorTest.java
index 04b31e0..b53e4d8 100644
--- a/iotdb/src/test/java/org/apache/iotdb/db/query/dataset/EngineDataSetWithTimeGeneratorTest.java
+++ b/iotdb/src/test/java/org/apache/iotdb/db/query/dataset/EngineDataSetWithTimeGeneratorTest.java
@@ -24,7 +24,7 @@ import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
 import org.apache.iotdb.db.qp.QueryProcessor;
-import org.apache.iotdb.db.qp.executor.AbstractQueryProcessExecutor;
+import org.apache.iotdb.db.qp.executor.QueryProcessExecutor;
 import org.apache.iotdb.db.qp.executor.OverflowQPExecutor;
 import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
@@ -35,7 +35,7 @@ import org.junit.Test;
 
 public class EngineDataSetWithTimeGeneratorTest {
 
-  private AbstractQueryProcessExecutor queryExecutor = new OverflowQPExecutor();
+  private QueryProcessExecutor queryExecutor = new OverflowQPExecutor();
   private QueryProcessor processor = new QueryProcessor(queryExecutor);
   private String[] sqls = {
       "SET STORAGE GROUP TO root.vehicle",


[incubator-iotdb] 05/19: reorganize package

Posted by lt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

lta pushed a commit to branch cluster_read
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git

commit 1229ce63d935331aad03bb7a9f827ffa2ba2a9c4
Author: lta <li...@163.com>
AuthorDate: Sun Apr 14 23:27:19 2019 +0800

    reorganize package
---
 .../java/org/apache/iotdb/cluster/config/ClusterDescriptor.java  | 2 +-
 .../iotdb/cluster/qp/{ => executor}/ClusterQPExecutor.java       | 6 +++---
 .../org/apache/iotdb/cluster/qp/executor/NonQueryExecutor.java   | 9 ++++-----
 .../apache/iotdb/cluster/qp/executor/QueryMetadataExecutor.java  | 4 +---
 .../apache/iotdb/cluster/qp/{callback => task}/BatchQPTask.java  | 4 ++--
 .../apache/iotdb/cluster/qp/{callback => task}/MultiQPTask.java  | 2 +-
 .../org/apache/iotdb/cluster/qp/{callback => task}/QPTask.java   | 2 +-
 .../apache/iotdb/cluster/qp/{callback => task}/SingleQPTask.java | 2 +-
 .../java/org/apache/iotdb/cluster/rpc/raft/NodeAsClient.java     | 2 +-
 .../iotdb/cluster/rpc/raft/impl/RaftNodeAsClientManager.java     | 4 ++--
 .../iotdb/cluster/{rpc => }/service/TSServiceClusterImpl.java    | 2 +-
 .../src/main/java/org/apache/iotdb/cluster/utils/RaftUtils.java  | 4 ++--
 .../java/org/apache/iotdb/cluster/qp/ClusterQPExecutorTest.java  | 2 +-
 .../test/java/org/apache/iotdb/cluster/utils/RaftUtilsTest.java  | 4 ++--
 14 files changed, 23 insertions(+), 26 deletions(-)

diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/config/ClusterDescriptor.java b/cluster/src/main/java/org/apache/iotdb/cluster/config/ClusterDescriptor.java
index 2eb4a6a..d8fe72f 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/config/ClusterDescriptor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/config/ClusterDescriptor.java
@@ -24,7 +24,7 @@ import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Properties;
-import org.apache.iotdb.cluster.rpc.service.TSServiceClusterImpl;
+import org.apache.iotdb.cluster.service.TSServiceClusterImpl;
 import org.apache.iotdb.db.conf.IoTDBConfig;
 import org.apache.iotdb.db.conf.IoTDBConstant;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/qp/ClusterQPExecutor.java b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/ClusterQPExecutor.java
similarity index 98%
rename from cluster/src/main/java/org/apache/iotdb/cluster/qp/ClusterQPExecutor.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/ClusterQPExecutor.java
index 419d95c..dfc5d77 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/qp/ClusterQPExecutor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/ClusterQPExecutor.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.qp;
+package org.apache.iotdb.cluster.qp.executor;
 
 import com.alipay.sofa.jraft.entity.PeerId;
 import java.util.HashMap;
@@ -24,8 +24,8 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import org.apache.iotdb.cluster.qp.callback.QPTask;
-import org.apache.iotdb.cluster.qp.callback.QPTask.TaskState;
+import org.apache.iotdb.cluster.qp.task.QPTask;
+import org.apache.iotdb.cluster.qp.task.QPTask.TaskState;
 import org.apache.iotdb.cluster.config.ClusterConfig;
 import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.config.ClusterDescriptor;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/NonQueryExecutor.java b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/NonQueryExecutor.java
index cbd1b65..a7d774c 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/NonQueryExecutor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/NonQueryExecutor.java
@@ -29,22 +29,21 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import org.apache.iotdb.cluster.qp.callback.BatchQPTask;
-import org.apache.iotdb.cluster.qp.callback.QPTask;
-import org.apache.iotdb.cluster.qp.callback.SingleQPTask;
+import org.apache.iotdb.cluster.qp.task.BatchQPTask;
+import org.apache.iotdb.cluster.qp.task.QPTask;
+import org.apache.iotdb.cluster.qp.task.SingleQPTask;
 import org.apache.iotdb.cluster.config.ClusterConfig;
 import org.apache.iotdb.cluster.entity.raft.DataPartitionRaftHolder;
 import org.apache.iotdb.cluster.entity.raft.MetadataRaftHolder;
 import org.apache.iotdb.cluster.entity.raft.RaftService;
 import org.apache.iotdb.cluster.exception.RaftConnectionException;
-import org.apache.iotdb.cluster.qp.ClusterQPExecutor;
 import org.apache.iotdb.cluster.rpc.raft.request.BasicRequest;
 import org.apache.iotdb.cluster.rpc.raft.request.DataGroupNonQueryRequest;
 import org.apache.iotdb.cluster.rpc.raft.request.MetaGroupNonQueryRequest;
 import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
 import org.apache.iotdb.cluster.rpc.raft.response.DataGroupNonQueryResponse;
 import org.apache.iotdb.cluster.rpc.raft.response.MetaGroupNonQueryResponse;
-import org.apache.iotdb.cluster.rpc.service.TSServiceClusterImpl.BatchResult;
+import org.apache.iotdb.cluster.service.TSServiceClusterImpl.BatchResult;
 import org.apache.iotdb.cluster.utils.RaftUtils;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.exception.ProcessorException;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/QueryMetadataExecutor.java b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/QueryMetadataExecutor.java
index 1dfbc7e..fc7672b 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/QueryMetadataExecutor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/QueryMetadataExecutor.java
@@ -26,14 +26,12 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import org.apache.iotdb.cluster.qp.callback.SingleQPTask;
+import org.apache.iotdb.cluster.qp.task.SingleQPTask;
 import org.apache.iotdb.cluster.config.ClusterConfig;
 import org.apache.iotdb.cluster.config.ClusterConstant;
-import org.apache.iotdb.cluster.entity.raft.DataPartitionRaftHolder;
 import org.apache.iotdb.cluster.entity.raft.MetadataRaftHolder;
 import org.apache.iotdb.cluster.entity.raft.RaftService;
 import org.apache.iotdb.cluster.exception.RaftConnectionException;
-import org.apache.iotdb.cluster.qp.ClusterQPExecutor;
 import org.apache.iotdb.cluster.rpc.raft.request.QueryMetadataInStringRequest;
 import org.apache.iotdb.cluster.rpc.raft.request.QueryMetadataRequest;
 import org.apache.iotdb.cluster.rpc.raft.request.QueryPathsRequest;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/qp/callback/BatchQPTask.java b/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/BatchQPTask.java
similarity index 97%
rename from cluster/src/main/java/org/apache/iotdb/cluster/qp/callback/BatchQPTask.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/qp/task/BatchQPTask.java
index 1645056..8f7e092 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/qp/callback/BatchQPTask.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/BatchQPTask.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.qp.callback;
+package org.apache.iotdb.cluster.qp.task;
 
 import com.alipay.sofa.jraft.entity.PeerId;
 import java.sql.Statement;
@@ -29,7 +29,7 @@ import org.apache.iotdb.cluster.exception.RaftConnectionException;
 import org.apache.iotdb.cluster.qp.executor.NonQueryExecutor;
 import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
 import org.apache.iotdb.cluster.rpc.raft.response.DataGroupNonQueryResponse;
-import org.apache.iotdb.cluster.rpc.service.TSServiceClusterImpl.BatchResult;
+import org.apache.iotdb.cluster.service.TSServiceClusterImpl.BatchResult;
 import org.apache.iotdb.cluster.utils.RaftUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/qp/callback/MultiQPTask.java b/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/MultiQPTask.java
similarity index 96%
rename from cluster/src/main/java/org/apache/iotdb/cluster/qp/callback/MultiQPTask.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/qp/task/MultiQPTask.java
index de2bd7a..85d6291 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/qp/callback/MultiQPTask.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/MultiQPTask.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.qp.callback;
+package org.apache.iotdb.cluster.qp.task;
 
 import java.util.Map;
 
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/qp/callback/QPTask.java b/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/QPTask.java
similarity index 98%
rename from cluster/src/main/java/org/apache/iotdb/cluster/qp/callback/QPTask.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/qp/task/QPTask.java
index fd21f3f..96a517a 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/qp/callback/QPTask.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/QPTask.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.qp.callback;
+package org.apache.iotdb.cluster.qp.task;
 
 import java.util.concurrent.CountDownLatch;
 import org.apache.iotdb.cluster.entity.Server;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/qp/callback/SingleQPTask.java b/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/SingleQPTask.java
similarity index 97%
rename from cluster/src/main/java/org/apache/iotdb/cluster/qp/callback/SingleQPTask.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/qp/task/SingleQPTask.java
index 7fc7ba2..7896ca3 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/qp/callback/SingleQPTask.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/SingleQPTask.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.qp.callback;
+package org.apache.iotdb.cluster.qp.task;
 
 import org.apache.iotdb.cluster.rpc.raft.request.BasicRequest;
 import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/NodeAsClient.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/NodeAsClient.java
index ca5d238..a07c43f 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/NodeAsClient.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/NodeAsClient.java
@@ -19,7 +19,7 @@
 package org.apache.iotdb.cluster.rpc.raft;
 
 import com.alipay.sofa.jraft.entity.PeerId;
-import org.apache.iotdb.cluster.qp.callback.QPTask;
+import org.apache.iotdb.cluster.qp.task.QPTask;
 import org.apache.iotdb.cluster.exception.RaftConnectionException;
 import org.apache.iotdb.cluster.rpc.raft.request.BasicRequest;
 
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/impl/RaftNodeAsClientManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/impl/RaftNodeAsClientManager.java
index 6ea12e4..580296b 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/impl/RaftNodeAsClientManager.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/impl/RaftNodeAsClientManager.java
@@ -26,8 +26,8 @@ import com.alipay.sofa.jraft.rpc.impl.cli.BoltCliClientService;
 import java.util.concurrent.Executor;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.locks.ReentrantLock;
-import org.apache.iotdb.cluster.qp.callback.QPTask;
-import org.apache.iotdb.cluster.qp.callback.QPTask.TaskState;
+import org.apache.iotdb.cluster.qp.task.QPTask;
+import org.apache.iotdb.cluster.qp.task.QPTask.TaskState;
 import org.apache.iotdb.cluster.config.ClusterConfig;
 import org.apache.iotdb.cluster.config.ClusterDescriptor;
 import org.apache.iotdb.cluster.exception.RaftConnectionException;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/service/TSServiceClusterImpl.java b/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java
similarity index 99%
rename from cluster/src/main/java/org/apache/iotdb/cluster/rpc/service/TSServiceClusterImpl.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java
index 33e3e81..f9c8c13 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/service/TSServiceClusterImpl.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.rpc.service;
+package org.apache.iotdb.cluster.service;
 
 import com.alipay.sofa.jraft.util.OnlyForTest;
 import java.io.IOException;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/utils/RaftUtils.java b/cluster/src/main/java/org/apache/iotdb/cluster/utils/RaftUtils.java
index b960b9d..380336d 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/utils/RaftUtils.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/utils/RaftUtils.java
@@ -33,8 +33,8 @@ import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.atomic.AtomicInteger;
-import org.apache.iotdb.cluster.qp.callback.QPTask;
-import org.apache.iotdb.cluster.qp.callback.SingleQPTask;
+import org.apache.iotdb.cluster.qp.task.QPTask;
+import org.apache.iotdb.cluster.qp.task.SingleQPTask;
 import org.apache.iotdb.cluster.config.ClusterConfig;
 import org.apache.iotdb.cluster.entity.Server;
 import org.apache.iotdb.cluster.entity.raft.DataPartitionRaftHolder;
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/qp/ClusterQPExecutorTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/qp/ClusterQPExecutorTest.java
index 298dd4d..df93fcb 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/qp/ClusterQPExecutorTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/qp/ClusterQPExecutorTest.java
@@ -25,7 +25,7 @@ import static org.junit.Assert.assertTrue;
 import org.apache.iotdb.cluster.config.ClusterConfig;
 import org.apache.iotdb.cluster.config.ClusterDescriptor;
 import org.apache.iotdb.cluster.qp.executor.NonQueryExecutor;
-import org.apache.iotdb.cluster.rpc.service.TSServiceClusterImpl;
+import org.apache.iotdb.cluster.service.TSServiceClusterImpl;
 import org.apache.iotdb.cluster.utils.EnvironmentUtils;
 import org.junit.After;
 import org.junit.Before;
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/utils/RaftUtilsTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/utils/RaftUtilsTest.java
index 7205031..d35746d 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/utils/RaftUtilsTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/utils/RaftUtilsTest.java
@@ -37,8 +37,8 @@ import org.apache.iotdb.cluster.config.ClusterDescriptor;
 import org.apache.iotdb.cluster.entity.Server;
 import org.apache.iotdb.cluster.entity.raft.MetadataRaftHolder;
 import org.apache.iotdb.cluster.entity.raft.RaftService;
-import org.apache.iotdb.cluster.qp.callback.QPTask;
-import org.apache.iotdb.cluster.qp.callback.SingleQPTask;
+import org.apache.iotdb.cluster.qp.task.QPTask;
+import org.apache.iotdb.cluster.qp.task.SingleQPTask;
 import org.apache.iotdb.cluster.rpc.raft.request.BasicRequest;
 import org.apache.iotdb.cluster.rpc.raft.request.DataGroupNonQueryRequest;
 import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;


[incubator-iotdb] 13/19: merge conflicts

Posted by lt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

lta pushed a commit to branch cluster_read
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git

commit c0aea2c11275a7b3611023bef24d54c574d230b1
Merge: fda20cc e285a9d
Author: lta <li...@163.com>
AuthorDate: Mon Apr 15 22:50:57 2019 +0800

    merge conflicts

 .../ThreadName.java}                               |  23 ++--
 .../cluster/concurrent/pool/QPTaskManager.java     |  66 ++++++++++++
 .../cluster/concurrent/pool/ThreadPoolManager.java | 102 ++++++++++++++++++
 .../apache/iotdb/cluster/config/ClusterConfig.java |  58 ++++++----
 .../iotdb/cluster/config/ClusterConstant.java      |  11 +-
 .../iotdb/cluster/config/ClusterDescriptor.java    |  19 ++--
 .../org/apache/iotdb/cluster/entity/Server.java    |  12 ++-
 .../cluster/entity/raft/DataStateMachine.java      | 117 +++++++++++----------
 .../cluster/entity/raft/MetadataStateManchine.java | 108 ++++++++++---------
 .../iotdb/cluster/entity/raft/RaftService.java     |  15 ---
 .../cluster/qp/executor/AbstractQPExecutor.java    |   2 +-
 .../cluster/qp/executor/NonQueryExecutor.java      |  52 +++++----
 .../apache/iotdb/cluster/qp/task/BatchQPTask.java  |  44 ++++----
 .../apache/iotdb/cluster/qp/task/MultiQPTask.java  |  14 +--
 .../rpc/raft/impl/RaftNodeAsClientManager.java     |   2 +-
 .../org/apache/iotdb/cluster/utils/RaftUtils.java  |   7 ++
 .../cluster/concurrent/pool/QPTaskManagerTest.java |  85 +++++++++++++++
 .../cluster/config/ClusterDescriptorTest.java      |  26 +++--
 .../cluster/utils/ClusterConfigureGenerator.java   |   4 +-
 iotdb/iotdb/conf/iotdb-cluster.properties          |  26 +++--
 .../org/apache/iotdb/db/concurrent/ThreadName.java |   2 +-
 .../apache/iotdb/db/engine/pool/FlushManager.java  |   6 +-
 .../apache/iotdb/db/engine/pool/MergeManager.java  |   8 +-
 23 files changed, 570 insertions(+), 239 deletions(-)

diff --cc cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/NonQueryExecutor.java
index 071c096,c8c2a9b..f90bc66
--- a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/NonQueryExecutor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/NonQueryExecutor.java
@@@ -38,6 -34,10 +34,9 @@@ import org.apache.iotdb.cluster.entity.
  import org.apache.iotdb.cluster.entity.raft.MetadataRaftHolder;
  import org.apache.iotdb.cluster.entity.raft.RaftService;
  import org.apache.iotdb.cluster.exception.RaftConnectionException;
 -import org.apache.iotdb.cluster.qp.ClusterQPExecutor;
 -import org.apache.iotdb.cluster.qp.callback.BatchQPTask;
 -import org.apache.iotdb.cluster.qp.callback.QPTask;
 -import org.apache.iotdb.cluster.qp.callback.SingleQPTask;
++import org.apache.iotdb.cluster.qp.task.BatchQPTask;
++import org.apache.iotdb.cluster.qp.task.QPTask;
++import org.apache.iotdb.cluster.qp.task.SingleQPTask;
  import org.apache.iotdb.cluster.rpc.raft.request.BasicRequest;
  import org.apache.iotdb.cluster.rpc.raft.request.DataGroupNonQueryRequest;
  import org.apache.iotdb.cluster.rpc.raft.request.MetaGroupNonQueryRequest;
@@@ -110,6 -109,27 +108,27 @@@ public class NonQueryExecutor extends A
      /** 1. Classify physical plans by group id **/
      Map<String, List<PhysicalPlan>> physicalPlansMap = new HashMap<>();
      Map<String, List<Integer>> planIndexMap = new HashMap<>();
+     classifyPhysicalPlanByGroupId(physicalPlans, batchResult, physicalPlansMap, planIndexMap);
+ 
+     /** 2. Construct Multiple Data Group Requests **/
 -    Map<String, QPTask> subTaskMap = new HashMap<>();
++    Map<String, SingleQPTask> subTaskMap = new HashMap<>();
+     constructMultipleRequests(physicalPlansMap, planIndexMap, subTaskMap, batchResult);
+ 
+     /** 3. Execute Multiple Sub Tasks **/
+     BatchQPTask task = new BatchQPTask(subTaskMap.size(), batchResult, subTaskMap, planIndexMap);
 -    currentTask = task;
++    currentTask.set(task);
+     task.execute(this);
+     task.await();
+     batchResult.setAllSuccessful(task.isAllSuccessful());
+     batchResult.setBatchErrorMessage(task.getBatchErrorMessage());
+   }
+ 
+   /**
+    * Classify batch physical plan by groupId
+    */
+   private void classifyPhysicalPlanByGroupId(PhysicalPlan[] physicalPlans, BatchResult batchResult,
+       Map<String, List<PhysicalPlan>> physicalPlansMap, Map<String, List<Integer>> planIndexMap) {
+     int[] result = batchResult.getResult();
      for (int i = 0; i < result.length; i++) {
        /** Check if the request has failed. If it has failed, ignore it. **/
        if (result[i] != Statement.EXECUTE_FAILED) {
@@@ -139,9 -159,15 +158,15 @@@
          }
        }
      }
+   }
  
-     /** 2. Construct Multiple Data Group Requests **/
-     Map<String, SingleQPTask> subTaskMap = new HashMap<>();
+   /**
+    * Construct multiple data group requests
+    */
+   private void constructMultipleRequests(Map<String, List<PhysicalPlan>> physicalPlansMap,
 -      Map<String, List<Integer>> planIndexMap, Map<String, QPTask> subTaskMap,
++      Map<String, List<Integer>> planIndexMap, Map<String, SingleQPTask> subTaskMap,
+       BatchResult batchResult) {
+     int[] result = batchResult.getResult();
      for (Entry<String, List<PhysicalPlan>> entry : physicalPlansMap.entrySet()) {
        String groupId = entry.getKey();
        SingleQPTask singleQPTask;
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/qp/task/BatchQPTask.java
index 23b84c1,2706388..67c7362
--- a/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/BatchQPTask.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/BatchQPTask.java
@@@ -71,9 -73,9 +73,9 @@@ public class BatchQPTask extends MultiQ
    private NonQueryExecutor executor;
  
  
 -  public BatchQPTask(int taskNum, BatchResult batchResult, Map<String, QPTask> taskMap,
 +  public BatchQPTask(int taskNum, BatchResult batchResult, Map<String, SingleQPTask> taskMap,
        Map<String, List<Integer>> planIndexMap) {
-     super(false, taskNum, TaskState.INITIAL, TaskType.BATCH);
+     super(false, taskNum, TaskType.BATCH);
      this.batchResult = batchResult.getResult();
      this.isAllSuccessful = batchResult.isAllSuccessful();
      this.batchErrorMessage = batchResult.getBatchErrorMessage();
@@@ -115,19 -117,19 +117,19 @@@
    public void execute(NonQueryExecutor executor) {
      this.executor = executor;
  
 -    for (Entry<String, QPTask> entry : taskMap.entrySet()) {
 +    for (Entry<String, SingleQPTask> entry : taskMap.entrySet()) {
        String groupId = entry.getKey();
 -      QPTask subTask = entry.getValue();
 +      SingleQPTask subTask = entry.getValue();
-       Thread thread;
+       Future<?> taskThread;
        if (executor.canHandleNonQueryByGroupId(groupId)) {
-         thread = new Thread(() -> executeLocalSubTask(subTask, groupId));
-         thread.start();
+         taskThread = QPTaskManager.getInstance()
+             .submit(() -> executeLocalSubTask(subTask, groupId));
        } else {
          PeerId leader = RaftUtils.getLeaderPeerID(groupId);
-         thread = new Thread(() -> executeRpcSubTask(subTask, leader, groupId));
-         thread.start();
+         taskThread = QPTaskManager.getInstance()
+             .submit(() -> executeRpcSubTask(subTask, leader, groupId));
        }
-       taskThreadMap.put(groupId, thread);
+       taskThreadMap.put(groupId, taskThread);
      }
    }
  
@@@ -147,15 -149,15 +149,15 @@@
    /**
     * Execute RPC sub task
     */
 -  private void executeRpcSubTask(QPTask subTask, PeerId leader, String groupId) {
 +  private void executeRpcSubTask(SingleQPTask subTask, PeerId leader, String groupId) {
-       try {
-         executor.asyncHandleNonQueryTask(subTask, leader);
-         this.run(subTask.getResponse());
-       } catch (RaftConnectionException | InterruptedException e) {
-         LOGGER.error("Async handle sub task failed.");
-         this.run(DataGroupNonQueryResponse.createErrorResponse(groupId, e.getMessage()));
-       }
+     try {
+       executor.asyncHandleNonQueryTask(subTask, leader);
+       this.run(subTask.getResponse());
+     } catch (RaftConnectionException | InterruptedException e) {
+       LOGGER.error("Async handle sub task failed.");
+       this.run(DataGroupNonQueryResponse.createErrorResponse(groupId, e.getMessage()));
      }
+   }
  
    public boolean isAllSuccessful() {
      return isAllSuccessful;
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/qp/task/MultiQPTask.java
index 86e2b74,f400eaf..de23087
--- a/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/MultiQPTask.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/MultiQPTask.java
@@@ -16,35 -16,35 +16,37 @@@
   * specific language governing permissions and limitations
   * under the License.
   */
 -package org.apache.iotdb.cluster.qp.callback;
 +package org.apache.iotdb.cluster.qp.task;
  
  import java.util.Map;
+ import java.util.concurrent.Future;
  
  public abstract class MultiQPTask extends QPTask {
  
    /**
     * Each request is corresponding to a group id. String: group id
     */
 -  Map<String, QPTask> taskMap;
 +  Map<String, SingleQPTask> taskMap;
  
    /**
-    * Task thread map
+    * Each future task handle a request in taskMap, which is corresponding to a group id. String:
+    * group id
     */
-   Map<String, Thread> taskThreadMap;
+   Map<String, Future<?>> taskThreadMap;
  
-   public MultiQPTask(boolean isSyncTask, int taskNum, TaskState taskState, TaskType taskType) {
+   public MultiQPTask(boolean isSyncTask, int taskNum, TaskType taskType) {
      super(isSyncTask, taskNum, TaskState.INITIAL, taskType);
    }
  
    @Override
    public void shutdown() {
-     for (Thread taskThread : taskThreadMap.values()) {
-       if (taskThread.isAlive() && !taskThread.isInterrupted()) {
-         taskThread.interrupt();
+     for (Future<?> task : taskThreadMap.values()) {
+       if (!task.isDone()) {
+         task.cancel(true);
        }
      }
 -    this.taskCountDownLatch.countDown();
 +    while(taskCountDownLatch.getCount()!=0) {
 +      this.taskCountDownLatch.countDown();
 +    }
    }
  }


[incubator-iotdb] 02/19: Merge branch 'cluster' of github.com:apache/incubator-iotdb into cluster

Posted by lt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

lta pushed a commit to branch cluster_read
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git

commit 41143c7e5dac6e071367abe19541492a4d01e85d
Merge: 6f2b6a2 ff6f262
Author: lta <li...@163.com>
AuthorDate: Fri Apr 12 19:44:03 2019 +0800

    Merge branch 'cluster' of github.com:apache/incubator-iotdb into cluster

 .../org/apache/iotdb/cluster/entity/Server.java    |   6 +
 .../cluster/qp/executor/QueryMetadataExecutor.java | 249 ++++++++++++---------
 .../rpc/raft/impl/RaftNodeAsClientManager.java     |   8 +
 ...essor.java => QueryMetadataAsyncProcessor.java} |  45 ++--
 .../QueryMetadataInStringAsyncProcessor.java       |   5 +-
 ...rocessor.java => QueryPathsAsyncProcessor.java} |  45 ++--
 ...sor.java => QuerySeriesTypeAsyncProcessor.java} |  47 ++--
 .../processor/QueryTimeSeriesAsyncProcessor.java   |  10 +-
 .../rpc/raft/request/QueryMetadataRequest.java     |  28 +++
 .../rpc/raft/request/QueryPathsRequest.java        |  36 +++
 .../rpc/raft/request/QuerySeriesTypeRequest.java   |  35 +++
 .../rpc/raft/response/QueryMetadataResponse.java   |  47 ++++
 .../rpc/raft/response/QueryPathsResponse.java      |  50 +++++
 .../rpc/raft/response/QuerySeriesTypeResponse.java |  50 +++++
 .../cluster/rpc/service/TSServiceClusterImpl.java  |  19 ++
 .../org/apache/iotdb/db/metadata/Metadata.java     | 121 +++++++++-
 .../org/apache/iotdb/db/service/TSServiceImpl.java |  25 ++-
 .../org/apache/iotdb/db/metadata/MetadataTest.java |  93 ++++++++
 18 files changed, 745 insertions(+), 174 deletions(-)


[incubator-iotdb] 14/19: add single query manager

Posted by lt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

lta pushed a commit to branch cluster_read
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git

commit e0439b68e6801d2969a2f9e9b3969e81ecbc207a
Author: lta <li...@163.com>
AuthorDate: Tue Apr 16 11:23:05 2019 +0800

    add single query manager
---
 .../cluster/qp/executor/AbstractQPExecutor.java    | 105 +-------------
 .../cluster/qp/executor/NonQueryExecutor.java      |  17 +--
 .../cluster/qp/executor/QueryMetadataExecutor.java |  17 +--
 .../apache/iotdb/cluster/qp/task/BatchQPTask.java  |   3 +-
 ...xecutorWithTimeGenerator.java => PathType.java} |   6 +-
 .../executor/ClusterExecutorWithTimeGenerator.java |  64 +++++++++
 .../ClusterExecutorWithoutTimeGenerator.java       | 145 +++++++++++---------
 .../executor/ClusterQueryProcessExecutor.java      |   1 +
 .../executor/ClusterQueryRouter.java               |  39 +++++-
 .../ClusterRpcReaderFactory.java}                  |  12 +-
 .../manager/ClusterRpcQueryManager.java            |   4 +-
 .../manager/ClusterSingleQueryManager.java         | 152 +++++++++++++++++++--
 .../manager/IClusterSingleQueryManager.java        |   6 +-
 ...hReader.java => ClusterRpcBatchDataReader.java} |   9 +-
 ...AllDataReader.java => ClusterSeriesReader.java} |  37 ++++-
 .../cluster/service/TSServiceClusterImpl.java      |  40 +-----
 .../iotdb/cluster/utils/QPExecutorUtils.java       | 120 ++++++++++++++++
 .../org/apache/iotdb/cluster/utils/RaftUtils.java  |  25 ++++
 .../apache/iotdb/cluster/utils/hash/Router.java    |   7 +
 .../db/query/executor/IEngineQueryRouter.java      |   2 +-
 20 files changed, 564 insertions(+), 247 deletions(-)

diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/AbstractQPExecutor.java b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/AbstractQPExecutor.java
index 8f635c4..e5df083 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/AbstractQPExecutor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/AbstractQPExecutor.java
@@ -51,17 +51,8 @@ public abstract class AbstractQPExecutor {
 
   private static final ClusterConfig CLUSTER_CONFIG = ClusterDescriptor.getInstance().getConfig();
 
-  /**
-   * Raft as client manager.
-   */
-  private static final RaftNodeAsClientManager CLIENT_MANAGER = RaftNodeAsClientManager
-      .getInstance();
-
   protected Router router = Router.getInstance();
 
-  private PhysicalNode localNode = new PhysicalNode(CLUSTER_CONFIG.getIp(),
-      CLUSTER_CONFIG.getPort());
-
   protected MManager mManager = MManager.getInstance();
 
   protected final Server server = Server.getInstance();
@@ -87,84 +78,6 @@ public abstract class AbstractQPExecutor {
   private int readDataConsistencyLevel = CLUSTER_CONFIG.getReadDataConsistencyLevel();
 
   /**
-   * Get Storage Group Name by device name
-   */
-  protected String getStroageGroupByDevice(String device) throws PathErrorException {
-    String storageGroup;
-    try {
-      storageGroup = MManager.getInstance().getFileNameByPath(device);
-    } catch (PathErrorException e) {
-      throw new PathErrorException(String.format("File level of %s doesn't exist.", device));
-    }
-    return storageGroup;
-  }
-
-  /**
-   * Get all Storage Group Names by path
-   */
-  public List<String> getAllStroageGroupsByPath(String path) throws PathErrorException {
-    List<String> storageGroupList;
-    try {
-      storageGroupList = mManager.getAllFileNamesByPath(path);
-    } catch (PathErrorException e) {
-      throw new PathErrorException(String.format("File level of %s doesn't exist.", path));
-    }
-    return storageGroupList;
-  }
-
-  /**
-   * Classify the input storage group list by which data group it belongs to.
-   *
-   * @return key is groupId, value is all SGs belong to this data group
-   */
-  protected Map<String, Set<String>> classifySGByGroupId(List<String> sgList) {
-    Map<String, Set<String>> map = new HashMap<>();
-    for (int i = 0; i < sgList.size(); i++) {
-      String sg = sgList.get(i);
-      String groupId = getGroupIdBySG(sg);
-      if (map.containsKey(groupId)) {
-        map.get(groupId).add(sg);
-      } else {
-        Set<String> set = new HashSet<>();
-        set.add(sg);
-        map.put(groupId, set);
-      }
-    }
-    return map;
-  }
-
-  /**
-   * Get raft group id by storage group name
-   */
-  protected String getGroupIdBySG(String storageGroup) {
-    return router.getGroupID(router.routeGroup(storageGroup));
-  }
-
-  /**
-   * Check if the non query command can execute in local. 1. If this node belongs to the storage
-   * group 2. If this node is leader.
-   */
-  public boolean canHandleNonQueryByGroupId(String groupId) {
-    boolean canHandle = false;
-    if(groupId.equals(ClusterConfig.METADATA_GROUP_ID)){
-      canHandle = ((MetadataRaftHolder) (server.getMetadataHolder())).getFsm().isLeader();
-    }else {
-      if (router.containPhysicalNodeByGroupId(groupId, localNode) && RaftUtils
-          .getPhysicalNodeFrom(RaftUtils.getLeaderPeerID(groupId)).equals(localNode)) {
-        canHandle = true;
-      }
-    }
-    return canHandle;
-  }
-
-  /**
-   * Check if the query command can execute in local. Check if this node belongs to the group id
-   */
-  protected boolean canHandleQueryByGroupId(String groupId) {
-    return router.containPhysicalNodeByGroupId(groupId, localNode);
-  }
-
-  /**
    * Async handle QPTask by QPTask and leader id
    *
    * @param task request QPTask
@@ -185,32 +98,18 @@ public abstract class AbstractQPExecutor {
    * @param leader leader node of the group
    * @param taskRetryNum Retry time of the task
    */
-  public void asyncSendNonQuerySingleTask(SingleQPTask task, PeerId leader, int taskRetryNum)
+  protected void asyncSendNonQuerySingleTask(SingleQPTask task, PeerId leader, int taskRetryNum)
       throws RaftConnectionException {
     if (taskRetryNum >= TASK_MAX_RETRY) {
       throw new RaftConnectionException(String.format("QPTask retries reach the upper bound %s",
           TASK_MAX_RETRY));
     }
-    NodeAsClient client = getRaftNodeAsClient();
+    NodeAsClient client = RaftUtils.getRaftNodeAsClient();
     /** Call async method **/
     client.asyncHandleRequest(task.getRequest(), leader, task);
   }
 
   /**
-   * try to get raft rpc client
-   */
-  private NodeAsClient getRaftNodeAsClient() throws RaftConnectionException {
-    NodeAsClient client = CLIENT_MANAGER.getRaftNodeAsClient();
-    if (client == null) {
-      throw new RaftConnectionException(String
-          .format("Raft inner rpc clients have reached the max numbers %s",
-              CLUSTER_CONFIG.getMaxNumOfInnerRpcClient() + CLUSTER_CONFIG
-                  .getMaxQueueNumOfInnerRpcClient()));
-    }
-    return client;
-  }
-
-  /**
    * Synchronous get task response. If it's redirected or status is exception, the task needs to be
    * resent. Note: If status is Exception, it marks that an exception occurred during the task is
    * being sent instead of executed.
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/NonQueryExecutor.java b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/NonQueryExecutor.java
index f90bc66..ecafe4e 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/NonQueryExecutor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/NonQueryExecutor.java
@@ -44,6 +44,7 @@ import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
 import org.apache.iotdb.cluster.rpc.raft.response.DataGroupNonQueryResponse;
 import org.apache.iotdb.cluster.rpc.raft.response.MetaGroupNonQueryResponse;
 import org.apache.iotdb.cluster.service.TSServiceClusterImpl.BatchResult;
+import org.apache.iotdb.cluster.utils.QPExecutorUtils;
 import org.apache.iotdb.cluster.utils.RaftUtils;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.exception.ProcessorException;
@@ -196,16 +197,16 @@ public class NonQueryExecutor extends AbstractQPExecutor {
     switch (plan.getOperatorType()) {
       case DELETE:
         storageGroup = getStorageGroupFromDeletePlan((DeletePlan) plan);
-        groupId = getGroupIdBySG(storageGroup);
+        groupId = router.getGroupIdBySG(storageGroup);
         break;
       case UPDATE:
         Path path = ((UpdatePlan) plan).getPath();
-        storageGroup = getStroageGroupByDevice(path.getDevice());
-        groupId = getGroupIdBySG(storageGroup);
+        storageGroup = QPExecutorUtils.getStroageGroupByDevice(path.getDevice());
+        groupId = router.getGroupIdBySG(storageGroup);
         break;
       case INSERT:
-        storageGroup = getStroageGroupByDevice(((InsertPlan) plan).getDeviceId());
-        groupId = getGroupIdBySG(storageGroup);
+        storageGroup = QPExecutorUtils.getStroageGroupByDevice(((InsertPlan) plan).getDeviceId());
+        groupId = router.getGroupIdBySG(storageGroup);
         break;
       case CREATE_ROLE:
       case DELETE_ROLE:
@@ -284,8 +285,8 @@ public class NonQueryExecutor extends AbstractQPExecutor {
       case ADD_PATH:
       case DELETE_PATH:
         String deviceId = path.getDevice();
-        String storageGroup = getStroageGroupByDevice(deviceId);
-        groupId = getGroupIdBySG(storageGroup);
+        String storageGroup = QPExecutorUtils.getStroageGroupByDevice(deviceId);
+        groupId = router.getGroupIdBySG(storageGroup);
         break;
       case SET_FILE_LEVEL:
         boolean fileLevelExist = mManager.checkStorageLevelOfMTree(path.getFullPath());
@@ -319,7 +320,7 @@ public class NonQueryExecutor extends AbstractQPExecutor {
     currentTask.set(qpTask);
 
     /** Check if the plan can be executed locally. **/
-    if (canHandleNonQueryByGroupId(groupId)) {
+    if (QPExecutorUtils.canHandleNonQueryByGroupId(groupId)) {
       return handleNonQueryRequestLocally(groupId, qpTask);
     } else {
       PeerId leader = RaftUtils.getLeaderPeerID(groupId);
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/QueryMetadataExecutor.java b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/QueryMetadataExecutor.java
index 0702548..aea0656 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/QueryMetadataExecutor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/QueryMetadataExecutor.java
@@ -45,6 +45,7 @@ import org.apache.iotdb.cluster.rpc.raft.response.QueryPathsResponse;
 import org.apache.iotdb.cluster.rpc.raft.response.QuerySeriesTypeResponse;
 import org.apache.iotdb.cluster.rpc.raft.response.QueryStorageGroupResponse;
 import org.apache.iotdb.cluster.rpc.raft.response.QueryTimeSeriesResponse;
+import org.apache.iotdb.cluster.utils.QPExecutorUtils;
 import org.apache.iotdb.cluster.utils.RaftUtils;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.exception.ProcessorException;
@@ -81,7 +82,7 @@ public class QueryMetadataExecutor extends AbstractQPExecutor {
     if (storageGroupList.isEmpty()) {
       return new ArrayList<>();
     } else {
-      Map<String, Set<String>> groupIdSGMap = classifySGByGroupId(storageGroupList);
+      Map<String, Set<String>> groupIdSGMap = QPExecutorUtils.classifySGByGroupId(storageGroupList);
       for (Entry<String, Set<String>> entry : groupIdSGMap.entrySet()) {
         List<String> paths = getSubQueryPaths(entry.getValue(), path);
         String groupId = entry.getKey();
@@ -130,7 +131,7 @@ public class QueryMetadataExecutor extends AbstractQPExecutor {
     LOGGER.debug("Execute show timeseries {} statement for group {}.", pathList, groupId);
     PeerId holder;
     /** Check if the plan can be executed locally. **/
-    if (canHandleQueryByGroupId(groupId)) {
+    if (QPExecutorUtils.canHandleQueryByGroupId(groupId)) {
       LOGGER.debug("Execute show timeseries {} statement locally for group {} by sending request to local node.", pathList, groupId);
       holder = this.server.getServerId();
     } else {
@@ -158,7 +159,7 @@ public class QueryMetadataExecutor extends AbstractQPExecutor {
       LOGGER.debug("Execute show metadata in string statement for group {}.", groupId);
       PeerId holder;
       /** Check if the plan can be executed locally. **/
-      if (canHandleQueryByGroupId(groupId)) {
+      if (QPExecutorUtils.canHandleQueryByGroupId(groupId)) {
         LOGGER.debug("Execute show metadata in string statement locally for group {} by sending request to local node.", groupId);
         holder = this.server.getServerId();
       } else {
@@ -197,7 +198,7 @@ public class QueryMetadataExecutor extends AbstractQPExecutor {
       LOGGER.debug("Execute query metadata statement for group {}.", groupId);
       PeerId holder;
       /** Check if the plan can be executed locally. **/
-      if (canHandleQueryByGroupId(groupId)) {
+      if (QPExecutorUtils.canHandleQueryByGroupId(groupId)) {
         LOGGER.debug("Execute query metadata statement locally for group {} by sending request to local node.", groupId);
         holder = this.server.getServerId();
       } else {
@@ -232,7 +233,7 @@ public class QueryMetadataExecutor extends AbstractQPExecutor {
     if (storageGroupList.size() != 1) {
       throw new PathErrorException("path " + path + " is not valid.");
     } else {
-      String groupId = getGroupIdBySG(storageGroupList.get(0));
+      String groupId = router.getGroupIdBySG(storageGroupList.get(0));
       QuerySeriesTypeRequest request = new QuerySeriesTypeRequest(groupId,
           readMetadataConsistencyLevel, path);
       SingleQPTask task = new SingleQPTask(false, request);
@@ -240,7 +241,7 @@ public class QueryMetadataExecutor extends AbstractQPExecutor {
       LOGGER.debug("Execute get series type for {} statement for group {}.", path, groupId);
       PeerId holder;
       /** Check if the plan can be executed locally. **/
-      if (canHandleQueryByGroupId(groupId)) {
+      if (QPExecutorUtils.canHandleQueryByGroupId(groupId)) {
         LOGGER.debug("Execute get series type for {} statement locally for group {} by sending request to local node.", path, groupId);
         holder = this.server.getServerId();
       } else {
@@ -265,7 +266,7 @@ public class QueryMetadataExecutor extends AbstractQPExecutor {
     if (storageGroupList.isEmpty()) {
       return new ArrayList<>();
     } else {
-      Map<String, Set<String>> groupIdSGMap = classifySGByGroupId(storageGroupList);
+      Map<String, Set<String>> groupIdSGMap = QPExecutorUtils.classifySGByGroupId(storageGroupList);
       for (Entry<String, Set<String>> entry : groupIdSGMap.entrySet()) {
         List<String> paths = getSubQueryPaths(entry.getValue(), path);
         String groupId = entry.getKey();
@@ -289,7 +290,7 @@ public class QueryMetadataExecutor extends AbstractQPExecutor {
     LOGGER.debug("Execute get paths for {} statement for group {}.", pathList, groupId);
     PeerId holder;
     /** Check if the plan can be executed locally. **/
-    if (canHandleQueryByGroupId(groupId)) {
+    if (QPExecutorUtils.canHandleQueryByGroupId(groupId)) {
       LOGGER.debug("Execute get paths for {} statement locally for group {} by sending request to local node.", pathList, groupId);
       holder = this.server.getServerId();
     } else {
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/BatchQPTask.java b/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/BatchQPTask.java
index 67c7362..d224bae 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/BatchQPTask.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/BatchQPTask.java
@@ -32,6 +32,7 @@ import org.apache.iotdb.cluster.qp.executor.NonQueryExecutor;
 import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
 import org.apache.iotdb.cluster.rpc.raft.response.DataGroupNonQueryResponse;
 import org.apache.iotdb.cluster.service.TSServiceClusterImpl.BatchResult;
+import org.apache.iotdb.cluster.utils.QPExecutorUtils;
 import org.apache.iotdb.cluster.utils.RaftUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -121,7 +122,7 @@ public class BatchQPTask extends MultiQPTask {
       String groupId = entry.getKey();
       SingleQPTask subTask = entry.getValue();
       Future<?> taskThread;
-      if (executor.canHandleNonQueryByGroupId(groupId)) {
+      if (QPExecutorUtils.canHandleNonQueryByGroupId(groupId)) {
         taskThread = QPTaskManager.getInstance()
             .submit(() -> executeLocalSubTask(subTask, groupId));
       } else {
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithTimeGenerator.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/PathType.java
similarity index 87%
copy from cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithTimeGenerator.java
copy to cluster/src/main/java/org/apache/iotdb/cluster/query/PathType.java
index 8bbff0b..d25bb86 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithTimeGenerator.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/PathType.java
@@ -16,8 +16,8 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.query.coordinatornode.executor;
-
-public class ClusterExecutorWithTimeGenerator {
+package org.apache.iotdb.cluster.query;
 
+public enum PathType {
+  SELECT_PATH, FILTER_PATH
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithTimeGenerator.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithTimeGenerator.java
index 8bbff0b..d1ca472 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithTimeGenerator.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithTimeGenerator.java
@@ -18,6 +18,70 @@
  */
 package org.apache.iotdb.cluster.query.coordinatornode.executor;
 
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.iotdb.cluster.query.coordinatornode.manager.IClusterSingleQueryManager;
+import org.apache.iotdb.db.exception.FileNodeManagerException;
+import org.apache.iotdb.db.exception.PathErrorException;
+import org.apache.iotdb.db.metadata.MManager;
+import org.apache.iotdb.db.query.context.QueryContext;
+import org.apache.iotdb.db.query.control.QueryResourceManager;
+import org.apache.iotdb.db.query.dataset.EngineDataSetWithTimeGenerator;
+import org.apache.iotdb.db.query.factory.SeriesReaderFactory;
+import org.apache.iotdb.db.query.reader.merge.EngineReaderByTimeStamp;
+import org.apache.iotdb.db.query.timegenerator.EngineTimeGenerator;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.tsfile.read.common.Path;
+import org.apache.iotdb.tsfile.read.expression.QueryExpression;
+import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
+
 public class ClusterExecutorWithTimeGenerator {
 
+  private QueryExpression queryExpression;
+  private IClusterSingleQueryManager queryManager;
+
+  ClusterExecutorWithTimeGenerator(QueryExpression queryExpression, IClusterSingleQueryManager queryManager) {
+    this.queryExpression = queryExpression;
+    this.queryManager = queryManager;
+  }
+
+  /**
+   * execute query.
+   *
+   * @return QueryDataSet object
+   * @throws IOException IOException
+   * @throws FileNodeManagerException FileNodeManagerException
+   */
+  public QueryDataSet execute(QueryContext context) throws FileNodeManagerException {
+
+    QueryResourceManager.getInstance()
+        .beginQueryOfGivenQueryPaths(context.getJobId(), queryExpression.getSelectedSeries());
+    QueryResourceManager.getInstance()
+        .beginQueryOfGivenExpression(context.getJobId(), queryExpression.getExpression());
+
+    EngineTimeGenerator timestampGenerator;
+    List<EngineReaderByTimeStamp> readersOfSelectedSeries;
+    try {
+      timestampGenerator = new EngineTimeGenerator(queryExpression.getExpression(), context);
+      readersOfSelectedSeries = SeriesReaderFactory
+          .getByTimestampReadersOfSelectedPaths(queryExpression.getSelectedSeries(), context);
+    } catch (IOException ex) {
+      throw new FileNodeManagerException(ex);
+    }
+
+    List<TSDataType> dataTypes = new ArrayList<>();
+
+    for (Path path : queryExpression.getSelectedSeries()) {
+      try {
+        dataTypes.add(MManager.getInstance().getSeriesType(path.getFullPath()));
+      } catch (PathErrorException e) {
+        throw new FileNodeManagerException(e);
+      }
+
+    }
+    return new EngineDataSetWithTimeGenerator(queryExpression.getSelectedSeries(), dataTypes,
+        timestampGenerator,
+        readersOfSelectedSeries);
+  }
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithoutTimeGenerator.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithoutTimeGenerator.java
index 0392bce..7bd8008 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithoutTimeGenerator.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithoutTimeGenerator.java
@@ -21,6 +21,9 @@ package org.apache.iotdb.cluster.query.coordinatornode.executor;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+import org.apache.iotdb.cluster.query.coordinatornode.manager.ClusterSingleQueryManager;
+import org.apache.iotdb.cluster.query.coordinatornode.reader.ClusterSeriesReader;
 import org.apache.iotdb.db.engine.querycontext.QueryDataSource;
 import org.apache.iotdb.db.exception.FileNodeManagerException;
 import org.apache.iotdb.db.exception.PathErrorException;
@@ -42,9 +45,12 @@ import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
 
 public class ClusterExecutorWithoutTimeGenerator {
   private QueryExpression queryExpression;
+  private ClusterSingleQueryManager queryManager;
 
-  public ClusterExecutorWithoutTimeGenerator(QueryExpression queryExpression) {
+  public ClusterExecutorWithoutTimeGenerator(QueryExpression queryExpression,
+      ClusterSingleQueryManager queryManager) {
     this.queryExpression = queryExpression;
+    this.queryManager = queryManager;
   }
 
   /**
@@ -62,37 +68,37 @@ public class ClusterExecutorWithoutTimeGenerator {
         .beginQueryOfGivenQueryPaths(context.getJobId(), queryExpression.getSelectedSeries());
 
     for (Path path : queryExpression.getSelectedSeries()) {
-
-      QueryDataSource queryDataSource = QueryResourceManager.getInstance().getQueryDataSource(path,
-          context);
-
-      // add data type
-      try {
-        dataTypes.add(MManager.getInstance().getSeriesType(path.getFullPath()));
-      } catch (PathErrorException e) {
-        throw new FileNodeManagerException(e);
-      }
-
-      // sequence reader for one sealed tsfile
-      SequenceDataReader tsFilesReader;
-      try {
-        tsFilesReader = new SequenceDataReader(queryDataSource.getSeqDataSource(),
-            timeFilter, context);
-      } catch (IOException e) {
-        throw new FileNodeManagerException(e);
-      }
-
-      // unseq reader for all chunk groups in unSeqFile
-      PriorityMergeReader unSeqMergeReader;
-      try {
-        unSeqMergeReader = SeriesReaderFactory.getInstance()
-            .createUnSeqMergeReader(queryDataSource.getOverflowSeriesDataSource(), timeFilter);
-      } catch (IOException e) {
-        throw new FileNodeManagerException(e);
-      }
-
-      // merge sequence data with unsequence data.
-      readersOfSelectedSeries.add(new AllDataReader(tsFilesReader, unSeqMergeReader));
+//
+//      QueryDataSource queryDataSource = QueryResourceManager.getInstance().getQueryDataSource(path,
+//          context);
+//
+//      // add data type
+//      try {
+//        dataTypes.add(MManager.getInstance().getSeriesType(path.getFullPath()));
+//      } catch (PathErrorException e) {
+//        throw new FileNodeManagerException(e);
+//      }
+//
+//      // sequence reader for one sealed tsfile
+//      SequenceDataReader tsFilesReader;
+//      try {
+//        tsFilesReader = new SequenceDataReader(queryDataSource.getSeqDataSource(),
+//            timeFilter, context);
+//      } catch (IOException e) {
+//        throw new FileNodeManagerException(e);
+//      }
+//
+//      // unseq reader for all chunk groups in unSeqFile
+//      PriorityMergeReader unSeqMergeReader;
+//      try {
+//        unSeqMergeReader = SeriesReaderFactory.getInstance()
+//            .createUnSeqMergeReader(queryDataSource.getOverflowSeriesDataSource(), timeFilter);
+//      } catch (IOException e) {
+//        throw new FileNodeManagerException(e);
+//      }
+//
+//      // merge sequence data with unsequence data.
+//      readersOfSelectedSeries.add(new AllDataReader(tsFilesReader, unSeqMergeReader));
     }
 
     try {
@@ -112,43 +118,54 @@ public class ClusterExecutorWithoutTimeGenerator {
     List<IPointReader> readersOfSelectedSeries = new ArrayList<>();
     List<TSDataType> dataTypes = new ArrayList<>();
 
-    QueryResourceManager.getInstance()
-        .beginQueryOfGivenQueryPaths(context.getJobId(), queryExpression.getSelectedSeries());
-
+    Map<String, ClusterSeriesReader> selectPathReaders = queryManager.getSelectPathReaders();
+    List<Path> paths = new ArrayList<>();
     for (Path path : queryExpression.getSelectedSeries()) {
 
-      QueryDataSource queryDataSource = QueryResourceManager.getInstance().getQueryDataSource(path,
-          context);
-
-      // add data type
-      try {
-        dataTypes.add(MManager.getInstance().getSeriesType(path.getFullPath()));
-      } catch (PathErrorException e) {
-        throw new FileNodeManagerException(e);
+      if(selectPathReaders.containsKey(path.toString())){
+        ClusterSeriesReader reader = selectPathReaders.get(path.toString());
+        readersOfSelectedSeries.add(reader);
+        dataTypes.add(reader.getDataType());
+      } else {
+        QueryDataSource queryDataSource = QueryResourceManager.getInstance()
+            .getQueryDataSource(path,
+                context);
+
+        // add data type
+        try {
+          dataTypes.add(MManager.getInstance().getSeriesType(path.getFullPath()));
+        } catch (PathErrorException e) {
+          throw new FileNodeManagerException(e);
+        }
+
+        // sequence insert data
+        SequenceDataReader tsFilesReader;
+        try {
+          tsFilesReader = new SequenceDataReader(queryDataSource.getSeqDataSource(),
+              null, context);
+        } catch (IOException e) {
+          throw new FileNodeManagerException(e);
+        }
+
+        // unseq insert data
+        PriorityMergeReader unSeqMergeReader;
+        try {
+          unSeqMergeReader = SeriesReaderFactory.getInstance()
+              .createUnSeqMergeReader(queryDataSource.getOverflowSeriesDataSource(), null);
+        } catch (IOException e) {
+          throw new FileNodeManagerException(e);
+        }
+
+        // merge sequence data with unsequence data.
+        readersOfSelectedSeries.add(new AllDataReader(tsFilesReader, unSeqMergeReader));
+
+        paths.add(path);
       }
-
-      // sequence insert data
-      SequenceDataReader tsFilesReader;
-      try {
-        tsFilesReader = new SequenceDataReader(queryDataSource.getSeqDataSource(),
-            null, context);
-      } catch (IOException e) {
-        throw new FileNodeManagerException(e);
-      }
-
-      // unseq insert data
-      PriorityMergeReader unSeqMergeReader;
-      try {
-        unSeqMergeReader = SeriesReaderFactory.getInstance()
-            .createUnSeqMergeReader(queryDataSource.getOverflowSeriesDataSource(), null);
-      } catch (IOException e) {
-        throw new FileNodeManagerException(e);
-      }
-
-      // merge sequence data with unsequence data.
-      readersOfSelectedSeries.add(new AllDataReader(tsFilesReader, unSeqMergeReader));
     }
 
+    QueryResourceManager.getInstance()
+        .beginQueryOfGivenQueryPaths(context.getJobId(), paths);
+
     try {
       return new EngineDataSetWithoutTimeGenerator(queryExpression.getSelectedSeries(), dataTypes,
           readersOfSelectedSeries);
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterQueryProcessExecutor.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterQueryProcessExecutor.java
index 7b51a4f..e7e58f8 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterQueryProcessExecutor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterQueryProcessExecutor.java
@@ -110,6 +110,7 @@ public class ClusterQueryProcessExecutor extends QueryProcessExecutor {
     this.fetchSize.set(fetchSize);
   }
 
+  @Override
   public IEngineQueryRouter getQueryRouter() {
     return queryRouter;
   }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterQueryRouter.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterQueryRouter.java
index c0a853b..8fa1a95 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterQueryRouter.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterQueryRouter.java
@@ -21,6 +21,10 @@ package org.apache.iotdb.cluster.query.coordinatornode.executor;
 import java.io.IOException;
 import java.util.List;
 import java.util.Map;
+import org.apache.iotdb.cluster.query.coordinatornode.manager.ClusterRpcQueryManager;
+import org.apache.iotdb.cluster.query.coordinatornode.manager.ClusterSingleQueryManager;
+import org.apache.iotdb.cluster.query.coordinatornode.manager.ClusterSingleQueryManager.QueryType;
+import org.apache.iotdb.cluster.query.coordinatornode.manager.IClusterSingleQueryManager;
 import org.apache.iotdb.db.exception.FileNodeManagerException;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.exception.ProcessorException;
@@ -30,8 +34,10 @@ import org.apache.iotdb.db.query.fill.IFill;
 import org.apache.iotdb.tsfile.exception.filter.QueryFilterOptimizationException;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.Path;
+import org.apache.iotdb.tsfile.read.expression.ExpressionType;
 import org.apache.iotdb.tsfile.read.expression.IExpression;
 import org.apache.iotdb.tsfile.read.expression.QueryExpression;
+import org.apache.iotdb.tsfile.read.expression.util.ExpressionOptimizer;
 import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
 import org.apache.iotdb.tsfile.utils.Pair;
 
@@ -39,8 +45,37 @@ public class ClusterQueryRouter implements IEngineQueryRouter {
 
   @Override
   public QueryDataSet query(QueryExpression queryExpression, QueryContext context)
-      throws FileNodeManagerException {
-    return null;
+      throws FileNodeManagerException, PathErrorException {
+
+    ClusterSingleQueryManager queryManager = ClusterRpcQueryManager.getInstance()
+        .getSingleQuery(context.getJobId());
+    if (queryExpression.hasQueryFilter()) {
+      try {
+        IExpression optimizedExpression = ExpressionOptimizer.getInstance()
+            .optimize(queryExpression.getExpression(), queryExpression.getSelectedSeries());
+        queryExpression.setExpression(optimizedExpression);
+
+        if (optimizedExpression.getType() == ExpressionType.GLOBAL_TIME) {
+          queryManager.init(QueryType.GLOBAL_TIME);
+          ClusterExecutorWithoutTimeGenerator engineExecutor =
+              new ClusterExecutorWithoutTimeGenerator(queryExpression, queryManager);
+          return engineExecutor.executeWithGlobalTimeFilter(context);
+        } else {
+          queryManager.init(QueryType.FILTER);
+          ClusterExecutorWithTimeGenerator engineExecutor = new ClusterExecutorWithTimeGenerator(
+              queryExpression, queryManager);
+          return engineExecutor.execute(context);
+        }
+
+      } catch (QueryFilterOptimizationException e) {
+        throw new FileNodeManagerException(e);
+      }
+    } else {
+      queryManager.init(QueryType.NO_FILTER);
+      ClusterExecutorWithoutTimeGenerator engineExecutor =
+          new ClusterExecutorWithoutTimeGenerator(queryExpression, queryManager);
+      return engineExecutor.executeWithoutFilter(context);
+    }
   }
 
   @Override
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithTimeGenerator.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/factory/ClusterRpcReaderFactory.java
similarity index 64%
copy from cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithTimeGenerator.java
copy to cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/factory/ClusterRpcReaderFactory.java
index 8bbff0b..27444af 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithTimeGenerator.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/factory/ClusterRpcReaderFactory.java
@@ -16,8 +16,16 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.query.coordinatornode.executor;
+package org.apache.iotdb.cluster.query.coordinatornode.factory;
 
-public class ClusterExecutorWithTimeGenerator {
+import com.alipay.sofa.jraft.entity.PeerId;
+import java.util.Map;
+import org.apache.iotdb.cluster.query.coordinatornode.reader.ClusterSeriesReader;
+import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
 
+public class ClusterRpcReaderFactory {
+
+  public static Map<String, ClusterSeriesReader> createClusterSeriesReader(String groupId, PeerId peerId, QueryPlan queryPlan){
+return null;
+  }
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterRpcQueryManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterRpcQueryManager.java
index 3e9a68c..f33fe05 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterRpcQueryManager.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterRpcQueryManager.java
@@ -29,7 +29,7 @@ public class ClusterRpcQueryManager{
   /**
    * Key is group id, value is manager of a client query.
    */
-  ConcurrentHashMap<Long, IClusterSingleQueryManager> singleQueryManagerMap = new ConcurrentHashMap<>();
+  ConcurrentHashMap<Long, ClusterSingleQueryManager> singleQueryManagerMap = new ConcurrentHashMap<>();
 
   /**
    * Add a query
@@ -41,7 +41,7 @@ public class ClusterRpcQueryManager{
   /**
    * Get query manager by group id
    */
-  public IClusterSingleQueryManager getSingleQuery(long jobId) {
+  public ClusterSingleQueryManager getSingleQuery(long jobId) {
     return singleQueryManagerMap.get(jobId);
   }
 
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterSingleQueryManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterSingleQueryManager.java
index 156b9a5..90c1ac5 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterSingleQueryManager.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterSingleQueryManager.java
@@ -19,10 +19,20 @@
 package org.apache.iotdb.cluster.query.coordinatornode.manager;
 
 import com.alipay.sofa.jraft.entity.PeerId;
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
+import org.apache.iotdb.cluster.query.coordinatornode.factory.ClusterRpcReaderFactory;
+import org.apache.iotdb.cluster.query.coordinatornode.reader.ClusterSeriesReader;
+import org.apache.iotdb.cluster.utils.QPExecutorUtils;
+import org.apache.iotdb.cluster.utils.RaftUtils;
+import org.apache.iotdb.cluster.utils.hash.Router;
+import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
+import org.apache.iotdb.tsfile.read.common.Path;
 
 public class ClusterSingleQueryManager implements IClusterSingleQueryManager {
 
@@ -34,7 +44,7 @@ public class ClusterSingleQueryManager implements IClusterSingleQueryManager {
   /**
    * Origin query plan parsed by QueryProcessor
    */
-  private QueryPlan originPhysicalPlan;
+  private QueryPlan queryPlan;
 
   /**
    * Represent selected reader nodes, key is group id and value is selected peer id
@@ -42,25 +52,107 @@ public class ClusterSingleQueryManager implements IClusterSingleQueryManager {
   private Map<String, PeerId> readerNodes = new HashMap<>();
 
   /**
-   * Physical plans of select paths which are divided from originPhysicalPlan
+   * Query plans of select paths which are divided from queryPlan group by group id
    */
   private Map<String, QueryPlan> selectPathPlans = new HashMap<>();
 
+  private Map<String, ClusterSeriesReader> selectPathReaders = new HashMap<>();
+
   /**
-   * Physical plans of filter paths which are divided from originPhysicalPlan
+   * Physical plans of filter paths which are divided from queryPlan group by group id
    */
   private Map<String, QueryPlan> filterPathPlans = new HashMap<>();
 
   public ClusterSingleQueryManager(long jobId,
-      QueryPlan originPhysicalPlan) {
+      QueryPlan queryPlan) {
     this.jobId = jobId;
-    this.originPhysicalPlan = originPhysicalPlan;
+    this.queryPlan = queryPlan;
   }
 
   @Override
-  public void dividePhysicalPlan() {
-//    List<Path>
-//    MManager.getInstance().getFileNameByPath()
+  public void init(QueryType queryType) throws PathErrorException {
+    switch (queryType) {
+      case NO_FILTER:
+        divideNoFilterPhysicalPlan();
+        break;
+      case GLOBAL_TIME:
+        divideGlobalTimePhysicalPlan();
+        break;
+      case FILTER:
+        divideFilterPhysicalPlan();
+        break;
+      default:
+        throw new UnsupportedOperationException();
+    }
+    initSelectedPathPlan();
+    initFilterPathPlan();
+  }
+
+  public enum QueryType {
+    NO_FILTER, GLOBAL_TIME, FILTER
+  }
+
+  /**
+   * Divide no-fill type query plan by group id
+   */
+  private void divideNoFilterPhysicalPlan() throws PathErrorException {
+    List<Path> selectPaths = queryPlan.getPaths();
+    Map<String, List<Path>> pathsByGroupId = new HashMap<>();
+    for (Path path : selectPaths) {
+      String storageGroup = QPExecutorUtils.getStroageGroupByDevice(path.getDevice());
+      String groupId = Router.getInstance().getGroupIdBySG(storageGroup);
+      if (pathsByGroupId.containsKey(groupId)) {
+        pathsByGroupId.put(groupId, new ArrayList<>());
+      }
+      pathsByGroupId.get(groupId).add(path);
+    }
+    for (Entry<String, List<Path>> entry : pathsByGroupId.entrySet()) {
+      String groupId = entry.getKey();
+      List<Path> paths = entry.getValue();
+      QueryPlan subQueryPlan = new QueryPlan();
+      subQueryPlan.setProposer(queryPlan.getProposer());
+      subQueryPlan.setPaths(paths);
+      selectPathPlans.put(groupId, subQueryPlan);
+    }
+  }
+
+  private void divideGlobalTimePhysicalPlan() {
+
+  }
+
+  private void divideFilterPhysicalPlan() {
+
+  }
+
+  /**
+   * Init select path
+   */
+  private void initSelectedPathPlan(){
+    if(!selectPathPlans.isEmpty()){
+      for(Entry<String, QueryPlan> entry: selectPathPlans.entrySet()){
+        String groupId = entry.getKey();
+        QueryPlan queryPlan = entry.getValue();
+        if(!canHandleQueryLocally(groupId)) {
+          PeerId randomPeer = RaftUtils.getRandomPeerID(groupId);
+          readerNodes.put(groupId, randomPeer);
+          Map<String, ClusterSeriesReader> selectPathReaders = ClusterRpcReaderFactory
+              .createClusterSeriesReader(groupId, randomPeer, queryPlan);
+          for (Path path : queryPlan.getPaths()) {
+            selectPathReaders.put(path.getFullPath(), selectPathReaders.get(path.getFullPath()));
+          }
+        }
+      }
+    }
+  }
+
+  private void initFilterPathPlan(){
+    if(!filterPathPlans.isEmpty()){
+
+    }
+  }
+
+  private boolean canHandleQueryLocally(String groupId){
+    return QPExecutorUtils.canHandleQueryByGroupId(groupId);
   }
 
   @Override
@@ -96,11 +188,47 @@ public class ClusterSingleQueryManager implements IClusterSingleQueryManager {
     this.jobId = jobId;
   }
 
-  public PhysicalPlan getOriginPhysicalPlan() {
-    return originPhysicalPlan;
+  public PhysicalPlan getQueryPlan() {
+    return queryPlan;
+  }
+
+  public void setQueryPlan(QueryPlan queryPlan) {
+    this.queryPlan = queryPlan;
+  }
+
+  public Map<String, PeerId> getReaderNodes() {
+    return readerNodes;
+  }
+
+  public void setReaderNodes(
+      Map<String, PeerId> readerNodes) {
+    this.readerNodes = readerNodes;
+  }
+
+  public Map<String, QueryPlan> getSelectPathPlans() {
+    return selectPathPlans;
+  }
+
+  public void setSelectPathPlans(
+      Map<String, QueryPlan> selectPathPlans) {
+    this.selectPathPlans = selectPathPlans;
+  }
+
+  public Map<String, ClusterSeriesReader> getSelectPathReaders() {
+    return selectPathReaders;
+  }
+
+  public void setSelectPathReaders(
+      Map<String, ClusterSeriesReader> selectPathReaders) {
+    this.selectPathReaders = selectPathReaders;
+  }
+
+  public Map<String, QueryPlan> getFilterPathPlans() {
+    return filterPathPlans;
   }
 
-  public void setOriginPhysicalPlan(QueryPlan originPhysicalPlan) {
-    this.originPhysicalPlan = originPhysicalPlan;
+  public void setFilterPathPlans(
+      Map<String, QueryPlan> filterPathPlans) {
+    this.filterPathPlans = filterPathPlans;
   }
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/IClusterSingleQueryManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/IClusterSingleQueryManager.java
index c5fffbc..dc84d32 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/IClusterSingleQueryManager.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/IClusterSingleQueryManager.java
@@ -19,6 +19,8 @@
 package org.apache.iotdb.cluster.query.coordinatornode.manager;
 
 import com.alipay.sofa.jraft.entity.PeerId;
+import org.apache.iotdb.cluster.query.coordinatornode.manager.ClusterSingleQueryManager.QueryType;
+import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 
 /**
@@ -28,8 +30,10 @@ public interface IClusterSingleQueryManager {
 
   /**
    * Divide physical plan into several sub physical plans according to timeseries full path.
+   * @param queryType
    */
-  void dividePhysicalPlan();
+  void init(
+      QueryType queryType) throws PathErrorException;
 
   /**
    * Get physical plan of select path
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterRpcBatchReader.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterRpcBatchDataReader.java
similarity index 81%
rename from cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterRpcBatchReader.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterRpcBatchDataReader.java
index fc9eb8c..5b75c9d 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterRpcBatchReader.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterRpcBatchDataReader.java
@@ -19,10 +19,17 @@
 package org.apache.iotdb.cluster.query.coordinatornode.reader;
 
 import java.io.IOException;
+import org.apache.iotdb.cluster.query.PathType;
 import org.apache.iotdb.db.query.reader.IBatchReader;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.BatchData;
 
-public class ClusterRpcBatchReader implements IBatchReader {
+public class ClusterRpcBatchDataReader implements IBatchReader {
+
+  private String PeerId;
+  private String jobId;
+  private PathType type;
+  private BatchData batchData;
 
   @Override
   public boolean hasNext() throws IOException {
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterAllDataReader.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterSeriesReader.java
similarity index 60%
rename from cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterAllDataReader.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterSeriesReader.java
index 684ead0..438559e 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterAllDataReader.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterSeriesReader.java
@@ -22,10 +22,21 @@ import java.io.IOException;
 import org.apache.iotdb.db.query.reader.IBatchReader;
 import org.apache.iotdb.db.query.reader.IPointReader;
 import org.apache.iotdb.db.utils.TimeValuePair;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.tsfile.read.common.Path;
 
-public class ClusterAllDataReader implements IPointReader {
+public class ClusterSeriesReader implements IPointReader {
 
   private IBatchReader rpcBatchReader;
+  private String fullPath;
+  private TSDataType dataType;
+
+  public ClusterSeriesReader(IBatchReader rpcBatchReader, String fullPath,
+      TSDataType dataType) {
+    this.rpcBatchReader = rpcBatchReader;
+    this.fullPath = fullPath;
+    this.dataType = dataType;
+  }
 
   @Override
   public TimeValuePair current() throws IOException {
@@ -46,4 +57,28 @@ public class ClusterAllDataReader implements IPointReader {
   public void close() throws IOException {
 
   }
+
+  public IBatchReader getRpcBatchReader() {
+    return rpcBatchReader;
+  }
+
+  public void setRpcBatchReader(IBatchReader rpcBatchReader) {
+    this.rpcBatchReader = rpcBatchReader;
+  }
+
+  public String getFullPath() {
+    return fullPath;
+  }
+
+  public void setFullPath(String fullPath) {
+    this.fullPath = fullPath;
+  }
+
+  public TSDataType getDataType() {
+    return dataType;
+  }
+
+  public void setDataType(TSDataType dataType) {
+    this.dataType = dataType;
+  }
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java b/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java
index a11fae4..79b2acd 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java
@@ -38,10 +38,8 @@ import org.apache.iotdb.db.conf.IoTDBConstant;
 import org.apache.iotdb.db.exception.FileNodeManagerException;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.exception.ProcessorException;
-import org.apache.iotdb.db.metadata.MManager;
 import org.apache.iotdb.db.metadata.Metadata;
 import org.apache.iotdb.db.qp.QueryProcessor;
-import org.apache.iotdb.db.qp.executor.OverflowQPExecutor;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
 import org.apache.iotdb.db.query.context.QueryContext;
@@ -72,11 +70,6 @@ public class TSServiceClusterImpl extends TSServiceImpl {
   private NonQueryExecutor nonQueryExecutor = new NonQueryExecutor();
   private QueryMetadataExecutor queryMetadataExecutor = new QueryMetadataExecutor();
 
-  /**
-   * Key is query statement, Value is corresponding job id which is assigned in <class>QueryResourceManager</class>
-   */
-  private ThreadLocal<HashMap<String, Long>> queryJobIdMap = new ThreadLocal<>();
-
   public TSServiceClusterImpl() throws IOException {
     super();
   }
@@ -278,18 +271,6 @@ public class TSServiceClusterImpl extends TSServiceImpl {
   }
 
   @Override
-  public void recordANewQuery(String statement, PhysicalPlan physicalPlan) {
-    long jobId = QueryResourceManager.getInstance().assignJobId();
-    queryStatus.get().put(statement, physicalPlan);
-    queryJobIdMap.get().put(statement, jobId);
-    queryManager.addSingleQuery(jobId, (QueryPlan) physicalPlan);
-    // refresh current queryRet for statement
-    if (queryRet.get().containsKey(statement)) {
-      queryRet.get().remove(statement);
-    }
-  }
-
-  @Override
   public void releaseQueryResource(TSCloseOperationReq req) throws FileNodeManagerException {
     Map<Long, QueryContext> contextMap = contextMapLocal.get();
     if (contextMap == null) {
@@ -310,35 +291,18 @@ public class TSServiceClusterImpl extends TSServiceImpl {
   }
 
   @Override
-  public void clearAllStatusForCurrentRequest() {
-    if (this.queryRet.get() != null) {
-      this.queryRet.get().clear();
-    }
-
-    if (this.queryJobIdMap.get() != null) {
-      this.queryJobIdMap.get().clear();
-    }
-
-    if (this.queryStatus.get() != null) {
-      this.queryStatus.get().clear();
-    }
-  }
-
-
-  @Override
   public QueryDataSet createNewDataSet(String statement, int fetchSize, TSFetchResultsReq req)
       throws PathErrorException, QueryFilterOptimizationException, FileNodeManagerException,
       ProcessorException, IOException {
     PhysicalPlan physicalPlan = queryStatus.get().get(statement);
     processor.getExecutor().setFetchSize(fetchSize);
-    long jobId = queryJobIdMap.get().get(statement);
 
+    long jobId = QueryResourceManager.getInstance().assignJobId();
     QueryContext context = new QueryContext(jobId);
     initContextMap();
     contextMapLocal.get().put(req.queryId, context);
 
-    queryManager.getSingleQuery(jobId).dividePhysicalPlan();
-
+    queryManager.addSingleQuery(jobId, (QueryPlan) physicalPlan);
     QueryDataSet queryDataSet = processor.getExecutor().processQuery((QueryPlan) physicalPlan,
         context);
     queryRet.get().put(statement, queryDataSet);
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/utils/QPExecutorUtils.java b/cluster/src/main/java/org/apache/iotdb/cluster/utils/QPExecutorUtils.java
new file mode 100644
index 0000000..63a5be6
--- /dev/null
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/utils/QPExecutorUtils.java
@@ -0,0 +1,120 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.cluster.utils;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.apache.iotdb.cluster.config.ClusterConfig;
+import org.apache.iotdb.cluster.config.ClusterDescriptor;
+import org.apache.iotdb.cluster.entity.Server;
+import org.apache.iotdb.cluster.entity.raft.MetadataRaftHolder;
+import org.apache.iotdb.cluster.utils.hash.PhysicalNode;
+import org.apache.iotdb.cluster.utils.hash.Router;
+import org.apache.iotdb.db.exception.PathErrorException;
+import org.apache.iotdb.db.metadata.MManager;
+
+public class QPExecutorUtils {
+
+  private static final ClusterConfig CLUSTER_CONFIG = ClusterDescriptor.getInstance().getConfig();
+
+  private static final Router router = Router.getInstance();
+
+  private static final PhysicalNode localNode = new PhysicalNode(CLUSTER_CONFIG.getIp(),
+      CLUSTER_CONFIG.getPort());
+
+  private static final  MManager mManager = MManager.getInstance();
+
+  private static final Server server = Server.getInstance();
+
+
+  /**
+   * Get Storage Group Name by device name
+   */
+  public static String getStroageGroupByDevice(String device) throws PathErrorException {
+    String storageGroup;
+    try {
+      storageGroup = MManager.getInstance().getFileNameByPath(device);
+    } catch (PathErrorException e) {
+      throw new PathErrorException(String.format("File level of %s doesn't exist.", device));
+    }
+    return storageGroup;
+  }
+
+  /**
+   * Get all Storage Group Names by path
+   */
+  public static List<String> getAllStroageGroupsByPath(String path) throws PathErrorException {
+    List<String> storageGroupList;
+    try {
+      storageGroupList = mManager.getAllFileNamesByPath(path);
+    } catch (PathErrorException e) {
+      throw new PathErrorException(String.format("File level of %s doesn't exist.", path));
+    }
+    return storageGroupList;
+  }
+
+  /**
+   * Classify the input storage group list by which data group it belongs to.
+   *
+   * @return key is groupId, value is all SGs belong to this data group
+   */
+  public static Map<String, Set<String>> classifySGByGroupId(List<String> sgList) {
+    Map<String, Set<String>> map = new HashMap<>();
+    for (int i = 0; i < sgList.size(); i++) {
+      String sg = sgList.get(i);
+      String groupId = router.getGroupIdBySG(sg);
+      if (map.containsKey(groupId)) {
+        map.get(groupId).add(sg);
+      } else {
+        Set<String> set = new HashSet<>();
+        set.add(sg);
+        map.put(groupId, set);
+      }
+    }
+    return map;
+  }
+
+  /**
+   * Check if the non query command can execute in local. 1. If this node belongs to the storage
+   * group 2. If this node is leader.
+   */
+  public static boolean canHandleNonQueryByGroupId(String groupId) {
+    boolean canHandle = false;
+    if(groupId.equals(ClusterConfig.METADATA_GROUP_ID)){
+      canHandle = ((MetadataRaftHolder) (server.getMetadataHolder())).getFsm().isLeader();
+    }else {
+      if (router.containPhysicalNodeByGroupId(groupId, localNode) && RaftUtils
+          .getPhysicalNodeFrom(RaftUtils.getLeaderPeerID(groupId)).equals(localNode)) {
+        canHandle = true;
+      }
+    }
+    return canHandle;
+  }
+
+  /**
+   * Check if the query command can execute in local. Check if this node belongs to the group id
+   */
+  public static boolean canHandleQueryByGroupId(String groupId) {
+    return router.containPhysicalNodeByGroupId(groupId, localNode);
+  }
+
+}
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/utils/RaftUtils.java b/cluster/src/main/java/org/apache/iotdb/cluster/utils/RaftUtils.java
index c1a3270..5c3f3cb 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/utils/RaftUtils.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/utils/RaftUtils.java
@@ -33,6 +33,8 @@ import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.atomic.AtomicInteger;
+import org.apache.iotdb.cluster.config.ClusterDescriptor;
+import org.apache.iotdb.cluster.exception.RaftConnectionException;
 import org.apache.iotdb.cluster.qp.task.QPTask;
 import org.apache.iotdb.cluster.qp.task.SingleQPTask;
 import org.apache.iotdb.cluster.config.ClusterConfig;
@@ -40,7 +42,9 @@ import org.apache.iotdb.cluster.entity.Server;
 import org.apache.iotdb.cluster.entity.raft.DataPartitionRaftHolder;
 import org.apache.iotdb.cluster.entity.raft.MetadataRaftHolder;
 import org.apache.iotdb.cluster.entity.raft.RaftService;
+import org.apache.iotdb.cluster.rpc.raft.NodeAsClient;
 import org.apache.iotdb.cluster.rpc.raft.closure.ResponseClosure;
+import org.apache.iotdb.cluster.rpc.raft.impl.RaftNodeAsClientManager;
 import org.apache.iotdb.cluster.rpc.raft.request.BasicRequest;
 import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
 import org.apache.iotdb.cluster.rpc.raft.response.MetaGroupNonQueryResponse;
@@ -51,10 +55,17 @@ import org.slf4j.LoggerFactory;
 
 public class RaftUtils {
 
+  private static final ClusterConfig CLUSTER_CONFIG = ClusterDescriptor.getInstance().getConfig();
+
   private static final Logger LOGGER = LoggerFactory.getLogger(RaftUtils.class);
   private static final Server server = Server.getInstance();
   private static final Router router = Router.getInstance();
   private static final AtomicInteger requestId = new AtomicInteger(0);
+  /**
+   * Raft as client manager.
+   */
+  private static final RaftNodeAsClientManager CLIENT_MANAGER = RaftNodeAsClientManager
+      .getInstance();
 
   /**
    * The cache will be update in two case: 1. When @onLeaderStart() method of state machine is
@@ -302,4 +313,18 @@ public class RaftUtils {
     status.setCode(-1);
     return status;
   }
+
+  /**
+   * try to get raft rpc client
+   */
+  public static NodeAsClient getRaftNodeAsClient() throws RaftConnectionException {
+    NodeAsClient client = CLIENT_MANAGER.getRaftNodeAsClient();
+    if (client == null) {
+      throw new RaftConnectionException(String
+          .format("Raft inner rpc clients have reached the max numbers %s",
+              CLUSTER_CONFIG.getMaxNumOfInnerRpcClient() + CLUSTER_CONFIG
+                  .getMaxQueueNumOfInnerRpcClient()));
+    }
+    return client;
+  }
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/utils/hash/Router.java b/cluster/src/main/java/org/apache/iotdb/cluster/utils/hash/Router.java
index 7c7b2be..12d3b01 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/utils/hash/Router.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/utils/hash/Router.java
@@ -236,4 +236,11 @@ public class Router {
   public Set<String> getAllGroupId() {
     return groupIdMapNodeCache.keySet();
   }
+
+  /**
+   * Get raft group id by storage group name
+   */
+  public String getGroupIdBySG(String storageGroup) {
+    return getGroupID(routeGroup(storageGroup));
+  }
 }
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/query/executor/IEngineQueryRouter.java b/iotdb/src/main/java/org/apache/iotdb/db/query/executor/IEngineQueryRouter.java
index 1d0b91b..01c1aed 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/query/executor/IEngineQueryRouter.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/query/executor/IEngineQueryRouter.java
@@ -40,7 +40,7 @@ public interface IEngineQueryRouter {
    * Execute physical plan.
    */
   QueryDataSet query(QueryExpression queryExpression, QueryContext context)
-      throws FileNodeManagerException;
+      throws FileNodeManagerException, PathErrorException;
 
   /**
    * Execute aggregation query.


[incubator-iotdb] 18/19: manage package

Posted by lt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

lta pushed a commit to branch cluster_read
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git

commit 65eab8e1daf8beb577a73d2da796860efc0d5793
Author: lta <li...@163.com>
AuthorDate: Tue Apr 16 19:51:59 2019 +0800

    manage package
---
 .../iotdb/cluster/qp/executor/ClusterQueryProcessExecutor.java    | 3 +--
 .../executor/ClusterExecutorWithTimeGenerator.java                | 4 ++--
 .../executor/ClusterExecutorWithoutTimeGenerator.java             | 6 +++---
 .../query/{coordinatornode => }/executor/ClusterQueryRouter.java  | 8 ++++----
 .../coordinatornode}/ClusterRpcQueryManager.java                  | 2 +-
 .../coordinatornode}/ClusterRpcSingleQueryManager.java            | 4 ++--
 .../coordinatornode}/IClusterRpcSingleQueryManager.java           | 4 ++--
 .../manager => manager/querynode}/ClusterLocalQueryManager.java   | 2 +-
 .../querynode}/ClusterLocalSingleQueryManager.java                | 2 +-
 .../{coordinatornode => }/reader/ClusterRpcBatchDataReader.java   | 2 +-
 .../query/{coordinatornode => }/reader/ClusterSeriesReader.java   | 3 +--
 .../raft/processor/querydata/QuerySeriesDataSyncProcessor.java    | 2 +-
 .../org/apache/iotdb/cluster/service/TSServiceClusterImpl.java    | 2 +-
 .../apache/iotdb/cluster/utils/query/ClusterRpcReaderUtils.java   | 4 ++--
 14 files changed, 23 insertions(+), 25 deletions(-)

diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/ClusterQueryProcessExecutor.java b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/ClusterQueryProcessExecutor.java
index 1b82583..c5032fc 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/ClusterQueryProcessExecutor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/ClusterQueryProcessExecutor.java
@@ -21,7 +21,7 @@ package org.apache.iotdb.cluster.qp.executor;
 import java.io.IOException;
 import java.util.List;
 import java.util.Map;
-import org.apache.iotdb.cluster.query.coordinatornode.executor.ClusterQueryRouter;
+import org.apache.iotdb.cluster.query.executor.ClusterQueryRouter;
 import org.apache.iotdb.db.exception.FileNodeManagerException;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.exception.ProcessorException;
@@ -33,7 +33,6 @@ import org.apache.iotdb.db.qp.physical.crud.FillQueryPlan;
 import org.apache.iotdb.db.qp.physical.crud.GroupByPlan;
 import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
 import org.apache.iotdb.db.query.context.QueryContext;
-import org.apache.iotdb.db.query.executor.IEngineQueryRouter;
 import org.apache.iotdb.db.query.fill.IFill;
 import org.apache.iotdb.tsfile.exception.filter.QueryFilterOptimizationException;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithTimeGenerator.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/executor/ClusterExecutorWithTimeGenerator.java
similarity index 96%
rename from cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithTimeGenerator.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/query/executor/ClusterExecutorWithTimeGenerator.java
index 6c0354a..19c78af 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithTimeGenerator.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/executor/ClusterExecutorWithTimeGenerator.java
@@ -16,12 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.query.coordinatornode.executor;
+package org.apache.iotdb.cluster.query.executor;
 
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
-import org.apache.iotdb.cluster.query.coordinatornode.manager.IClusterRpcSingleQueryManager;
+import org.apache.iotdb.cluster.query.manager.coordinatornode.IClusterRpcSingleQueryManager;
 import org.apache.iotdb.db.exception.FileNodeManagerException;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.metadata.MManager;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithoutTimeGenerator.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/executor/ClusterExecutorWithoutTimeGenerator.java
similarity index 96%
rename from cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithoutTimeGenerator.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/query/executor/ClusterExecutorWithoutTimeGenerator.java
index e52e604..1990af0 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterExecutorWithoutTimeGenerator.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/executor/ClusterExecutorWithoutTimeGenerator.java
@@ -16,14 +16,14 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.query.coordinatornode.executor;
+package org.apache.iotdb.cluster.query.executor;
 
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import org.apache.iotdb.cluster.query.coordinatornode.manager.ClusterRpcSingleQueryManager;
-import org.apache.iotdb.cluster.query.coordinatornode.reader.ClusterSeriesReader;
+import org.apache.iotdb.cluster.query.manager.coordinatornode.ClusterRpcSingleQueryManager;
+import org.apache.iotdb.cluster.query.reader.ClusterSeriesReader;
 import org.apache.iotdb.db.engine.querycontext.QueryDataSource;
 import org.apache.iotdb.db.exception.FileNodeManagerException;
 import org.apache.iotdb.db.exception.PathErrorException;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterQueryRouter.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/executor/ClusterQueryRouter.java
similarity index 95%
rename from cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterQueryRouter.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/query/executor/ClusterQueryRouter.java
index 6f07e58..ea1ddbd 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/executor/ClusterQueryRouter.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/executor/ClusterQueryRouter.java
@@ -16,15 +16,15 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.query.coordinatornode.executor;
+package org.apache.iotdb.cluster.query.executor;
 
 import java.io.IOException;
 import java.util.List;
 import java.util.Map;
 import org.apache.iotdb.cluster.exception.RaftConnectionException;
-import org.apache.iotdb.cluster.query.coordinatornode.manager.ClusterRpcQueryManager;
-import org.apache.iotdb.cluster.query.coordinatornode.manager.ClusterRpcSingleQueryManager;
-import org.apache.iotdb.cluster.query.coordinatornode.manager.ClusterRpcSingleQueryManager.QueryType;
+import org.apache.iotdb.cluster.query.manager.coordinatornode.ClusterRpcQueryManager;
+import org.apache.iotdb.cluster.query.manager.coordinatornode.ClusterRpcSingleQueryManager;
+import org.apache.iotdb.cluster.query.manager.coordinatornode.ClusterRpcSingleQueryManager.QueryType;
 import org.apache.iotdb.db.exception.FileNodeManagerException;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.exception.ProcessorException;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterRpcQueryManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/manager/coordinatornode/ClusterRpcQueryManager.java
similarity index 96%
rename from cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterRpcQueryManager.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/query/manager/coordinatornode/ClusterRpcQueryManager.java
index bdebd1a..fdaec5c 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterRpcQueryManager.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/manager/coordinatornode/ClusterRpcQueryManager.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.query.coordinatornode.manager;
+package org.apache.iotdb.cluster.query.manager.coordinatornode;
 
 import java.util.concurrent.ConcurrentHashMap;
 import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterRpcSingleQueryManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/manager/coordinatornode/ClusterRpcSingleQueryManager.java
similarity index 98%
rename from cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterRpcSingleQueryManager.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/query/manager/coordinatornode/ClusterRpcSingleQueryManager.java
index 01dcd4d..effd0ac 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/ClusterRpcSingleQueryManager.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/manager/coordinatornode/ClusterRpcSingleQueryManager.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.query.coordinatornode.manager;
+package org.apache.iotdb.cluster.query.manager.coordinatornode;
 
 import com.alipay.sofa.jraft.entity.PeerId;
 import java.io.IOException;
@@ -27,7 +27,7 @@ import java.util.Map;
 import java.util.Map.Entry;
 import org.apache.iotdb.cluster.exception.RaftConnectionException;
 import org.apache.iotdb.cluster.query.PathType;
-import org.apache.iotdb.cluster.query.coordinatornode.reader.ClusterSeriesReader;
+import org.apache.iotdb.cluster.query.reader.ClusterSeriesReader;
 import org.apache.iotdb.cluster.utils.QPExecutorUtils;
 import org.apache.iotdb.cluster.utils.RaftUtils;
 import org.apache.iotdb.cluster.utils.hash.Router;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/IClusterRpcSingleQueryManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/manager/coordinatornode/IClusterRpcSingleQueryManager.java
similarity index 94%
rename from cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/IClusterRpcSingleQueryManager.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/query/manager/coordinatornode/IClusterRpcSingleQueryManager.java
index 01cdb8a..f72be62 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/manager/IClusterRpcSingleQueryManager.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/manager/coordinatornode/IClusterRpcSingleQueryManager.java
@@ -16,12 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.query.coordinatornode.manager;
+package org.apache.iotdb.cluster.query.manager.coordinatornode;
 
 import com.alipay.sofa.jraft.entity.PeerId;
 import java.io.IOException;
 import org.apache.iotdb.cluster.exception.RaftConnectionException;
-import org.apache.iotdb.cluster.query.coordinatornode.manager.ClusterRpcSingleQueryManager.QueryType;
+import org.apache.iotdb.cluster.query.manager.coordinatornode.ClusterRpcSingleQueryManager.QueryType;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/querynode/manager/ClusterLocalQueryManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/manager/querynode/ClusterLocalQueryManager.java
similarity index 98%
rename from cluster/src/main/java/org/apache/iotdb/cluster/query/querynode/manager/ClusterLocalQueryManager.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/query/manager/querynode/ClusterLocalQueryManager.java
index 50c3c1e..7c7a995 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/querynode/manager/ClusterLocalQueryManager.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/manager/querynode/ClusterLocalQueryManager.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.query.querynode.manager;
+package org.apache.iotdb.cluster.query.manager.querynode;
 
 import java.io.IOException;
 import java.util.concurrent.ConcurrentHashMap;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/querynode/manager/ClusterLocalSingleQueryManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/manager/querynode/ClusterLocalSingleQueryManager.java
similarity index 98%
rename from cluster/src/main/java/org/apache/iotdb/cluster/query/querynode/manager/ClusterLocalSingleQueryManager.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/query/manager/querynode/ClusterLocalSingleQueryManager.java
index 99f3bf9..43e7b10 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/querynode/manager/ClusterLocalSingleQueryManager.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/manager/querynode/ClusterLocalSingleQueryManager.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.query.querynode.manager;
+package org.apache.iotdb.cluster.query.manager.querynode;
 
 import java.io.IOException;
 import java.util.ArrayList;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterRpcBatchDataReader.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/ClusterRpcBatchDataReader.java
similarity index 96%
rename from cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterRpcBatchDataReader.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/query/reader/ClusterRpcBatchDataReader.java
index ba36416..c656490 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterRpcBatchDataReader.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/ClusterRpcBatchDataReader.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.query.coordinatornode.reader;
+package org.apache.iotdb.cluster.query.reader;
 
 import com.alipay.sofa.jraft.entity.PeerId;
 import java.io.IOException;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterSeriesReader.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/ClusterSeriesReader.java
similarity index 95%
rename from cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterSeriesReader.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/query/reader/ClusterSeriesReader.java
index 3d022f8..b55ff56 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterSeriesReader.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/ClusterSeriesReader.java
@@ -16,14 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster.query.coordinatornode.reader;
+package org.apache.iotdb.cluster.query.reader;
 
 import java.io.IOException;
 import org.apache.iotdb.db.query.reader.IBatchReader;
 import org.apache.iotdb.db.query.reader.IPointReader;
 import org.apache.iotdb.db.utils.TimeValuePair;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
-import org.apache.iotdb.tsfile.read.common.Path;
 
 public class ClusterSeriesReader implements IPointReader {
 
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/querydata/QuerySeriesDataSyncProcessor.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/querydata/QuerySeriesDataSyncProcessor.java
index d2064ba..b871b10 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/querydata/QuerySeriesDataSyncProcessor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/processor/querydata/QuerySeriesDataSyncProcessor.java
@@ -4,7 +4,7 @@ import com.alipay.remoting.BizContext;
 import com.alipay.sofa.jraft.Status;
 import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.query.PathType;
-import org.apache.iotdb.cluster.query.querynode.manager.ClusterLocalQueryManager;
+import org.apache.iotdb.cluster.query.manager.querynode.ClusterLocalQueryManager;
 import org.apache.iotdb.cluster.rpc.raft.processor.BasicSyncUserProcessor;
 import org.apache.iotdb.cluster.rpc.raft.request.querydata.QuerySeriesDataRequest;
 import org.apache.iotdb.cluster.rpc.raft.request.querydata.Stage;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java b/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java
index d978f7a..7d50bc4 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java
@@ -32,7 +32,7 @@ import org.apache.iotdb.cluster.exception.ConsistencyLevelException;
 import org.apache.iotdb.cluster.qp.executor.NonQueryExecutor;
 import org.apache.iotdb.cluster.qp.executor.QueryMetadataExecutor;
 import org.apache.iotdb.cluster.qp.executor.ClusterQueryProcessExecutor;
-import org.apache.iotdb.cluster.query.coordinatornode.manager.ClusterRpcQueryManager;
+import org.apache.iotdb.cluster.query.manager.coordinatornode.ClusterRpcQueryManager;
 import org.apache.iotdb.db.auth.AuthException;
 import org.apache.iotdb.db.conf.IoTDBConstant;
 import org.apache.iotdb.db.exception.FileNodeManagerException;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/utils/query/ClusterRpcReaderUtils.java b/cluster/src/main/java/org/apache/iotdb/cluster/utils/query/ClusterRpcReaderUtils.java
index 77d9cb3..e8adf15 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/utils/query/ClusterRpcReaderUtils.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/utils/query/ClusterRpcReaderUtils.java
@@ -28,8 +28,8 @@ import org.apache.iotdb.cluster.config.ClusterDescriptor;
 import org.apache.iotdb.cluster.exception.RaftConnectionException;
 import org.apache.iotdb.cluster.qp.task.QPTask.TaskState;
 import org.apache.iotdb.cluster.query.PathType;
-import org.apache.iotdb.cluster.query.coordinatornode.reader.ClusterRpcBatchDataReader;
-import org.apache.iotdb.cluster.query.coordinatornode.reader.ClusterSeriesReader;
+import org.apache.iotdb.cluster.query.reader.ClusterRpcBatchDataReader;
+import org.apache.iotdb.cluster.query.reader.ClusterSeriesReader;
 import org.apache.iotdb.cluster.rpc.raft.NodeAsClient;
 import org.apache.iotdb.cluster.rpc.raft.request.BasicRequest;
 import org.apache.iotdb.cluster.rpc.raft.request.querydata.QuerySeriesDataRequest;


[incubator-iotdb] 03/19: reorganize aggeFunc code

Posted by lt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

lta pushed a commit to branch cluster_read
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git

commit 17c9a236ce4fa3f1a7cc5707d994a5d4472674be
Author: lta <li...@163.com>
AuthorDate: Fri Apr 12 20:05:11 2019 +0800

    reorganize aggeFunc code
---
 .../org/apache/iotdb/db/query/aggregation/AggreResultData.java     | 2 +-
 .../org/apache/iotdb/db/query/aggregation/impl/CountAggrFunc.java  | 2 +-
 .../org/apache/iotdb/db/query/aggregation/impl/FirstAggrFunc.java  | 2 +-
 .../org/apache/iotdb/db/query/aggregation/impl/LastAggrFunc.java   | 2 +-
 .../apache/iotdb/db/query/aggregation/impl/MaxTimeAggrFunc.java    | 2 +-
 .../apache/iotdb/db/query/aggregation/impl/MaxValueAggrFunc.java   | 2 +-
 .../org/apache/iotdb/db/query/aggregation/impl/MeanAggrFunc.java   | 2 +-
 .../apache/iotdb/db/query/aggregation/impl/MinTimeAggrFunc.java    | 2 +-
 .../apache/iotdb/db/query/aggregation/impl/MinValueAggrFunc.java   | 2 +-
 .../apache/iotdb/db/query/dataset/AggreResultDataPointReader.java  | 2 +-
 .../iotdb/db/query/executor/groupby/GroupByEngineDataSet.java      | 7 ++-----
 11 files changed, 12 insertions(+), 15 deletions(-)

diff --git a/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/AggreResultData.java b/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/AggreResultData.java
index 0efae01..41cef8c 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/AggreResultData.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/AggreResultData.java
@@ -44,7 +44,7 @@ public class AggreResultData {
     this.isSetValue = false;
   }
 
-  public void reSet() {
+  public void reset() {
     isSetValue = false;
     isSetTime = false;
   }
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/impl/CountAggrFunc.java b/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/impl/CountAggrFunc.java
index 020aaf1..99ef06c 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/impl/CountAggrFunc.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/impl/CountAggrFunc.java
@@ -40,7 +40,7 @@ public class CountAggrFunc extends AggregateFunction {
 
   @Override
   public void init() {
-    resultData.reSet();
+    resultData.reset();
     resultData.setTimestamp(0);
     resultData.setLongRet(0);
   }
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/impl/FirstAggrFunc.java b/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/impl/FirstAggrFunc.java
index 3e8bb05..0688303 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/impl/FirstAggrFunc.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/impl/FirstAggrFunc.java
@@ -37,7 +37,7 @@ public class FirstAggrFunc extends AggregateFunction {
 
   @Override
   public void init() {
-    resultData.reSet();
+    resultData.reset();
   }
 
   @Override
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/impl/LastAggrFunc.java b/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/impl/LastAggrFunc.java
index 8c12728..b8ea98b 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/impl/LastAggrFunc.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/impl/LastAggrFunc.java
@@ -37,7 +37,7 @@ public class LastAggrFunc extends AggregateFunction {
 
   @Override
   public void init() {
-    resultData.reSet();
+    resultData.reset();
   }
 
   @Override
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MaxTimeAggrFunc.java b/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MaxTimeAggrFunc.java
index 73b8f1c..ba3460b 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MaxTimeAggrFunc.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MaxTimeAggrFunc.java
@@ -37,7 +37,7 @@ public class MaxTimeAggrFunc extends AggregateFunction {
 
   @Override
   public void init() {
-    resultData.reSet();
+    resultData.reset();
   }
 
   @Override
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MaxValueAggrFunc.java b/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MaxValueAggrFunc.java
index 8e2d2a7..40bea9c 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MaxValueAggrFunc.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MaxValueAggrFunc.java
@@ -36,7 +36,7 @@ public class MaxValueAggrFunc extends AggregateFunction {
 
   @Override
   public void init() {
-    resultData.reSet();
+    resultData.reset();
   }
 
   @Override
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MeanAggrFunc.java b/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MeanAggrFunc.java
index da6cc95..5373018 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MeanAggrFunc.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MeanAggrFunc.java
@@ -42,7 +42,7 @@ public class MeanAggrFunc extends AggregateFunction {
 
   @Override
   public void init() {
-    resultData.reSet();
+    resultData.reset();
     sum = 0.0;
     cnt = 0;
   }
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MinTimeAggrFunc.java b/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MinTimeAggrFunc.java
index f083812..278fde2 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MinTimeAggrFunc.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MinTimeAggrFunc.java
@@ -36,7 +36,7 @@ public class MinTimeAggrFunc extends AggregateFunction {
 
   @Override
   public void init() {
-    resultData.reSet();
+    resultData.reset();
   }
 
   @Override
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MinValueAggrFunc.java b/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MinValueAggrFunc.java
index ad64fb3..137f8fe 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MinValueAggrFunc.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/query/aggregation/impl/MinValueAggrFunc.java
@@ -36,7 +36,7 @@ public class MinValueAggrFunc extends AggregateFunction {
 
   @Override
   public void init() {
-    resultData.reSet();
+    resultData.reset();
   }
 
   @Override
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/query/dataset/AggreResultDataPointReader.java b/iotdb/src/main/java/org/apache/iotdb/db/query/dataset/AggreResultDataPointReader.java
index c2edab0..6545bfa 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/query/dataset/AggreResultDataPointReader.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/query/dataset/AggreResultDataPointReader.java
@@ -36,7 +36,7 @@ public class AggreResultDataPointReader implements IPointReader {
   @Override
   public TimeValuePair next() {
     TimeValuePair timeValuePair = TimeValuePairUtils.getCurrentTimeValuePair(aggreResultData);
-    aggreResultData.reSet();
+    aggreResultData.reset();
     return timeValuePair;
   }
 
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/query/executor/groupby/GroupByEngineDataSet.java b/iotdb/src/main/java/org/apache/iotdb/db/query/executor/groupby/GroupByEngineDataSet.java
index 2ccecf5..f7ecea8 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/query/executor/groupby/GroupByEngineDataSet.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/query/executor/groupby/GroupByEngineDataSet.java
@@ -90,15 +90,12 @@ public abstract class GroupByEngineDataSet extends QueryDataSet {
       return true;
     }
 
-    // end
-    if (usedIndex >= mergedIntervals.size()) {
-      return false;
-    }
-
     // skip the intervals in coverage of last time-partition
     while (usedIndex < mergedIntervals.size() && mergedIntervals.get(usedIndex).right < endTime) {
       usedIndex++;
     }
+
+    //end
     if (usedIndex >= mergedIntervals.size()) {
       return false;
     }


[incubator-iotdb] 12/19: Merge branch 'cluster' of github.com:apache/incubator-iotdb into cluster

Posted by lt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

lta pushed a commit to branch cluster_read
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git

commit e285a9d52ab8832b62ddf149e27df32baacbefe9
Merge: 1d6c7a3 f893a74
Author: lta <li...@163.com>
AuthorDate: Mon Apr 15 22:43:03 2019 +0800

    Merge branch 'cluster' of github.com:apache/incubator-iotdb into cluster

 .../ThreadName.java}                               |  23 ++--
 .../cluster/concurrent/pool/QPTaskManager.java     |  66 ++++++++++++
 .../cluster/concurrent/pool/ThreadPoolManager.java | 102 ++++++++++++++++++
 .../apache/iotdb/cluster/config/ClusterConfig.java |  58 ++++++----
 .../iotdb/cluster/config/ClusterConstant.java      |  11 +-
 .../iotdb/cluster/config/ClusterDescriptor.java    |  19 ++--
 .../org/apache/iotdb/cluster/entity/Server.java    |  12 ++-
 .../cluster/entity/raft/DataStateMachine.java      | 117 +++++++++++----------
 .../cluster/entity/raft/MetadataStateManchine.java | 108 ++++++++++---------
 .../iotdb/cluster/entity/raft/RaftService.java     |  15 ---
 .../apache/iotdb/cluster/qp/ClusterQPExecutor.java |   2 +-
 .../iotdb/cluster/qp/callback/BatchQPTask.java     |  44 ++++----
 .../iotdb/cluster/qp/callback/MultiQPTask.java     |  14 +--
 .../cluster/qp/executor/NonQueryExecutor.java      |  51 ++++++---
 .../rpc/raft/impl/RaftNodeAsClientManager.java     |   2 +-
 .../org/apache/iotdb/cluster/utils/RaftUtils.java  |   7 ++
 .../cluster/concurrent/pool/QPTaskManagerTest.java |  85 +++++++++++++++
 .../cluster/config/ClusterDescriptorTest.java      |  26 +++--
 .../cluster/utils/ClusterConfigureGenerator.java   |   4 +-
 iotdb/iotdb/conf/iotdb-cluster.properties          |  26 +++--
 .../org/apache/iotdb/db/concurrent/ThreadName.java |   2 +-
 .../apache/iotdb/db/engine/pool/FlushManager.java  |   6 +-
 .../apache/iotdb/db/engine/pool/MergeManager.java  |   8 +-
 23 files changed, 570 insertions(+), 238 deletions(-)


[incubator-iotdb] 06/19: initial query module

Posted by lt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

lta pushed a commit to branch cluster_read
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git

commit 9bfb04adfdef6e5f91372f681a0a45fd2b2a00ea
Author: lta <li...@163.com>
AuthorDate: Mon Apr 15 11:20:32 2019 +0800

    initial query module
---
 ...xecutor.java => AbstractClusterQPExecutor.java} | 29 ++++----
 .../cluster/qp/executor/NonQueryExecutor.java      | 10 +--
 .../cluster/qp/executor/QueryMetadataExecutor.java | 12 ++--
 .../apache/iotdb/cluster/qp/task/BatchQPTask.java  |  8 +--
 .../apache/iotdb/cluster/qp/task/MultiQPTask.java  |  2 +-
 .../reader/ClusterAllDataReader.java               | 31 ++++++++
 .../reader/ClusterRpcBatchReader.java              | 23 ++++++
 .../cluster/query/executor/ClusterQueryRouter.java | 48 +++++++++++++
 .../query/executor/QueryProcessorExecutor.java     | 82 ++++++++++++++++++++++
 .../iotdb/cluster/rpc/raft/NodeAsClient.java       | 16 ++---
 .../rpc/raft/impl/RaftNodeAsClientManager.java     |  6 +-
 .../cluster/service/TSServiceClusterImpl.java      |  3 +
 ...est.java => AbstractClusterQPExecutorTest.java} |  2 +-
 .../org/apache/iotdb/db/qp/QueryProcessor.java     | 12 ++--
 ...utor.java => AbstractQueryProcessExecutor.java} | 10 +--
 .../iotdb/db/qp/executor/OverflowQPExecutor.java   |  4 +-
 .../db/qp/logical/crud/BasicFunctionOperator.java  |  4 +-
 .../iotdb/db/qp/logical/crud/FilterOperator.java   |  6 +-
 .../iotdb/db/qp/physical/crud/QueryPlan.java       |  4 +-
 .../iotdb/db/qp/strategy/PhysicalGenerator.java    |  8 +--
 .../qp/strategy/optimizer/ConcatPathOptimizer.java |  6 +-
 .../iotdb/db/query/executor/EngineQueryRouter.java | 30 ++------
 .../db/query/executor/IEngineQueryRouter.java      | 61 ++++++++++++++++
 .../org/apache/iotdb/db/service/TSServiceImpl.java |  2 +-
 .../apache/iotdb/db/qp/utils/MemIntQpExecutor.java |  6 +-
 .../EngineDataSetWithTimeGeneratorTest.java        |  4 +-
 26 files changed, 330 insertions(+), 99 deletions(-)

diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/ClusterQPExecutor.java b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/AbstractClusterQPExecutor.java
similarity index 91%
rename from cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/ClusterQPExecutor.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/AbstractClusterQPExecutor.java
index dfc5d77..1a3cfe3 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/ClusterQPExecutor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/AbstractClusterQPExecutor.java
@@ -24,8 +24,6 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import org.apache.iotdb.cluster.qp.task.QPTask;
-import org.apache.iotdb.cluster.qp.task.QPTask.TaskState;
 import org.apache.iotdb.cluster.config.ClusterConfig;
 import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.config.ClusterDescriptor;
@@ -33,6 +31,9 @@ import org.apache.iotdb.cluster.entity.Server;
 import org.apache.iotdb.cluster.entity.raft.MetadataRaftHolder;
 import org.apache.iotdb.cluster.exception.ConsistencyLevelException;
 import org.apache.iotdb.cluster.exception.RaftConnectionException;
+import org.apache.iotdb.cluster.qp.task.QPTask;
+import org.apache.iotdb.cluster.qp.task.QPTask.TaskState;
+import org.apache.iotdb.cluster.qp.task.SingleQPTask;
 import org.apache.iotdb.cluster.rpc.raft.NodeAsClient;
 import org.apache.iotdb.cluster.rpc.raft.impl.RaftNodeAsClientManager;
 import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
@@ -44,9 +45,9 @@ import org.apache.iotdb.db.metadata.MManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public abstract class ClusterQPExecutor {
+public abstract class AbstractClusterQPExecutor {
 
-  private static final Logger LOGGER = LoggerFactory.getLogger(ClusterQPExecutor.class);
+  private static final Logger LOGGER = LoggerFactory.getLogger(AbstractClusterQPExecutor.class);
 
   private static final ClusterConfig CLUSTER_CONFIG = ClusterDescriptor.getInstance().getConfig();
 
@@ -171,21 +172,20 @@ public abstract class ClusterQPExecutor {
    * @param taskRetryNum Number of QPTask retries due to timeout and redirected.
    * @return basic response
    */
-  protected BasicResponse asyncHandleNonQueryTaskGetRes(QPTask task, PeerId leader,
+  protected BasicResponse asyncHandleNonQuerySingleTaskGetRes(SingleQPTask task, PeerId leader,
       int taskRetryNum)
       throws InterruptedException, RaftConnectionException {
-    asyncSendNonQueryTask(task, leader, taskRetryNum);
-    return asyncGetNonQueryRes(task, leader, taskRetryNum);
+    asyncSendNonQuerySingleTask(task, leader, taskRetryNum);
+    return syncGetNonQueryRes(task, leader, taskRetryNum);
   }
 
   /**
    * Asynchronous send rpc task via client
-   *
-   * @param task rpc task
+   *  @param task rpc task
    * @param leader leader node of the group
    * @param taskRetryNum Retry time of the task
    */
-  public void asyncSendNonQueryTask(QPTask task, PeerId leader, int taskRetryNum)
+  public void asyncSendNonQuerySingleTask(SingleQPTask task, PeerId leader, int taskRetryNum)
       throws RaftConnectionException {
     if (taskRetryNum >= TASK_MAX_RETRY) {
       throw new RaftConnectionException(String.format("QPTask retries reach the upper bound %s",
@@ -211,15 +211,14 @@ public abstract class ClusterQPExecutor {
   }
 
   /**
-   * Asynchronous get task response. If it's redirected or status is exception, the task needs to be
+   * Synchronous get task response. If it's redirected or status is exception, the task needs to be
    * resent. Note: If status is Exception, it marks that an exception occurred during the task is
    * being sent instead of executed.
-   *
-   * @param task rpc task
+   *  @param task rpc task
    * @param leader leader node of the group
    * @param taskRetryNum Retry time of the task
    */
-  private BasicResponse asyncGetNonQueryRes(QPTask task, PeerId leader, int taskRetryNum)
+  private BasicResponse syncGetNonQueryRes(SingleQPTask task, PeerId leader, int taskRetryNum)
       throws InterruptedException, RaftConnectionException {
     task.await();
     if (task.getTaskState() != TaskState.FINISH) {
@@ -230,7 +229,7 @@ public abstract class ClusterQPExecutor {
         RaftUtils.updateRaftGroupLeader(task.getRequest().getGroupID(), leader);
       }
       task.resetTask();
-      return asyncHandleNonQueryTaskGetRes(task, leader, taskRetryNum + 1);
+      return asyncHandleNonQuerySingleTaskGetRes(task, leader, taskRetryNum + 1);
     }
     return task.getResponse();
   }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/NonQueryExecutor.java b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/NonQueryExecutor.java
index a7d774c..f9fa3a9 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/NonQueryExecutor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/NonQueryExecutor.java
@@ -60,7 +60,7 @@ import org.slf4j.LoggerFactory;
 /**
  * Handle distributed non-query logic
  */
-public class NonQueryExecutor extends ClusterQPExecutor {
+public class NonQueryExecutor extends AbstractClusterQPExecutor {
 
   private static final Logger LOGGER = LoggerFactory.getLogger(NonQueryExecutor.class);
 
@@ -140,7 +140,7 @@ public class NonQueryExecutor extends ClusterQPExecutor {
     }
 
     /** 2. Construct Multiple Data Group Requests **/
-    Map<String, QPTask> subTaskMap = new HashMap<>();
+    Map<String, SingleQPTask> subTaskMap = new HashMap<>();
     for (Entry<String, List<PhysicalPlan>> entry : physicalPlansMap.entrySet()) {
       String groupId = entry.getKey();
       SingleQPTask singleQPTask;
@@ -298,7 +298,7 @@ public class NonQueryExecutor extends ClusterQPExecutor {
     } else {
       request = new DataGroupNonQueryRequest(groupId, plans);
     }
-    QPTask qpTask = new SingleQPTask(false, request);
+    SingleQPTask qpTask = new SingleQPTask(false, request);
     currentTask = qpTask;
 
     /** Check if the plan can be executed locally. **/
@@ -340,9 +340,9 @@ public class NonQueryExecutor extends ClusterQPExecutor {
    * @param leader leader of the target raft group
    * @return request result
    */
-  public boolean asyncHandleNonQueryTask(QPTask task, PeerId leader)
+  public boolean asyncHandleNonQueryTask(SingleQPTask task, PeerId leader)
       throws RaftConnectionException, InterruptedException {
-    BasicResponse response = asyncHandleNonQueryTaskGetRes(task, leader, 0);
+    BasicResponse response = asyncHandleNonQuerySingleTaskGetRes(task, leader, 0);
     return response != null && response.isSuccess();
   }
 
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/QueryMetadataExecutor.java b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/QueryMetadataExecutor.java
index fc7672b..73e3181 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/QueryMetadataExecutor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/qp/executor/QueryMetadataExecutor.java
@@ -57,7 +57,7 @@ import org.slf4j.LoggerFactory;
 /**
  * Handle < show timeseries <path> > logic
  */
-public class QueryMetadataExecutor extends ClusterQPExecutor {
+public class QueryMetadataExecutor extends AbstractClusterQPExecutor {
 
   private static final Logger LOGGER = LoggerFactory.getLogger(QueryMetadataExecutor.class);
   private static final String DOUB_SEPARATOR = "\\.";
@@ -165,7 +165,7 @@ public class QueryMetadataExecutor extends ClusterQPExecutor {
         holder = RaftUtils.getRandomPeerID(groupId);
       }
       try {
-        asyncSendNonQueryTask(task, holder, 0);
+        asyncSendNonQuerySingleTask(task, holder, 0);
       } catch (RaftConnectionException e) {
         throw new ProcessorException("Raft connection occurs error.", e);
       }
@@ -204,7 +204,7 @@ public class QueryMetadataExecutor extends ClusterQPExecutor {
         holder = RaftUtils.getRandomPeerID(groupId);
       }
       try {
-        asyncSendNonQueryTask(task, holder, 0);
+        asyncSendNonQuerySingleTask(task, holder, 0);
       } catch (RaftConnectionException e) {
         throw new ProcessorException("Raft connection occurs error.", e);
       }
@@ -304,14 +304,14 @@ public class QueryMetadataExecutor extends ClusterQPExecutor {
 
   private List<List<String>> queryTimeSeries(SingleQPTask task, PeerId leader)
       throws InterruptedException, RaftConnectionException {
-    BasicResponse response = asyncHandleNonQueryTaskGetRes(task, leader, 0);
+    BasicResponse response = asyncHandleNonQuerySingleTaskGetRes(task, leader, 0);
     return response == null ? new ArrayList<>()
         : ((QueryTimeSeriesResponse) response).getTimeSeries();
   }
 
   private TSDataType querySeriesType(SingleQPTask task, PeerId leader)
       throws InterruptedException, RaftConnectionException {
-    BasicResponse response = asyncHandleNonQueryTaskGetRes(task, leader, 0);
+    BasicResponse response = asyncHandleNonQuerySingleTaskGetRes(task, leader, 0);
     return response == null ? null
         : ((QuerySeriesTypeResponse) response).getDataType();
   }
@@ -363,7 +363,7 @@ public class QueryMetadataExecutor extends ClusterQPExecutor {
 
   private List<String> queryPaths(SingleQPTask task, PeerId leader)
       throws InterruptedException, RaftConnectionException {
-    BasicResponse response = asyncHandleNonQueryTaskGetRes(task, leader, 0);
+    BasicResponse response = asyncHandleNonQuerySingleTaskGetRes(task, leader, 0);
     return response == null ? new ArrayList<>()
         : ((QueryPathsResponse) response).getPaths();
   }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/BatchQPTask.java b/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/BatchQPTask.java
index 8f7e092..23b84c1 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/BatchQPTask.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/BatchQPTask.java
@@ -71,7 +71,7 @@ public class BatchQPTask extends MultiQPTask {
   private NonQueryExecutor executor;
 
 
-  public BatchQPTask(int taskNum, BatchResult batchResult, Map<String, QPTask> taskMap,
+  public BatchQPTask(int taskNum, BatchResult batchResult, Map<String, SingleQPTask> taskMap,
       Map<String, List<Integer>> planIndexMap) {
     super(false, taskNum, TaskState.INITIAL, TaskType.BATCH);
     this.batchResult = batchResult.getResult();
@@ -115,9 +115,9 @@ public class BatchQPTask extends MultiQPTask {
   public void execute(NonQueryExecutor executor) {
     this.executor = executor;
 
-    for (Entry<String, QPTask> entry : taskMap.entrySet()) {
+    for (Entry<String, SingleQPTask> entry : taskMap.entrySet()) {
       String groupId = entry.getKey();
-      QPTask subTask = entry.getValue();
+      SingleQPTask subTask = entry.getValue();
       Thread thread;
       if (executor.canHandleNonQueryByGroupId(groupId)) {
         thread = new Thread(() -> executeLocalSubTask(subTask, groupId));
@@ -147,7 +147,7 @@ public class BatchQPTask extends MultiQPTask {
   /**
    * Execute RPC sub task
    */
-  private void executeRpcSubTask(QPTask subTask, PeerId leader, String groupId) {
+  private void executeRpcSubTask(SingleQPTask subTask, PeerId leader, String groupId) {
       try {
         executor.asyncHandleNonQueryTask(subTask, leader);
         this.run(subTask.getResponse());
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/MultiQPTask.java b/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/MultiQPTask.java
index 85d6291..f53a2a2 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/MultiQPTask.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/qp/task/MultiQPTask.java
@@ -25,7 +25,7 @@ public abstract class MultiQPTask extends QPTask {
   /**
    * Each request is corresponding to a group id. String: group id
    */
-  Map<String, QPTask> taskMap;
+  Map<String, SingleQPTask> taskMap;
 
   /**
    * Task thread map
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterAllDataReader.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterAllDataReader.java
new file mode 100644
index 0000000..62cfeb1
--- /dev/null
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterAllDataReader.java
@@ -0,0 +1,31 @@
+package org.apache.iotdb.cluster.query.coordinatornode.reader;
+
+import java.io.IOException;
+import org.apache.iotdb.db.query.reader.IBatchReader;
+import org.apache.iotdb.db.query.reader.IPointReader;
+import org.apache.iotdb.db.utils.TimeValuePair;
+
+public class ClusterAllDataReader implements IPointReader {
+
+  private IBatchReader rpcBatchReader;
+
+  @Override
+  public TimeValuePair current() throws IOException {
+    return null;
+  }
+
+  @Override
+  public boolean hasNext() throws IOException {
+    return false;
+  }
+
+  @Override
+  public TimeValuePair next() throws IOException {
+    return null;
+  }
+
+  @Override
+  public void close() throws IOException {
+
+  }
+}
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterRpcBatchReader.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterRpcBatchReader.java
new file mode 100644
index 0000000..0ffbe14
--- /dev/null
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/coordinatornode/reader/ClusterRpcBatchReader.java
@@ -0,0 +1,23 @@
+package org.apache.iotdb.cluster.query.coordinatornode.reader;
+
+import java.io.IOException;
+import org.apache.iotdb.db.query.reader.IBatchReader;
+import org.apache.iotdb.tsfile.read.common.BatchData;
+
+public class ClusterRpcBatchReader implements IBatchReader {
+
+  @Override
+  public boolean hasNext() throws IOException {
+    return false;
+  }
+
+  @Override
+  public BatchData nextBatch() throws IOException {
+    return null;
+  }
+
+  @Override
+  public void close() throws IOException {
+
+  }
+}
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/executor/ClusterQueryRouter.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/executor/ClusterQueryRouter.java
new file mode 100644
index 0000000..0f797fc
--- /dev/null
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/executor/ClusterQueryRouter.java
@@ -0,0 +1,48 @@
+package org.apache.iotdb.cluster.query.executor;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import org.apache.iotdb.db.exception.FileNodeManagerException;
+import org.apache.iotdb.db.exception.PathErrorException;
+import org.apache.iotdb.db.exception.ProcessorException;
+import org.apache.iotdb.db.query.context.QueryContext;
+import org.apache.iotdb.db.query.executor.IEngineQueryRouter;
+import org.apache.iotdb.db.query.fill.IFill;
+import org.apache.iotdb.tsfile.exception.filter.QueryFilterOptimizationException;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.tsfile.read.common.Path;
+import org.apache.iotdb.tsfile.read.expression.IExpression;
+import org.apache.iotdb.tsfile.read.expression.QueryExpression;
+import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
+import org.apache.iotdb.tsfile.utils.Pair;
+
+public class ClusterQueryRouter implements IEngineQueryRouter {
+
+  @Override
+  public QueryDataSet query(QueryExpression queryExpression, QueryContext context)
+      throws FileNodeManagerException {
+    return null;
+  }
+
+  @Override
+  public QueryDataSet aggregate(List<Path> selectedSeries, List<String> aggres,
+      IExpression expression, QueryContext context)
+      throws QueryFilterOptimizationException, FileNodeManagerException, IOException, PathErrorException, ProcessorException {
+    return null;
+  }
+
+  @Override
+  public QueryDataSet groupBy(List<Path> selectedSeries, List<String> aggres,
+      IExpression expression, long unit, long origin, List<Pair<Long, Long>> intervals,
+      QueryContext context)
+      throws ProcessorException, QueryFilterOptimizationException, FileNodeManagerException, PathErrorException, IOException {
+    return null;
+  }
+
+  @Override
+  public QueryDataSet fill(List<Path> fillPaths, long queryTime, Map<TSDataType, IFill> fillType,
+      QueryContext context) throws FileNodeManagerException, PathErrorException, IOException {
+    return null;
+  }
+}
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/executor/QueryProcessorExecutor.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/executor/QueryProcessorExecutor.java
new file mode 100644
index 0000000..ecd5f61
--- /dev/null
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/executor/QueryProcessorExecutor.java
@@ -0,0 +1,82 @@
+package org.apache.iotdb.cluster.query.executor;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import org.apache.iotdb.db.exception.FileNodeManagerException;
+import org.apache.iotdb.db.exception.PathErrorException;
+import org.apache.iotdb.db.exception.ProcessorException;
+import org.apache.iotdb.db.qp.executor.AbstractQueryProcessExecutor;
+import org.apache.iotdb.db.query.context.QueryContext;
+import org.apache.iotdb.db.query.fill.IFill;
+import org.apache.iotdb.tsfile.exception.filter.QueryFilterOptimizationException;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.tsfile.read.common.Path;
+import org.apache.iotdb.tsfile.read.expression.IExpression;
+import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
+import org.apache.iotdb.tsfile.utils.Pair;
+
+public class QueryProcessorExecutor extends AbstractQueryProcessExecutor {
+
+  public QueryProcessorExecutor() {
+    super(new ClusterQueryRouter());
+  }
+
+  @Override
+  public TSDataType getSeriesType(Path fullPath) throws PathErrorException {
+    return null;
+  }
+
+  @Override
+  public boolean judgePathExists(Path fullPath) {
+    return false;
+  }
+
+  @Override
+  public QueryDataSet aggregate(List<Path> paths, List<String> aggres, IExpression expression,
+      QueryContext context)
+      throws ProcessorException, IOException, PathErrorException, FileNodeManagerException, QueryFilterOptimizationException {
+    return null;
+  }
+
+  @Override
+  public QueryDataSet groupBy(List<Path> paths, List<String> aggres, IExpression expression,
+      long unit, long origin, List<Pair<Long, Long>> intervals, QueryContext context)
+      throws ProcessorException, IOException, PathErrorException, FileNodeManagerException, QueryFilterOptimizationException {
+    return null;
+  }
+
+  @Override
+  public QueryDataSet fill(List<Path> fillPaths, long queryTime, Map<TSDataType, IFill> fillTypes,
+      QueryContext context)
+      throws ProcessorException, IOException, PathErrorException, FileNodeManagerException {
+    return null;
+  }
+
+  @Override
+  public boolean update(Path path, long startTime, long endTime, String value)
+      throws ProcessorException {
+    return false;
+  }
+
+  @Override
+  protected boolean delete(Path path, long deleteTime) throws ProcessorException {
+    return false;
+  }
+
+  @Override
+  public int insert(Path path, long insertTime, String value) throws ProcessorException {
+    return 0;
+  }
+
+  @Override
+  public int multiInsert(String deviceId, long insertTime, List<String> measurementList,
+      List<String> insertValues) throws ProcessorException {
+    return 0;
+  }
+
+  @Override
+  public List<String> getAllPaths(String originPath) throws PathErrorException {
+    return null;
+  }
+}
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/NodeAsClient.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/NodeAsClient.java
index a07c43f..ed38584 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/NodeAsClient.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/NodeAsClient.java
@@ -19,8 +19,8 @@
 package org.apache.iotdb.cluster.rpc.raft;
 
 import com.alipay.sofa.jraft.entity.PeerId;
-import org.apache.iotdb.cluster.qp.task.QPTask;
 import org.apache.iotdb.cluster.exception.RaftConnectionException;
+import org.apache.iotdb.cluster.qp.task.SingleQPTask;
 import org.apache.iotdb.cluster.rpc.raft.request.BasicRequest;
 
 /**
@@ -30,21 +30,19 @@ public interface NodeAsClient {
 
   /**
    * Asynchronous processing requests
-   *
-   * @param leader leader node of the target group
-   * @param qpTask the QPTask to be executed
+   *  @param leader leader node of the target group
+   * @param qpTask single QPTask to be executed
    */
   void asyncHandleRequest(BasicRequest request, PeerId leader,
-      QPTask qpTask) throws RaftConnectionException;
+      SingleQPTask qpTask) throws RaftConnectionException;
 
   /**
    * Synchronous processing requests
-   *
-   * @param clientService client rpc service handle
+   *  @param clientService client rpc service handle
    * @param leader leader node of the target group
-   * @param qpTask the QPTask to be executed
+   * @param qpTask single QPTask to be executed
    */
-  void syncHandleRequest(BasicRequest request, PeerId leader, QPTask qpTask)
+  void syncHandleRequest(BasicRequest request, PeerId leader, SingleQPTask qpTask)
       throws RaftConnectionException;
 
   /**
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/impl/RaftNodeAsClientManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/impl/RaftNodeAsClientManager.java
index 580296b..f23e218 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/impl/RaftNodeAsClientManager.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/rpc/raft/impl/RaftNodeAsClientManager.java
@@ -26,11 +26,11 @@ import com.alipay.sofa.jraft.rpc.impl.cli.BoltCliClientService;
 import java.util.concurrent.Executor;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.locks.ReentrantLock;
-import org.apache.iotdb.cluster.qp.task.QPTask;
 import org.apache.iotdb.cluster.qp.task.QPTask.TaskState;
 import org.apache.iotdb.cluster.config.ClusterConfig;
 import org.apache.iotdb.cluster.config.ClusterDescriptor;
 import org.apache.iotdb.cluster.exception.RaftConnectionException;
+import org.apache.iotdb.cluster.qp.task.SingleQPTask;
 import org.apache.iotdb.cluster.rpc.raft.NodeAsClient;
 import org.apache.iotdb.cluster.rpc.raft.request.BasicRequest;
 import org.apache.iotdb.cluster.rpc.raft.response.BasicResponse;
@@ -176,7 +176,7 @@ public class RaftNodeAsClientManager {
 
     @Override
     public void asyncHandleRequest(BasicRequest request, PeerId leader,
-        QPTask qpTask)
+        SingleQPTask qpTask)
         throws RaftConnectionException {
       LOGGER.debug("Node as client to send request to leader: {}", leader);
       try {
@@ -215,7 +215,7 @@ public class RaftNodeAsClientManager {
 
     @Override
     public void syncHandleRequest(BasicRequest request, PeerId leader,
-        QPTask qpTask)
+        SingleQPTask qpTask)
         throws RaftConnectionException {
       try {
         BasicResponse response = (BasicResponse) boltClientService.getRpcClient()
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java b/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java
index f9c8c13..7d6516e 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/service/TSServiceClusterImpl.java
@@ -30,11 +30,13 @@ import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.exception.ConsistencyLevelException;
 import org.apache.iotdb.cluster.qp.executor.NonQueryExecutor;
 import org.apache.iotdb.cluster.qp.executor.QueryMetadataExecutor;
+import org.apache.iotdb.cluster.query.executor.QueryProcessorExecutor;
 import org.apache.iotdb.db.auth.AuthException;
 import org.apache.iotdb.db.conf.IoTDBConstant;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.exception.ProcessorException;
 import org.apache.iotdb.db.metadata.Metadata;
+import org.apache.iotdb.db.qp.QueryProcessor;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 import org.apache.iotdb.db.service.TSServiceImpl;
 import org.apache.iotdb.service.rpc.thrift.TSExecuteBatchStatementReq;
@@ -53,6 +55,7 @@ public class TSServiceClusterImpl extends TSServiceImpl {
 
   private static final Logger LOGGER = LoggerFactory.getLogger(TSServiceClusterImpl.class);
 
+  private QueryProcessor processor = new QueryProcessor(new QueryProcessorExecutor());
   private ThreadLocal<NonQueryExecutor> nonQueryExecutor = new ThreadLocal<>();
   private ThreadLocal<QueryMetadataExecutor> queryMetadataExecutor = new ThreadLocal<>();
 
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/qp/ClusterQPExecutorTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/qp/AbstractClusterQPExecutorTest.java
similarity index 98%
rename from cluster/src/test/java/org/apache/iotdb/cluster/qp/ClusterQPExecutorTest.java
rename to cluster/src/test/java/org/apache/iotdb/cluster/qp/AbstractClusterQPExecutorTest.java
index df93fcb..7959423 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/qp/ClusterQPExecutorTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/qp/AbstractClusterQPExecutorTest.java
@@ -31,7 +31,7 @@ import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
-public class ClusterQPExecutorTest {
+public class AbstractClusterQPExecutorTest {
 
   private static final ClusterConfig CLUSTER_CONFIG = ClusterDescriptor.getInstance().getConfig();
 
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/QueryProcessor.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/QueryProcessor.java
index c64c71a..62f4d80 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/QueryProcessor.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/QueryProcessor.java
@@ -27,7 +27,7 @@ import org.apache.iotdb.db.exception.qp.IllegalASTFormatException;
 import org.apache.iotdb.db.exception.qp.LogicalOperatorException;
 import org.apache.iotdb.db.exception.qp.LogicalOptimizeException;
 import org.apache.iotdb.db.exception.qp.QueryProcessorException;
-import org.apache.iotdb.db.qp.executor.QueryProcessExecutor;
+import org.apache.iotdb.db.qp.executor.AbstractQueryProcessExecutor;
 import org.apache.iotdb.db.qp.logical.Operator;
 import org.apache.iotdb.db.qp.logical.RootOperator;
 import org.apache.iotdb.db.qp.logical.crud.FilterOperator;
@@ -49,13 +49,13 @@ import org.apache.iotdb.db.sql.parse.ParseUtils;
  */
 public class QueryProcessor {
 
-  private QueryProcessExecutor executor;
+  private AbstractQueryProcessExecutor executor;
 
-  public QueryProcessor(QueryProcessExecutor executor) {
+  public QueryProcessor(AbstractQueryProcessExecutor executor) {
     this.executor = executor;
   }
 
-  public QueryProcessExecutor getExecutor() {
+  public AbstractQueryProcessExecutor getExecutor() {
     return executor;
   }
 
@@ -122,7 +122,7 @@ public class QueryProcessor {
    * @throws LogicalOptimizeException
    *             exception in logical optimizing
    */
-  private Operator logicalOptimize(Operator operator, QueryProcessExecutor executor)
+  private Operator logicalOptimize(Operator operator, AbstractQueryProcessExecutor executor)
       throws LogicalOperatorException {
     switch (operator.getType()) {
       case AUTHOR:
@@ -156,7 +156,7 @@ public class QueryProcessor {
    * @throws LogicalOptimizeException
    *             exception in SFW optimizing
    */
-  private SFWOperator optimizeSFWOperator(SFWOperator root, QueryProcessExecutor executor)
+  private SFWOperator optimizeSFWOperator(SFWOperator root, AbstractQueryProcessExecutor executor)
       throws LogicalOperatorException {
     ConcatPathOptimizer concatPathOptimizer = new ConcatPathOptimizer(executor);
     root = (SFWOperator) concatPathOptimizer.transform(root);
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/QueryProcessExecutor.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/AbstractQueryProcessExecutor.java
similarity index 96%
rename from iotdb/src/main/java/org/apache/iotdb/db/qp/executor/QueryProcessExecutor.java
rename to iotdb/src/main/java/org/apache/iotdb/db/qp/executor/AbstractQueryProcessExecutor.java
index 60f97f7..c9ec1b5 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/QueryProcessExecutor.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/AbstractQueryProcessExecutor.java
@@ -35,6 +35,7 @@ import org.apache.iotdb.db.qp.physical.crud.GroupByPlan;
 import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
 import org.apache.iotdb.db.query.context.QueryContext;
 import org.apache.iotdb.db.query.executor.EngineQueryRouter;
+import org.apache.iotdb.db.query.executor.IEngineQueryRouter;
 import org.apache.iotdb.db.query.fill.IFill;
 import org.apache.iotdb.tsfile.exception.filter.QueryFilterOptimizationException;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
@@ -44,12 +45,13 @@ import org.apache.iotdb.tsfile.read.expression.QueryExpression;
 import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
 import org.apache.iotdb.tsfile.utils.Pair;
 
-public abstract class QueryProcessExecutor {
+public abstract class AbstractQueryProcessExecutor {
 
   protected ThreadLocal<Integer> fetchSize = new ThreadLocal<>();
-  protected EngineQueryRouter queryRouter = new EngineQueryRouter();
+  protected IEngineQueryRouter queryRouter;
 
-  public QueryProcessExecutor() {
+  public AbstractQueryProcessExecutor(IEngineQueryRouter queryRouter) {
+    this.queryRouter = queryRouter;
   }
 
   /**
@@ -72,7 +74,7 @@ public abstract class QueryProcessExecutor {
 
     if (queryPlan instanceof AggregationPlan) {
       return aggregate(queryPlan.getPaths(), queryPlan.getAggregations(),
-          ((AggregationPlan) queryPlan).getExpression(), context);
+          queryPlan.getExpression(), context);
     }
 
     if (queryPlan instanceof FillQueryPlan) {
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/OverflowQPExecutor.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/OverflowQPExecutor.java
index a3bb2a4..505bbcc 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/OverflowQPExecutor.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/OverflowQPExecutor.java
@@ -52,6 +52,7 @@ import org.apache.iotdb.db.qp.physical.sys.LoadDataPlan;
 import org.apache.iotdb.db.qp.physical.sys.MetadataPlan;
 import org.apache.iotdb.db.qp.physical.sys.PropertyPlan;
 import org.apache.iotdb.db.query.context.QueryContext;
+import org.apache.iotdb.db.query.executor.EngineQueryRouter;
 import org.apache.iotdb.db.query.fill.IFill;
 import org.apache.iotdb.db.utils.AuthUtils;
 import org.apache.iotdb.db.utils.LoadDataUtils;
@@ -69,7 +70,7 @@ import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class OverflowQPExecutor extends QueryProcessExecutor {
+public class OverflowQPExecutor extends AbstractQueryProcessExecutor {
 
   private static final Logger LOG = LoggerFactory.getLogger(OverflowQPExecutor.class);
 
@@ -77,6 +78,7 @@ public class OverflowQPExecutor extends QueryProcessExecutor {
   private MManager mManager = MManager.getInstance();
 
   public OverflowQPExecutor() {
+    super(new EngineQueryRouter());
     fileNodeManager = FileNodeManager.getInstance();
   }
 
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/logical/crud/BasicFunctionOperator.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/logical/crud/BasicFunctionOperator.java
index 1472e54..a909db6 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/logical/crud/BasicFunctionOperator.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/logical/crud/BasicFunctionOperator.java
@@ -21,7 +21,7 @@ package org.apache.iotdb.db.qp.logical.crud;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.exception.qp.LogicalOperatorException;
 import org.apache.iotdb.db.qp.constant.SQLConstant;
-import org.apache.iotdb.db.qp.executor.QueryProcessExecutor;
+import org.apache.iotdb.db.qp.executor.AbstractQueryProcessExecutor;
 import org.apache.iotdb.db.qp.logical.Operator;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.Path;
@@ -97,7 +97,7 @@ public class BasicFunctionOperator extends FunctionOperator {
 
   @Override
   protected Pair<IUnaryExpression, String> transformToSingleQueryFilter(
-      QueryProcessExecutor executor)
+      AbstractQueryProcessExecutor executor)
       throws LogicalOperatorException, PathErrorException {
     TSDataType type = executor.getSeriesType(path);
     if (type == null) {
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/logical/crud/FilterOperator.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/logical/crud/FilterOperator.java
index a6c032b..3956c57 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/logical/crud/FilterOperator.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/logical/crud/FilterOperator.java
@@ -26,7 +26,7 @@ import java.util.List;
 import org.apache.iotdb.db.exception.qp.LogicalOperatorException;
 import org.apache.iotdb.db.exception.qp.QueryProcessorException;
 import org.apache.iotdb.db.qp.constant.SQLConstant;
-import org.apache.iotdb.db.qp.executor.QueryProcessExecutor;
+import org.apache.iotdb.db.qp.executor.AbstractQueryProcessExecutor;
 import org.apache.iotdb.db.qp.logical.Operator;
 import org.apache.iotdb.tsfile.read.common.Path;
 import org.apache.iotdb.tsfile.read.expression.IExpression;
@@ -111,7 +111,7 @@ public class FilterOperator extends Operator implements Comparable<FilterOperato
    *
    * @return QueryFilter in TsFile
    */
-  public IExpression transformToExpression(QueryProcessExecutor executor)
+  public IExpression transformToExpression(AbstractQueryProcessExecutor executor)
       throws QueryProcessorException {
     if (isSingle) {
       Pair<IUnaryExpression, String> ret = transformToSingleQueryFilter(executor);
@@ -149,7 +149,7 @@ public class FilterOperator extends Operator implements Comparable<FilterOperato
    * @throws QueryProcessorException exception in filter transforming
    */
   protected Pair<IUnaryExpression, String> transformToSingleQueryFilter(
-      QueryProcessExecutor executor)
+      AbstractQueryProcessExecutor executor)
       throws QueryProcessorException {
     if (childOperators.isEmpty()) {
       throw new LogicalOperatorException(
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/QueryPlan.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/QueryPlan.java
index 4e60c5b..5a747fa 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/QueryPlan.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/crud/QueryPlan.java
@@ -20,7 +20,7 @@ package org.apache.iotdb.db.qp.physical.crud;
 
 import java.util.List;
 import org.apache.iotdb.db.exception.qp.QueryProcessorException;
-import org.apache.iotdb.db.qp.executor.QueryProcessExecutor;
+import org.apache.iotdb.db.qp.executor.AbstractQueryProcessExecutor;
 import org.apache.iotdb.db.qp.logical.Operator;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 import org.apache.iotdb.tsfile.read.common.Path;
@@ -43,7 +43,7 @@ public class QueryPlan extends PhysicalPlan {
   /**
    * Check if all paths exist.
    */
-  public void checkPaths(QueryProcessExecutor executor) throws QueryProcessorException {
+  public void checkPaths(AbstractQueryProcessExecutor executor) throws QueryProcessorException {
     for (Path path : paths) {
       if (!executor.judgePathExists(path)) {
         throw new QueryProcessorException("Path doesn't exist: " + path);
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
index d33e044..c0cb8bb 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
@@ -24,7 +24,7 @@ import org.apache.iotdb.db.auth.AuthException;
 import org.apache.iotdb.db.exception.ProcessorException;
 import org.apache.iotdb.db.exception.qp.LogicalOperatorException;
 import org.apache.iotdb.db.exception.qp.QueryProcessorException;
-import org.apache.iotdb.db.qp.executor.QueryProcessExecutor;
+import org.apache.iotdb.db.qp.executor.AbstractQueryProcessExecutor;
 import org.apache.iotdb.db.qp.logical.Operator;
 import org.apache.iotdb.db.qp.logical.crud.BasicFunctionOperator;
 import org.apache.iotdb.db.qp.logical.crud.DeleteOperator;
@@ -57,9 +57,9 @@ import org.slf4j.LoggerFactory;
 public class PhysicalGenerator {
 
   private static final Logger logger = LoggerFactory.getLogger(PhysicalGenerator.class);
-  private QueryProcessExecutor executor;
+  private AbstractQueryProcessExecutor executor;
 
-  public PhysicalGenerator(QueryProcessExecutor executor) {
+  public PhysicalGenerator(AbstractQueryProcessExecutor executor) {
     this.executor = executor;
   }
 
@@ -278,7 +278,7 @@ public class PhysicalGenerator {
   }
 
   // private SingleQueryPlan constructSelectPlan(FilterOperator filterOperator, List<Path> paths,
-  // QueryProcessExecutor conf) throws QueryProcessorException {
+  // AbstractQueryProcessExecutor conf) throws QueryProcessorException {
   // FilterOperator timeFilter = null;
   // FilterOperator freqFilter = null;
   // FilterOperator valueFilter = null;
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/strategy/optimizer/ConcatPathOptimizer.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/strategy/optimizer/ConcatPathOptimizer.java
index 7941380..cdc1ca3 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/strategy/optimizer/ConcatPathOptimizer.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/strategy/optimizer/ConcatPathOptimizer.java
@@ -26,7 +26,7 @@ import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.exception.qp.LogicalOperatorException;
 import org.apache.iotdb.db.exception.qp.LogicalOptimizeException;
 import org.apache.iotdb.db.qp.constant.SQLConstant;
-import org.apache.iotdb.db.qp.executor.QueryProcessExecutor;
+import org.apache.iotdb.db.qp.executor.AbstractQueryProcessExecutor;
 import org.apache.iotdb.db.qp.logical.Operator;
 import org.apache.iotdb.db.qp.logical.crud.BasicFunctionOperator;
 import org.apache.iotdb.db.qp.logical.crud.FilterOperator;
@@ -46,9 +46,9 @@ public class ConcatPathOptimizer implements ILogicalOptimizer {
   private static final Logger LOG = LoggerFactory.getLogger(ConcatPathOptimizer.class);
   private static final String WARNING_NO_SUFFIX_PATHS = "given SFWOperator doesn't have suffix paths, cannot concat seriesPath";
 
-  private QueryProcessExecutor executor;
+  private AbstractQueryProcessExecutor executor;
 
-  public ConcatPathOptimizer(QueryProcessExecutor executor) {
+  public ConcatPathOptimizer(AbstractQueryProcessExecutor executor) {
     this.executor = executor;
   }
 
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/query/executor/EngineQueryRouter.java b/iotdb/src/main/java/org/apache/iotdb/db/query/executor/EngineQueryRouter.java
index c18e798..8470dde 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/query/executor/EngineQueryRouter.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/query/executor/EngineQueryRouter.java
@@ -47,11 +47,9 @@ import org.apache.iotdb.tsfile.utils.Pair;
  * Query entrance class of IoTDB query process. All query clause will be transformed to physical
  * plan, physical plan will be executed by EngineQueryRouter.
  */
-public class EngineQueryRouter {
+public class EngineQueryRouter implements IEngineQueryRouter{
 
-  /**
-   * execute physical plan.
-   */
+  @Override
   public QueryDataSet query(QueryExpression queryExpression, QueryContext context)
       throws FileNodeManagerException {
 
@@ -81,9 +79,7 @@ public class EngineQueryRouter {
     }
   }
 
-  /**
-   * execute aggregation query.
-   */
+  @Override
   public QueryDataSet aggregate(List<Path> selectedSeries, List<String> aggres,
       IExpression expression, QueryContext context) throws QueryFilterOptimizationException,
       FileNodeManagerException, IOException, PathErrorException, ProcessorException {
@@ -105,17 +101,7 @@ public class EngineQueryRouter {
     }
   }
 
-  /**
-   * execute groupBy query.
-   *
-   * @param selectedSeries select path list
-   * @param aggres aggregation name list
-   * @param expression filter expression
-   * @param unit time granularity for interval partitioning, unit is ms.
-   * @param origin the datum time point for interval division is divided into a time interval for
-   * each TimeUnit time from this point forward and backward.
-   * @param intervals time intervals, closed interval.
-   */
+  @Override
   public QueryDataSet groupBy(List<Path> selectedSeries, List<String> aggres,
       IExpression expression, long unit, long origin, List<Pair<Long, Long>> intervals,
       QueryContext context)
@@ -175,13 +161,7 @@ public class EngineQueryRouter {
     }
   }
 
-  /**
-   * execute fill query.
-   *
-   * @param fillPaths select path list
-   * @param queryTime timestamp
-   * @param fillType type IFill map
-   */
+  @Override
   public QueryDataSet fill(List<Path> fillPaths, long queryTime, Map<TSDataType, IFill> fillType,
       QueryContext context)
       throws FileNodeManagerException, PathErrorException, IOException {
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/query/executor/IEngineQueryRouter.java b/iotdb/src/main/java/org/apache/iotdb/db/query/executor/IEngineQueryRouter.java
new file mode 100644
index 0000000..fb30949
--- /dev/null
+++ b/iotdb/src/main/java/org/apache/iotdb/db/query/executor/IEngineQueryRouter.java
@@ -0,0 +1,61 @@
+
+package org.apache.iotdb.db.query.executor;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import org.apache.iotdb.db.exception.FileNodeManagerException;
+import org.apache.iotdb.db.exception.PathErrorException;
+import org.apache.iotdb.db.exception.ProcessorException;
+import org.apache.iotdb.db.query.context.QueryContext;
+import org.apache.iotdb.db.query.fill.IFill;
+import org.apache.iotdb.tsfile.exception.filter.QueryFilterOptimizationException;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.tsfile.read.common.Path;
+import org.apache.iotdb.tsfile.read.expression.IExpression;
+import org.apache.iotdb.tsfile.read.expression.QueryExpression;
+import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
+import org.apache.iotdb.tsfile.utils.Pair;
+
+public interface IEngineQueryRouter {
+
+  /**
+   * Execute physical plan.
+   */
+  QueryDataSet query(QueryExpression queryExpression, QueryContext context)
+      throws FileNodeManagerException;
+
+  /**
+   * Execute aggregation query.
+   */
+  QueryDataSet aggregate(List<Path> selectedSeries, List<String> aggres,
+      IExpression expression, QueryContext context)
+      throws QueryFilterOptimizationException, FileNodeManagerException, IOException, PathErrorException, ProcessorException;
+
+  /**
+   * Execute groupBy query.
+   *
+   * @param selectedSeries select path list
+   * @param aggres aggregation name list
+   * @param expression filter expression
+   * @param unit time granularity for interval partitioning, unit is ms.
+   * @param origin the datum time point for interval division is divided into a time interval for
+   * each TimeUnit time from this point forward and backward.
+   * @param intervals time intervals, closed interval.
+   */
+  QueryDataSet groupBy(List<Path> selectedSeries, List<String> aggres,
+      IExpression expression, long unit, long origin, List<Pair<Long, Long>> intervals,
+      QueryContext context)
+      throws ProcessorException, QueryFilterOptimizationException, FileNodeManagerException,
+      PathErrorException, IOException;
+  /**
+   * Execute fill query.
+   *
+   * @param fillPaths select path list
+   * @param queryTime timestamp
+   * @param fillType type IFill map
+   */
+  QueryDataSet fill(List<Path> fillPaths, long queryTime, Map<TSDataType, IFill> fillType,
+      QueryContext context) throws FileNodeManagerException, PathErrorException, IOException;
+
+}
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java b/iotdb/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
index 299133c..c0e711b 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
@@ -99,7 +99,7 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
   protected static final String INFO_NOT_LOGIN = "{}: Not login.";
   protected static final String ERROR_NOT_LOGIN = "Not login";
 
-  protected QueryProcessor processor = new QueryProcessor(new OverflowQPExecutor());
+  private QueryProcessor processor = new QueryProcessor(new OverflowQPExecutor());
   // Record the username for every rpc connection. Username.get() is null if
   // login is failed.
   protected ThreadLocal<String> username = new ThreadLocal<>();
diff --git a/iotdb/src/test/java/org/apache/iotdb/db/qp/utils/MemIntQpExecutor.java b/iotdb/src/test/java/org/apache/iotdb/db/qp/utils/MemIntQpExecutor.java
index 1446cb1..a8ace20 100644
--- a/iotdb/src/test/java/org/apache/iotdb/db/qp/utils/MemIntQpExecutor.java
+++ b/iotdb/src/test/java/org/apache/iotdb/db/qp/utils/MemIntQpExecutor.java
@@ -31,12 +31,13 @@ import org.apache.iotdb.db.exception.FileNodeManagerException;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.exception.ProcessorException;
 import org.apache.iotdb.db.qp.constant.SQLConstant;
-import org.apache.iotdb.db.qp.executor.QueryProcessExecutor;
+import org.apache.iotdb.db.qp.executor.AbstractQueryProcessExecutor;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 import org.apache.iotdb.db.qp.physical.crud.DeletePlan;
 import org.apache.iotdb.db.qp.physical.crud.InsertPlan;
 import org.apache.iotdb.db.qp.physical.crud.UpdatePlan;
 import org.apache.iotdb.db.query.context.QueryContext;
+import org.apache.iotdb.db.query.executor.EngineQueryRouter;
 import org.apache.iotdb.db.query.fill.IFill;
 import org.apache.iotdb.tsfile.exception.filter.QueryFilterOptimizationException;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
@@ -50,7 +51,7 @@ import org.slf4j.LoggerFactory;
 /**
  * Implement a simple executor with a memory demo reading processor for test.
  */
-public class MemIntQpExecutor extends QueryProcessExecutor {
+public class MemIntQpExecutor extends AbstractQueryProcessExecutor {
 
   private static Logger LOG = LoggerFactory.getLogger(MemIntQpExecutor.class);
 
@@ -61,6 +62,7 @@ public class MemIntQpExecutor extends QueryProcessExecutor {
   private Map<String, List<String>> fakeAllPaths;
 
   public MemIntQpExecutor() {
+    super(new EngineQueryRouter());
     this.fetchSize.set(5);
   }
 
diff --git a/iotdb/src/test/java/org/apache/iotdb/db/query/dataset/EngineDataSetWithTimeGeneratorTest.java b/iotdb/src/test/java/org/apache/iotdb/db/query/dataset/EngineDataSetWithTimeGeneratorTest.java
index 6dec434..04b31e0 100644
--- a/iotdb/src/test/java/org/apache/iotdb/db/query/dataset/EngineDataSetWithTimeGeneratorTest.java
+++ b/iotdb/src/test/java/org/apache/iotdb/db/query/dataset/EngineDataSetWithTimeGeneratorTest.java
@@ -24,8 +24,8 @@ import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
 import org.apache.iotdb.db.qp.QueryProcessor;
+import org.apache.iotdb.db.qp.executor.AbstractQueryProcessExecutor;
 import org.apache.iotdb.db.qp.executor.OverflowQPExecutor;
-import org.apache.iotdb.db.qp.executor.QueryProcessExecutor;
 import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
 import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
@@ -35,7 +35,7 @@ import org.junit.Test;
 
 public class EngineDataSetWithTimeGeneratorTest {
 
-  private QueryProcessExecutor queryExecutor = new OverflowQPExecutor();
+  private AbstractQueryProcessExecutor queryExecutor = new OverflowQPExecutor();
   private QueryProcessor processor = new QueryProcessor(queryExecutor);
   private String[] sqls = {
       "SET STORAGE GROUP TO root.vehicle",