You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ro...@apache.org on 2021/09/03 09:07:39 UTC

[iotdb] branch nested-operations updated (c8e960b -> 6bab3ff)

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

rong pushed a change to branch nested-operations
in repository https://gitbox.apache.org/repos/asf/iotdb.git.


    from c8e960b  SingleInputSingleOutputIntermediateLayer & SingleInputMultiOutputIntermediateLayer
     new 8672e1a  MultiInputSingleOutputIntermediateLayer & MultiInputMultiOutputIntermediateLayer
     new 6dfba2c  refactor: inputLayer -> udfLayer
     new 6bab3ff  new access data structures

The 3 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.


Summary of changes:
 .../db/query/dataset/UDTFAlignByTimeDataSet.java   |  4 +-
 .../apache/iotdb/db/query/dataset/UDTFDataSet.java | 18 ++--
 .../db/query/dataset/UDTFNonAlignDataSet.java      |  2 +-
 .../iotdb/db/query/expression/Expression.java      |  4 +-
 .../query/expression/binary/BinaryExpression.java  |  8 +-
 .../query/expression/unary/FunctionExpression.java | 11 +--
 .../query/expression/unary/NegationExpression.java |  6 +-
 .../query/expression/unary/TimeSeriesOperand.java  |  7 +-
 .../apache/iotdb/db/query/udf/api/access/Row.java  | 18 ++--
 ...ticSerializableTVListBackedSingleColumnRow.java | 99 ++++++++++++++++++++++
 ...SerializableTVListBackedSingleColumnWindow.java | 90 ++++++++++++++++++++
 ...bleTVListBackedSingleColumnWindowIterator.java} | 30 +++----
 .../LayerPointReaderBackedSingleColumnRow.java     | 91 ++++++++++++++++++++
 .../access/{RowImpl.java => MultiColumnRow.java}   |  4 +-
 .../{RowWindowImpl.java => MultiColumnWindow.java} | 16 ++--
 ...torImpl.java => MultiColumnWindowIterator.java} |  8 +-
 .../iotdb/db/query/udf/core/layer/DAGBuilder.java  | 35 ++++----
 ...=> MultiInputMultiOutputIntermediateLayer.java} |  4 +-
 ...> MultiInputSingleOutputIntermediateLayer.java} |  4 +-
 .../core/layer/{InputLayer.java => UDFLayer.java}  |  6 +-
 20 files changed, 377 insertions(+), 88 deletions(-)
 create mode 100644 server/src/main/java/org/apache/iotdb/db/query/udf/core/access/ElasticSerializableTVListBackedSingleColumnRow.java
 create mode 100644 server/src/main/java/org/apache/iotdb/db/query/udf/core/access/ElasticSerializableTVListBackedSingleColumnWindow.java
 copy server/src/main/java/org/apache/iotdb/db/query/udf/core/access/{RowIteratorImpl.java => ElasticSerializableTVListBackedSingleColumnWindowIterator.java} (58%)
 create mode 100644 server/src/main/java/org/apache/iotdb/db/query/udf/core/access/LayerPointReaderBackedSingleColumnRow.java
 rename server/src/main/java/org/apache/iotdb/db/query/udf/core/access/{RowImpl.java => MultiColumnRow.java} (95%)
 rename server/src/main/java/org/apache/iotdb/db/query/udf/core/access/{RowWindowImpl.java => MultiColumnWindow.java} (86%)
 rename server/src/main/java/org/apache/iotdb/db/query/udf/core/access/{RowIteratorImpl.java => MultiColumnWindowIterator.java} (90%)
 copy server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/{MultiInputIntermediateLayer.java => MultiInputMultiOutputIntermediateLayer.java} (89%)
 rename server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/{MultiInputIntermediateLayer.java => MultiInputSingleOutputIntermediateLayer.java} (89%)
 rename server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/{InputLayer.java => UDFLayer.java} (99%)

[iotdb] 01/03: MultiInputSingleOutputIntermediateLayer & MultiInputMultiOutputIntermediateLayer

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

rong pushed a commit to branch nested-operations
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 8672e1a64ee02ac3cb0f5299e9fd206cebc7a469
Author: Steve Yurong Su <ro...@apache.org>
AuthorDate: Thu Sep 2 16:40:42 2021 +0800

    MultiInputSingleOutputIntermediateLayer & MultiInputMultiOutputIntermediateLayer
---
 .../apache/iotdb/db/query/expression/unary/FunctionExpression.java    | 4 ++--
 ...rmediateLayer.java => MultiInputMultiOutputIntermediateLayer.java} | 4 ++--
 ...mediateLayer.java => MultiInputSingleOutputIntermediateLayer.java} | 4 ++--
 3 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/FunctionExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/FunctionExpression.java
index 7f55995..696e2d2 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/FunctionExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/FunctionExpression.java
@@ -29,7 +29,7 @@ import org.apache.iotdb.db.qp.utils.WildcardsRemover;
 import org.apache.iotdb.db.query.expression.Expression;
 import org.apache.iotdb.db.query.udf.core.layer.InputLayer;
 import org.apache.iotdb.db.query.udf.core.layer.IntermediateLayer;
-import org.apache.iotdb.db.query.udf.core.layer.MultiInputIntermediateLayer;
+import org.apache.iotdb.db.query.udf.core.layer.MultiInputMultiOutputIntermediateLayer;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 
 import java.util.ArrayList;
@@ -164,7 +164,7 @@ public class FunctionExpression extends Expression {
       }
 
       expressionIntermediateLayerMap.put(
-          this, new MultiInputIntermediateLayer(parentLayerPointReaders, -1, -1));
+          this, new MultiInputMultiOutputIntermediateLayer(parentLayerPointReaders, -1, -1));
     }
 
     return expressionIntermediateLayerMap.get(this);
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/MultiInputIntermediateLayer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/MultiInputMultiOutputIntermediateLayer.java
similarity index 89%
copy from server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/MultiInputIntermediateLayer.java
copy to server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/MultiInputMultiOutputIntermediateLayer.java
index 260c308..9cd5422 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/MultiInputIntermediateLayer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/MultiInputMultiOutputIntermediateLayer.java
@@ -23,9 +23,9 @@ import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 
 import java.util.List;
 
-public class MultiInputIntermediateLayer implements IntermediateLayer {
+public class MultiInputMultiOutputIntermediateLayer implements IntermediateLayer {
 
-  public MultiInputIntermediateLayer(
+  public MultiInputMultiOutputIntermediateLayer(
       List<LayerPointReader> parentLayerPointReaders, long queryId, float memoryBudgetInMB) {}
 
   @Override
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/MultiInputIntermediateLayer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/MultiInputSingleOutputIntermediateLayer.java
similarity index 89%
rename from server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/MultiInputIntermediateLayer.java
rename to server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/MultiInputSingleOutputIntermediateLayer.java
index 260c308..71a4f06 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/MultiInputIntermediateLayer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/MultiInputSingleOutputIntermediateLayer.java
@@ -23,9 +23,9 @@ import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 
 import java.util.List;
 
-public class MultiInputIntermediateLayer implements IntermediateLayer {
+public class MultiInputSingleOutputIntermediateLayer implements IntermediateLayer {
 
-  public MultiInputIntermediateLayer(
+  public MultiInputSingleOutputIntermediateLayer(
       List<LayerPointReader> parentLayerPointReaders, long queryId, float memoryBudgetInMB) {}
 
   @Override

[iotdb] 02/03: refactor: inputLayer -> udfLayer

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

rong pushed a commit to branch nested-operations
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 6dfba2c72dd5d1899f989f88780bed03f1bf51f8
Author: Steve Yurong Su <ro...@apache.org>
AuthorDate: Fri Sep 3 09:33:18 2021 +0800

    refactor: inputLayer -> udfLayer
---
 .../db/query/dataset/UDTFAlignByTimeDataSet.java   |  4 +--
 .../apache/iotdb/db/query/dataset/UDTFDataSet.java | 18 +++++------
 .../db/query/dataset/UDTFNonAlignDataSet.java      |  2 +-
 .../iotdb/db/query/expression/Expression.java      |  4 +--
 .../query/expression/binary/BinaryExpression.java  |  8 ++---
 .../query/expression/unary/FunctionExpression.java |  7 +++--
 .../query/expression/unary/NegationExpression.java |  6 ++--
 .../query/expression/unary/TimeSeriesOperand.java  |  7 +++--
 .../iotdb/db/query/udf/core/layer/DAGBuilder.java  | 35 ++++++++++++----------
 .../core/layer/{InputLayer.java => UDFLayer.java}  |  6 ++--
 10 files changed, 52 insertions(+), 45 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/query/dataset/UDTFAlignByTimeDataSet.java b/server/src/main/java/org/apache/iotdb/db/query/dataset/UDTFAlignByTimeDataSet.java
index 6c065c2..c7e8af4 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/dataset/UDTFAlignByTimeDataSet.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/dataset/UDTFAlignByTimeDataSet.java
@@ -193,7 +193,7 @@ public class UDTFAlignByTimeDataSet extends UDTFDataSet implements DirectAlignBy
       }
 
       // todo: control upper bound here
-      inputLayer.updateRowRecordListEvictionUpperBound();
+      udfLayer.updateRowRecordListEvictionUpperBound();
     }
 
     /*
@@ -296,7 +296,7 @@ public class UDTFAlignByTimeDataSet extends UDTFDataSet implements DirectAlignBy
     }
 
     // todo: control upper bound here
-    inputLayer.updateRowRecordListEvictionUpperBound();
+    udfLayer.updateRowRecordListEvictionUpperBound();
 
     return rowRecord;
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/dataset/UDTFDataSet.java b/server/src/main/java/org/apache/iotdb/db/query/dataset/UDTFDataSet.java
index 0f9ef3d..6ed497d 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/dataset/UDTFDataSet.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/dataset/UDTFDataSet.java
@@ -36,7 +36,7 @@ import org.apache.iotdb.db.query.reader.series.IReaderByTimestamp;
 import org.apache.iotdb.db.query.reader.series.ManagedSeriesReader;
 import org.apache.iotdb.db.query.udf.api.customizer.strategy.AccessStrategy;
 import org.apache.iotdb.db.query.udf.core.executor.UDTFExecutor;
-import org.apache.iotdb.db.query.udf.core.layer.InputLayer;
+import org.apache.iotdb.db.query.udf.core.layer.UDFLayer;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 import org.apache.iotdb.db.query.udf.core.transformer.ArithmeticAdditionTransformer;
 import org.apache.iotdb.db.query.udf.core.transformer.ArithmeticDivisionTransformer;
@@ -67,7 +67,7 @@ public abstract class UDTFDataSet extends QueryDataSet {
 
   protected final long queryId;
   protected final UDTFPlan udtfPlan;
-  protected final InputLayer inputLayer;
+  protected final UDFLayer udfLayer;
 
   protected LayerPointReader[] transformers;
 
@@ -84,8 +84,8 @@ public abstract class UDTFDataSet extends QueryDataSet {
     super(new ArrayList<>(deduplicatedPaths), deduplicatedDataTypes);
     queryId = queryContext.getQueryId();
     this.udtfPlan = udtfPlan;
-    inputLayer =
-        new InputLayer(
+    udfLayer =
+        new UDFLayer(
             queryId,
             UDF_READER_MEMORY_BUDGET_IN_MB,
             deduplicatedPaths,
@@ -108,8 +108,8 @@ public abstract class UDTFDataSet extends QueryDataSet {
     super(new ArrayList<>(deduplicatedPaths), deduplicatedDataTypes);
     queryId = queryContext.getQueryId();
     this.udtfPlan = udtfPlan;
-    inputLayer =
-        new InputLayer(
+    udfLayer =
+        new UDFLayer(
             queryId,
             UDF_READER_MEMORY_BUDGET_IN_MB,
             deduplicatedPaths,
@@ -167,13 +167,13 @@ public abstract class UDTFDataSet extends QueryDataSet {
     switch (accessStrategy.getAccessStrategyType()) {
       case ROW_BY_ROW:
         transformers[columnIndex] =
-            new UDFQueryRowTransformer(inputLayer.constructRowReader(readerIndexes), executor);
+            new UDFQueryRowTransformer(udfLayer.constructRowReader(readerIndexes), executor);
         break;
       case SLIDING_SIZE_WINDOW:
       case SLIDING_TIME_WINDOW:
         transformers[columnIndex] =
             new UDFQueryRowWindowTransformer(
-                inputLayer.constructRowWindowReader(
+                udfLayer.constructRowWindowReader(
                     readerIndexes, accessStrategy, memoryBudgetForSingleWindowTransformer),
                 executor);
         break;
@@ -254,7 +254,7 @@ public abstract class UDTFDataSet extends QueryDataSet {
   }
 
   private LayerPointReader constructPointReaderBySeriesName(String seriesName) {
-    return inputLayer.constructPointReader(udtfPlan.getReaderIndex(seriesName));
+    return udfLayer.constructPointReader(udtfPlan.getReaderIndex(seriesName));
   }
 
   public void finalizeUDFs(long queryId) {
diff --git a/server/src/main/java/org/apache/iotdb/db/query/dataset/UDTFNonAlignDataSet.java b/server/src/main/java/org/apache/iotdb/db/query/dataset/UDTFNonAlignDataSet.java
index 25dd871..e3810bb 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/dataset/UDTFNonAlignDataSet.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/dataset/UDTFNonAlignDataSet.java
@@ -114,7 +114,7 @@ public class UDTFNonAlignDataSet extends UDTFDataSet implements DirectNonAlignDa
     }
 
     // todo: control upper bound here
-    inputLayer.updateRowRecordListEvictionUpperBound();
+    udfLayer.updateRowRecordListEvictionUpperBound();
 
     tsQueryNonAlignDataSet.setTimeList(timeBufferList);
     tsQueryNonAlignDataSet.setValueList(valueBufferList);
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/Expression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/Expression.java
index 9dd75bd..09a15ad 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/Expression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/Expression.java
@@ -24,8 +24,8 @@ import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.metadata.PartialPath;
 import org.apache.iotdb.db.qp.physical.crud.UDTFPlan;
 import org.apache.iotdb.db.qp.utils.WildcardsRemover;
-import org.apache.iotdb.db.query.udf.core.layer.InputLayer;
 import org.apache.iotdb.db.query.udf.core.layer.IntermediateLayer;
+import org.apache.iotdb.db.query.udf.core.layer.UDFLayer;
 
 import java.util.List;
 import java.util.Map;
@@ -53,7 +53,7 @@ public abstract class Expression {
 
   public abstract IntermediateLayer constructIntermediateLayer(
       UDTFPlan udtfPlan,
-      InputLayer inputLayer,
+      UDFLayer rawTimeSeriesInputLayer,
       Map<Expression, IntermediateLayer> expressionIntermediateLayerMap)
       throws QueryProcessException;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/BinaryExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/BinaryExpression.java
index e31496c..b793ef9 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/BinaryExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/BinaryExpression.java
@@ -25,9 +25,9 @@ import org.apache.iotdb.db.metadata.PartialPath;
 import org.apache.iotdb.db.qp.physical.crud.UDTFPlan;
 import org.apache.iotdb.db.qp.utils.WildcardsRemover;
 import org.apache.iotdb.db.query.expression.Expression;
-import org.apache.iotdb.db.query.udf.core.layer.InputLayer;
 import org.apache.iotdb.db.query.udf.core.layer.IntermediateLayer;
 import org.apache.iotdb.db.query.udf.core.layer.SingleInputMultiOutputIntermediateLayer;
+import org.apache.iotdb.db.query.udf.core.layer.UDFLayer;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 import org.apache.iotdb.db.query.udf.core.transformer.ArithmeticBinaryTransformer;
 
@@ -113,16 +113,16 @@ public abstract class BinaryExpression extends Expression {
   @Override
   public IntermediateLayer constructIntermediateLayer(
       UDTFPlan udtfPlan,
-      InputLayer inputLayer,
+      UDFLayer rawTimeSeriesInputLayer,
       Map<Expression, IntermediateLayer> expressionIntermediateLayerMap)
       throws QueryProcessException {
     if (!expressionIntermediateLayerMap.containsKey(this)) {
       IntermediateLayer leftParentIntermediateLayer =
           leftExpression.constructIntermediateLayer(
-              udtfPlan, inputLayer, expressionIntermediateLayerMap);
+              udtfPlan, rawTimeSeriesInputLayer, expressionIntermediateLayerMap);
       IntermediateLayer rightParentIntermediateLayer =
           rightExpression.constructIntermediateLayer(
-              udtfPlan, inputLayer, expressionIntermediateLayerMap);
+              udtfPlan, rawTimeSeriesInputLayer, expressionIntermediateLayerMap);
 
       expressionIntermediateLayerMap.put(
           this,
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/FunctionExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/FunctionExpression.java
index 696e2d2..d484769 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/FunctionExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/FunctionExpression.java
@@ -27,9 +27,9 @@ import org.apache.iotdb.db.qp.physical.crud.UDTFPlan;
 import org.apache.iotdb.db.qp.strategy.optimizer.ConcatPathOptimizer;
 import org.apache.iotdb.db.qp.utils.WildcardsRemover;
 import org.apache.iotdb.db.query.expression.Expression;
-import org.apache.iotdb.db.query.udf.core.layer.InputLayer;
 import org.apache.iotdb.db.query.udf.core.layer.IntermediateLayer;
 import org.apache.iotdb.db.query.udf.core.layer.MultiInputMultiOutputIntermediateLayer;
+import org.apache.iotdb.db.query.udf.core.layer.UDFLayer;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 
 import java.util.ArrayList;
@@ -151,7 +151,7 @@ public class FunctionExpression extends Expression {
   @Override
   public IntermediateLayer constructIntermediateLayer(
       UDTFPlan udtfPlan,
-      InputLayer inputLayer,
+      UDFLayer rawTimeSeriesInputLayer,
       Map<Expression, IntermediateLayer> expressionIntermediateLayerMap)
       throws QueryProcessException {
     if (!expressionIntermediateLayerMap.containsKey(this)) {
@@ -159,7 +159,8 @@ public class FunctionExpression extends Expression {
       for (Expression expression : expressions) {
         parentLayerPointReaders.add(
             expression
-                .constructIntermediateLayer(udtfPlan, inputLayer, expressionIntermediateLayerMap)
+                .constructIntermediateLayer(
+                    udtfPlan, rawTimeSeriesInputLayer, expressionIntermediateLayerMap)
                 .constructPointReader());
       }
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/NegationExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/NegationExpression.java
index 8dcdc73..326d1af 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/NegationExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/NegationExpression.java
@@ -25,9 +25,9 @@ import org.apache.iotdb.db.metadata.PartialPath;
 import org.apache.iotdb.db.qp.physical.crud.UDTFPlan;
 import org.apache.iotdb.db.qp.utils.WildcardsRemover;
 import org.apache.iotdb.db.query.expression.Expression;
-import org.apache.iotdb.db.query.udf.core.layer.InputLayer;
 import org.apache.iotdb.db.query.udf.core.layer.IntermediateLayer;
 import org.apache.iotdb.db.query.udf.core.layer.SingleInputMultiOutputIntermediateLayer;
+import org.apache.iotdb.db.query.udf.core.layer.UDFLayer;
 import org.apache.iotdb.db.query.udf.core.transformer.ArithmeticNegationTransformer;
 
 import java.util.ArrayList;
@@ -79,13 +79,13 @@ public class NegationExpression extends Expression {
   @Override
   public IntermediateLayer constructIntermediateLayer(
       UDTFPlan udtfPlan,
-      InputLayer inputLayer,
+      UDFLayer rawTimeSeriesInputLayer,
       Map<Expression, IntermediateLayer> expressionIntermediateLayerMap)
       throws QueryProcessException {
     if (!expressionIntermediateLayerMap.containsKey(this)) {
       IntermediateLayer parentIntermediateLayer =
           expression.constructIntermediateLayer(
-              udtfPlan, inputLayer, expressionIntermediateLayerMap);
+              udtfPlan, rawTimeSeriesInputLayer, expressionIntermediateLayerMap);
 
       expressionIntermediateLayerMap.put(
           this,
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/TimeSeriesOperand.java b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/TimeSeriesOperand.java
index 9b17315..a67e621 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/TimeSeriesOperand.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/TimeSeriesOperand.java
@@ -25,9 +25,9 @@ import org.apache.iotdb.db.metadata.PartialPath;
 import org.apache.iotdb.db.qp.physical.crud.UDTFPlan;
 import org.apache.iotdb.db.qp.utils.WildcardsRemover;
 import org.apache.iotdb.db.query.expression.Expression;
-import org.apache.iotdb.db.query.udf.core.layer.InputLayer;
 import org.apache.iotdb.db.query.udf.core.layer.IntermediateLayer;
 import org.apache.iotdb.db.query.udf.core.layer.SingleInputMultiOutputIntermediateLayer;
+import org.apache.iotdb.db.query.udf.core.layer.UDFLayer;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
 import java.util.List;
@@ -74,14 +74,15 @@ public class TimeSeriesOperand extends Expression {
   @Override
   public IntermediateLayer constructIntermediateLayer(
       UDTFPlan udtfPlan,
-      InputLayer inputLayer,
+      UDFLayer rawTimeSeriesInputLayer,
       Map<Expression, IntermediateLayer> expressionIntermediateLayerMap)
       throws QueryProcessException {
     if (!expressionIntermediateLayerMap.containsKey(this)) {
       expressionIntermediateLayerMap.put(
           this,
           new SingleInputMultiOutputIntermediateLayer(
-              inputLayer.constructPointReader(udtfPlan.getReaderIndex(path.getFullPath())),
+              rawTimeSeriesInputLayer.constructPointReader(
+                  udtfPlan.getReaderIndex(path.getFullPath())),
               -1,
               -1));
     }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/DAGBuilder.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/DAGBuilder.java
index 472ca2d..6a107d7 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/DAGBuilder.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/DAGBuilder.java
@@ -23,7 +23,7 @@ import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.qp.physical.crud.UDTFPlan;
 import org.apache.iotdb.db.query.expression.Expression;
 import org.apache.iotdb.db.query.expression.ResultColumn;
-import org.apache.iotdb.db.query.udf.core.transformer.Transformer;
+import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -33,42 +33,47 @@ import java.util.Map;
 public class DAGBuilder {
 
   private final UDTFPlan udtfPlan;
-  private final InputLayer inputLayer;
+  private final UDFLayer rawTimeSeriesInputLayer;
 
   // input
   private final List<Expression> resultColumnExpressions;
   // output
-  private final Transformer[] resultColumnTransformers;
+  private final LayerPointReader[] resultColumnPointReaders;
 
   // all result column expressions will be split into several sub-expressions, each expression has
-  // its own transformer. different result column expressions may have the same sub-expressions,
-  // but they can share the same transformer. we cache the transformer here to make sure that only
-  // one transformer will be built for one expression.
+  // its own result point reader. different result column expressions may have the same
+  // sub-expressions, but they can share the same point reader. we cache the point reader here to
+  // make sure that only one point reader will be built for one expression.
   private final Map<Expression, IntermediateLayer> expressionIntermediateLayerMap;
 
-  public DAGBuilder(UDTFPlan udtfPlan, InputLayer inputLayer) throws QueryProcessException {
+  public DAGBuilder(UDTFPlan udtfPlan, UDFLayer inputLayer) throws QueryProcessException {
     this.udtfPlan = udtfPlan;
-    this.inputLayer = inputLayer;
+    this.rawTimeSeriesInputLayer = inputLayer;
 
     resultColumnExpressions = new ArrayList<>();
     for (ResultColumn resultColumn : udtfPlan.getResultColumns()) {
       resultColumnExpressions.add(resultColumn.getExpression());
     }
-    resultColumnTransformers = new Transformer[resultColumnExpressions.size()];
+    resultColumnPointReaders = new LayerPointReader[resultColumnExpressions.size()];
 
     expressionIntermediateLayerMap = new HashMap<>();
 
     build();
   }
 
-  public void build() throws QueryProcessException {
-    for (Expression resultColumnExpression : resultColumnExpressions) {
-      resultColumnExpression.constructIntermediateLayer(
-          udtfPlan, inputLayer, expressionIntermediateLayerMap);
+  public DAGBuilder build() throws QueryProcessException {
+    for (int i = 0; i < resultColumnExpressions.size(); ++i) {
+      resultColumnPointReaders[i] =
+          resultColumnExpressions
+              .get(i)
+              .constructIntermediateLayer(
+                  udtfPlan, rawTimeSeriesInputLayer, expressionIntermediateLayerMap)
+              .constructPointReader();
     }
+    return this;
   }
 
-  public Transformer[] getResultColumnTransformers() {
-    return resultColumnTransformers;
+  public LayerPointReader[] getResultColumnPointReaders() {
+    return resultColumnPointReaders;
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/InputLayer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/UDFLayer.java
similarity index 99%
rename from server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/InputLayer.java
rename to server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/UDFLayer.java
index f16a210..a613c4c 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/InputLayer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/UDFLayer.java
@@ -49,7 +49,7 @@ import org.apache.iotdb.tsfile.utils.Binary;
 import java.io.IOException;
 import java.util.List;
 
-public class InputLayer {
+public class UDFLayer {
 
   private long queryId;
 
@@ -61,7 +61,7 @@ public class InputLayer {
   private SafetyLine safetyLine;
 
   /** InputLayerWithoutValueFilter */
-  public InputLayer(
+  public UDFLayer(
       long queryId,
       float memoryBudgetInMB,
       List<PartialPath> paths,
@@ -75,7 +75,7 @@ public class InputLayer {
   }
 
   /** InputLayerWithValueFilter */
-  public InputLayer(
+  public UDFLayer(
       long queryId,
       float memoryBudgetInMB,
       List<PartialPath> paths,

[iotdb] 03/03: new access data structures

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

rong pushed a commit to branch nested-operations
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 6bab3ff128cd2ee47f32339d541d09af11ef0d77
Author: Steve Yurong Su <ro...@apache.org>
AuthorDate: Fri Sep 3 17:07:04 2021 +0800

    new access data structures
---
 .../apache/iotdb/db/query/udf/api/access/Row.java  | 18 ++--
 ...ticSerializableTVListBackedSingleColumnRow.java | 99 ++++++++++++++++++++++
 ...SerializableTVListBackedSingleColumnWindow.java | 90 ++++++++++++++++++++
 ...bleTVListBackedSingleColumnWindowIterator.java} | 30 +++----
 .../LayerPointReaderBackedSingleColumnRow.java     | 91 ++++++++++++++++++++
 .../access/{RowImpl.java => MultiColumnRow.java}   |  4 +-
 .../{RowWindowImpl.java => MultiColumnWindow.java} | 16 ++--
 ...torImpl.java => MultiColumnWindowIterator.java} |  8 +-
 8 files changed, 319 insertions(+), 37 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/api/access/Row.java b/server/src/main/java/org/apache/iotdb/db/query/udf/api/access/Row.java
index 5939a5d..eaf1f7c 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/api/access/Row.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/api/access/Row.java
@@ -22,6 +22,8 @@ package org.apache.iotdb.db.query.udf.api.access;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.utils.Binary;
 
+import java.io.IOException;
+
 public interface Row {
 
   /**
@@ -29,7 +31,7 @@ public interface Row {
    *
    * @return timestamp
    */
-  long getTime();
+  long getTime() throws IOException;
 
   /**
    * Returns the int value at the specified column in this row.
@@ -39,7 +41,7 @@ public interface Row {
    * @param columnIndex index of the specified column
    * @return the int value at the specified column in this row
    */
-  int getInt(int columnIndex);
+  int getInt(int columnIndex) throws IOException;
 
   /**
    * Returns the long value at the specified column in this row.
@@ -49,7 +51,7 @@ public interface Row {
    * @param columnIndex index of the specified column
    * @return the long value at the specified column in this row
    */
-  long getLong(int columnIndex);
+  long getLong(int columnIndex) throws IOException;
 
   /**
    * Returns the float value at the specified column in this row.
@@ -59,7 +61,7 @@ public interface Row {
    * @param columnIndex index of the specified column
    * @return the float value at the specified column in this row
    */
-  float getFloat(int columnIndex);
+  float getFloat(int columnIndex) throws IOException;
 
   /**
    * Returns the double value at the specified column in this row.
@@ -70,7 +72,7 @@ public interface Row {
    * @param columnIndex index of the specified column
    * @return the double value at the specified column in this row
    */
-  double getDouble(int columnIndex);
+  double getDouble(int columnIndex) throws IOException;
 
   /**
    * Returns the boolean value at the specified column in this row.
@@ -81,7 +83,7 @@ public interface Row {
    * @param columnIndex index of the specified column
    * @return the boolean value at the specified column in this row
    */
-  boolean getBoolean(int columnIndex);
+  boolean getBoolean(int columnIndex) throws IOException;
 
   /**
    * Returns the Binary value at the specified column in this row.
@@ -91,7 +93,7 @@ public interface Row {
    * @param columnIndex index of the specified column
    * @return the Binary value at the specified column in this row
    */
-  Binary getBinary(int columnIndex);
+  Binary getBinary(int columnIndex) throws IOException;
 
   /**
    * Returns the String value at the specified column in this row.
@@ -101,7 +103,7 @@ public interface Row {
    * @param columnIndex index of the specified column
    * @return the String value at the specified column in this row
    */
-  String getString(int columnIndex);
+  String getString(int columnIndex) throws IOException;
 
   /**
    * Returns the actual data type of the value at the specified column in this row.
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/access/ElasticSerializableTVListBackedSingleColumnRow.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/access/ElasticSerializableTVListBackedSingleColumnRow.java
new file mode 100644
index 0000000..1207f32
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/access/ElasticSerializableTVListBackedSingleColumnRow.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.db.query.udf.core.access;
+
+import org.apache.iotdb.db.query.udf.api.access.Row;
+import org.apache.iotdb.db.query.udf.datastructure.tv.ElasticSerializableTVList;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.tsfile.utils.Binary;
+
+import java.io.IOException;
+
+public class ElasticSerializableTVListBackedSingleColumnRow implements Row {
+
+  private final ElasticSerializableTVList tvList;
+  private int currentRowIndex;
+
+  public ElasticSerializableTVListBackedSingleColumnRow(
+      ElasticSerializableTVList tvList, int currentRowIndex) {
+    this.tvList = tvList;
+    this.currentRowIndex = currentRowIndex;
+  }
+
+  @Override
+  public long getTime() throws IOException {
+    return tvList.getTime(currentRowIndex);
+  }
+
+  @Override
+  public int getInt(int columnIndex) throws IOException {
+    return tvList.getInt(currentRowIndex);
+  }
+
+  @Override
+  public long getLong(int columnIndex) throws IOException {
+    return tvList.getLong(currentRowIndex);
+  }
+
+  @Override
+  public float getFloat(int columnIndex) throws IOException {
+    return tvList.getFloat(currentRowIndex);
+  }
+
+  @Override
+  public double getDouble(int columnIndex) throws IOException {
+    return tvList.getDouble(currentRowIndex);
+  }
+
+  @Override
+  public boolean getBoolean(int columnIndex) throws IOException {
+    return tvList.getBoolean(currentRowIndex);
+  }
+
+  @Override
+  public Binary getBinary(int columnIndex) throws IOException {
+    return tvList.getBinary(currentRowIndex);
+  }
+
+  @Override
+  public String getString(int columnIndex) throws IOException {
+    return tvList.getString(currentRowIndex);
+  }
+
+  @Override
+  public TSDataType getDataType(int columnIndex) {
+    return tvList.getDataType();
+  }
+
+  @Override
+  public boolean isNull(int columnIndex) {
+    return false;
+  }
+
+  @Override
+  public int size() {
+    return 1;
+  }
+
+  public Row seek(int currentRowIndex) {
+    this.currentRowIndex = currentRowIndex;
+    return this;
+  }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/access/ElasticSerializableTVListBackedSingleColumnWindow.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/access/ElasticSerializableTVListBackedSingleColumnWindow.java
new file mode 100644
index 0000000..208d2b6
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/access/ElasticSerializableTVListBackedSingleColumnWindow.java
@@ -0,0 +1,90 @@
+/*
+ * 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.udf.core.access;
+
+import org.apache.iotdb.db.query.udf.api.access.Row;
+import org.apache.iotdb.db.query.udf.api.access.RowIterator;
+import org.apache.iotdb.db.query.udf.api.access.RowWindow;
+import org.apache.iotdb.db.query.udf.datastructure.tv.ElasticSerializableTVList;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+
+public class ElasticSerializableTVListBackedSingleColumnWindow implements RowWindow {
+
+  private final ElasticSerializableTVList tvList;
+  private int beginIndex;
+  private int endIndex;
+  private int size;
+
+  private final ElasticSerializableTVListBackedSingleColumnRow row;
+  private ElasticSerializableTVListBackedSingleColumnWindowIterator rowIterator;
+
+  // [beginIndex, endIndex)
+  public ElasticSerializableTVListBackedSingleColumnWindow(
+      ElasticSerializableTVList tvList, int beginIndex, int endIndex) {
+    this.tvList = tvList;
+    this.beginIndex = beginIndex;
+    this.endIndex = endIndex;
+    size = endIndex - beginIndex;
+
+    row = new ElasticSerializableTVListBackedSingleColumnRow(tvList, beginIndex);
+  }
+
+  @Override
+  public int windowSize() {
+    return size;
+  }
+
+  @Override
+  public Row getRow(int rowIndex) {
+    if (rowIndex < beginIndex || endIndex <= rowIndex) {
+      throw new ArrayIndexOutOfBoundsException(
+          String.format("Array index(%d) out of range [%d, %d).", rowIndex, beginIndex, endIndex));
+    }
+    return row.seek(beginIndex + rowIndex);
+  }
+
+  @Override
+  public TSDataType getDataType(int columnIndex) {
+    return tvList.getDataType();
+  }
+
+  @Override
+  public RowIterator getRowIterator() {
+    if (rowIterator == null) {
+      rowIterator =
+          new ElasticSerializableTVListBackedSingleColumnWindowIterator(
+              tvList, beginIndex, endIndex);
+    }
+
+    rowIterator.reset();
+    return rowIterator;
+  }
+
+  private RowWindow seek(int beginIndex, int endIndex) {
+    this.beginIndex = beginIndex;
+    this.endIndex = endIndex;
+    size = endIndex - beginIndex;
+
+    row.seek(beginIndex);
+    rowIterator = null;
+
+    return this;
+  }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/access/RowIteratorImpl.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/access/ElasticSerializableTVListBackedSingleColumnWindowIterator.java
similarity index 58%
copy from server/src/main/java/org/apache/iotdb/db/query/udf/core/access/RowIteratorImpl.java
copy to server/src/main/java/org/apache/iotdb/db/query/udf/core/access/ElasticSerializableTVListBackedSingleColumnWindowIterator.java
index 8c303f2..5991d50 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/access/RowIteratorImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/access/ElasticSerializableTVListBackedSingleColumnWindowIterator.java
@@ -21,38 +21,34 @@ package org.apache.iotdb.db.query.udf.core.access;
 
 import org.apache.iotdb.db.query.udf.api.access.Row;
 import org.apache.iotdb.db.query.udf.api.access.RowIterator;
-import org.apache.iotdb.db.query.udf.datastructure.primitive.IntList;
-import org.apache.iotdb.db.query.udf.datastructure.row.ElasticSerializableRowRecordList;
-import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.db.query.udf.datastructure.tv.ElasticSerializableTVList;
 
 import java.io.IOException;
 
-public class RowIteratorImpl implements RowIterator {
+public class ElasticSerializableTVListBackedSingleColumnWindowIterator implements RowIterator {
 
-  private final ElasticSerializableRowRecordList rowRecordList;
-  private final IntList windowRowIndexes;
-  private final RowImpl row;
+  private final int beginIndex;
+  private final int size;
+  private final ElasticSerializableTVListBackedSingleColumnRow row;
   private int rowIndex;
 
-  public RowIteratorImpl(
-      ElasticSerializableRowRecordList rowRecordList,
-      int[] columnIndexes,
-      TSDataType[] dataTypes,
-      IntList windowRowIndexes) {
-    this.rowRecordList = rowRecordList;
-    this.windowRowIndexes = windowRowIndexes;
-    row = new RowImpl(columnIndexes, dataTypes);
+  // [beginIndex, endIndex)
+  public ElasticSerializableTVListBackedSingleColumnWindowIterator(
+      ElasticSerializableTVList tvList, int beginIndex, int endIndex) {
+    this.beginIndex = beginIndex;
+    size = endIndex - beginIndex;
+    row = new ElasticSerializableTVListBackedSingleColumnRow(tvList, beginIndex);
     rowIndex = -1;
   }
 
   @Override
   public boolean hasNextRow() {
-    return rowIndex < windowRowIndexes.size() - 1;
+    return rowIndex < size - 1;
   }
 
   @Override
   public Row next() throws IOException {
-    return row.setRowRecord(rowRecordList.getRowRecord(windowRowIndexes.get(++rowIndex)));
+    return row.seek(++rowIndex + beginIndex);
   }
 
   @Override
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/access/LayerPointReaderBackedSingleColumnRow.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/access/LayerPointReaderBackedSingleColumnRow.java
new file mode 100644
index 0000000..a725878
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/access/LayerPointReaderBackedSingleColumnRow.java
@@ -0,0 +1,91 @@
+/*
+ * 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.udf.core.access;
+
+import org.apache.iotdb.db.query.udf.api.access.Row;
+import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.tsfile.utils.Binary;
+
+import java.io.IOException;
+
+public class LayerPointReaderBackedSingleColumnRow implements Row {
+
+  private final LayerPointReader layerPointReader;
+
+  public LayerPointReaderBackedSingleColumnRow(LayerPointReader layerPointReader) {
+    this.layerPointReader = layerPointReader;
+  }
+
+  @Override
+  public long getTime() throws IOException {
+    return layerPointReader.currentTime();
+  }
+
+  @Override
+  public int getInt(int columnIndex) throws IOException {
+    return layerPointReader.currentInt();
+  }
+
+  @Override
+  public long getLong(int columnIndex) throws IOException {
+    return layerPointReader.currentLong();
+  }
+
+  @Override
+  public float getFloat(int columnIndex) throws IOException {
+    return layerPointReader.currentFloat();
+  }
+
+  @Override
+  public double getDouble(int columnIndex) throws IOException {
+    return layerPointReader.currentDouble();
+  }
+
+  @Override
+  public boolean getBoolean(int columnIndex) throws IOException {
+    return layerPointReader.currentBoolean();
+  }
+
+  @Override
+  public Binary getBinary(int columnIndex) throws IOException {
+    return layerPointReader.currentBinary();
+  }
+
+  @Override
+  public String getString(int columnIndex) throws IOException {
+    return layerPointReader.currentBinary().getStringValue();
+  }
+
+  @Override
+  public TSDataType getDataType(int columnIndex) {
+    return layerPointReader.getDataType();
+  }
+
+  @Override
+  public boolean isNull(int columnIndex) {
+    return false;
+  }
+
+  @Override
+  public int size() {
+    return 1;
+  }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/access/RowImpl.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/access/MultiColumnRow.java
similarity index 95%
rename from server/src/main/java/org/apache/iotdb/db/query/udf/core/access/RowImpl.java
rename to server/src/main/java/org/apache/iotdb/db/query/udf/core/access/MultiColumnRow.java
index e186200..8baeca7 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/access/RowImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/access/MultiColumnRow.java
@@ -23,14 +23,14 @@ import org.apache.iotdb.db.query.udf.api.access.Row;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.utils.Binary;
 
-public class RowImpl implements Row {
+public class MultiColumnRow implements Row {
 
   private final int[] columnIndexes;
   private final TSDataType[] dataTypes;
 
   private Object[] rowRecord;
 
-  public RowImpl(int[] columnIndexes, TSDataType[] dataTypes) {
+  public MultiColumnRow(int[] columnIndexes, TSDataType[] dataTypes) {
     this.columnIndexes = columnIndexes;
     this.dataTypes = dataTypes;
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/access/RowWindowImpl.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/access/MultiColumnWindow.java
similarity index 86%
rename from server/src/main/java/org/apache/iotdb/db/query/udf/core/access/RowWindowImpl.java
rename to server/src/main/java/org/apache/iotdb/db/query/udf/core/access/MultiColumnWindow.java
index 3a225fa..0a01ad4 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/access/RowWindowImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/access/MultiColumnWindow.java
@@ -28,7 +28,7 @@ import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
 import java.io.IOException;
 
-public class RowWindowImpl implements RowWindow {
+public class MultiColumnWindow implements RowWindow {
 
   private final ElasticSerializableRowRecordList rowRecordList;
 
@@ -36,10 +36,10 @@ public class RowWindowImpl implements RowWindow {
   private final TSDataType[] dataTypes;
   private final IntList windowRowIndexes;
 
-  private final RowImpl row;
-  private final RowIteratorImpl rowIterator;
+  private final MultiColumnRow row;
+  private MultiColumnWindowIterator rowIterator;
 
-  public RowWindowImpl(
+  public MultiColumnWindow(
       ElasticSerializableRowRecordList rowRecordList,
       int[] columnIndexes,
       TSDataType[] dataTypes,
@@ -48,8 +48,7 @@ public class RowWindowImpl implements RowWindow {
     this.columnIndexes = columnIndexes;
     this.dataTypes = dataTypes;
     this.windowRowIndexes = windowRowIndexes;
-    row = new RowImpl(columnIndexes, dataTypes);
-    rowIterator = new RowIteratorImpl(rowRecordList, columnIndexes, dataTypes, windowRowIndexes);
+    row = new MultiColumnRow(columnIndexes, dataTypes);
   }
 
   @Override
@@ -74,6 +73,11 @@ public class RowWindowImpl implements RowWindow {
 
   @Override
   public RowIterator getRowIterator() {
+    if (rowIterator == null) {
+      rowIterator =
+          new MultiColumnWindowIterator(rowRecordList, columnIndexes, dataTypes, windowRowIndexes);
+    }
+
     rowIterator.reset();
     return rowIterator;
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/access/RowIteratorImpl.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/access/MultiColumnWindowIterator.java
similarity index 90%
rename from server/src/main/java/org/apache/iotdb/db/query/udf/core/access/RowIteratorImpl.java
rename to server/src/main/java/org/apache/iotdb/db/query/udf/core/access/MultiColumnWindowIterator.java
index 8c303f2..59de7fc 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/access/RowIteratorImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/access/MultiColumnWindowIterator.java
@@ -27,21 +27,21 @@ import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
 import java.io.IOException;
 
-public class RowIteratorImpl implements RowIterator {
+public class MultiColumnWindowIterator implements RowIterator {
 
   private final ElasticSerializableRowRecordList rowRecordList;
   private final IntList windowRowIndexes;
-  private final RowImpl row;
+  private final MultiColumnRow row;
   private int rowIndex;
 
-  public RowIteratorImpl(
+  public MultiColumnWindowIterator(
       ElasticSerializableRowRecordList rowRecordList,
       int[] columnIndexes,
       TSDataType[] dataTypes,
       IntList windowRowIndexes) {
     this.rowRecordList = rowRecordList;
     this.windowRowIndexes = windowRowIndexes;
-    row = new RowImpl(columnIndexes, dataTypes);
+    row = new MultiColumnRow(columnIndexes, dataTypes);
     rowIndex = -1;
   }