This is an automated email from the ASF dual-hosted git repository. zhihao pushed a commit to branch perf/szh/change_point_in_window in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit ad1e94f63d37301b648993f5626be84d9a803132 Author: Sh-Zh-7 <[email protected]> AuthorDate: Tue Mar 3 15:54:29 2026 +0800 MVN spotless apply. --- .../plan/planner/TableOperatorGenerator.java | 4 +-- .../plan/planner/plan/node/PlanNodeType.java | 2 +- .../plan/planner/plan/node/PlanVisitor.java | 2 +- .../distribute/TableDistributedPlanGenerator.java | 2 +- .../ReplaceFilterWindowLeadWithChangePoint.java | 7 ++-- .../relational/planner/node/ChangePointNode.java | 1 - .../operator/ChangePointOperatorTest.java | 39 ++++++++-------------- .../planner/ChangePointOptimizationTest.java | 2 -- .../planner/assertions/PlanMatchPattern.java | 2 +- 9 files changed, 22 insertions(+), 39 deletions(-) diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java index cb125831cc4..3dde45c5c59 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java @@ -56,6 +56,7 @@ import org.apache.iotdb.db.queryengine.execution.operator.process.MappingCollect import org.apache.iotdb.db.queryengine.execution.operator.process.OffsetOperator; import org.apache.iotdb.db.queryengine.execution.operator.process.PatternRecognitionOperator; import org.apache.iotdb.db.queryengine.execution.operator.process.PreviousFillWithGroupOperator; +import org.apache.iotdb.db.queryengine.execution.operator.process.TableChangePointOperator; import org.apache.iotdb.db.queryengine.execution.operator.process.TableFillOperator; import org.apache.iotdb.db.queryengine.execution.operator.process.TableIntoOperator; import org.apache.iotdb.db.queryengine.execution.operator.process.TableLinearFillOperator; @@ -101,7 +102,6 @@ import org.apache.iotdb.db.queryengine.execution.operator.process.rowpattern.exp import org.apache.iotdb.db.queryengine.execution.operator.process.rowpattern.matcher.IrRowPatternToProgramRewriter; import org.apache.iotdb.db.queryengine.execution.operator.process.rowpattern.matcher.Matcher; import org.apache.iotdb.db.queryengine.execution.operator.process.rowpattern.matcher.Program; -import org.apache.iotdb.db.queryengine.execution.operator.process.TableChangePointOperator; import org.apache.iotdb.db.queryengine.execution.operator.process.window.RowNumberOperator; import org.apache.iotdb.db.queryengine.execution.operator.process.window.TableWindowOperator; import org.apache.iotdb.db.queryengine.execution.operator.process.window.TopKRankingOperator; @@ -187,6 +187,7 @@ import org.apache.iotdb.db.queryengine.plan.relational.planner.node.AggregationN import org.apache.iotdb.db.queryengine.plan.relational.planner.node.AggregationTableScanNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.AggregationTreeDeviceViewScanNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.AssignUniqueId; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.ChangePointNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.CollectNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.CteScanNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.DeviceTableScanNode; @@ -209,7 +210,6 @@ import org.apache.iotdb.db.queryengine.plan.relational.planner.node.OutputNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.PatternRecognitionNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.PreviousFillNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.ProjectNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.ChangePointNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.RowNumberNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.SemiJoinNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.SortNode; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanNodeType.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanNodeType.java index d56ae531580..7b81db80e0f 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanNodeType.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanNodeType.java @@ -119,6 +119,7 @@ import org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.RelationalIn import org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.RelationalInsertTabletNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.AggregationTreeDeviceViewScanNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.AssignUniqueId; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.ChangePointNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.EnforceSingleRowNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.ExceptNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.GapFillNode; @@ -129,7 +130,6 @@ import org.apache.iotdb.db.queryengine.plan.relational.planner.node.LinearFillNo import org.apache.iotdb.db.queryengine.plan.relational.planner.node.MarkDistinctNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.PatternRecognitionNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.PreviousFillNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.ChangePointNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.RowNumberNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.SemiJoinNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.TableFunctionNode; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanVisitor.java index 944824f7f91..c51e263b3a1 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanVisitor.java @@ -123,6 +123,7 @@ import org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.RelationalIn import org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.RelationalInsertTabletNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.iterative.GroupReference; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.AggregationTreeDeviceViewScanNode; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.ChangePointNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.CteScanNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.DeviceTableScanNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.ExceptNode; @@ -134,7 +135,6 @@ import org.apache.iotdb.db.queryengine.plan.relational.planner.node.LinearFillNo import org.apache.iotdb.db.queryengine.plan.relational.planner.node.MarkDistinctNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.PatternRecognitionNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.PreviousFillNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.ChangePointNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.RowNumberNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.SemiJoinNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.TableFunctionNode; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributedPlanGenerator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributedPlanGenerator.java index bff078a811f..253dd6b1fab 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributedPlanGenerator.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributedPlanGenerator.java @@ -58,6 +58,7 @@ import org.apache.iotdb.db.queryengine.plan.relational.planner.node.AggregationN import org.apache.iotdb.db.queryengine.plan.relational.planner.node.AggregationTableScanNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.AggregationTreeDeviceViewScanNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.AssignUniqueId; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.ChangePointNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.CollectNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.DeviceTableScanNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.EnforceSingleRowNode; @@ -76,7 +77,6 @@ import org.apache.iotdb.db.queryengine.plan.relational.planner.node.OffsetNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.OutputNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.PatternRecognitionNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.ProjectNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.ChangePointNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.RowNumberNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.SemiJoinNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.SortNode; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/iterative/rule/ReplaceFilterWindowLeadWithChangePoint.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/iterative/rule/ReplaceFilterWindowLeadWithChangePoint.java index abe49a626e0..3f88c588fee 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/iterative/rule/ReplaceFilterWindowLeadWithChangePoint.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/iterative/rule/ReplaceFilterWindowLeadWithChangePoint.java @@ -123,9 +123,7 @@ public class ReplaceFilterWindowLeadWithChangePoint implements Rule<FilterNode> } Expression offsetExpr = arguments.get(1); if (offsetExpr instanceof Literal) { - Object val = - ((Literal) offsetExpr) - .getTsValue(); + Object val = ((Literal) offsetExpr).getTsValue(); return val instanceof Number && ((Number) val).longValue() == 1; } return false; @@ -155,8 +153,7 @@ public class ReplaceFilterWindowLeadWithChangePoint implements Rule<FilterNode> Expression first = terms.get(0); Expression second = terms.get(1); - return (isNotEqualComparison(first, measurementName, nextName) - && isNullCheck(second, nextName)) + return (isNotEqualComparison(first, measurementName, nextName) && isNullCheck(second, nextName)) || (isNullCheck(first, nextName) && isNotEqualComparison(second, measurementName, nextName)); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/ChangePointNode.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/ChangePointNode.java index 02b567c8434..18e0d406524 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/ChangePointNode.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/ChangePointNode.java @@ -27,7 +27,6 @@ import org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.SingleChil import org.apache.iotdb.db.queryengine.plan.relational.planner.Symbol; import com.google.common.collect.ImmutableList; -import org.apache.tsfile.utils.ReadWriteIOUtils; import java.io.DataOutputStream; import java.io.IOException; diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/ChangePointOperatorTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/ChangePointOperatorTest.java index a81fa60cc8a..abb61b245dc 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/ChangePointOperatorTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/ChangePointOperatorTest.java @@ -230,8 +230,8 @@ public class ChangePointOperatorTest { } /** - * Alternating pattern: each point differs from the previous one (1, 2, 1, 2, ...). All points - * are change points. + * Alternating pattern: each point differs from the previous one (1, 2, 1, 2, ...). All points are + * change points. */ @Test public void testAlternatingValues() throws Exception { @@ -252,9 +252,7 @@ public class ChangePointOperatorTest { operator.close(); } - /** - * A single data point. The operator should emit exactly one change point. - */ + /** A single data point. The operator should emit exactly one change point. */ @Test public void testSinglePoint() throws Exception { prepareSeqFile(0, new int[] {99}); @@ -326,8 +324,8 @@ public class ChangePointOperatorTest { } /** - * Tests that statistics and non-statistics paths yield identical results for mixed data where some - * pages are uniform and others are not. + * Tests that statistics and non-statistics paths yield identical results for mixed data where + * some pages are uniform and others are not. * * <p>Page 0 (0-19): all 5 (uniform), Page 1 (20-39): values 5,6,5,6,... (non-uniform), Page 2 * (40-59): all 6 (uniform) @@ -375,9 +373,7 @@ public class ChangePointOperatorTest { resultNoStats.get(i)[0], resultWithStats.get(i)[0]); assertEquals( - "Mismatch at index " + i + " value", - resultNoStats.get(i)[1], - resultWithStats.get(i)[1]); + "Mismatch at index " + i + " value", resultNoStats.get(i)[1], resultWithStats.get(i)[1]); } } @@ -437,9 +433,7 @@ public class ChangePointOperatorTest { assertEquals(10, result.get(0)[1]); } - /** - * Verifies isFinished() returns true after all data is consumed. - */ + /** Verifies isFinished() returns true after all data is consumed. */ @Test public void testIsFinished() throws Exception { prepareSeqFile(0, new int[] {1, 1, 2, 2, 3}); @@ -472,8 +466,7 @@ public class ChangePointOperatorTest { createFragmentInstanceContext(instanceId, stateMachine); DriverContext driverContext = new DriverContext(fragmentInstanceContext, 0); PlanNodeId planNodeId = new PlanNodeId("1"); - driverContext.addOperatorContext( - 1, planNodeId, ChangePointOperator.class.getSimpleName()); + driverContext.addOperatorContext(1, planNodeId, ChangePointOperator.class.getSimpleName()); SeriesScanOptions.Builder scanOptionsBuilder = new SeriesScanOptions.Builder(); scanOptionsBuilder.withAllSensors(allSensors); @@ -487,16 +480,13 @@ public class ChangePointOperatorTest { scanOptionsBuilder.build(), canUseStatistics); - operator.initQueryDataSource( - new QueryDataSource(seqResources, unSeqResources)); + operator.initQueryDataSource(new QueryDataSource(seqResources, unSeqResources)); operator.getOperatorContext().setMaxRunTime(new Duration(500, TimeUnit.MILLISECONDS)); return operator; } - /** - * Collects all (timestamp, int_value) pairs from the operator output. - */ + /** Collects all (timestamp, int_value) pairs from the operator output. */ private List<long[]> collectResults(ChangePointOperator operator) throws Exception { List<long[]> results = new ArrayList<>(); while (operator.hasNext()) { @@ -528,7 +518,8 @@ public class ChangePointOperatorTest { resource.setVersion(fileIndex); IMeasurementSchema schema = - new MeasurementSchema(MEASUREMENT, TSDataType.INT32, TSEncoding.PLAIN, CompressionType.UNCOMPRESSED); + new MeasurementSchema( + MEASUREMENT, TSDataType.INT32, TSEncoding.PLAIN, CompressionType.UNCOMPRESSED); if (!file.getParentFile().exists()) { Assert.assertTrue(file.getParentFile().mkdirs()); @@ -545,10 +536,8 @@ public class ChangePointOperatorTest { record.addTuple(new IntDataPoint(MEASUREMENT, values[i])); writer.writeRecord(record); - resource.updateStartTime( - IDeviceID.Factory.DEFAULT_FACTORY.create(DEVICE_ID), timestamp); - resource.updateEndTime( - IDeviceID.Factory.DEFAULT_FACTORY.create(DEVICE_ID), timestamp); + resource.updateStartTime(IDeviceID.Factory.DEFAULT_FACTORY.create(DEVICE_ID), timestamp); + resource.updateEndTime(IDeviceID.Factory.DEFAULT_FACTORY.create(DEVICE_ID), timestamp); if ((i + 1) % FLUSH_INTERVAL == 0) { writer.flush(); diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ChangePointOptimizationTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ChangePointOptimizationTest.java index 66312bb6a19..b52790bdfd5 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ChangePointOptimizationTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ChangePointOptimizationTest.java @@ -31,8 +31,6 @@ import static org.apache.iotdb.db.queryengine.plan.relational.planner.assertions import static org.apache.iotdb.db.queryengine.plan.relational.planner.assertions.PlanMatchPattern.filter; import static org.apache.iotdb.db.queryengine.plan.relational.planner.assertions.PlanMatchPattern.group; import static org.apache.iotdb.db.queryengine.plan.relational.planner.assertions.PlanMatchPattern.output; -import static org.apache.iotdb.db.queryengine.plan.relational.planner.assertions.PlanMatchPattern.project; -import static org.apache.iotdb.db.queryengine.plan.relational.planner.assertions.PlanMatchPattern.sort; import static org.apache.iotdb.db.queryengine.plan.relational.planner.assertions.PlanMatchPattern.tableScan; import static org.apache.iotdb.db.queryengine.plan.relational.planner.assertions.PlanMatchPattern.window; diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/assertions/PlanMatchPattern.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/assertions/PlanMatchPattern.java index e30f1967cf9..c37f227f7ef 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/assertions/PlanMatchPattern.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/assertions/PlanMatchPattern.java @@ -30,6 +30,7 @@ import org.apache.iotdb.db.queryengine.plan.relational.planner.node.AggregationN import org.apache.iotdb.db.queryengine.plan.relational.planner.node.AggregationTableScanNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.AggregationTreeDeviceViewScanNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.AssignUniqueId; +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.ChangePointNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.CollectNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.CteScanNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.DeviceTableScanNode; @@ -46,7 +47,6 @@ import org.apache.iotdb.db.queryengine.plan.relational.planner.node.MergeSortNod import org.apache.iotdb.db.queryengine.plan.relational.planner.node.OffsetNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.OutputNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.ProjectNode; -import org.apache.iotdb.db.queryengine.plan.relational.planner.node.ChangePointNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.RowNumberNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.SemiJoinNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.SortNode;
