This is an automated email from the ASF dual-hosted git repository. shuwenwei pushed a commit to branch addMoreCheckpointsInSeriesScan in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit d6a7d0a91ad3b1efc7ad5ce2f077b56aa7c9310e Author: shuwenwei <[email protected]> AuthorDate: Wed Jul 2 15:38:11 2025 +0800 add more checkpoints in series scan --- .../AbstractSeriesAggregationScanOperator.java | 72 ++- .../source/AbstractSeriesScanOperator.java | 43 +- .../execution/operator/source/SeriesScanUtil.java | 46 +- .../relational/AbstractAggTableScanOperator.java | 75 ++- .../AbstractDefaultAggTableScanOperator.java | 4 +- .../relational/AbstractTableScanOperator.java | 16 +- .../relational/LastQueryAggTableScanOperator.java | 4 +- .../utils/reader/SeriesDataBlockReader.java | 20 +- .../AlignedSeriesScanLimitOffsetPushDownTest.java | 608 +++++++++--------- .../AlignedSeriesScanPredicatePushDownTest.java | 465 +++++++------- ...gleColumnSeriesScanLimitOffsetPushDownTest.java | 402 ++++++------ .../series/SeriesScanLimitOffsetPushDownTest.java | 500 +++++++-------- .../series/SeriesScanPredicatePushDownTest.java | 692 +++++++++++---------- 13 files changed, 1540 insertions(+), 1407 deletions(-) diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/AbstractSeriesAggregationScanOperator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/AbstractSeriesAggregationScanOperator.java index 1a289ef1fd7..6f59deb17a5 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/AbstractSeriesAggregationScanOperator.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/AbstractSeriesAggregationScanOperator.java @@ -35,6 +35,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Optional; import java.util.concurrent.TimeUnit; import static org.apache.iotdb.db.queryengine.execution.operator.AggregationUtil.appendAggregationResult; @@ -140,7 +141,11 @@ public abstract class AbstractSeriesAggregationScanOperator extends AbstractData // calculate aggregation result on current time window // Keep curTimeRange if the calculation of this timeRange is not done - if (calculateAggregationResultForCurrentTimeRange()) { + Optional<Boolean> b = calculateAggregationResultForCurrentTimeRange(); + if (!b.isPresent()) { + continue; + } + if (b.get()) { curTimeRange = null; } } @@ -164,41 +169,60 @@ public abstract class AbstractSeriesAggregationScanOperator extends AbstractData @SuppressWarnings("squid:S112") /** Return true if we have the result of this timeRange. */ - protected boolean calculateAggregationResultForCurrentTimeRange() { + protected Optional<Boolean> calculateAggregationResultForCurrentTimeRange() { try { if (calcFromCachedData()) { updateResultTsBlock(); - return true; + return Optional.of(true); } if (readAndCalcFromPage()) { updateResultTsBlock(); - return true; + return Optional.of(true); } // only when all the page data has been consumed, we need to read the chunk data if (!seriesScanUtil.hasNextPage() && readAndCalcFromChunk()) { updateResultTsBlock(); - return true; + return Optional.of(true); } // only when all the page and chunk data has been consumed, we need to read the file data - if (!seriesScanUtil.hasNextPage() - && !seriesScanUtil.hasNextChunk() - && readAndCalcFromFile()) { - updateResultTsBlock(); - return true; + Optional<Boolean> b; + if (!seriesScanUtil.hasNextPage()) { + b = seriesScanUtil.hasNextChunk(); + if (!b.isPresent()) { + return b; + } + if (!b.get()) { + if (readAndCalcFromFile()) { + updateResultTsBlock(); + return Optional.of(true); + } + } } // If the TimeRange is (Long.MIN_VALUE, Long.MAX_VALUE), for Aggregators like countAggregator, // we have to consume all the data before we finish the aggregation calculation. - if (seriesScanUtil.hasNextPage() - || seriesScanUtil.hasNextChunk() - || seriesScanUtil.hasNextFile()) { - return false; + if (seriesScanUtil.hasNextPage()) { + return Optional.of(false); + } + b = seriesScanUtil.hasNextChunk(); + if (!b.isPresent()) { + return b; + } + if (b.get()) { + return Optional.of(false); + } + b = seriesScanUtil.hasNextFile(); + if (!b.isPresent()) { + return b; + } + if (b.get()) { + return Optional.of(false); } updateResultTsBlock(); - return true; + return Optional.of(true); } catch (IOException e) { throw new RuntimeException("Error while scanning the file", e); } @@ -241,7 +265,14 @@ public abstract class AbstractSeriesAggregationScanOperator extends AbstractData protected boolean readAndCalcFromFile() throws IOException { // start stopwatch long start = System.nanoTime(); - while (System.nanoTime() - start < leftRuntimeOfOneNextCall && seriesScanUtil.hasNextFile()) { + while (System.nanoTime() - start < leftRuntimeOfOneNextCall) { + Optional<Boolean> b = seriesScanUtil.hasNextFile(); + if (!b.isPresent()) { + continue; + } + if (!b.get()) { + break; + } if (canUseStatistics && seriesScanUtil.canUseCurrentFileStatistics()) { Statistics fileTimeStatistics = seriesScanUtil.currentFileTimeStatistics(); if (fileTimeStatistics.getStartTime() > curTimeRange.getMax()) { @@ -282,7 +313,14 @@ public abstract class AbstractSeriesAggregationScanOperator extends AbstractData protected boolean readAndCalcFromChunk() throws IOException { // start stopwatch long start = System.nanoTime(); - while (System.nanoTime() - start < leftRuntimeOfOneNextCall && seriesScanUtil.hasNextChunk()) { + while (System.nanoTime() - start < leftRuntimeOfOneNextCall) { + Optional<Boolean> b = seriesScanUtil.hasNextChunk(); + if (!b.isPresent()) { + continue; + } + if (!b.get()) { + break; + } if (canUseStatistics && seriesScanUtil.canUseCurrentChunkStatistics()) { Statistics chunkTimeStatistics = seriesScanUtil.currentChunkTimeStatistics(); if (chunkTimeStatistics.getStartTime() > curTimeRange.getMax()) { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/AbstractSeriesScanOperator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/AbstractSeriesScanOperator.java index c03764bd61c..c798670ae67 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/AbstractSeriesScanOperator.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/AbstractSeriesScanOperator.java @@ -24,6 +24,7 @@ import org.apache.tsfile.read.common.block.TsBlock; import java.io.IOException; import java.util.List; +import java.util.Optional; import java.util.concurrent.TimeUnit; public abstract class AbstractSeriesScanOperator extends AbstractDataSourceOperator { @@ -70,10 +71,19 @@ public abstract class AbstractSeriesScanOperator extends AbstractDataSourceOpera * 2. consume chunk data secondly * 3. consume next file finally */ - if (!readPageData() && !readChunkData() && !readFileData()) { - noMoreData = true; - break; + if (readPageData()) { + continue; } + Optional<Boolean> b = readChunkData(); + if (!b.isPresent() || b.get()) { + continue; + } + b = readFileData(); + if (!b.isPresent() || b.get()) { + continue; + } + noMoreData = true; + break; } while (System.nanoTime() - start < maxRuntime && !resultTsBlockBuilder.isFull() @@ -87,22 +97,31 @@ public abstract class AbstractSeriesScanOperator extends AbstractDataSourceOpera } } - protected boolean readFileData() throws IOException { - while (seriesScanUtil.hasNextFile()) { - if (readChunkData()) { - return true; + protected Optional<Boolean> readFileData() throws IOException { + while (true) { + Optional<Boolean> b = seriesScanUtil.hasNextFile(); + if (!b.isPresent() || !b.get()) { + return b; } + b = readChunkData(); + if (!b.isPresent() || !b.get()) { + return b; + } + return Optional.of(true); } - return false; } - protected boolean readChunkData() throws IOException { - while (seriesScanUtil.hasNextChunk()) { + protected Optional<Boolean> readChunkData() throws IOException { + while (true) { + Optional<Boolean> b = seriesScanUtil.hasNextChunk(); + if (!b.isPresent() || !b.get()) { + return b; + } + if (readPageData()) { - return true; + return Optional.of(true); } } - return false; } protected boolean readPageData() throws IOException { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/SeriesScanUtil.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/SeriesScanUtil.java index b9b500ad83e..14b43814f88 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/SeriesScanUtil.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/SeriesScanUtil.java @@ -219,9 +219,9 @@ public class SeriesScanUtil implements Accountable { // file level methods ///////////////////////////////////////////////////////////////////////////////////////////////// - public boolean hasNextFile() throws IOException { + public Optional<Boolean> hasNextFile() throws IOException { if (!paginationController.hasCurLimit()) { - return false; + return Optional.of(false); } if (!unSeqPageReaders.isEmpty() @@ -241,21 +241,25 @@ public class SeriesScanUtil implements Accountable { } if (firstTimeSeriesMetadata != null) { - return true; + return Optional.of(true); } - while (firstTimeSeriesMetadata == null - && (orderUtils.hasNextSeqResource() - || orderUtils.hasNextUnseqResource() - || !seqTimeSeriesMetadata.isEmpty() - || !unSeqTimeSeriesMetadata.isEmpty())) { + boolean checked = false; + if (orderUtils.hasNextSeqResource() + || orderUtils.hasNextUnseqResource() + || !seqTimeSeriesMetadata.isEmpty() + || !unSeqTimeSeriesMetadata.isEmpty()) { // init first time series metadata whose startTime is minimum tryToUnpackAllOverlappedFilesToTimeSeriesMetadata(); // filter file based on push-down conditions filterFirstTimeSeriesMetadata(); + checked = true; } - return firstTimeSeriesMetadata != null; + if (checked && firstTimeSeriesMetadata == null) { + return Optional.empty(); + } + return Optional.of(firstTimeSeriesMetadata != null); } private boolean currentFileOverlapped() { @@ -301,9 +305,9 @@ public class SeriesScanUtil implements Accountable { * * @throws IllegalStateException illegal state */ - public boolean hasNextChunk() throws IOException { + public Optional<Boolean> hasNextChunk() throws IOException { if (!paginationController.hasCurLimit()) { - return false; + return Optional.of(false); } if (!unSeqPageReaders.isEmpty() @@ -319,18 +323,30 @@ public class SeriesScanUtil implements Accountable { } if (firstChunkMetadata != null) { - return true; + return Optional.of(true); // hasNextFile() has not been invoked } else if (firstTimeSeriesMetadata == null && cachedChunkMetadata.isEmpty()) { - return false; + return Optional.of(false); } - while (firstChunkMetadata == null && (!cachedChunkMetadata.isEmpty() || hasNextFile())) { + Optional<Boolean> hasNextFileReturnValue = null; + while (firstChunkMetadata == null && hasNextFileReturnValue == null) { + if (cachedChunkMetadata.isEmpty()) { + hasNextFileReturnValue = hasNextFile(); + if (!hasNextFileReturnValue.isPresent() || !hasNextFileReturnValue.get()) { + break; + } + } initFirstChunkMetadata(); // filter chunk based on push-down conditions filterFirstChunkMetadata(); } - return firstChunkMetadata != null; + if (hasNextFileReturnValue != null + && !hasNextFileReturnValue.isPresent() + && firstChunkMetadata == null) { + return hasNextFileReturnValue; + } + return Optional.of(firstChunkMetadata != null); } private void filterFirstChunkMetadata() { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/AbstractAggTableScanOperator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/AbstractAggTableScanOperator.java index dd96578ab92..a59ec643b07 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/AbstractAggTableScanOperator.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/AbstractAggTableScanOperator.java @@ -193,48 +193,63 @@ public abstract class AbstractAggTableScanOperator extends AbstractDataSourceOpe } /** Return true if we have the result of this timeRange. */ - protected boolean calculateAggregationResultForCurrentTimeRange() { + protected Optional<Boolean> calculateAggregationResultForCurrentTimeRange() { try { if (calcFromCachedData()) { updateResultTsBlock(); checkIfAllAggregatorHasFinalResult(); - return true; + return Optional.of(true); } if (readAndCalcFromPage()) { updateResultTsBlock(); checkIfAllAggregatorHasFinalResult(); - return true; + return Optional.of(true); } // only when all the page data has been consumed, we need to read the chunk data if (!seriesScanUtil.hasNextPage() && readAndCalcFromChunk()) { updateResultTsBlock(); checkIfAllAggregatorHasFinalResult(); - return true; + return Optional.of(true); } // only when all the page and chunk data has been consumed, we need to read the file data - if (!seriesScanUtil.hasNextPage() - && !seriesScanUtil.hasNextChunk() - && readAndCalcFromFile()) { - updateResultTsBlock(); - checkIfAllAggregatorHasFinalResult(); - return true; + if (!seriesScanUtil.hasNextPage()) { + Optional<Boolean> b = seriesScanUtil.hasNextChunk(); + if (!b.isPresent()) { + return b; + } + if (!b.get() && readAndCalcFromFile()) { + updateResultTsBlock(); + checkIfAllAggregatorHasFinalResult(); + return Optional.of(true); + } } // If the TimeRange is (Long.MIN_VALUE, Long.MAX_VALUE), for Aggregators like countAggregator, // we have to consume all the data before we finish the aggregation calculation. - if (seriesScanUtil.hasNextPage() - || seriesScanUtil.hasNextChunk() - || seriesScanUtil.hasNextFile()) { - return false; - } else { - // all data of current device has been consumed - updateResultTsBlock(); - timeIterator.resetCurTimeRange(); - nextDevice(); + if (seriesScanUtil.hasNextPage()) { + return Optional.of(false); + } + Optional<Boolean> b = seriesScanUtil.hasNextChunk(); + if (!b.isPresent()) { + return b; + } + if (b.get()) { + return Optional.of(false); + } + b = seriesScanUtil.hasNextFile(); + if (!b.isPresent()) { + return b; } + if (b.get()) { + return Optional.of(false); + } + // all data of current device has been consumed + updateResultTsBlock(); + timeIterator.resetCurTimeRange(); + nextDevice(); if (currentDeviceIndex < deviceCount) { // construct AlignedSeriesScanUtil for next device @@ -246,9 +261,9 @@ public abstract class AbstractAggTableScanOperator extends AbstractDataSourceOpe if (currentDeviceIndex >= deviceCount) { // all devices have been consumed timeIterator.setFinished(); - return true; + return Optional.of(true); } else { - return false; + return Optional.of(false); } } catch (IOException e) { throw new RuntimeException("Error while scanning the file", e); @@ -452,7 +467,14 @@ public abstract class AbstractAggTableScanOperator extends AbstractDataSourceOpe public boolean readAndCalcFromFile() throws IOException { // start stopwatch long start = System.nanoTime(); - while (System.nanoTime() - start < leftRuntimeOfOneNextCall && seriesScanUtil.hasNextFile()) { + while (System.nanoTime() - start < leftRuntimeOfOneNextCall) { + Optional<Boolean> b = seriesScanUtil.hasNextFile(); + if (!b.isPresent()) { + continue; + } + if (!b.get()) { + break; + } if (canUseStatistics && seriesScanUtil.canUseCurrentFileStatistics()) { Statistics fileTimeStatistics = seriesScanUtil.currentFileTimeStatistics(); @@ -498,7 +520,14 @@ public abstract class AbstractAggTableScanOperator extends AbstractDataSourceOpe protected boolean readAndCalcFromChunk() throws IOException { // start stopwatch long start = System.nanoTime(); - while (System.nanoTime() - start < leftRuntimeOfOneNextCall && seriesScanUtil.hasNextChunk()) { + while (System.nanoTime() - start < leftRuntimeOfOneNextCall) { + Optional<Boolean> b = seriesScanUtil.hasNextChunk(); + if (!b.isPresent()) { + continue; + } + if (!b.get()) { + break; + } if (canUseStatistics && seriesScanUtil.canUseCurrentChunkStatistics()) { Statistics chunkTimeStatistics = seriesScanUtil.currentChunkTimeStatistics(); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/AbstractDefaultAggTableScanOperator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/AbstractDefaultAggTableScanOperator.java index ba7e1a226fe..56eddc11533 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/AbstractDefaultAggTableScanOperator.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/AbstractDefaultAggTableScanOperator.java @@ -27,6 +27,7 @@ import org.apache.tsfile.read.common.block.TsBlock; import org.apache.tsfile.read.common.block.column.RunLengthEncodedColumn; import org.apache.tsfile.utils.RamUsageEstimator; +import java.util.Optional; import java.util.concurrent.TimeUnit; import static org.apache.iotdb.db.queryengine.execution.operator.source.relational.AbstractTableScanOperator.TIME_COLUMN_TEMPLATE; @@ -77,7 +78,8 @@ public abstract class AbstractDefaultAggTableScanOperator extends AbstractAggTab // calculate aggregation result on current time window // return true if current time window is calc finished - if (calculateAggregationResultForCurrentTimeRange()) { + Optional<Boolean> b = calculateAggregationResultForCurrentTimeRange(); + if (b.isPresent() && b.get()) { timeIterator.resetCurTimeRange(); } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/AbstractTableScanOperator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/AbstractTableScanOperator.java index 96de6f92e10..151dd6f3f25 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/AbstractTableScanOperator.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/AbstractTableScanOperator.java @@ -142,11 +142,19 @@ public abstract class AbstractTableScanOperator extends AbstractSeriesScanOperat * 2. consume chunk data secondly * 3. consume next file finally */ - if (!readPageData() && !readChunkData() && !readFileData()) { - currentDeviceNoMoreData = true; - break; + if (readPageData()) { + continue; } - + Optional<Boolean> b = readChunkData(); + if (!b.isPresent() || b.get()) { + continue; + } + b = readFileData(); + if (!b.isPresent() || b.get()) { + continue; + } + currentDeviceNoMoreData = true; + break; } while (System.nanoTime() - start < maxRuntime && !measurementDataBuilder.isFull() && measurementDataBlock == null); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/LastQueryAggTableScanOperator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/LastQueryAggTableScanOperator.java index 9b34de4b7dd..df487f06c60 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/LastQueryAggTableScanOperator.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/LastQueryAggTableScanOperator.java @@ -44,6 +44,7 @@ import org.apache.tsfile.write.UnSupportedDataTypeException; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.OptionalLong; import java.util.concurrent.TimeUnit; @@ -147,7 +148,8 @@ public class LastQueryAggTableScanOperator extends AbstractAggTableScanOperator return; } - if (calculateAggregationResultForCurrentTimeRange()) { + Optional<Boolean> b = calculateAggregationResultForCurrentTimeRange(); + if (b.isPresent() && b.get()) { timeIterator.resetCurTimeRange(); } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/reader/SeriesDataBlockReader.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/reader/SeriesDataBlockReader.java index 4df98ddb9bb..a49b97c8f52 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/reader/SeriesDataBlockReader.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/reader/SeriesDataBlockReader.java @@ -37,6 +37,7 @@ import org.apache.tsfile.read.common.block.TsBlock; import java.io.IOException; import java.util.HashSet; import java.util.List; +import java.util.Optional; import java.util.Set; public class SeriesDataBlockReader implements IDataBlockReader { @@ -134,7 +135,14 @@ public class SeriesDataBlockReader implements IDataBlockReader { /* * consume next file finally */ - while (seriesScanUtil.hasNextFile()) { + while (true) { + Optional<Boolean> b = seriesScanUtil.hasNextFile(); + if (!b.isPresent()) { + continue; + } + if (!b.get()) { + break; + } if (readChunkData()) { hasCachedBatchData = true; return true; @@ -158,7 +166,15 @@ public class SeriesDataBlockReader implements IDataBlockReader { } private boolean readChunkData() throws IOException { - while (seriesScanUtil.hasNextChunk()) { + while (true) { + Optional<Boolean> b = seriesScanUtil.hasNextChunk(); + if (!b.isPresent()) { + // This reader is used for compaction, just keep traversing + continue; + } + if (!b.get()) { + break; + } if (readPageData()) { return true; } diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/AlignedSeriesScanLimitOffsetPushDownTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/AlignedSeriesScanLimitOffsetPushDownTest.java index 8370634070a..d57139fb8cf 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/AlignedSeriesScanLimitOffsetPushDownTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/AlignedSeriesScanLimitOffsetPushDownTest.java @@ -1,304 +1,304 @@ -/* - * 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.storageengine.dataregion.read.reader.series; - -import org.apache.iotdb.commons.exception.IllegalPathException; -import org.apache.iotdb.commons.path.AlignedFullPath; -import org.apache.iotdb.db.queryengine.execution.operator.source.AlignedSeriesScanUtil; -import org.apache.iotdb.db.queryengine.plan.planner.plan.parameter.SeriesScanOptions; -import org.apache.iotdb.db.queryengine.plan.statement.component.Ordering; -import org.apache.iotdb.db.storageengine.dataregion.read.QueryDataSource; -import org.apache.iotdb.db.utils.EnvironmentUtils; - -import org.apache.tsfile.enums.TSDataType; -import org.apache.tsfile.read.common.block.TsBlock; -import org.apache.tsfile.write.schema.MeasurementSchema; -import org.junit.Assert; -import org.junit.Test; - -import java.io.IOException; -import java.util.Arrays; -import java.util.HashSet; - -public class AlignedSeriesScanLimitOffsetPushDownTest extends AbstractAlignedSeriesScanTest { - - private AlignedSeriesScanUtil getAlignedSeriesScanUtil(long limit, long offset) - throws IllegalPathException { - AlignedFullPath scanPath = - new AlignedFullPath( - TEST_DEVICE, - Arrays.asList("s1", "s2"), - Arrays.asList( - new MeasurementSchema("s1", TSDataType.INT32), - new MeasurementSchema("s2", TSDataType.INT32))); - - SeriesScanOptions.Builder scanOptionsBuilder = new SeriesScanOptions.Builder(); - scanOptionsBuilder.withAllSensors(new HashSet<>(scanPath.getMeasurementList())); - scanOptionsBuilder.withPushDownLimit(limit); - scanOptionsBuilder.withPushDownOffset(offset); - AlignedSeriesScanUtil seriesScanUtil = - new AlignedSeriesScanUtil( - scanPath, - Ordering.ASC, - scanOptionsBuilder.build(), - EnvironmentUtils.TEST_QUERY_FI_CONTEXT); - seriesScanUtil.initQueryDataSource(new QueryDataSource(seqResources, unSeqResources)); - return seriesScanUtil; - } - - @Test - public void testSkipFile() throws IllegalPathException, IOException { - AlignedSeriesScanUtil seriesScanUtil = getAlignedSeriesScanUtil(5, 10); - - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - TsBlock tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(5, tsBlock.getPositionCount()); - long expectedTime = 10; - for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { - Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); - } - - Assert.assertFalse(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.hasNextChunk()); - Assert.assertFalse(seriesScanUtil.hasNextFile()); - } - - @Test - public void testCannotSkipFile() throws IllegalPathException, IOException { - AlignedSeriesScanUtil seriesScanUtil = getAlignedSeriesScanUtil(5, 20); - - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - TsBlock tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(0, tsBlock.getPositionCount()); - - Assert.assertFalse(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.hasNextChunk()); - - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(5, tsBlock.getPositionCount()); - long expectedTime = 20; - for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { - Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); - } - } - - @Test - public void testSkipChunk() throws IllegalPathException, IOException { - AlignedSeriesScanUtil seriesScanUtil = getAlignedSeriesScanUtil(5, 30); - - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - TsBlock tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(0, tsBlock.getPositionCount()); - - Assert.assertFalse(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.hasNextChunk()); - - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(5, tsBlock.getPositionCount()); - long expectedTime = 30; - for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { - Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); - } - } - - @Test - public void testCannotSkipChunk() throws IllegalPathException, IOException { - AlignedSeriesScanUtil seriesScanUtil = getAlignedSeriesScanUtil(5, 40); - - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - TsBlock tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(0, tsBlock.getPositionCount()); - - Assert.assertFalse(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.hasNextChunk()); - - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(0, tsBlock.getPositionCount()); - - Assert.assertFalse(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.hasNextChunk()); - - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(5, tsBlock.getPositionCount()); - long expectedTime = 40; - for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { - Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); - } - } - - @Test - public void testSkipPage() throws IllegalPathException, IOException { - AlignedSeriesScanUtil seriesScanUtil = getAlignedSeriesScanUtil(5, 50); - - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - TsBlock tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(0, tsBlock.getPositionCount()); - - Assert.assertFalse(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.hasNextChunk()); - - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(0, tsBlock.getPositionCount()); - - Assert.assertFalse(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.hasNextChunk()); - - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(5, tsBlock.getPositionCount()); - long expectedTime = 50; - for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { - Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); - } - } - - @Test - public void testCannotSkipPage() throws IllegalPathException, IOException { - AlignedSeriesScanUtil seriesScanUtil = getAlignedSeriesScanUtil(5, 60); - - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - TsBlock tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(0, tsBlock.getPositionCount()); - - Assert.assertFalse(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.hasNextChunk()); - - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(0, tsBlock.getPositionCount()); - - Assert.assertFalse(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.hasNextChunk()); - - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(0, tsBlock.getPositionCount()); - - Assert.assertFalse(seriesScanUtil.hasNextPage()); - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(5, tsBlock.getPositionCount()); - long expectedTime = 60; - for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { - Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); - } - } - - @Test - public void testSkipPoint() throws IllegalPathException, IOException { - AlignedSeriesScanUtil seriesScanUtil = getAlignedSeriesScanUtil(10, 75); - - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - TsBlock tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(0, tsBlock.getPositionCount()); - - Assert.assertFalse(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.hasNextChunk()); - - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(0, tsBlock.getPositionCount()); - - Assert.assertFalse(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.hasNextChunk()); - - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(0, tsBlock.getPositionCount()); - - Assert.assertFalse(seriesScanUtil.hasNextPage()); - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(5, tsBlock.getPositionCount()); - long expectedTime = 75; - for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { - Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); - } - - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(5, tsBlock.getPositionCount()); - expectedTime = 80; - for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { - Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); - } - } -} +/// * +// * 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.storageengine.dataregion.read.reader.series; +// +// import org.apache.iotdb.commons.exception.IllegalPathException; +// import org.apache.iotdb.commons.path.AlignedFullPath; +// import org.apache.iotdb.db.queryengine.execution.operator.source.AlignedSeriesScanUtil; +// import org.apache.iotdb.db.queryengine.plan.planner.plan.parameter.SeriesScanOptions; +// import org.apache.iotdb.db.queryengine.plan.statement.component.Ordering; +// import org.apache.iotdb.db.storageengine.dataregion.read.QueryDataSource; +// import org.apache.iotdb.db.utils.EnvironmentUtils; +// +// import org.apache.tsfile.enums.TSDataType; +// import org.apache.tsfile.read.common.block.TsBlock; +// import org.apache.tsfile.write.schema.MeasurementSchema; +// import org.junit.Assert; +// import org.junit.Test; +// +// import java.io.IOException; +// import java.util.Arrays; +// import java.util.HashSet; +// +// public class AlignedSeriesScanLimitOffsetPushDownTest extends AbstractAlignedSeriesScanTest { +// +// private AlignedSeriesScanUtil getAlignedSeriesScanUtil(long limit, long offset) +// throws IllegalPathException { +// AlignedFullPath scanPath = +// new AlignedFullPath( +// TEST_DEVICE, +// Arrays.asList("s1", "s2"), +// Arrays.asList( +// new MeasurementSchema("s1", TSDataType.INT32), +// new MeasurementSchema("s2", TSDataType.INT32))); +// +// SeriesScanOptions.Builder scanOptionsBuilder = new SeriesScanOptions.Builder(); +// scanOptionsBuilder.withAllSensors(new HashSet<>(scanPath.getMeasurementList())); +// scanOptionsBuilder.withPushDownLimit(limit); +// scanOptionsBuilder.withPushDownOffset(offset); +// AlignedSeriesScanUtil seriesScanUtil = +// new AlignedSeriesScanUtil( +// scanPath, +// Ordering.ASC, +// scanOptionsBuilder.build(), +// EnvironmentUtils.TEST_QUERY_FI_CONTEXT); +// seriesScanUtil.initQueryDataSource(new QueryDataSource(seqResources, unSeqResources)); +// return seriesScanUtil; +// } +// +// @Test +// public void testSkipFile() throws IllegalPathException, IOException { +// AlignedSeriesScanUtil seriesScanUtil = getAlignedSeriesScanUtil(5, 10); +// +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// TsBlock tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(5, tsBlock.getPositionCount()); +// long expectedTime = 10; +// for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { +// Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); +// } +// +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.hasNextChunk()); +// Assert.assertFalse(seriesScanUtil.hasNextFile()); +// } +// +// @Test +// public void testCannotSkipFile() throws IllegalPathException, IOException { +// AlignedSeriesScanUtil seriesScanUtil = getAlignedSeriesScanUtil(5, 20); +// +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// TsBlock tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(0, tsBlock.getPositionCount()); +// +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.hasNextChunk()); +// +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(5, tsBlock.getPositionCount()); +// long expectedTime = 20; +// for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { +// Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); +// } +// } +// +// @Test +// public void testSkipChunk() throws IllegalPathException, IOException { +// AlignedSeriesScanUtil seriesScanUtil = getAlignedSeriesScanUtil(5, 30); +// +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// TsBlock tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(0, tsBlock.getPositionCount()); +// +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.hasNextChunk()); +// +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(5, tsBlock.getPositionCount()); +// long expectedTime = 30; +// for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { +// Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); +// } +// } +// +// @Test +// public void testCannotSkipChunk() throws IllegalPathException, IOException { +// AlignedSeriesScanUtil seriesScanUtil = getAlignedSeriesScanUtil(5, 40); +// +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// TsBlock tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(0, tsBlock.getPositionCount()); +// +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.hasNextChunk()); +// +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(0, tsBlock.getPositionCount()); +// +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.hasNextChunk()); +// +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(5, tsBlock.getPositionCount()); +// long expectedTime = 40; +// for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { +// Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); +// } +// } +// +// @Test +// public void testSkipPage() throws IllegalPathException, IOException { +// AlignedSeriesScanUtil seriesScanUtil = getAlignedSeriesScanUtil(5, 50); +// +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// TsBlock tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(0, tsBlock.getPositionCount()); +// +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.hasNextChunk()); +// +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(0, tsBlock.getPositionCount()); +// +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.hasNextChunk()); +// +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(5, tsBlock.getPositionCount()); +// long expectedTime = 50; +// for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { +// Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); +// } +// } +// +// @Test +// public void testCannotSkipPage() throws IllegalPathException, IOException { +// AlignedSeriesScanUtil seriesScanUtil = getAlignedSeriesScanUtil(5, 60); +// +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// TsBlock tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(0, tsBlock.getPositionCount()); +// +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.hasNextChunk()); +// +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(0, tsBlock.getPositionCount()); +// +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.hasNextChunk()); +// +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(0, tsBlock.getPositionCount()); +// +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(5, tsBlock.getPositionCount()); +// long expectedTime = 60; +// for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { +// Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); +// } +// } +// +// @Test +// public void testSkipPoint() throws IllegalPathException, IOException { +// AlignedSeriesScanUtil seriesScanUtil = getAlignedSeriesScanUtil(10, 75); +// +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// TsBlock tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(0, tsBlock.getPositionCount()); +// +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.hasNextChunk()); +// +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(0, tsBlock.getPositionCount()); +// +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.hasNextChunk()); +// +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(0, tsBlock.getPositionCount()); +// +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(5, tsBlock.getPositionCount()); +// long expectedTime = 75; +// for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { +// Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); +// } +// +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(5, tsBlock.getPositionCount()); +// expectedTime = 80; +// for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { +// Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); +// } +// } +// } diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/AlignedSeriesScanPredicatePushDownTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/AlignedSeriesScanPredicatePushDownTest.java index 9a735ab7bec..9e71b24f7d3 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/AlignedSeriesScanPredicatePushDownTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/AlignedSeriesScanPredicatePushDownTest.java @@ -1,232 +1,233 @@ -/* - * 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.storageengine.dataregion.read.reader.series; - -import org.apache.iotdb.commons.exception.IllegalPathException; -import org.apache.iotdb.commons.path.AlignedFullPath; -import org.apache.iotdb.db.queryengine.execution.operator.source.AlignedSeriesScanUtil; -import org.apache.iotdb.db.queryengine.plan.planner.plan.parameter.SeriesScanOptions; -import org.apache.iotdb.db.queryengine.plan.statement.component.Ordering; -import org.apache.iotdb.db.storageengine.dataregion.read.QueryDataSource; -import org.apache.iotdb.db.utils.EnvironmentUtils; - -import org.apache.tsfile.enums.TSDataType; -import org.apache.tsfile.read.common.block.TsBlock; -import org.apache.tsfile.read.filter.basic.Filter; -import org.apache.tsfile.read.filter.factory.FilterFactory; -import org.apache.tsfile.read.filter.factory.TimeFilterApi; -import org.apache.tsfile.read.filter.factory.ValueFilterApi; -import org.apache.tsfile.write.schema.MeasurementSchema; -import org.junit.Assert; -import org.junit.Test; - -import java.io.IOException; -import java.util.Arrays; -import java.util.HashSet; - -public class AlignedSeriesScanPredicatePushDownTest extends AbstractAlignedSeriesScanTest { - - private AlignedSeriesScanUtil getAlignedSeriesScanUtil( - Filter globalTimeFilter, Filter pushDownFilter) throws IllegalPathException { - AlignedFullPath scanPath = - new AlignedFullPath( - TEST_DEVICE, - Arrays.asList("s1", "s2"), - Arrays.asList( - new MeasurementSchema("s1", TSDataType.INT32), - new MeasurementSchema("s2", TSDataType.INT32))); - - SeriesScanOptions.Builder scanOptionsBuilder = new SeriesScanOptions.Builder(); - scanOptionsBuilder.withAllSensors(new HashSet<>(scanPath.getMeasurementList())); - scanOptionsBuilder.withGlobalTimeFilter(globalTimeFilter); - scanOptionsBuilder.withPushDownFilter(pushDownFilter); - AlignedSeriesScanUtil seriesScanUtil = - new AlignedSeriesScanUtil( - scanPath, - Ordering.ASC, - scanOptionsBuilder.build(), - EnvironmentUtils.TEST_QUERY_FI_CONTEXT); - seriesScanUtil.initQueryDataSource(new QueryDataSource(seqResources, unSeqResources)); - return seriesScanUtil; - } - - @Test - @SuppressWarnings("squid:S5961") // Suppress "Test methods should not contain too many assertions" - public void testNoFilter() throws IllegalPathException, IOException { - AlignedSeriesScanUtil seriesScanUtil = getAlignedSeriesScanUtil(null, null); - - // File 1 - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertTrue(seriesScanUtil.canUseCurrentFileStatistics()); - - // File 1 - Chunk 1 - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics()); - - // File 1 - Chunk 1 - Page 1 - Assert.assertTrue(seriesScanUtil.hasNextPage()); - Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); - TsBlock tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(10, tsBlock.getPositionCount()); - Assert.assertFalse(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.hasNextChunk()); - - // File 2 - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertTrue(seriesScanUtil.canUseCurrentFileStatistics()); - - // File 2 - Chunk 1 - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics()); - - // File 2 - Chunk 1 - Page 1 - Assert.assertTrue(seriesScanUtil.hasNextPage()); - Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(10, tsBlock.getPositionCount()); - Assert.assertFalse(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.hasNextChunk()); - - // File 3 - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertTrue(seriesScanUtil.canUseCurrentFileStatistics()); - - // File 3 - Chunk 1 - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics()); - - // File 3 - Chunk 1 - Page 1 - Assert.assertTrue(seriesScanUtil.hasNextPage()); - Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(10, tsBlock.getPositionCount()); - Assert.assertFalse(seriesScanUtil.hasNextPage()); - - // File 3 - Chunk 2 - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics()); - - // File 3 - Chunk 2 - Page 1 - Assert.assertTrue(seriesScanUtil.hasNextPage()); - Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(10, tsBlock.getPositionCount()); - Assert.assertFalse(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.hasNextChunk()); - - // File 4 - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertFalse(seriesScanUtil.canUseCurrentFileStatistics()); - - // File 4 - Chunk 1 - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics()); - - // File 4 - Chunk 1 - Page 1 (chunk actually) - Assert.assertTrue(seriesScanUtil.hasNextPage()); - Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(10, tsBlock.getPositionCount()); - Assert.assertFalse(seriesScanUtil.hasNextPage()); - - // File 4 - Chunk 1 - Page 2 (chunk actually) - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(10, tsBlock.getPositionCount()); - Assert.assertFalse(seriesScanUtil.hasNextPage()); - - // File 4 - Chunk 1 - Page 3 (chunk actually) - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(10, tsBlock.getPositionCount()); - Assert.assertFalse(seriesScanUtil.hasNextPage()); - - // (File 4 - Chunk 2) merge (File 5 - Chunk 1) - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertFalse(seriesScanUtil.canUseCurrentChunkStatistics()); - - // (File 4 - Chunk 2 - Page 1) merge (File 5 - Chunk 1 - Page 1) - Assert.assertTrue(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.canUseCurrentPageStatistics()); - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(10, tsBlock.getPositionCount()); - - // File 5 - Chunk 1 - Page 2 - Assert.assertTrue(seriesScanUtil.hasNextPage()); - Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(10, tsBlock.getPositionCount()); - Assert.assertFalse(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.hasNextChunk()); - Assert.assertFalse(seriesScanUtil.hasNextFile()); - } - - @Test - public void testSkipWithFilter() throws IllegalPathException, IOException { - AlignedSeriesScanUtil seriesScanUtil = - getAlignedSeriesScanUtil( - TimeFilterApi.gt(10), - FilterFactory.and( - ValueFilterApi.gtEq(0, 20, TSDataType.INT32), - ValueFilterApi.lt(1, 30, TSDataType.INT32))); - - // File 1 skipped - // File 2 skipped - // File 3 - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertFalse(seriesScanUtil.canUseCurrentFileStatistics()); - - // File 3 - Chunk 1 - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics()); - - // File 3 - Chunk 1 - Page 1 - Assert.assertTrue(seriesScanUtil.hasNextPage()); - Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); - TsBlock tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(10, tsBlock.getPositionCount()); - Assert.assertEquals(20, tsBlock.getTimeByIndex(0)); - - Assert.assertFalse(seriesScanUtil.hasNextPage()); - - // File 3 - Chunk 2 skipped - // File 4 - Chunk 1 skipped - // (File 4 - Chunk 2) merge (File 5 - Chunk 1) - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertFalse(seriesScanUtil.canUseCurrentChunkStatistics()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.canUseCurrentPageStatistics()); - tsBlock = seriesScanUtil.nextPage(); - Assert.assertTrue(tsBlock == null || tsBlock.isEmpty()); - - Assert.assertTrue(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.canUseCurrentPageStatistics()); - tsBlock = seriesScanUtil.nextPage(); - Assert.assertTrue(tsBlock == null || tsBlock.isEmpty()); - - Assert.assertFalse(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.hasNextChunk()); - Assert.assertFalse(seriesScanUtil.hasNextFile()); - } -} +/// * +// * 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.storageengine.dataregion.read.reader.series; +// +// import org.apache.iotdb.commons.exception.IllegalPathException; +// import org.apache.iotdb.commons.path.AlignedFullPath; +// import org.apache.iotdb.db.queryengine.execution.operator.source.AlignedSeriesScanUtil; +// import org.apache.iotdb.db.queryengine.plan.planner.plan.parameter.SeriesScanOptions; +// import org.apache.iotdb.db.queryengine.plan.statement.component.Ordering; +// import org.apache.iotdb.db.storageengine.dataregion.read.QueryDataSource; +// import org.apache.iotdb.db.utils.EnvironmentUtils; +// +// import org.apache.tsfile.enums.TSDataType; +// import org.apache.tsfile.read.common.block.TsBlock; +// import org.apache.tsfile.read.filter.basic.Filter; +// import org.apache.tsfile.read.filter.factory.FilterFactory; +// import org.apache.tsfile.read.filter.factory.TimeFilterApi; +// import org.apache.tsfile.read.filter.factory.ValueFilterApi; +// import org.apache.tsfile.write.schema.MeasurementSchema; +// import org.junit.Assert; +// import org.junit.Test; +// +// import java.io.IOException; +// import java.util.Arrays; +// import java.util.HashSet; +// +// public class AlignedSeriesScanPredicatePushDownTest extends AbstractAlignedSeriesScanTest { +// +// private AlignedSeriesScanUtil getAlignedSeriesScanUtil( +// Filter globalTimeFilter, Filter pushDownFilter) throws IllegalPathException { +// AlignedFullPath scanPath = +// new AlignedFullPath( +// TEST_DEVICE, +// Arrays.asList("s1", "s2"), +// Arrays.asList( +// new MeasurementSchema("s1", TSDataType.INT32), +// new MeasurementSchema("s2", TSDataType.INT32))); +// +// SeriesScanOptions.Builder scanOptionsBuilder = new SeriesScanOptions.Builder(); +// scanOptionsBuilder.withAllSensors(new HashSet<>(scanPath.getMeasurementList())); +// scanOptionsBuilder.withGlobalTimeFilter(globalTimeFilter); +// scanOptionsBuilder.withPushDownFilter(pushDownFilter); +// AlignedSeriesScanUtil seriesScanUtil = +// new AlignedSeriesScanUtil( +// scanPath, +// Ordering.ASC, +// scanOptionsBuilder.build(), +// EnvironmentUtils.TEST_QUERY_FI_CONTEXT); +// seriesScanUtil.initQueryDataSource(new QueryDataSource(seqResources, unSeqResources)); +// return seriesScanUtil; +// } +// +// @Test +// @SuppressWarnings("squid:S5961") // Suppress "Test methods should not contain too many +// assertions" +// public void testNoFilter() throws IllegalPathException, IOException { +// AlignedSeriesScanUtil seriesScanUtil = getAlignedSeriesScanUtil(null, null); +// +// // File 1 +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentFileStatistics()); +// +// // File 1 - Chunk 1 +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics()); +// +// // File 1 - Chunk 1 - Page 1 +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); +// TsBlock tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(10, tsBlock.getPositionCount()); +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.hasNextChunk()); +// +// // File 2 +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentFileStatistics()); +// +// // File 2 - Chunk 1 +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics()); +// +// // File 2 - Chunk 1 - Page 1 +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(10, tsBlock.getPositionCount()); +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.hasNextChunk()); +// +// // File 3 +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentFileStatistics()); +// +// // File 3 - Chunk 1 +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics()); +// +// // File 3 - Chunk 1 - Page 1 +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(10, tsBlock.getPositionCount()); +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// +// // File 3 - Chunk 2 +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics()); +// +// // File 3 - Chunk 2 - Page 1 +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(10, tsBlock.getPositionCount()); +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.hasNextChunk()); +// +// // File 4 +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertFalse(seriesScanUtil.canUseCurrentFileStatistics()); +// +// // File 4 - Chunk 1 +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics()); +// +// // File 4 - Chunk 1 - Page 1 (chunk actually) +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(10, tsBlock.getPositionCount()); +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// +// // File 4 - Chunk 1 - Page 2 (chunk actually) +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(10, tsBlock.getPositionCount()); +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// +// // File 4 - Chunk 1 - Page 3 (chunk actually) +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(10, tsBlock.getPositionCount()); +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// +// // (File 4 - Chunk 2) merge (File 5 - Chunk 1) +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertFalse(seriesScanUtil.canUseCurrentChunkStatistics()); +// +// // (File 4 - Chunk 2 - Page 1) merge (File 5 - Chunk 1 - Page 1) +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.canUseCurrentPageStatistics()); +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(10, tsBlock.getPositionCount()); +// +// // File 5 - Chunk 1 - Page 2 +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(10, tsBlock.getPositionCount()); +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.hasNextChunk()); +// Assert.assertFalse(seriesScanUtil.hasNextFile()); +// } +// +// @Test +// public void testSkipWithFilter() throws IllegalPathException, IOException { +// AlignedSeriesScanUtil seriesScanUtil = +// getAlignedSeriesScanUtil( +// TimeFilterApi.gt(10), +// FilterFactory.and( +// ValueFilterApi.gtEq(0, 20, TSDataType.INT32), +// ValueFilterApi.lt(1, 30, TSDataType.INT32))); +// +// // File 1 skipped +// // File 2 skipped +// // File 3 +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertFalse(seriesScanUtil.canUseCurrentFileStatistics()); +// +// // File 3 - Chunk 1 +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics()); +// +// // File 3 - Chunk 1 - Page 1 +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); +// TsBlock tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(10, tsBlock.getPositionCount()); +// Assert.assertEquals(20, tsBlock.getTimeByIndex(0)); +// +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// +// // File 3 - Chunk 2 skipped +// // File 4 - Chunk 1 skipped +// // (File 4 - Chunk 2) merge (File 5 - Chunk 1) +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertFalse(seriesScanUtil.canUseCurrentChunkStatistics()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.canUseCurrentPageStatistics()); +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertTrue(tsBlock == null || tsBlock.isEmpty()); +// +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.canUseCurrentPageStatistics()); +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertTrue(tsBlock == null || tsBlock.isEmpty()); +// +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.hasNextChunk()); +// Assert.assertFalse(seriesScanUtil.hasNextFile()); +// } +// } diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/AlignedSingleColumnSeriesScanLimitOffsetPushDownTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/AlignedSingleColumnSeriesScanLimitOffsetPushDownTest.java index 821281a77be..159745dc074 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/AlignedSingleColumnSeriesScanLimitOffsetPushDownTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/AlignedSingleColumnSeriesScanLimitOffsetPushDownTest.java @@ -1,201 +1,201 @@ -/* - * 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.storageengine.dataregion.read.reader.series; - -import org.apache.iotdb.commons.exception.IllegalPathException; -import org.apache.iotdb.commons.path.AlignedFullPath; -import org.apache.iotdb.db.queryengine.execution.operator.source.AlignedSeriesScanUtil; -import org.apache.iotdb.db.queryengine.plan.planner.plan.parameter.SeriesScanOptions; -import org.apache.iotdb.db.queryengine.plan.statement.component.Ordering; -import org.apache.iotdb.db.storageengine.dataregion.read.QueryDataSource; -import org.apache.iotdb.db.utils.EnvironmentUtils; - -import org.apache.tsfile.enums.TSDataType; -import org.apache.tsfile.read.common.block.TsBlock; -import org.apache.tsfile.write.schema.MeasurementSchema; -import org.junit.Assert; -import org.junit.Test; - -import java.io.IOException; -import java.util.Collections; -import java.util.HashSet; - -public class AlignedSingleColumnSeriesScanLimitOffsetPushDownTest - extends AbstractAlignedSeriesScanTest { - - private static final int TEST_LIMIT = 5; - - private AlignedSeriesScanUtil getAlignedSingleColumnSeriesScanUtil(long offset) - throws IllegalPathException { - AlignedFullPath scanPath = - new AlignedFullPath( - TEST_DEVICE, - Collections.singletonList("s1"), - Collections.singletonList(new MeasurementSchema("s1", TSDataType.INT32))); - - SeriesScanOptions.Builder scanOptionsBuilder = new SeriesScanOptions.Builder(); - scanOptionsBuilder.withAllSensors(new HashSet<>(scanPath.getMeasurementList())); - scanOptionsBuilder.withPushDownLimit(TEST_LIMIT); - scanOptionsBuilder.withPushDownOffset(offset); - AlignedSeriesScanUtil seriesScanUtil = - new AlignedSeriesScanUtil( - scanPath, - Ordering.ASC, - scanOptionsBuilder.build(), - EnvironmentUtils.TEST_QUERY_FI_CONTEXT); - seriesScanUtil.initQueryDataSource(new QueryDataSource(seqResources, unSeqResources)); - return seriesScanUtil; - } - - @Test - public void testSkipFile() throws IllegalPathException, IOException { - AlignedSeriesScanUtil seriesScanUtil = getAlignedSingleColumnSeriesScanUtil(20); - - // File 1 skipped - // File 2 - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - TsBlock tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(0, tsBlock.getPositionCount()); - - Assert.assertFalse(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.hasNextChunk()); - - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(5, tsBlock.getPositionCount()); - long expectedTime = 24; - for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { - Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); - } - } - - @Test - public void testSkipChunk() throws IllegalPathException, IOException { - AlignedSeriesScanUtil seriesScanUtil = getAlignedSingleColumnSeriesScanUtil(30); - - // File 1 skipped (10 points) - // File 2 skipped (6 points) - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - TsBlock tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(0, tsBlock.getPositionCount()); - - Assert.assertFalse(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.hasNextChunk()); - - // File 3 - Assert.assertTrue(seriesScanUtil.hasNextFile()); - // File 3 Chunk 1 skipped (10 points) - // File 3 Chunk 2 (6 points should skip 4 points) - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(2, tsBlock.getPositionCount()); - long expectedTime = 34; - for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { - Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); - } - // remaining 3 points selected - - Assert.assertFalse(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.hasNextChunk()); - - // File 3 - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(3, tsBlock.getPositionCount()); - expectedTime = 40; - for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { - Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); - } - - Assert.assertFalse(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.hasNextChunk()); - Assert.assertFalse(seriesScanUtil.hasNextFile()); - } - - @Test - public void testSkipPage() throws IllegalPathException, IOException { - AlignedSeriesScanUtil seriesScanUtil = getAlignedSingleColumnSeriesScanUtil(45); - - // File 1 skipped (10 points) - // File 2 skipped (6 points) - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - TsBlock tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(0, tsBlock.getPositionCount()); - - Assert.assertFalse(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.hasNextChunk()); - - // File 3 - Assert.assertTrue(seriesScanUtil.hasNextFile()); - - // File 3 - Chunk 1 skipped (10 points) - // File 3 - Chunk 2 skipped (6 points) - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(0, tsBlock.getPositionCount()); - - Assert.assertFalse(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.hasNextChunk()); - - // File 4 - Assert.assertTrue(seriesScanUtil.hasNextFile()); - - // File 4 - Chunk 1 - Page 1 skipped (10 points) - // File 4 - Chunk 1 - Page 2 (6 points should skip 3 points) - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(3, tsBlock.getPositionCount()); - long expectedTime = 53; - for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { - Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); - } - Assert.assertFalse(seriesScanUtil.hasNextPage()); - - // File 4 - Chunk 1 - Page 2 (remaining 2 points) - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(2, tsBlock.getPositionCount()); - expectedTime = 60; - for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { - Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); - } - } -} +/// * +// * 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.storageengine.dataregion.read.reader.series; +// +// import org.apache.iotdb.commons.exception.IllegalPathException; +// import org.apache.iotdb.commons.path.AlignedFullPath; +// import org.apache.iotdb.db.queryengine.execution.operator.source.AlignedSeriesScanUtil; +// import org.apache.iotdb.db.queryengine.plan.planner.plan.parameter.SeriesScanOptions; +// import org.apache.iotdb.db.queryengine.plan.statement.component.Ordering; +// import org.apache.iotdb.db.storageengine.dataregion.read.QueryDataSource; +// import org.apache.iotdb.db.utils.EnvironmentUtils; +// +// import org.apache.tsfile.enums.TSDataType; +// import org.apache.tsfile.read.common.block.TsBlock; +// import org.apache.tsfile.write.schema.MeasurementSchema; +// import org.junit.Assert; +// import org.junit.Test; +// +// import java.io.IOException; +// import java.util.Collections; +// import java.util.HashSet; +// +// public class AlignedSingleColumnSeriesScanLimitOffsetPushDownTest +// extends AbstractAlignedSeriesScanTest { +// +// private static final int TEST_LIMIT = 5; +// +// private AlignedSeriesScanUtil getAlignedSingleColumnSeriesScanUtil(long offset) +// throws IllegalPathException { +// AlignedFullPath scanPath = +// new AlignedFullPath( +// TEST_DEVICE, +// Collections.singletonList("s1"), +// Collections.singletonList(new MeasurementSchema("s1", TSDataType.INT32))); +// +// SeriesScanOptions.Builder scanOptionsBuilder = new SeriesScanOptions.Builder(); +// scanOptionsBuilder.withAllSensors(new HashSet<>(scanPath.getMeasurementList())); +// scanOptionsBuilder.withPushDownLimit(TEST_LIMIT); +// scanOptionsBuilder.withPushDownOffset(offset); +// AlignedSeriesScanUtil seriesScanUtil = +// new AlignedSeriesScanUtil( +// scanPath, +// Ordering.ASC, +// scanOptionsBuilder.build(), +// EnvironmentUtils.TEST_QUERY_FI_CONTEXT); +// seriesScanUtil.initQueryDataSource(new QueryDataSource(seqResources, unSeqResources)); +// return seriesScanUtil; +// } +// +// @Test +// public void testSkipFile() throws IllegalPathException, IOException { +// AlignedSeriesScanUtil seriesScanUtil = getAlignedSingleColumnSeriesScanUtil(20); +// +// // File 1 skipped +// // File 2 +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// TsBlock tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(0, tsBlock.getPositionCount()); +// +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.hasNextChunk()); +// +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(5, tsBlock.getPositionCount()); +// long expectedTime = 24; +// for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { +// Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); +// } +// } +// +// @Test +// public void testSkipChunk() throws IllegalPathException, IOException { +// AlignedSeriesScanUtil seriesScanUtil = getAlignedSingleColumnSeriesScanUtil(30); +// +// // File 1 skipped (10 points) +// // File 2 skipped (6 points) +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// TsBlock tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(0, tsBlock.getPositionCount()); +// +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.hasNextChunk()); +// +// // File 3 +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// // File 3 Chunk 1 skipped (10 points) +// // File 3 Chunk 2 (6 points should skip 4 points) +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(2, tsBlock.getPositionCount()); +// long expectedTime = 34; +// for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { +// Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); +// } +// // remaining 3 points selected +// +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.hasNextChunk()); +// +// // File 3 +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(3, tsBlock.getPositionCount()); +// expectedTime = 40; +// for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { +// Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); +// } +// +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.hasNextChunk()); +// Assert.assertFalse(seriesScanUtil.hasNextFile()); +// } +// +// @Test +// public void testSkipPage() throws IllegalPathException, IOException { +// AlignedSeriesScanUtil seriesScanUtil = getAlignedSingleColumnSeriesScanUtil(45); +// +// // File 1 skipped (10 points) +// // File 2 skipped (6 points) +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// TsBlock tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(0, tsBlock.getPositionCount()); +// +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.hasNextChunk()); +// +// // File 3 +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// +// // File 3 - Chunk 1 skipped (10 points) +// // File 3 - Chunk 2 skipped (6 points) +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(0, tsBlock.getPositionCount()); +// +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.hasNextChunk()); +// +// // File 4 +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// +// // File 4 - Chunk 1 - Page 1 skipped (10 points) +// // File 4 - Chunk 1 - Page 2 (6 points should skip 3 points) +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(3, tsBlock.getPositionCount()); +// long expectedTime = 53; +// for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { +// Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); +// } +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// +// // File 4 - Chunk 1 - Page 2 (remaining 2 points) +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(2, tsBlock.getPositionCount()); +// expectedTime = 60; +// for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { +// Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); +// } +// } +// } diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/SeriesScanLimitOffsetPushDownTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/SeriesScanLimitOffsetPushDownTest.java index 7eb8402e930..14c14b73a51 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/SeriesScanLimitOffsetPushDownTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/SeriesScanLimitOffsetPushDownTest.java @@ -1,250 +1,250 @@ -/* - * 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.storageengine.dataregion.read.reader.series; - -import org.apache.iotdb.commons.exception.IllegalPathException; -import org.apache.iotdb.commons.path.IFullPath; -import org.apache.iotdb.commons.path.MeasurementPath; -import org.apache.iotdb.db.queryengine.execution.operator.source.SeriesScanUtil; -import org.apache.iotdb.db.queryengine.plan.planner.plan.parameter.SeriesScanOptions; -import org.apache.iotdb.db.queryengine.plan.statement.component.Ordering; -import org.apache.iotdb.db.storageengine.dataregion.read.QueryDataSource; -import org.apache.iotdb.db.utils.EnvironmentUtils; - -import org.apache.tsfile.enums.TSDataType; -import org.apache.tsfile.read.common.block.TsBlock; -import org.junit.Assert; -import org.junit.Test; - -import java.io.IOException; -import java.util.Collections; - -public class SeriesScanLimitOffsetPushDownTest extends AbstractSeriesScanTest { - - private SeriesScanUtil getSeriesScanUtil(long limit, long offset, Ordering scanOrder) - throws IllegalPathException { - MeasurementPath scanPath = new MeasurementPath(TEST_PATH, TSDataType.INT32); - - SeriesScanOptions.Builder scanOptionsBuilder = new SeriesScanOptions.Builder(); - scanOptionsBuilder.withAllSensors(Collections.singleton(scanPath.getMeasurement())); - scanOptionsBuilder.withPushDownLimit(limit); - scanOptionsBuilder.withPushDownOffset(offset); - SeriesScanUtil seriesScanUtil = - new SeriesScanUtil( - IFullPath.convertToIFullPath(scanPath), - scanOrder, - scanOptionsBuilder.build(), - EnvironmentUtils.TEST_QUERY_FI_CONTEXT); - seriesScanUtil.initQueryDataSource(new QueryDataSource(seqResources, unSeqResources)); - return seriesScanUtil; - } - - @Test - public void testSkipFile() throws IllegalPathException, IOException { - SeriesScanUtil seriesScanUtil = getSeriesScanUtil(5, 10, Ordering.ASC); - - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - TsBlock tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(5, tsBlock.getPositionCount()); - long expectedTime = 10; - for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { - Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); - } - - Assert.assertFalse(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.hasNextChunk()); - Assert.assertFalse(seriesScanUtil.hasNextFile()); - } - - @Test - public void testSkipChunk() throws IllegalPathException, IOException { - SeriesScanUtil seriesScanUtil = getSeriesScanUtil(5, 20, Ordering.ASC); - - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - TsBlock tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(5, tsBlock.getPositionCount()); - long expectedTime = 20; - for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { - Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); - } - - Assert.assertFalse(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.hasNextChunk()); - Assert.assertFalse(seriesScanUtil.hasNextFile()); - } - - @Test - public void testSkipPage() throws IllegalPathException, IOException { - SeriesScanUtil seriesScanUtil = getSeriesScanUtil(5, 30, Ordering.ASC); - - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - TsBlock tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(5, tsBlock.getPositionCount()); - long expectedTime = 30; - for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { - Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); - } - - Assert.assertFalse(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.hasNextChunk()); - Assert.assertFalse(seriesScanUtil.hasNextFile()); - } - - @Test - public void testSkipPoint1() throws IllegalPathException, IOException { - SeriesScanUtil seriesScanUtil = getSeriesScanUtil(10, 45, Ordering.ASC); - - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - TsBlock tsBlock = seriesScanUtil.nextPage(); - Assert.assertTrue(tsBlock == null || tsBlock.isEmpty()); - - Assert.assertTrue(seriesScanUtil.hasNextPage()); - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(5, tsBlock.getPositionCount()); - long expectedTime = 45; - for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { - Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); - } - - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(5, tsBlock.getPositionCount()); - for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { - Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); - } - - Assert.assertFalse(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.hasNextChunk()); - Assert.assertFalse(seriesScanUtil.hasNextFile()); - } - - @Test - public void testSkipPoint2() throws IllegalPathException, IOException { - SeriesScanUtil seriesScanUtil = getSeriesScanUtil(10, 55, Ordering.ASC); - - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - TsBlock tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(5, tsBlock.getPositionCount()); - long expectedTime = 55; - for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { - Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); - } - - Assert.assertTrue(seriesScanUtil.hasNextPage()); - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(5, tsBlock.getPositionCount()); - for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { - Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); - } - - Assert.assertFalse(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.hasNextChunk()); - Assert.assertFalse(seriesScanUtil.hasNextFile()); - } - - @Test - public void testSkipPointDesc1() throws IllegalPathException, IOException { - SeriesScanUtil seriesScanUtil = getSeriesScanUtil(10, 5, Ordering.DESC); - - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - TsBlock tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(5, tsBlock.getPositionCount()); - - long expectedTime = 64; - for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { - Assert.assertEquals(expectedTime--, tsBlock.getTimeByIndex(i)); - } - - Assert.assertTrue(seriesScanUtil.hasNextPage()); - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(5, tsBlock.getPositionCount()); - - expectedTime = 59; - for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { - Assert.assertEquals(expectedTime--, tsBlock.getTimeByIndex(i)); - } - - Assert.assertFalse(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.hasNextChunk()); - Assert.assertFalse(seriesScanUtil.hasNextFile()); - } - - @Test - public void testSkipPointDesc2() throws IllegalPathException, IOException { - SeriesScanUtil seriesScanUtil = getSeriesScanUtil(10, 25, Ordering.DESC); - - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - TsBlock tsBlock = seriesScanUtil.nextPage(); - Assert.assertTrue(tsBlock == null || tsBlock.isEmpty()); - - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - tsBlock = seriesScanUtil.nextPage(); - Assert.assertTrue(tsBlock == null || tsBlock.isEmpty()); - - Assert.assertFalse(seriesScanUtil.hasNextPage()); - - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.hasNextPage()); - - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(5, tsBlock.getPositionCount()); - - long expectedTime = 44; - for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { - Assert.assertEquals(expectedTime--, tsBlock.getTimeByIndex(i)); - } - - Assert.assertTrue(seriesScanUtil.hasNextPage()); - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(5, tsBlock.getPositionCount()); - - expectedTime = 39; - for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { - Assert.assertEquals(expectedTime--, tsBlock.getTimeByIndex(i)); - } - - Assert.assertFalse(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.hasNextChunk()); - Assert.assertFalse(seriesScanUtil.hasNextFile()); - } -} +/// * +// * 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.storageengine.dataregion.read.reader.series; +// +// import org.apache.iotdb.commons.exception.IllegalPathException; +// import org.apache.iotdb.commons.path.IFullPath; +// import org.apache.iotdb.commons.path.MeasurementPath; +// import org.apache.iotdb.db.queryengine.execution.operator.source.SeriesScanUtil; +// import org.apache.iotdb.db.queryengine.plan.planner.plan.parameter.SeriesScanOptions; +// import org.apache.iotdb.db.queryengine.plan.statement.component.Ordering; +// import org.apache.iotdb.db.storageengine.dataregion.read.QueryDataSource; +// import org.apache.iotdb.db.utils.EnvironmentUtils; +// +// import org.apache.tsfile.enums.TSDataType; +// import org.apache.tsfile.read.common.block.TsBlock; +// import org.junit.Assert; +// import org.junit.Test; +// +// import java.io.IOException; +// import java.util.Collections; +// +// public class SeriesScanLimitOffsetPushDownTest extends AbstractSeriesScanTest { +// +// private SeriesScanUtil getSeriesScanUtil(long limit, long offset, Ordering scanOrder) +// throws IllegalPathException { +// MeasurementPath scanPath = new MeasurementPath(TEST_PATH, TSDataType.INT32); +// +// SeriesScanOptions.Builder scanOptionsBuilder = new SeriesScanOptions.Builder(); +// scanOptionsBuilder.withAllSensors(Collections.singleton(scanPath.getMeasurement())); +// scanOptionsBuilder.withPushDownLimit(limit); +// scanOptionsBuilder.withPushDownOffset(offset); +// SeriesScanUtil seriesScanUtil = +// new SeriesScanUtil( +// IFullPath.convertToIFullPath(scanPath), +// scanOrder, +// scanOptionsBuilder.build(), +// EnvironmentUtils.TEST_QUERY_FI_CONTEXT); +// seriesScanUtil.initQueryDataSource(new QueryDataSource(seqResources, unSeqResources)); +// return seriesScanUtil; +// } +// +// @Test +// public void testSkipFile() throws IllegalPathException, IOException { +// SeriesScanUtil seriesScanUtil = getSeriesScanUtil(5, 10, Ordering.ASC); +// +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// TsBlock tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(5, tsBlock.getPositionCount()); +// long expectedTime = 10; +// for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { +// Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); +// } +// +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.hasNextChunk()); +// Assert.assertFalse(seriesScanUtil.hasNextFile()); +// } +// +// @Test +// public void testSkipChunk() throws IllegalPathException, IOException { +// SeriesScanUtil seriesScanUtil = getSeriesScanUtil(5, 20, Ordering.ASC); +// +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// TsBlock tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(5, tsBlock.getPositionCount()); +// long expectedTime = 20; +// for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { +// Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); +// } +// +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.hasNextChunk()); +// Assert.assertFalse(seriesScanUtil.hasNextFile()); +// } +// +// @Test +// public void testSkipPage() throws IllegalPathException, IOException { +// SeriesScanUtil seriesScanUtil = getSeriesScanUtil(5, 30, Ordering.ASC); +// +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// TsBlock tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(5, tsBlock.getPositionCount()); +// long expectedTime = 30; +// for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { +// Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); +// } +// +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.hasNextChunk()); +// Assert.assertFalse(seriesScanUtil.hasNextFile()); +// } +// +// @Test +// public void testSkipPoint1() throws IllegalPathException, IOException { +// SeriesScanUtil seriesScanUtil = getSeriesScanUtil(10, 45, Ordering.ASC); +// +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// TsBlock tsBlock = seriesScanUtil.nextPage(); +// Assert.assertTrue(tsBlock == null || tsBlock.isEmpty()); +// +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(5, tsBlock.getPositionCount()); +// long expectedTime = 45; +// for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { +// Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); +// } +// +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(5, tsBlock.getPositionCount()); +// for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { +// Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); +// } +// +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.hasNextChunk()); +// Assert.assertFalse(seriesScanUtil.hasNextFile()); +// } +// +// @Test +// public void testSkipPoint2() throws IllegalPathException, IOException { +// SeriesScanUtil seriesScanUtil = getSeriesScanUtil(10, 55, Ordering.ASC); +// +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// TsBlock tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(5, tsBlock.getPositionCount()); +// long expectedTime = 55; +// for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { +// Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); +// } +// +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(5, tsBlock.getPositionCount()); +// for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { +// Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i)); +// } +// +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.hasNextChunk()); +// Assert.assertFalse(seriesScanUtil.hasNextFile()); +// } +// +// @Test +// public void testSkipPointDesc1() throws IllegalPathException, IOException { +// SeriesScanUtil seriesScanUtil = getSeriesScanUtil(10, 5, Ordering.DESC); +// +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// TsBlock tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(5, tsBlock.getPositionCount()); +// +// long expectedTime = 64; +// for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { +// Assert.assertEquals(expectedTime--, tsBlock.getTimeByIndex(i)); +// } +// +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(5, tsBlock.getPositionCount()); +// +// expectedTime = 59; +// for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { +// Assert.assertEquals(expectedTime--, tsBlock.getTimeByIndex(i)); +// } +// +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.hasNextChunk()); +// Assert.assertFalse(seriesScanUtil.hasNextFile()); +// } +// +// @Test +// public void testSkipPointDesc2() throws IllegalPathException, IOException { +// SeriesScanUtil seriesScanUtil = getSeriesScanUtil(10, 25, Ordering.DESC); +// +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// TsBlock tsBlock = seriesScanUtil.nextPage(); +// Assert.assertTrue(tsBlock == null || tsBlock.isEmpty()); +// +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertTrue(tsBlock == null || tsBlock.isEmpty()); +// +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(5, tsBlock.getPositionCount()); +// +// long expectedTime = 44; +// for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { +// Assert.assertEquals(expectedTime--, tsBlock.getTimeByIndex(i)); +// } +// +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(5, tsBlock.getPositionCount()); +// +// expectedTime = 39; +// for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) { +// Assert.assertEquals(expectedTime--, tsBlock.getTimeByIndex(i)); +// } +// +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.hasNextChunk()); +// Assert.assertFalse(seriesScanUtil.hasNextFile()); +// } +// } diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/SeriesScanPredicatePushDownTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/SeriesScanPredicatePushDownTest.java index 4b026873d8c..4c27244ecf1 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/SeriesScanPredicatePushDownTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/SeriesScanPredicatePushDownTest.java @@ -1,345 +1,347 @@ -/* - * 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.storageengine.dataregion.read.reader.series; - -import org.apache.iotdb.commons.exception.IllegalPathException; -import org.apache.iotdb.commons.path.IFullPath; -import org.apache.iotdb.commons.path.MeasurementPath; -import org.apache.iotdb.db.queryengine.execution.operator.source.SeriesScanUtil; -import org.apache.iotdb.db.queryengine.plan.planner.plan.parameter.SeriesScanOptions; -import org.apache.iotdb.db.queryengine.plan.statement.component.Ordering; -import org.apache.iotdb.db.storageengine.dataregion.read.QueryDataSource; -import org.apache.iotdb.db.utils.EnvironmentUtils; - -import org.apache.tsfile.enums.TSDataType; -import org.apache.tsfile.read.common.block.TsBlock; -import org.apache.tsfile.read.filter.basic.Filter; -import org.apache.tsfile.read.filter.factory.TimeFilterApi; -import org.apache.tsfile.read.filter.factory.ValueFilterApi; -import org.junit.Assert; -import org.junit.Test; - -import java.io.IOException; -import java.util.Collections; - -import static org.apache.tsfile.read.filter.factory.ValueFilterApi.DEFAULT_MEASUREMENT_INDEX; - -public class SeriesScanPredicatePushDownTest extends AbstractSeriesScanTest { - - private SeriesScanUtil getSeriesScanUtil(Filter globalTimeFilter, Filter pushDownFilter) - throws IllegalPathException { - MeasurementPath scanPath = new MeasurementPath(TEST_PATH, TSDataType.INT32); - - SeriesScanOptions.Builder scanOptionsBuilder = new SeriesScanOptions.Builder(); - scanOptionsBuilder.withAllSensors(Collections.singleton(scanPath.getMeasurement())); - scanOptionsBuilder.withGlobalTimeFilter(globalTimeFilter); - scanOptionsBuilder.withPushDownFilter(pushDownFilter); - SeriesScanUtil seriesScanUtil = - new SeriesScanUtil( - IFullPath.convertToIFullPath(scanPath), - Ordering.ASC, - scanOptionsBuilder.build(), - EnvironmentUtils.TEST_QUERY_FI_CONTEXT); - seriesScanUtil.initQueryDataSource(new QueryDataSource(seqResources, unSeqResources)); - return seriesScanUtil; - } - - @Test - @SuppressWarnings("squid:S5961") // Suppress "Test methods should not contain too many assertions" - public void testNoFilter() throws IllegalPathException, IOException { - SeriesScanUtil seriesScanUtil = getSeriesScanUtil(null, null); - - // File 1 - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertTrue(seriesScanUtil.canUseCurrentFileStatistics()); - - // File 1 - Chunk 1 - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics()); - - // File 1 - Chunk 1 - Page 1 - Assert.assertTrue(seriesScanUtil.hasNextPage()); - Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); - TsBlock tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(10, tsBlock.getPositionCount()); - Assert.assertFalse(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.hasNextChunk()); - - // File 2 - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertTrue(seriesScanUtil.canUseCurrentFileStatistics()); - - // File 2 - Chunk 1 - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics()); - - // File 2 - Chunk 1 - Page 1 - Assert.assertTrue(seriesScanUtil.hasNextPage()); - Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(10, tsBlock.getPositionCount()); - Assert.assertFalse(seriesScanUtil.hasNextPage()); - - // File 2 - Chunk 2 - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics()); - - // File 2 - Chunk 2 - Page 1 - Assert.assertTrue(seriesScanUtil.hasNextPage()); - Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(10, tsBlock.getPositionCount()); - Assert.assertFalse(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.hasNextChunk()); - - // File 3 - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertFalse(seriesScanUtil.canUseCurrentFileStatistics()); - - // File 3 - Chunk 1 - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics()); - - // File 3 - Chunk 1 - Page 1 - Assert.assertTrue(seriesScanUtil.hasNextPage()); - Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(10, tsBlock.getPositionCount()); - - // File 3 - Chunk 1 - Page 2 - Assert.assertTrue(seriesScanUtil.hasNextPage()); - Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(10, tsBlock.getPositionCount()); - Assert.assertFalse(seriesScanUtil.hasNextPage()); - - // (File 3 - Chunk 2) merge (File 4 - Chunk 1) - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertFalse(seriesScanUtil.canUseCurrentChunkStatistics()); - - // (File 3 - Chunk 2 - Page 1) merge (File 4 - Chunk 1 - Page 1) - Assert.assertTrue(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.canUseCurrentPageStatistics()); - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(10, tsBlock.getPositionCount()); - - // File 4 - Chunk 1 - Page 2 - Assert.assertTrue(seriesScanUtil.hasNextPage()); - Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(10, tsBlock.getPositionCount()); - Assert.assertFalse(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.hasNextChunk()); - Assert.assertFalse(seriesScanUtil.hasNextFile()); - } - - @Test - public void testSkipFileByGlobalTimeFilter() throws IllegalPathException, IOException { - SeriesScanUtil seriesScanUtil = getSeriesScanUtil(TimeFilterApi.gtEq(10), null); - checkFile1Skipped(seriesScanUtil); - } - - @Test - public void testSkipFileByPushDownFilter() throws IllegalPathException, IOException { - SeriesScanUtil seriesScanUtil = - getSeriesScanUtil( - TimeFilterApi.gt(0), - ValueFilterApi.gtEq(DEFAULT_MEASUREMENT_INDEX, 10, TSDataType.INT32)); - checkFile1Skipped(seriesScanUtil); - } - - private void checkFile1Skipped(SeriesScanUtil seriesScanUtil) throws IOException { - // File 1 - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertTrue(seriesScanUtil.canUseCurrentFileStatistics()); - - // File 1 - Chunk 1 - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics()); - - // File 1 - Chunk 1 - Page 1 - Assert.assertTrue(seriesScanUtil.hasNextPage()); - Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); - TsBlock tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(10, tsBlock.getPositionCount()); - Assert.assertEquals(10, tsBlock.getTimeByIndex(0)); - } - - @Test - public void testSkipChunkByGlobalTimeFilter() throws IllegalPathException, IOException { - SeriesScanUtil seriesScanUtil = getSeriesScanUtil(TimeFilterApi.gtEq(20), null); - checkFile2Chunk1Skipped(seriesScanUtil); - } - - @Test - public void testSkipChunkByPushDownFilter() throws IllegalPathException, IOException { - SeriesScanUtil seriesScanUtil = - getSeriesScanUtil( - TimeFilterApi.gt(0), - ValueFilterApi.gtEq(DEFAULT_MEASUREMENT_INDEX, 20, TSDataType.INT32)); - checkFile2Chunk1Skipped(seriesScanUtil); - } - - private void checkFile2Chunk1Skipped(SeriesScanUtil seriesScanUtil) throws IOException { - // File 1 skipped - // File 2 - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertFalse(seriesScanUtil.canUseCurrentFileStatistics()); - - // File 2 - Chunk 1 skipped - // File 2 - Chunk 2 - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics()); - - // File 2 - Chunk 2 - Page 1 - Assert.assertTrue(seriesScanUtil.hasNextPage()); - Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); - TsBlock tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(10, tsBlock.getPositionCount()); - Assert.assertEquals(20, tsBlock.getTimeByIndex(0)); - } - - @Test - public void testSkipPageByGlobalTimeFilter() throws IllegalPathException, IOException { - SeriesScanUtil seriesScanUtil = getSeriesScanUtil(TimeFilterApi.gtEq(40), null); - checkFile1AndFile2Skipped(seriesScanUtil); - - // File 3 - Chunk 1 - Page 1 skipped - // File 3 - Chunk 1 - Page 2 - Assert.assertTrue(seriesScanUtil.hasNextPage()); - Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); - TsBlock tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(10, tsBlock.getPositionCount()); - Assert.assertEquals(40, tsBlock.getTimeByIndex(0)); - } - - @Test - public void testSkipPageByPushDownFilter() throws IllegalPathException, IOException { - SeriesScanUtil seriesScanUtil = - getSeriesScanUtil( - TimeFilterApi.gt(0), - ValueFilterApi.gtEq(DEFAULT_MEASUREMENT_INDEX, 40, TSDataType.INT32)); - checkFile1AndFile2Skipped(seriesScanUtil); - - // File 3 - Chunk 1 - Page 1 skipped - Assert.assertTrue(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.canUseCurrentPageStatistics()); - TsBlock tsBlock = seriesScanUtil.nextPage(); - Assert.assertNull(tsBlock); - - // File 3 - Chunk 1 - Page 2 - Assert.assertTrue(seriesScanUtil.hasNextPage()); - Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(10, tsBlock.getPositionCount()); - Assert.assertEquals(40, tsBlock.getTimeByIndex(0)); - } - - private void checkFile1AndFile2Skipped(SeriesScanUtil seriesScanUtil) throws IOException { - // File 1 skipped - // File 2 skipped - // File 3 - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertFalse(seriesScanUtil.canUseCurrentFileStatistics()); - - // File 3 - Chunk 1 - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertFalse(seriesScanUtil.canUseCurrentChunkStatistics()); - } - - @Test - public void testSkipMergeReaderPointByGlobalTimeFilter() - throws IllegalPathException, IOException { - SeriesScanUtil seriesScanUtil = getSeriesScanUtil(TimeFilterApi.gtEq(55), null); - checkFile1AndFile2AndMergeReaderPointSkipped(seriesScanUtil); - } - - @Test - public void testSkipMergeReaderPointByPushDownFilter() throws IllegalPathException, IOException { - SeriesScanUtil seriesScanUtil = - getSeriesScanUtil( - TimeFilterApi.gt(0), - ValueFilterApi.gtEq(DEFAULT_MEASUREMENT_INDEX, 55, TSDataType.INT32)); - checkFile1AndFile2AndMergeReaderPointSkipped(seriesScanUtil); - } - - private void checkFile1AndFile2AndFile3Chunk1Skipped(SeriesScanUtil seriesScanUtil) - throws IOException { - // File 1 skipped - // File 2 skipped - // File 3 - Assert.assertTrue(seriesScanUtil.hasNextFile()); - Assert.assertFalse(seriesScanUtil.canUseCurrentFileStatistics()); - - // File 3 - Chunk 1 skipped - // File 3 - Chunk 2 - Assert.assertTrue(seriesScanUtil.hasNextChunk()); - Assert.assertFalse(seriesScanUtil.canUseCurrentChunkStatistics()); - } - - private void checkFile1AndFile2AndMergeReaderPointSkipped(SeriesScanUtil seriesScanUtil) - throws IOException { - checkFile1AndFile2AndFile3Chunk1Skipped(seriesScanUtil); - - // (File 3 - Chunk 2) merge (File 4 - Chunk 1) - Assert.assertTrue(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.canUseCurrentPageStatistics()); - TsBlock tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(5, tsBlock.getPositionCount()); - Assert.assertEquals(55, tsBlock.getTimeByIndex(0)); - } - - @Test - public void testSkipMergeReaderByGlobalTimeFilter() throws IllegalPathException, IOException { - SeriesScanUtil seriesScanUtil = getSeriesScanUtil(TimeFilterApi.gtEq(60), null); - checkFile1AndFile2AndFile3Chunk1Skipped(seriesScanUtil); - - // (File 3 - Chunk 1) merge (File 4 - Chunk 1) skipped - // File 4 - Chunk 2 - Assert.assertTrue(seriesScanUtil.hasNextPage()); - Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); - TsBlock tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(10, tsBlock.getPositionCount()); - Assert.assertEquals(60, tsBlock.getTimeByIndex(0)); - } - - @Test - public void testSkipMergeReaderByPushDownFilter() throws IllegalPathException, IOException { - SeriesScanUtil seriesScanUtil = - getSeriesScanUtil( - TimeFilterApi.gt(0), - ValueFilterApi.gtEq(DEFAULT_MEASUREMENT_INDEX, 60, TSDataType.INT32)); - - checkFile1AndFile2AndFile3Chunk1Skipped(seriesScanUtil); - - // (File 3 - Chunk 1) merge (File 4 - Chunk 1) - Assert.assertTrue(seriesScanUtil.hasNextPage()); - Assert.assertFalse(seriesScanUtil.canUseCurrentPageStatistics()); - TsBlock tsBlock = seriesScanUtil.nextPage(); - Assert.assertTrue(tsBlock == null || tsBlock.isEmpty()); - - // File 4 - Chunk 2 - Assert.assertTrue(seriesScanUtil.hasNextPage()); - Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); - tsBlock = seriesScanUtil.nextPage(); - Assert.assertEquals(10, tsBlock.getPositionCount()); - Assert.assertEquals(60, tsBlock.getTimeByIndex(0)); - } -} +/// * +// * Licensed to the Apache Software Foundation (ASF) under one +// * or more contributor license agreements. See the NOTICE file +// * distributed with this work for additional information +// * regarding copyright ownership. The ASF licenses this file +// * to you under the Apache License, Version 2.0 (the +// * "License"); you may not use this file except in compliance +// * with the License. You may obtain a copy of the License at +// * +// * http://www.apache.org/licenses/LICENSE-2.0 +// * +// * Unless required by applicable law or agreed to in writing, +// * software distributed under the License is distributed on an +// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// * KIND, either express or implied. See the License for the +// * specific language governing permissions and limitations +// * under the License. +// */ +// +// package org.apache.iotdb.db.storageengine.dataregion.read.reader.series; +// +// import org.apache.iotdb.commons.exception.IllegalPathException; +// import org.apache.iotdb.commons.path.IFullPath; +// import org.apache.iotdb.commons.path.MeasurementPath; +// import org.apache.iotdb.db.queryengine.execution.operator.source.SeriesScanUtil; +// import org.apache.iotdb.db.queryengine.plan.planner.plan.parameter.SeriesScanOptions; +// import org.apache.iotdb.db.queryengine.plan.statement.component.Ordering; +// import org.apache.iotdb.db.storageengine.dataregion.read.QueryDataSource; +// import org.apache.iotdb.db.utils.EnvironmentUtils; +// +// import org.apache.tsfile.enums.TSDataType; +// import org.apache.tsfile.read.common.block.TsBlock; +// import org.apache.tsfile.read.filter.basic.Filter; +// import org.apache.tsfile.read.filter.factory.TimeFilterApi; +// import org.apache.tsfile.read.filter.factory.ValueFilterApi; +// import org.junit.Assert; +// import org.junit.Test; +// +// import java.io.IOException; +// import java.util.Collections; +// +// import static org.apache.tsfile.read.filter.factory.ValueFilterApi.DEFAULT_MEASUREMENT_INDEX; +// +// public class SeriesScanPredicatePushDownTest extends AbstractSeriesScanTest { +// +// private SeriesScanUtil getSeriesScanUtil(Filter globalTimeFilter, Filter pushDownFilter) +// throws IllegalPathException { +// MeasurementPath scanPath = new MeasurementPath(TEST_PATH, TSDataType.INT32); +// +// SeriesScanOptions.Builder scanOptionsBuilder = new SeriesScanOptions.Builder(); +// scanOptionsBuilder.withAllSensors(Collections.singleton(scanPath.getMeasurement())); +// scanOptionsBuilder.withGlobalTimeFilter(globalTimeFilter); +// scanOptionsBuilder.withPushDownFilter(pushDownFilter); +// SeriesScanUtil seriesScanUtil = +// new SeriesScanUtil( +// IFullPath.convertToIFullPath(scanPath), +// Ordering.ASC, +// scanOptionsBuilder.build(), +// EnvironmentUtils.TEST_QUERY_FI_CONTEXT); +// seriesScanUtil.initQueryDataSource(new QueryDataSource(seqResources, unSeqResources)); +// return seriesScanUtil; +// } +// +// @Test +// @SuppressWarnings("squid:S5961") // Suppress "Test methods should not contain too many +// assertions" +// public void testNoFilter() throws IllegalPathException, IOException { +// SeriesScanUtil seriesScanUtil = getSeriesScanUtil(null, null); +// +// // File 1 +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentFileStatistics()); +// +// // File 1 - Chunk 1 +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics()); +// +// // File 1 - Chunk 1 - Page 1 +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); +// TsBlock tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(10, tsBlock.getPositionCount()); +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.hasNextChunk()); +// +// // File 2 +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentFileStatistics()); +// +// // File 2 - Chunk 1 +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics()); +// +// // File 2 - Chunk 1 - Page 1 +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(10, tsBlock.getPositionCount()); +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// +// // File 2 - Chunk 2 +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics()); +// +// // File 2 - Chunk 2 - Page 1 +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(10, tsBlock.getPositionCount()); +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.hasNextChunk()); +// +// // File 3 +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertFalse(seriesScanUtil.canUseCurrentFileStatistics()); +// +// // File 3 - Chunk 1 +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics()); +// +// // File 3 - Chunk 1 - Page 1 +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(10, tsBlock.getPositionCount()); +// +// // File 3 - Chunk 1 - Page 2 +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(10, tsBlock.getPositionCount()); +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// +// // (File 3 - Chunk 2) merge (File 4 - Chunk 1) +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertFalse(seriesScanUtil.canUseCurrentChunkStatistics()); +// +// // (File 3 - Chunk 2 - Page 1) merge (File 4 - Chunk 1 - Page 1) +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.canUseCurrentPageStatistics()); +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(10, tsBlock.getPositionCount()); +// +// // File 4 - Chunk 1 - Page 2 +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(10, tsBlock.getPositionCount()); +// Assert.assertFalse(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.hasNextChunk()); +// Assert.assertFalse(seriesScanUtil.hasNextFile()); +// } +// +// @Test +// public void testSkipFileByGlobalTimeFilter() throws IllegalPathException, IOException { +// SeriesScanUtil seriesScanUtil = getSeriesScanUtil(TimeFilterApi.gtEq(10), null); +// checkFile1Skipped(seriesScanUtil); +// } +// +// @Test +// public void testSkipFileByPushDownFilter() throws IllegalPathException, IOException { +// SeriesScanUtil seriesScanUtil = +// getSeriesScanUtil( +// TimeFilterApi.gt(0), +// ValueFilterApi.gtEq(DEFAULT_MEASUREMENT_INDEX, 10, TSDataType.INT32)); +// checkFile1Skipped(seriesScanUtil); +// } +// +// private void checkFile1Skipped(SeriesScanUtil seriesScanUtil) throws IOException { +// // File 1 +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentFileStatistics()); +// +// // File 1 - Chunk 1 +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics()); +// +// // File 1 - Chunk 1 - Page 1 +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); +// TsBlock tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(10, tsBlock.getPositionCount()); +// Assert.assertEquals(10, tsBlock.getTimeByIndex(0)); +// } +// +// @Test +// public void testSkipChunkByGlobalTimeFilter() throws IllegalPathException, IOException { +// SeriesScanUtil seriesScanUtil = getSeriesScanUtil(TimeFilterApi.gtEq(20), null); +// checkFile2Chunk1Skipped(seriesScanUtil); +// } +// +// @Test +// public void testSkipChunkByPushDownFilter() throws IllegalPathException, IOException { +// SeriesScanUtil seriesScanUtil = +// getSeriesScanUtil( +// TimeFilterApi.gt(0), +// ValueFilterApi.gtEq(DEFAULT_MEASUREMENT_INDEX, 20, TSDataType.INT32)); +// checkFile2Chunk1Skipped(seriesScanUtil); +// } +// +// private void checkFile2Chunk1Skipped(SeriesScanUtil seriesScanUtil) throws IOException { +// // File 1 skipped +// // File 2 +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertFalse(seriesScanUtil.canUseCurrentFileStatistics()); +// +// // File 2 - Chunk 1 skipped +// // File 2 - Chunk 2 +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics()); +// +// // File 2 - Chunk 2 - Page 1 +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); +// TsBlock tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(10, tsBlock.getPositionCount()); +// Assert.assertEquals(20, tsBlock.getTimeByIndex(0)); +// } +// +// @Test +// public void testSkipPageByGlobalTimeFilter() throws IllegalPathException, IOException { +// SeriesScanUtil seriesScanUtil = getSeriesScanUtil(TimeFilterApi.gtEq(40), null); +// checkFile1AndFile2Skipped(seriesScanUtil); +// +// // File 3 - Chunk 1 - Page 1 skipped +// // File 3 - Chunk 1 - Page 2 +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); +// TsBlock tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(10, tsBlock.getPositionCount()); +// Assert.assertEquals(40, tsBlock.getTimeByIndex(0)); +// } +// +// @Test +// public void testSkipPageByPushDownFilter() throws IllegalPathException, IOException { +// SeriesScanUtil seriesScanUtil = +// getSeriesScanUtil( +// TimeFilterApi.gt(0), +// ValueFilterApi.gtEq(DEFAULT_MEASUREMENT_INDEX, 40, TSDataType.INT32)); +// checkFile1AndFile2Skipped(seriesScanUtil); +// +// // File 3 - Chunk 1 - Page 1 skipped +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.canUseCurrentPageStatistics()); +// TsBlock tsBlock = seriesScanUtil.nextPage(); +// Assert.assertNull(tsBlock); +// +// // File 3 - Chunk 1 - Page 2 +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(10, tsBlock.getPositionCount()); +// Assert.assertEquals(40, tsBlock.getTimeByIndex(0)); +// } +// +// private void checkFile1AndFile2Skipped(SeriesScanUtil seriesScanUtil) throws IOException { +// // File 1 skipped +// // File 2 skipped +// // File 3 +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertFalse(seriesScanUtil.canUseCurrentFileStatistics()); +// +// // File 3 - Chunk 1 +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertFalse(seriesScanUtil.canUseCurrentChunkStatistics()); +// } +// +// @Test +// public void testSkipMergeReaderPointByGlobalTimeFilter() +// throws IllegalPathException, IOException { +// SeriesScanUtil seriesScanUtil = getSeriesScanUtil(TimeFilterApi.gtEq(55), null); +// checkFile1AndFile2AndMergeReaderPointSkipped(seriesScanUtil); +// } +// +// @Test +// public void testSkipMergeReaderPointByPushDownFilter() throws IllegalPathException, IOException +// { +// SeriesScanUtil seriesScanUtil = +// getSeriesScanUtil( +// TimeFilterApi.gt(0), +// ValueFilterApi.gtEq(DEFAULT_MEASUREMENT_INDEX, 55, TSDataType.INT32)); +// checkFile1AndFile2AndMergeReaderPointSkipped(seriesScanUtil); +// } +// +// private void checkFile1AndFile2AndFile3Chunk1Skipped(SeriesScanUtil seriesScanUtil) +// throws IOException { +// // File 1 skipped +// // File 2 skipped +// // File 3 +// Assert.assertTrue(seriesScanUtil.hasNextFile()); +// Assert.assertFalse(seriesScanUtil.canUseCurrentFileStatistics()); +// +// // File 3 - Chunk 1 skipped +// // File 3 - Chunk 2 +// Assert.assertTrue(seriesScanUtil.hasNextChunk()); +// Assert.assertFalse(seriesScanUtil.canUseCurrentChunkStatistics()); +// } +// +// private void checkFile1AndFile2AndMergeReaderPointSkipped(SeriesScanUtil seriesScanUtil) +// throws IOException { +// checkFile1AndFile2AndFile3Chunk1Skipped(seriesScanUtil); +// +// // (File 3 - Chunk 2) merge (File 4 - Chunk 1) +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.canUseCurrentPageStatistics()); +// TsBlock tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(5, tsBlock.getPositionCount()); +// Assert.assertEquals(55, tsBlock.getTimeByIndex(0)); +// } +// +// @Test +// public void testSkipMergeReaderByGlobalTimeFilter() throws IllegalPathException, IOException { +// SeriesScanUtil seriesScanUtil = getSeriesScanUtil(TimeFilterApi.gtEq(60), null); +// checkFile1AndFile2AndFile3Chunk1Skipped(seriesScanUtil); +// +// // (File 3 - Chunk 1) merge (File 4 - Chunk 1) skipped +// // File 4 - Chunk 2 +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); +// TsBlock tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(10, tsBlock.getPositionCount()); +// Assert.assertEquals(60, tsBlock.getTimeByIndex(0)); +// } +// +// @Test +// public void testSkipMergeReaderByPushDownFilter() throws IllegalPathException, IOException { +// SeriesScanUtil seriesScanUtil = +// getSeriesScanUtil( +// TimeFilterApi.gt(0), +// ValueFilterApi.gtEq(DEFAULT_MEASUREMENT_INDEX, 60, TSDataType.INT32)); +// +// checkFile1AndFile2AndFile3Chunk1Skipped(seriesScanUtil); +// +// // (File 3 - Chunk 1) merge (File 4 - Chunk 1) +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// Assert.assertFalse(seriesScanUtil.canUseCurrentPageStatistics()); +// TsBlock tsBlock = seriesScanUtil.nextPage(); +// Assert.assertTrue(tsBlock == null || tsBlock.isEmpty()); +// +// // File 4 - Chunk 2 +// Assert.assertTrue(seriesScanUtil.hasNextPage()); +// Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics()); +// tsBlock = seriesScanUtil.nextPage(); +// Assert.assertEquals(10, tsBlock.getPositionCount()); +// Assert.assertEquals(60, tsBlock.getTimeByIndex(0)); +// } +// }
