This is an automated email from the ASF dual-hosted git repository.
jackietien pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new 0bb50c3009 [IOTDB-3644] Fix the incorrect result bug when querying
with value filter & order by time desc (#6422)
0bb50c3009 is described below
commit 0bb50c3009d58b5bf299db6845f97c99f76b3f0a
Author: liuminghui233 <[email protected]>
AuthorDate: Fri Jun 24 21:36:52 2022 +0800
[IOTDB-3644] Fix the incorrect result bug when querying with value filter &
order by time desc (#6422)
---
.../aggregation/IoTDBAggregationLargeDataIT.java | 6 ++---
.../execution/operator/process/FilterOperator.java | 6 +++--
.../operator/process/TransformOperator.java | 5 ++--
.../db/mpp/plan/planner/LocalExecutionPlanner.java | 6 +++--
.../db/mpp/plan/planner/LogicalPlanBuilder.java | 14 +++++++---
.../iotdb/db/mpp/plan/planner/LogicalPlanner.java | 18 ++++++++-----
.../plan/planner/plan/node/process/FilterNode.java | 19 +++++++++-----
.../planner/plan/node/process/TransformNode.java | 30 +++++++++++++++++-----
.../db/mpp/plan/plan/QueryLogicalPlanUtil.java | 18 ++++++++-----
.../plan/node/process/FilterNodeSerdeTest.java | 3 ++-
10 files changed, 87 insertions(+), 38 deletions(-)
diff --git
a/integration-test/src/test/java/org/apache/iotdb/db/it/aggregation/IoTDBAggregationLargeDataIT.java
b/integration-test/src/test/java/org/apache/iotdb/db/it/aggregation/IoTDBAggregationLargeDataIT.java
index 01ef6b3cd9..3c15fd1b87 100644
---
a/integration-test/src/test/java/org/apache/iotdb/db/it/aggregation/IoTDBAggregationLargeDataIT.java
+++
b/integration-test/src/test/java/org/apache/iotdb/db/it/aggregation/IoTDBAggregationLargeDataIT.java
@@ -21,15 +21,16 @@ package org.apache.iotdb.db.it.aggregation;
import org.apache.iotdb.it.env.ConfigFactory;
import org.apache.iotdb.it.env.EnvFactory;
+import org.apache.iotdb.it.env.IoTDBTestRunner;
import org.apache.iotdb.itbase.category.ClusterIT;
import org.apache.iotdb.itbase.category.LocalStandaloneIT;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.experimental.categories.Category;
+import org.junit.runner.RunWith;
import java.sql.Connection;
import java.sql.ResultSet;
@@ -47,8 +48,7 @@ import static
org.apache.iotdb.db.constant.TestConstant.minValue;
import static org.apache.iotdb.db.constant.TestConstant.sum;
import static org.junit.Assert.fail;
-// TODO: remove ignore after supporting value filter
-@Ignore
+@RunWith(IoTDBTestRunner.class)
@Category({LocalStandaloneIT.class, ClusterIT.class})
public class IoTDBAggregationLargeDataIT {
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/process/FilterOperator.java
b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/process/FilterOperator.java
index d5ab29350c..2611ae791a 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/process/FilterOperator.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/process/FilterOperator.java
@@ -58,7 +58,8 @@ public class FilterOperator extends TransformOperator {
Expression[] outputExpressions,
boolean keepNull,
ZoneId zoneId,
- TypeProvider typeProvider)
+ TypeProvider typeProvider,
+ boolean isAscending)
throws QueryProcessException, IOException {
super(
operatorContext,
@@ -68,7 +69,8 @@ public class FilterOperator extends TransformOperator {
bindExpressions(filterExpression, outputExpressions),
keepNull,
zoneId,
- typeProvider);
+ typeProvider,
+ isAscending);
}
private static Expression[] bindExpressions(
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/process/TransformOperator.java
b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/process/TransformOperator.java
index 5e77c82c63..26d81f71b5 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/process/TransformOperator.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/process/TransformOperator.java
@@ -84,7 +84,8 @@ public class TransformOperator implements ProcessOperator {
Expression[] outputExpressions,
boolean keepNull,
ZoneId zoneId,
- TypeProvider typeProvider)
+ TypeProvider typeProvider,
+ boolean isAscending)
throws QueryProcessException, IOException {
this.operatorContext = operatorContext;
this.inputOperator = inputOperator;
@@ -94,7 +95,7 @@ public class TransformOperator implements ProcessOperator {
initUdtfContext(outputExpressions, zoneId);
initTransformers(inputLocations, outputExpressions, typeProvider);
- timeHeap = new TimeSelector(transformers.length << 1, true);
+ timeHeap = new TimeSelector(transformers.length << 1, isAscending);
shouldIterateReadersToNextValid = new boolean[outputExpressions.length];
Arrays.fill(shouldIterateReadersToNextValid, true);
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LocalExecutionPlanner.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LocalExecutionPlanner.java
index 82fd67af9a..b2056696df 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LocalExecutionPlanner.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LocalExecutionPlanner.java
@@ -778,7 +778,8 @@ public class LocalExecutionPlanner {
node.getOutputExpressions(),
node.isKeepNull(),
node.getZoneId(),
- context.getTypeProvider());
+ context.getTypeProvider(),
+ node.getScanOrder() == OrderBy.TIMESTAMP_ASC);
} catch (QueryProcessException | IOException e) {
throw new RuntimeException(e);
}
@@ -805,7 +806,8 @@ public class LocalExecutionPlanner {
node.getOutputExpressions(),
node.isKeepNull(),
node.getZoneId(),
- context.getTypeProvider());
+ context.getTypeProvider(),
+ node.getScanOrder() == OrderBy.TIMESTAMP_ASC);
} catch (QueryProcessException | IOException e) {
throw new RuntimeException(e);
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanBuilder.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanBuilder.java
index 5a9dbd4dac..b90a5d738a 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanBuilder.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanBuilder.java
@@ -578,7 +578,8 @@ public class LogicalPlanBuilder {
Expression queryFilter,
Set<Expression> selectExpressions,
boolean isGroupByTime,
- ZoneId zoneId) {
+ ZoneId zoneId,
+ OrderBy scanOrder) {
if (queryFilter == null) {
return this;
}
@@ -590,12 +591,16 @@ public class LogicalPlanBuilder {
selectExpressions.toArray(new Expression[0]),
queryFilter,
isGroupByTime,
- zoneId);
+ zoneId,
+ scanOrder);
return this;
}
public LogicalPlanBuilder planTransform(
- Set<Expression> transformExpressions, boolean isGroupByTime, ZoneId
zoneId) {
+ Set<Expression> transformExpressions,
+ boolean isGroupByTime,
+ ZoneId zoneId,
+ OrderBy scanOrder) {
boolean needTransform = false;
for (Expression expression : transformExpressions) {
if (ExpressionAnalyzer.checkIsNeedTransform(expression)) {
@@ -613,7 +618,8 @@ public class LogicalPlanBuilder {
this.getRoot(),
transformExpressions.toArray(new Expression[0]),
isGroupByTime,
- zoneId);
+ zoneId,
+ scanOrder);
return this;
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanner.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanner.java
index b94e106bdb..e1abfbf686 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanner.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanner.java
@@ -202,13 +202,15 @@ public class LogicalPlanner {
queryFilter,
aggregationTransformExpressions,
queryStatement.isGroupByTime(),
- queryStatement.getSelectComponent().getZoneId());
+ queryStatement.getSelectComponent().getZoneId(),
+ queryStatement.getResultOrder());
} else {
planBuilder =
planBuilder.planTransform(
aggregationTransformExpressions,
queryStatement.isGroupByTime(),
- queryStatement.getSelectComponent().getZoneId());
+ queryStatement.getSelectComponent().getZoneId(),
+ queryStatement.getResultOrder());
}
boolean outputPartial =
@@ -254,7 +256,8 @@ public class LogicalPlanner {
planBuilder.planTransform(
transformExpressions,
queryStatement.isGroupByTime(),
- queryStatement.getSelectComponent().getZoneId());
+ queryStatement.getSelectComponent().getZoneId(),
+ queryStatement.getResultOrder());
} else {
if (analysis.hasValueFilter()) {
planBuilder =
@@ -262,13 +265,15 @@ public class LogicalPlanner {
queryFilter,
transformExpressions,
queryStatement.isGroupByTime(),
- queryStatement.getSelectComponent().getZoneId());
+ queryStatement.getSelectComponent().getZoneId(),
+ queryStatement.getResultOrder());
} else {
planBuilder =
planBuilder.planTransform(
transformExpressions,
queryStatement.isGroupByTime(),
- queryStatement.getSelectComponent().getZoneId());
+ queryStatement.getSelectComponent().getZoneId(),
+ queryStatement.getResultOrder());
}
}
} else {
@@ -314,7 +319,8 @@ public class LogicalPlanner {
.planTransform(
transformExpressions,
queryStatement.isGroupByTime(),
- queryStatement.getSelectComponent().getZoneId());
+ queryStatement.getSelectComponent().getZoneId(),
+ queryStatement.getResultOrder());
}
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/process/FilterNode.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/process/FilterNode.java
index 9e1fa43eb3..10df916541 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/process/FilterNode.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/process/FilterNode.java
@@ -23,6 +23,7 @@ import
org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeType;
import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanVisitor;
+import org.apache.iotdb.db.mpp.plan.statement.component.OrderBy;
import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
import java.io.DataOutputStream;
@@ -41,8 +42,9 @@ public class FilterNode extends TransformNode {
Expression[] outputExpressions,
Expression predicate,
boolean keepNull,
- ZoneId zoneId) {
- super(id, childPlanNode, outputExpressions, keepNull, zoneId);
+ ZoneId zoneId,
+ OrderBy scanOrder) {
+ super(id, childPlanNode, outputExpressions, keepNull, zoneId, scanOrder);
this.predicate = predicate;
}
@@ -51,8 +53,9 @@ public class FilterNode extends TransformNode {
Expression[] outputExpressions,
Expression predicate,
boolean keepNull,
- ZoneId zoneId) {
- super(id, outputExpressions, keepNull, zoneId);
+ ZoneId zoneId,
+ OrderBy scanOrder) {
+ super(id, outputExpressions, keepNull, zoneId, scanOrder);
this.predicate = predicate;
}
@@ -63,7 +66,8 @@ public class FilterNode extends TransformNode {
@Override
public PlanNode clone() {
- return new FilterNode(getPlanNodeId(), outputExpressions, predicate,
keepNull, zoneId);
+ return new FilterNode(
+ getPlanNodeId(), outputExpressions, predicate, keepNull, zoneId,
scanOrder);
}
@Override
@@ -76,6 +80,7 @@ public class FilterNode extends TransformNode {
Expression.serialize(predicate, byteBuffer);
ReadWriteIOUtils.write(keepNull, byteBuffer);
ReadWriteIOUtils.write(zoneId.getId(), byteBuffer);
+ ReadWriteIOUtils.write(scanOrder.ordinal(), byteBuffer);
}
@Override
@@ -88,6 +93,7 @@ public class FilterNode extends TransformNode {
Expression.serialize(predicate, stream);
ReadWriteIOUtils.write(keepNull, stream);
ReadWriteIOUtils.write(zoneId.getId(), stream);
+ ReadWriteIOUtils.write(scanOrder.ordinal(), stream);
}
public static FilterNode deserialize(ByteBuffer byteBuffer) {
@@ -99,8 +105,9 @@ public class FilterNode extends TransformNode {
Expression predicate = Expression.deserialize(byteBuffer);
boolean keepNull = ReadWriteIOUtils.readBool(byteBuffer);
ZoneId zoneId =
ZoneId.of(Objects.requireNonNull(ReadWriteIOUtils.readString(byteBuffer)));
+ OrderBy scanOrder = OrderBy.values()[ReadWriteIOUtils.readInt(byteBuffer)];
PlanNodeId planNodeId = PlanNodeId.deserialize(byteBuffer);
- return new FilterNode(planNodeId, outputExpressions, predicate, keepNull,
zoneId);
+ return new FilterNode(planNodeId, outputExpressions, predicate, keepNull,
zoneId, scanOrder);
}
public Expression getPredicate() {
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/process/TransformNode.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/process/TransformNode.java
index f01ba32dfa..c57fb91317 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/process/TransformNode.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/process/TransformNode.java
@@ -24,6 +24,7 @@ import
org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeType;
import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanVisitor;
+import org.apache.iotdb.db.mpp.plan.statement.component.OrderBy;
import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
import com.google.common.collect.ImmutableList;
@@ -45,6 +46,8 @@ public class TransformNode extends ProcessNode {
protected final boolean keepNull;
protected final ZoneId zoneId;
+ protected final OrderBy scanOrder;
+
private List<String> outputColumnNames;
public TransformNode(
@@ -52,20 +55,27 @@ public class TransformNode extends ProcessNode {
PlanNode childPlanNode,
Expression[] outputExpressions,
boolean keepNull,
- ZoneId zoneId) {
+ ZoneId zoneId,
+ OrderBy scanOrder) {
super(id);
this.childPlanNode = childPlanNode;
this.outputExpressions = outputExpressions;
this.keepNull = keepNull;
this.zoneId = zoneId;
+ this.scanOrder = scanOrder;
}
public TransformNode(
- PlanNodeId id, Expression[] outputExpressions, boolean keepNull, ZoneId
zoneId) {
+ PlanNodeId id,
+ Expression[] outputExpressions,
+ boolean keepNull,
+ ZoneId zoneId,
+ OrderBy scanOrder) {
super(id);
this.outputExpressions = outputExpressions;
this.keepNull = keepNull;
this.zoneId = zoneId;
+ this.scanOrder = scanOrder;
}
@Override
@@ -101,7 +111,7 @@ public class TransformNode extends ProcessNode {
@Override
public PlanNode clone() {
- return new TransformNode(getPlanNodeId(), outputExpressions, keepNull,
zoneId);
+ return new TransformNode(getPlanNodeId(), outputExpressions, keepNull,
zoneId, scanOrder);
}
@Override
@@ -113,6 +123,7 @@ public class TransformNode extends ProcessNode {
}
ReadWriteIOUtils.write(keepNull, byteBuffer);
ReadWriteIOUtils.write(zoneId.getId(), byteBuffer);
+ ReadWriteIOUtils.write(scanOrder.ordinal(), byteBuffer);
}
@Override
@@ -124,6 +135,7 @@ public class TransformNode extends ProcessNode {
}
ReadWriteIOUtils.write(keepNull, stream);
ReadWriteIOUtils.write(zoneId.getId(), stream);
+ ReadWriteIOUtils.write(scanOrder.ordinal(), stream);
}
public static TransformNode deserialize(ByteBuffer byteBuffer) {
@@ -134,8 +146,9 @@ public class TransformNode extends ProcessNode {
}
boolean keepNull = ReadWriteIOUtils.readBool(byteBuffer);
ZoneId zoneId =
ZoneId.of(Objects.requireNonNull(ReadWriteIOUtils.readString(byteBuffer)));
+ OrderBy scanOrder = OrderBy.values()[ReadWriteIOUtils.readInt(byteBuffer)];
PlanNodeId planNodeId = PlanNodeId.deserialize(byteBuffer);
- return new TransformNode(planNodeId, outputExpressions, keepNull, zoneId);
+ return new TransformNode(planNodeId, outputExpressions, keepNull, zoneId,
scanOrder);
}
public final Expression[] getOutputExpressions() {
@@ -150,6 +163,10 @@ public class TransformNode extends ProcessNode {
return zoneId;
}
+ public OrderBy getScanOrder() {
+ return scanOrder;
+ }
+
@Override
public boolean equals(Object o) {
if (this == o) {
@@ -165,12 +182,13 @@ public class TransformNode extends ProcessNode {
return keepNull == that.keepNull
&& childPlanNode.equals(that.childPlanNode)
&& Arrays.equals(outputExpressions, that.outputExpressions)
- && zoneId.equals(that.zoneId);
+ && zoneId.equals(that.zoneId)
+ && scanOrder == that.scanOrder;
}
@Override
public int hashCode() {
- int result = Objects.hash(super.hashCode(), childPlanNode, keepNull,
zoneId);
+ int result = Objects.hash(super.hashCode(), childPlanNode, keepNull,
zoneId, scanOrder);
result = 31 * result + Arrays.hashCode(outputExpressions);
return result;
}
diff --git
a/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/QueryLogicalPlanUtil.java
b/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/QueryLogicalPlanUtil.java
index c5f7e05b19..c62da3bc79 100644
---
a/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/QueryLogicalPlanUtil.java
+++
b/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/QueryLogicalPlanUtil.java
@@ -231,7 +231,8 @@ public class QueryLogicalPlanUtil {
new Expression[] {new
TimeSeriesOperand(schemaMap.get("root.sg.d2.s1"))},
predicate,
false,
- ZonedDateTime.now().getOffset());
+ ZonedDateTime.now().getOffset(),
+ OrderBy.TIMESTAMP_DESC);
FilterNullNode filterNullNode =
new FilterNullNode(
@@ -296,7 +297,8 @@ public class QueryLogicalPlanUtil {
},
predicate1,
false,
- ZonedDateTime.now().getOffset());
+ ZonedDateTime.now().getOffset(),
+ OrderBy.TIMESTAMP_DESC);
List<PlanNode> sourceNodeList2 = new ArrayList<>();
sourceNodeList2.add(
@@ -337,7 +339,8 @@ public class QueryLogicalPlanUtil {
},
predicate2,
false,
- ZonedDateTime.now().getOffset());
+ ZonedDateTime.now().getOffset(),
+ OrderBy.TIMESTAMP_DESC);
Map<String, List<Integer>> deviceToMeasurementIndexesMap = new HashMap<>();
deviceToMeasurementIndexesMap.put("root.sg.d1", Arrays.asList(1, 2, 3));
@@ -794,7 +797,8 @@ public class QueryLogicalPlanUtil {
},
predicate,
false,
- ZonedDateTime.now().getOffset());
+ ZonedDateTime.now().getOffset(),
+ OrderBy.TIMESTAMP_DESC);
AggregationNode aggregationNode =
new AggregationNode(
@@ -915,7 +919,8 @@ public class QueryLogicalPlanUtil {
},
predicate1,
false,
- ZonedDateTime.now().getOffset());
+ ZonedDateTime.now().getOffset(),
+ OrderBy.TIMESTAMP_DESC);
AggregationNode aggregationNode1 =
new AggregationNode(
@@ -973,7 +978,8 @@ public class QueryLogicalPlanUtil {
},
predicate2,
false,
- ZonedDateTime.now().getOffset());
+ ZonedDateTime.now().getOffset(),
+ OrderBy.TIMESTAMP_DESC);
AggregationNode aggregationNode2 =
new AggregationNode(
diff --git
a/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/node/process/FilterNodeSerdeTest.java
b/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/node/process/FilterNodeSerdeTest.java
index 43310e8f47..bac6d75cd7 100644
---
a/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/node/process/FilterNodeSerdeTest.java
+++
b/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/node/process/FilterNodeSerdeTest.java
@@ -53,7 +53,8 @@ public class FilterNodeSerdeTest {
new TimeSeriesOperand(new PartialPath("root.sg.d1.s1")),
new ConstantOperand(TSDataType.INT64, "100")),
false,
- ZoneId.systemDefault());
+ ZoneId.systemDefault(),
+ OrderBy.TIMESTAMP_ASC);
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
filterNode.serialize(byteBuffer);