You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by xi...@apache.org on 2021/03/10 08:12:29 UTC
[iotdb] 02/02: implement single node version
This is an automated email from the ASF dual-hosted git repository.
xiangweiwei pushed a commit to branch clusterQueryOpt
in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 9ed42d1fc7c1857325eb14bc6b81246129dff805
Author: Alima777 <wx...@gmail.com>
AuthorDate: Wed Mar 10 16:10:38 2021 +0800
implement single node version
---
.../iotdb/cluster/query/reader/EmptyReader.java | 5 +
.../reader/RemoteSeriesReaderByTimestamp.java | 14 ++
.../dataset/RawQueryDataSetWithValueFilter.java | 157 ++++++++++++---------
.../RemoteRawQueryDataSetWithValueFilter.java | 68 ---------
.../adapter/ByTimestampReaderAdapter.java | 5 +
.../reader/chunk/DiskChunkReaderByTimestamp.java | 5 +
.../org/apache/iotdb/db/service/TSServiceImpl.java | 5 +-
.../query/dataset/DataSetWithTimeGenerator.java | 2 +-
.../tsfile/read/query/dataset/QueryDataSet.java | 5 +
.../read/query/timegenerator/TimeGenerator.java | 38 +++--
.../read/query/timegenerator/node/AndNode.java | 18 +--
.../read/query/timegenerator/node/OrNode.java | 42 +++---
.../tsfile/read/reader/FakedTimeGenerator.java | 15 +-
13 files changed, 194 insertions(+), 185 deletions(-)
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/EmptyReader.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/EmptyReader.java
index 933a9ab..6db6445 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/EmptyReader.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/EmptyReader.java
@@ -160,6 +160,11 @@ public class EmptyReader extends BaseManagedSeriesReader
}
@Override
+ public Object[] getValueInTimestamps(long[] timestamps) {
+ return null;
+ }
+
+ @Override
public boolean readerIsEmpty() {
return false;
}
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/RemoteSeriesReaderByTimestamp.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/RemoteSeriesReaderByTimestamp.java
index 2b68ef4..4a32acc 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/RemoteSeriesReaderByTimestamp.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/RemoteSeriesReaderByTimestamp.java
@@ -107,4 +107,18 @@ public class RemoteSeriesReaderByTimestamp implements IReaderByTimestamp {
}
}
}
+
+ @Override
+ public Object[] getValueInTimestamps(long[] timestamps) throws IOException {
+ return null;
+ }
+
+ @SuppressWarnings("java:S2274") // enable timeout
+ private ByteBuffer fetchResultAsync(long[] timestamps) throws IOException {
+ return null;
+ }
+
+ private ByteBuffer fetchResultSync(long[] timestamps) throws IOException {
+ return null;
+ }
}
diff --git a/server/src/main/java/org/apache/iotdb/db/query/dataset/RawQueryDataSetWithValueFilter.java b/server/src/main/java/org/apache/iotdb/db/query/dataset/RawQueryDataSetWithValueFilter.java
index e5349dc..3fb14f0 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/dataset/RawQueryDataSetWithValueFilter.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/dataset/RawQueryDataSetWithValueFilter.java
@@ -31,13 +31,14 @@ import java.util.List;
public class RawQueryDataSetWithValueFilter extends QueryDataSet implements UDFInputDataSet {
- protected final TimeGenerator timeGenerator;
- protected final List<IReaderByTimestamp> seriesReaderByTimestampList;
- protected final List<Boolean> cached;
+ private final TimeGenerator timeGenerator;
+ private final List<IReaderByTimestamp> seriesReaderByTimestampList;
+ private final List<Boolean> cached;
- protected boolean hasCachedRow;
- private RowRecord cachedRowRecord;
- private Object[] cachedRowInObjects;
+ private List<RowRecord> cachedRowRecords = new ArrayList<>();
+
+ /** Used for UDF. */
+ private List<Object[]> cachedRowInObjects = new ArrayList<>();
/**
* constructor of EngineDataSetWithValueFilter.
@@ -64,61 +65,78 @@ public class RawQueryDataSetWithValueFilter extends QueryDataSet implements UDFI
@Override
public boolean hasNextWithoutConstraint() throws IOException {
- if (hasCachedRow) {
+ if (!cachedRowRecords.isEmpty()) {
return true;
}
- return cacheRowRecord();
+ return cacheRowRecords();
}
+ /** @return the first record of cached rows or null if there is no more data */
@Override
public RowRecord nextWithoutConstraint() throws IOException {
- if (!hasCachedRow && !cacheRowRecord()) {
+ if (cachedRowRecords.isEmpty() && !cacheRowRecords()) {
return null;
}
- hasCachedRow = false;
- return cachedRowRecord;
+
+ return cachedRowRecords.remove(0);
}
/**
- * Cache row record
+ * Cache row records
*
* @return if there has next row record.
*/
- private boolean cacheRowRecord() throws IOException {
- while (timeGenerator.hasNext()) {
- boolean hasField = false;
- long timestamp = timeGenerator.next();
- RowRecord rowRecord = new RowRecord(timestamp);
-
- for (int i = 0; i < seriesReaderByTimestampList.size(); i++) {
- Object value;
- // get value from readers in time generator
- if (cached.get(i)) {
- value = timeGenerator.getValue(paths.get(i), timestamp);
- } else {
- // get value from series reader without filter
- IReaderByTimestamp reader = seriesReaderByTimestampList.get(i);
- value = reader.getValueInTimestamp(timestamp);
- }
- if (value == null) {
- rowRecord.addField(null);
+ private boolean cacheRowRecords() throws IOException {
+ int cachedTimeCnt = 0;
+ long[] cachedTimeArray = new long[fetchSize];
+ // TODO: LIMIT constraint
+ // 1. fill time array from time Generator
+ while (timeGenerator.hasNext() && cachedTimeCnt < fetchSize) {
+ cachedTimeArray[cachedTimeCnt++] = timeGenerator.next();
+ }
+ if (cachedTimeCnt == 0) {
+ return false;
+ }
+ RowRecord[] rowRecords = new RowRecord[cachedTimeCnt];
+ for (int i = 0; i < cachedTimeCnt; i++) {
+ rowRecords[i] = new RowRecord(cachedTimeArray[i]);
+ }
+
+ boolean[] hasField = new boolean[cachedTimeCnt];
+ // 2. fetch results of each time series using time array
+ for (int i = 0; i < seriesReaderByTimestampList.size(); i++) {
+ Object[] results;
+ // get value from readers in time generator
+ if (cached.get(i)) {
+ results = timeGenerator.getValues(paths.get(i));
+ } else {
+ results = seriesReaderByTimestampList.get(i).getValueInTimestamps(cachedTimeArray);
+ }
+
+ // 3. use values in results to fill row record
+ for (int j = 0; j < cachedTimeCnt; j++) {
+ if (results[j] == null) {
+ rowRecords[j].addField(null);
} else {
- hasField = true;
- rowRecord.addField(value, dataTypes.get(i));
+ hasField[j] = true;
+ rowRecords[j].addField(results[j], dataTypes.get(i));
}
}
- if (hasField) {
- hasCachedRow = true;
- cachedRowRecord = rowRecord;
- break;
+ }
+ // 4. remove rowRecord if all values in one timestamp are null
+ for (int i = 0; i < cachedTimeCnt; i++) {
+ if (hasField[i]) {
+ cachedRowRecords.add(rowRecords[i]);
}
}
- return hasCachedRow;
+
+ // 5. check whether there is next row record
+ return !cachedRowRecords.isEmpty();
}
@Override
public boolean hasNextRowInObjects() throws IOException {
- if (hasCachedRow) {
+ if (!cachedRowRecords.isEmpty()) {
return true;
}
return cacheRowInObjects();
@@ -126,40 +144,53 @@ public class RawQueryDataSetWithValueFilter extends QueryDataSet implements UDFI
@Override
public Object[] nextRowInObjects() throws IOException {
- if (!hasCachedRow && !cacheRowInObjects()) {
+ if (cachedRowRecords.isEmpty() && !cacheRowInObjects()) {
// values + timestamp
return new Object[seriesReaderByTimestampList.size() + 1];
}
- hasCachedRow = false;
- return cachedRowInObjects;
+
+ return cachedRowInObjects.remove(0);
}
private boolean cacheRowInObjects() throws IOException {
- int seriesNumber = seriesReaderByTimestampList.size();
- while (timeGenerator.hasNext()) {
- boolean hasField = false;
-
- Object[] rowInObjects = new Object[seriesNumber + 1];
- long timestamp = timeGenerator.next();
- rowInObjects[seriesNumber] = timestamp;
-
- for (int i = 0; i < seriesNumber; i++) {
- Object value =
- cached.get(i)
- ? timeGenerator.getValue(paths.get(i), timestamp)
- : seriesReaderByTimestampList.get(i).getValueInTimestamp(timestamp);
- if (value != null) {
- hasField = true;
- rowInObjects[i] = value;
- }
+ int cachedTimeCnt = 0;
+ long[] cachedTimeArray = new long[fetchSize];
+
+ // TODO: LIMIT constraint
+ // 1. fill time array from time Generator
+ while (timeGenerator.hasNext() && cachedTimeCnt < fetchSize) {
+ cachedTimeArray[cachedTimeCnt++] = timeGenerator.next();
+ }
+ Object[][] rowsInObject = new Object[cachedTimeCnt][seriesReaderByTimestampList.size() + 1];
+ for (int i = 0; i < cachedTimeCnt; i++) {
+ rowsInObject[i][seriesReaderByTimestampList.size()] = cachedTimeArray[i];
+ }
+
+ boolean[] hasField = new boolean[cachedTimeCnt];
+ // 2. fetch results of each time series using time array
+ for (int i = 0; i < seriesReaderByTimestampList.size(); i++) {
+ Object[] results;
+ // get value from readers in time generator
+ if (cached.get(i)) {
+ results = timeGenerator.getValues(paths.get(i));
+ } else {
+ results = seriesReaderByTimestampList.get(i).getValueInTimestamps(cachedTimeArray);
}
- if (hasField) {
- hasCachedRow = true;
- cachedRowInObjects = rowInObjects;
- break;
+ // 3. use values in results to fill row record
+ for (int j = 0; j < cachedTimeCnt; j++) {
+ if (results[j] != null) hasField[i] = true;
+ rowsInObject[j][i] = results[j];
}
}
- return hasCachedRow;
+ // 4. remove rowRecord if all values in one timestamp are null
+ for (int i = 0; i < cachedTimeCnt; i++) {
+ if (hasField[i]) {
+ cachedRowInObjects.add(rowsInObject[i]);
+ }
+ }
+
+ // 5. check whether there is next row record
+ return !cachedRowRecords.isEmpty();
}
}
diff --git a/server/src/main/java/org/apache/iotdb/db/query/dataset/RemoteRawQueryDataSetWithValueFilter.java b/server/src/main/java/org/apache/iotdb/db/query/dataset/RemoteRawQueryDataSetWithValueFilter.java
deleted file mode 100644
index c93e139..0000000
--- a/server/src/main/java/org/apache/iotdb/db/query/dataset/RemoteRawQueryDataSetWithValueFilter.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package org.apache.iotdb.db.query.dataset;
-
-import org.apache.iotdb.db.metadata.PartialPath;
-import org.apache.iotdb.db.query.reader.series.IReaderByTimestamp;
-import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
-import org.apache.iotdb.tsfile.read.common.RowRecord;
-import org.apache.iotdb.tsfile.read.query.timegenerator.TimeGenerator;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-public class RemoteRawQueryDataSetWithValueFilter extends RawQueryDataSetWithValueFilter {
-
- private List<RowRecord> cachedRowRecords = new ArrayList<>();
- private Object[] objects;
- private boolean[] isAllNull;
- /**
- * constructor of EngineDataSetWithValueFilter.
- *
- * @param paths paths in List structure
- * @param dataTypes time series data type
- * @param timeGenerator EngineTimeGenerator object
- * @param readers readers in List(IReaderByTimeStamp) structure
- * @param cached
- * @param ascending specifies how the data should be sorted,'True' means read in ascending time
- */
- public RemoteRawQueryDataSetWithValueFilter(
- List<PartialPath> paths,
- List<TSDataType> dataTypes,
- TimeGenerator timeGenerator,
- List<IReaderByTimestamp> readers,
- List<Boolean> cached,
- boolean ascending) {
- super(paths, dataTypes, timeGenerator, readers, cached, ascending);
- }
-
- /**
- * Cache row record
- *
- * @return if there has next row record.
- */
- private boolean cacheRowRecord() throws IOException {
- int cachedTimeCnt = 0;
- long[] cachedTimeArray = new long[MAX_TIME_NUM];
- // TODO: LIMIT constraint
- while (timeGenerator.hasNext() && cachedTimeCnt < MAX_TIME_NUM) {
- // 1. fill time array from time Generator
- cachedTimeArray[cachedTimeCnt++] = timeGenerator.next();
- }
- for (int i = 0; i < seriesReaderByTimestampList.size(); i++) {
- // 2. fetch results of each time series from readers using time array
- Object[] results = seriesReaderByTimestampList.get(i).getValueInTimestamps(cachedTimeArray);
- // 3. use values in results to fill row record
- for (int j = 0; j < MAX_TIME_NUM; j++) {
- if (i == 0) {
- RowRecord rowRecord = new RowRecord(cachedTimeArray[]);
- }
- fillRowRecord();
- if (results[j] != null) {
- isAllNull = false;
- }
- }
- }
- // 4. remove rowRecord if all values in one timestamp are null
- removeNonExistRecord();
- }
-}
diff --git a/server/src/main/java/org/apache/iotdb/db/query/externalsort/adapter/ByTimestampReaderAdapter.java b/server/src/main/java/org/apache/iotdb/db/query/externalsort/adapter/ByTimestampReaderAdapter.java
index ba482c4..befcc08 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/externalsort/adapter/ByTimestampReaderAdapter.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/externalsort/adapter/ByTimestampReaderAdapter.java
@@ -62,4 +62,9 @@ public class ByTimestampReaderAdapter implements IReaderByTimestamp {
return null;
}
+
+ @Override
+ public Object[] getValueInTimestamps(long[] timestamps) throws IOException {
+ return null;
+ }
}
diff --git a/server/src/main/java/org/apache/iotdb/db/query/reader/chunk/DiskChunkReaderByTimestamp.java b/server/src/main/java/org/apache/iotdb/db/query/reader/chunk/DiskChunkReaderByTimestamp.java
index bc87cf7..5095ccd 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/reader/chunk/DiskChunkReaderByTimestamp.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/reader/chunk/DiskChunkReaderByTimestamp.java
@@ -66,6 +66,11 @@ public class DiskChunkReaderByTimestamp implements IReaderByTimestamp {
return null;
}
+ @Override
+ public Object[] getValueInTimestamps(long[] timestamps) throws IOException {
+ return null;
+ }
+
private boolean hasNext() throws IOException {
if (data != null && data.hasCurrent()) {
return true;
diff --git a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
index ad60bfc..9004b7a 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
@@ -677,7 +677,7 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
resp = getQueryColumnHeaders(plan, username);
}
// create and cache dataset
- QueryDataSet newDataSet = createQueryDataSet(queryId, plan);
+ QueryDataSet newDataSet = createQueryDataSet(queryId, plan, fetchSize);
if (plan instanceof ShowPlan || plan instanceof AuthorPlan) {
resp = getListDataSetHeaders(newDataSet);
} else if (plan instanceof UDFPlan) {
@@ -1025,12 +1025,13 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
}
/** create QueryDataSet and buffer it for fetchResults */
- private QueryDataSet createQueryDataSet(long queryId, PhysicalPlan physicalPlan)
+ private QueryDataSet createQueryDataSet(long queryId, PhysicalPlan physicalPlan, int fetchSize)
throws QueryProcessException, QueryFilterOptimizationException, StorageEngineException,
IOException, MetadataException, SQLException, TException, InterruptedException {
QueryContext context = genQueryContext(queryId);
QueryDataSet queryDataSet = executor.processQuery(physicalPlan, context);
+ queryDataSet.setFetchSize(fetchSize);
queryId2DataSet.put(queryId, queryDataSet);
return queryDataSet;
}
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/query/dataset/DataSetWithTimeGenerator.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/query/dataset/DataSetWithTimeGenerator.java
index 8985bcc..7d911c4 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/query/dataset/DataSetWithTimeGenerator.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/query/dataset/DataSetWithTimeGenerator.java
@@ -72,7 +72,7 @@ public class DataSetWithTimeGenerator extends QueryDataSet {
// get value from readers in time generator
if (cached.get(i)) {
- Object value = timeGenerator.getValue(paths.get(i), timestamp);
+ Object value = timeGenerator.getValue(paths.get(i));
rowRecord.addField(value, dataTypes.get(i));
continue;
}
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/query/dataset/QueryDataSet.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/query/dataset/QueryDataSet.java
index eb7a206..c68a0e0 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/query/dataset/QueryDataSet.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/query/dataset/QueryDataSet.java
@@ -33,6 +33,7 @@ public abstract class QueryDataSet {
protected int rowLimit = 0; // rowLimit > 0 means the LIMIT constraint exists
protected int rowOffset = 0;
protected int alreadyReturnedRowNum = 0;
+ protected int fetchSize = 10000;
protected boolean ascending;
public QueryDataSet() {}
@@ -81,6 +82,10 @@ public abstract class QueryDataSet {
return nextWithoutConstraint();
}
+ public void setFetchSize(int fetchSize) {
+ this.fetchSize = fetchSize;
+ }
+
public abstract RowRecord nextWithoutConstraint() throws IOException;
public List<Path> getPaths() {
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/query/timegenerator/TimeGenerator.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/query/timegenerator/TimeGenerator.java
index 78c0686..2ea5fb8 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/query/timegenerator/TimeGenerator.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/query/timegenerator/TimeGenerator.java
@@ -31,7 +31,9 @@ import org.apache.iotdb.tsfile.read.query.timegenerator.node.OrNode;
import org.apache.iotdb.tsfile.read.reader.IBatchReader;
import java.io.IOException;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
/**
* All SingleSeriesExpression involved in a IExpression will be transferred to a TimeGenerator tree
@@ -41,7 +43,8 @@ import java.util.*;
*/
public abstract class TimeGenerator {
- private HashMap<Path, List<LeafNode>> leafCache = new HashMap<>();
+ private HashMap<Path, List<LeafNode>> leafNodeCache = new HashMap<>();
+ private HashMap<Path, List<Object>> leafValuesCache;
protected Node operatorNode;
private boolean hasOrNode;
@@ -50,18 +53,27 @@ public abstract class TimeGenerator {
}
public long next() throws IOException {
+ if (!hasOrNode) {
+ if (leafValuesCache == null) {
+ leafValuesCache = new HashMap<>();
+ }
+ leafNodeCache.forEach(
+ (path, nodes) ->
+ leafValuesCache
+ .computeIfAbsent(path, k -> new ArrayList<>())
+ .add(nodes.get(0).currentValue()));
+ }
return operatorNode.next();
}
- public Object getValue(Path path, long time) {
- for (LeafNode leafNode : leafCache.get(path)) {
- if (!leafNode.currentTimeIs(time)) {
- continue;
- }
- return leafNode.currentValue();
- }
+ /** ATTENTION: this method should only be used when there is no `OR` node */
+ public Object[] getValues(Path path) {
+ return leafValuesCache.get(path) == null ? null : leafValuesCache.remove(path).toArray();
+ }
- return null;
+ /** ATTENTION: this method should only be used when there is no `OR` node */
+ public Object getValue(Path path) {
+ return leafValuesCache.get(path) == null ? null : leafValuesCache.get(path).remove(0);
}
public void constructNode(IExpression expression) throws IOException {
@@ -76,13 +88,13 @@ public abstract class TimeGenerator {
IBatchReader seriesReader = generateNewBatchReader(singleSeriesExp);
Path path = singleSeriesExp.getSeriesPath();
- if (!leafCache.containsKey(path)) {
- leafCache.put(path, new ArrayList<>());
+ if (!leafNodeCache.containsKey(path)) {
+ leafNodeCache.put(path, new ArrayList<>());
}
// put the current reader to valueCache
LeafNode leafNode = new LeafNode(seriesReader);
- leafCache.get(path).add(leafNode);
+ leafNodeCache.get(path).add(leafNode);
return leafNode;
} else {
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/query/timegenerator/node/AndNode.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/query/timegenerator/node/AndNode.java
index b90aafb..eff83b0 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/query/timegenerator/node/AndNode.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/query/timegenerator/node/AndNode.java
@@ -26,8 +26,8 @@ public class AndNode implements Node {
private Node leftChild;
private Node rightChild;
- private long cachedValue;
- private boolean hasCachedValue;
+ private long cachedTime;
+ private boolean hasCachedTime;
private boolean ascending = true;
/**
@@ -39,20 +39,20 @@ public class AndNode implements Node {
public AndNode(Node leftChild, Node rightChild) {
this.leftChild = leftChild;
this.rightChild = rightChild;
- this.hasCachedValue = false;
+ this.hasCachedTime = false;
}
public AndNode(Node leftChild, Node rightChild, boolean ascending) {
this.leftChild = leftChild;
this.rightChild = rightChild;
- this.hasCachedValue = false;
+ this.hasCachedTime = false;
this.ascending = ascending;
}
@SuppressWarnings("squid:S3776") // Suppress high Cognitive Complexity warning
@Override
public boolean hasNext() throws IOException {
- if (hasCachedValue) {
+ if (hasCachedTime) {
return true;
}
if (leftChild.hasNext() && rightChild.hasNext()) {
@@ -69,8 +69,8 @@ public class AndNode implements Node {
long rightValue = rightChild.next();
while (true) {
if (leftValue == rightValue) {
- this.hasCachedValue = true;
- this.cachedValue = leftValue;
+ this.hasCachedTime = true;
+ this.cachedTime = leftValue;
return true;
}
if (seekRight.test(leftValue, rightValue)) {
@@ -92,8 +92,8 @@ public class AndNode implements Node {
@Override
public long next() throws IOException {
if (hasNext()) {
- hasCachedValue = false;
- return cachedValue;
+ hasCachedTime = false;
+ return cachedTime;
}
throw new IOException("no more data");
}
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/query/timegenerator/node/OrNode.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/query/timegenerator/node/OrNode.java
index 6205030..a133cbb 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/query/timegenerator/node/OrNode.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/query/timegenerator/node/OrNode.java
@@ -25,55 +25,55 @@ public class OrNode implements Node {
private Node leftChild;
private Node rightChild;
- private boolean hasCachedLeftValue;
- private long cachedLeftValue;
- private boolean hasCachedRightValue;
- private long cachedRightValue;
+ private boolean hasCachedLeftTime;
+ private long cachedLeftTime;
+ private boolean hasCachedRightTime;
+ private long cachedRightTime;
private boolean ascending = true;
public OrNode(Node leftChild, Node rightChild) {
this.leftChild = leftChild;
this.rightChild = rightChild;
- this.hasCachedLeftValue = false;
- this.hasCachedRightValue = false;
+ this.hasCachedLeftTime = false;
+ this.hasCachedRightTime = false;
}
public OrNode(Node leftChild, Node rightChild, boolean ascending) {
this.leftChild = leftChild;
this.rightChild = rightChild;
- this.hasCachedLeftValue = false;
- this.hasCachedRightValue = false;
+ this.hasCachedLeftTime = false;
+ this.hasCachedRightTime = false;
this.ascending = ascending;
}
@Override
public boolean hasNext() throws IOException {
- if (hasCachedLeftValue || hasCachedRightValue) {
+ if (hasCachedLeftTime || hasCachedRightTime) {
return true;
}
return leftChild.hasNext() || rightChild.hasNext();
}
private boolean hasLeftValue() throws IOException {
- return hasCachedLeftValue || leftChild.hasNext();
+ return hasCachedLeftTime || leftChild.hasNext();
}
private long getLeftValue() throws IOException {
- if (hasCachedLeftValue) {
- hasCachedLeftValue = false;
- return cachedLeftValue;
+ if (hasCachedLeftTime) {
+ hasCachedLeftTime = false;
+ return cachedLeftTime;
}
return leftChild.next();
}
private boolean hasRightValue() throws IOException {
- return hasCachedRightValue || rightChild.hasNext();
+ return hasCachedRightTime || rightChild.hasNext();
}
private long getRightValue() throws IOException {
- if (hasCachedRightValue) {
- hasCachedRightValue = false;
- return cachedRightValue;
+ if (hasCachedRightTime) {
+ hasCachedRightTime = false;
+ return cachedRightTime;
}
return rightChild.next();
}
@@ -99,12 +99,12 @@ public class OrNode implements Node {
private long popAndFillNextCache(boolean popLeft, boolean popRight, long left, long right) {
if (popLeft) {
- hasCachedRightValue = true;
- cachedRightValue = right;
+ hasCachedRightTime = true;
+ cachedRightTime = right;
return left;
} else if (popRight) {
- hasCachedLeftValue = true;
- cachedLeftValue = left;
+ hasCachedLeftTime = true;
+ cachedLeftTime = left;
return right;
} else {
return left;
diff --git a/tsfile/src/test/java/org/apache/iotdb/tsfile/read/reader/FakedTimeGenerator.java b/tsfile/src/test/java/org/apache/iotdb/tsfile/read/reader/FakedTimeGenerator.java
index 9b848dc..85b30c0 100644
--- a/tsfile/src/test/java/org/apache/iotdb/tsfile/read/reader/FakedTimeGenerator.java
+++ b/tsfile/src/test/java/org/apache/iotdb/tsfile/read/reader/FakedTimeGenerator.java
@@ -35,19 +35,18 @@ public class FakedTimeGenerator extends TimeGenerator {
public FakedTimeGenerator() throws IOException {
- // or(and(d1.s1, d2.s2), d2.s2)
+ // and(and(d1.s1, d2.s2), d2.s2)
IExpression expression =
- BinaryExpression.or(
+ BinaryExpression.and(
BinaryExpression.and(
new SingleSeriesExpression(
new Path("d1", "s1"),
- FilterFactory.and(TimeFilter.gtEq(1L), TimeFilter.ltEq(5L))),
+ FilterFactory.and(TimeFilter.gtEq(3L), TimeFilter.ltEq(8L))),
new SingleSeriesExpression(
new Path("d2", "s2"),
FilterFactory.and(TimeFilter.gtEq(1L), TimeFilter.ltEq(10L)))),
new SingleSeriesExpression(
- new Path("d2", "s2"),
- FilterFactory.and(TimeFilter.gtEq(11L), TimeFilter.ltEq(15L))));
+ new Path("d2", "s2"), FilterFactory.and(TimeFilter.gtEq(2L), TimeFilter.ltEq(6L))));
super.constructNode(expression);
}
@@ -68,10 +67,10 @@ public class FakedTimeGenerator extends TimeGenerator {
Path path = new Path("d1", "s1");
long count = 0;
while (fakedTimeGenerator.hasNext()) {
- long time = fakedTimeGenerator.next();
- fakedTimeGenerator.getValue(path, time);
+ fakedTimeGenerator.next();
+ fakedTimeGenerator.getValue(path);
count++;
}
- Assert.assertEquals(10L, count);
+ Assert.assertEquals(4L, count);
}
}