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 59eb9bbb0a9 Fix explicit time query process in TreeModel
59eb9bbb0a9 is described below
commit 59eb9bbb0a937f9315bd78bd3e0ccd81d67da7e7
Author: Weihao Li <[email protected]>
AuthorDate: Mon Jul 14 17:02:43 2025 +0800
Fix explicit time query process in TreeModel
---
.../aggregation/maxby/IoTDBMaxByAlignedSeriesIT.java | 20 ++++++++++++++++++++
.../iotdb/db/it/aggregation/maxby/IoTDBMaxByIT.java | 16 ++++++++++++++++
.../execution/operator/process/ProjectOperator.java | 3 ++-
.../plan/planner/OperatorTreeGenerator.java | 6 +++++-
.../dag/input/QueryDataSetInputLayer.java | 3 +++
5 files changed, 46 insertions(+), 2 deletions(-)
diff --git
a/integration-test/src/test/java/org/apache/iotdb/db/it/aggregation/maxby/IoTDBMaxByAlignedSeriesIT.java
b/integration-test/src/test/java/org/apache/iotdb/db/it/aggregation/maxby/IoTDBMaxByAlignedSeriesIT.java
index bdcce214db8..cf3a5d6cea8 100644
---
a/integration-test/src/test/java/org/apache/iotdb/db/it/aggregation/maxby/IoTDBMaxByAlignedSeriesIT.java
+++
b/integration-test/src/test/java/org/apache/iotdb/db/it/aggregation/maxby/IoTDBMaxByAlignedSeriesIT.java
@@ -22,8 +22,10 @@ package org.apache.iotdb.db.it.aggregation.maxby;
import org.apache.iotdb.it.env.EnvFactory;
import org.junit.BeforeClass;
+import org.junit.Test;
import static org.apache.iotdb.db.it.utils.TestUtils.prepareData;
+import static org.apache.iotdb.db.it.utils.TestUtils.resultSetEqualTest;
public class IoTDBMaxByAlignedSeriesIT extends IoTDBMaxByIT {
protected static final String[] ALIGNED_DATASET =
@@ -60,6 +62,7 @@ public class IoTDBMaxByAlignedSeriesIT extends IoTDBMaxByIT {
"INSERT INTO root.db.d2(timestamp,y1,y2,y3,y4,y5,y6) values(12, 8, 8,
8, 8, false, \"4\")",
"INSERT INTO root.db.d2(timestamp,x1,x2,x3,x4,x5,x6) values(13, 4, 4,
4, 4, false, \"4\")",
"INSERT INTO root.db.d2(timestamp,y1,y2,y3,y4,y5,y6) values(13, 8, 8,
8, 8, false, \"4\")",
+ "insert into root.sg.d1(time,s1,s2) values(1,1,1);",
};
@BeforeClass
@@ -68,4 +71,21 @@ public class IoTDBMaxByAlignedSeriesIT extends IoTDBMaxByIT {
EnvFactory.getEnv().initClusterEnvironment();
prepareData(ALIGNED_DATASET);
}
+
+ @Test
+ public void maxMinByTimeTest() {
+ String[] expectedHeader =
+ new String[] {"Device", "max_by(Time, s1 + 1)", "min_by(Time, s1 +
1)"};
+ String[] retArray = new String[] {"root.sg.d1,1,1,"};
+ resultSetEqualTest(
+ "select max_by(time, s1+1), min_by(time, s1+1) from root.sg.* align
by device",
+ expectedHeader,
+ retArray);
+
+ expectedHeader = new String[] {"Device", "max_by(Time, s1)", "min_by(Time,
s1)"};
+ resultSetEqualTest(
+ "select max_by(time, s1), min_by(time, s1) from root.sg.* where s1>0
align by device",
+ expectedHeader,
+ retArray);
+ }
}
diff --git
a/integration-test/src/test/java/org/apache/iotdb/db/it/aggregation/maxby/IoTDBMaxByIT.java
b/integration-test/src/test/java/org/apache/iotdb/db/it/aggregation/maxby/IoTDBMaxByIT.java
index 558cbe36d24..540c8bc6671 100644
---
a/integration-test/src/test/java/org/apache/iotdb/db/it/aggregation/maxby/IoTDBMaxByIT.java
+++
b/integration-test/src/test/java/org/apache/iotdb/db/it/aggregation/maxby/IoTDBMaxByIT.java
@@ -111,6 +111,7 @@ public class IoTDBMaxByIT {
"INSERT INTO root.db.d2(timestamp,y1,y2,y3,y4,y5,y6) values(12, 9, 9,
9, 9, false, \"1\")",
"INSERT INTO root.db.d2(timestamp,x1,x2,x3,x4,x5,x6) values(13, 4, 4,
4, 4, false, \"4\")",
"INSERT INTO root.db.d2(timestamp,y1,y2,y3,y4,y5,y6) values(13, 9, 9,
9, 9, false, \"1\")",
+ "insert into root.sg.d1(time,s1,s2) values(1,1,1);",
"flush"
};
@@ -487,6 +488,21 @@ public class IoTDBMaxByIT {
}
}
+ @Test
+ public void maxMinByTimeTest() {
+ String[] expectedHeader =
+ new String[] {"max_by(Time, root.sg.d1.s1 + 1)", "min_by(Time,
root.sg.d1.s1 + 1)"};
+ String[] retArray = new String[] {"1,1,"};
+ resultSetEqualTest(
+ "select max_by(time, s1+1), min_by(time, s1+1) from root.sg.*",
expectedHeader, retArray);
+
+ expectedHeader = new String[] {"max_by(Time, root.sg.d1.s1)",
"min_by(Time, root.sg.d1.s1)"};
+ resultSetEqualTest(
+ "select max_by(time, s1), min_by(time, s1) from root.sg.* where s1>0",
+ expectedHeader,
+ retArray);
+ }
+
/**
* @return yInput -> expectedHeader
*/
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/ProjectOperator.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/ProjectOperator.java
index bb4ffc7b74e..9c4cd266143 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/ProjectOperator.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/ProjectOperator.java
@@ -68,7 +68,8 @@ public class ProjectOperator implements ProcessOperator {
}
Column[] valueColumns = new Column[remainingColumnIndexList.size()];
for (int i = 0; i < remainingColumnIndexList.size(); i++) {
- valueColumns[i] = input.getColumn(remainingColumnIndexList.get(i));
+ int index = remainingColumnIndexList.get(i);
+ valueColumns[i] = index == -1 ? input.getTimeColumn() :
input.getColumn(index);
}
return new TsBlock(input.getPositionCount(), input.getTimeColumn(),
valueColumns);
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java
index a6a79247b0a..505af22ffc7 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java
@@ -606,7 +606,7 @@ public class OperatorTreeGenerator extends
PlanVisitor<Operator, LocalExecutionP
List<Integer> remainingColumnIndexList = new ArrayList<>();
for (String outputColumnName : outputColumnNames) {
int index = inputColumnNames.indexOf(outputColumnName);
- if (index < 0) {
+ if (index < 0 && !outputColumnName.equals(TIMESTAMP_EXPRESSION_STRING)) {
throw new IllegalStateException(
String.format("Cannot find column [%s] in child's output",
outputColumnName));
}
@@ -3219,6 +3219,10 @@ public class OperatorTreeGenerator extends
PlanVisitor<Operator, LocalExecutionP
.add(new InputLocation(tsBlockIndex, -1));
int valueColumnIndex = 0;
for (String columnName : childNode.getOutputColumnNames()) {
+ if (columnName.equals(TIMESTAMP_EXPRESSION_STRING)) {
+ valueColumnIndex++;
+ continue;
+ }
outputMappings
.computeIfAbsent(columnName, key -> new ArrayList<>())
.add(new InputLocation(tsBlockIndex, valueColumnIndex));
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/input/QueryDataSetInputLayer.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/input/QueryDataSetInputLayer.java
index d0db0f2b58c..d13dfb3ced4 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/input/QueryDataSetInputLayer.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/input/QueryDataSetInputLayer.java
@@ -129,6 +129,9 @@ public class QueryDataSetInputLayer {
@Override
public TSDataType[] getDataTypes() {
+ if (columnIndex == dataTypes.length) {
+ return new TSDataType[] {TSDataType.INT64};
+ }
return new TSDataType[] {dataTypes[columnIndex]};
}