You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ja...@apache.org on 2022/05/31 15:16:10 UTC
[iotdb] branch master updated: [IOTDB-3348] Miss some data while using or value filter (#6095)
This is an automated email from the ASF dual-hosted git repository.
jackietien pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new b47f7f0394 [IOTDB-3348] Miss some data while using or value filter (#6095)
b47f7f0394 is described below
commit b47f7f03941d21ae93c212c42e93463cff90f978
Author: Steve Yurong Su <ro...@apache.org>
AuthorDate: Tue May 31 23:16:04 2022 +0800
[IOTDB-3348] Miss some data while using or value filter (#6095)
---
.../dag/transformer/binary/BinaryTransformer.java | 4 +-
.../transformer/binary/LogicBinaryTransformer.java | 85 +++++++++++++++++++++-
2 files changed, 85 insertions(+), 4 deletions(-)
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/transformation/dag/transformer/binary/BinaryTransformer.java b/server/src/main/java/org/apache/iotdb/db/mpp/transformation/dag/transformer/binary/BinaryTransformer.java
index 13cd2a4d5b..a403130bbf 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/transformation/dag/transformer/binary/BinaryTransformer.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/transformation/dag/transformer/binary/BinaryTransformer.java
@@ -50,6 +50,8 @@ public abstract class BinaryTransformer extends Transformer {
checkType();
}
+ protected abstract void checkType();
+
@Override
public boolean isConstantPointReader() {
return isCurrentConstant;
@@ -78,8 +80,6 @@ public abstract class BinaryTransformer extends Transformer {
protected abstract void transformAndCache() throws QueryProcessException, IOException;
- protected abstract void checkType();
-
/**
* finds the smallest, unconsumed timestamp that exists in both {@code leftPointReader} and {@code
* rightPointReader} and then caches the timestamp in {@code cachedTime}.
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/transformation/dag/transformer/binary/LogicBinaryTransformer.java b/server/src/main/java/org/apache/iotdb/db/mpp/transformation/dag/transformer/binary/LogicBinaryTransformer.java
index 15cf8aa75c..e05d6dbaf9 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/transformation/dag/transformer/binary/LogicBinaryTransformer.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/transformation/dag/transformer/binary/LogicBinaryTransformer.java
@@ -42,12 +42,93 @@ public abstract class LogicBinaryTransformer extends BinaryTransformer {
}
@Override
- protected void transformAndCache() throws QueryProcessException, IOException {
- cachedBoolean = evaluate(leftPointReader.currentBoolean(), rightPointReader.currentBoolean());
+ protected boolean cacheValue() throws QueryProcessException, IOException {
+ final boolean leftHasNext = leftPointReader.next();
+ final boolean rightHasNext = rightPointReader.next();
+
+ if (leftHasNext && rightHasNext) {
+ return cacheValue(leftPointReader, rightPointReader);
+ }
+
+ if (!leftHasNext && !rightHasNext) {
+ return false;
+ }
+
+ if (leftHasNext && !isLeftPointReaderConstant) {
+ return cacheValue(leftPointReader);
+ }
+ if (rightHasNext && !isRightPointReaderConstant) {
+ return cacheValue(rightPointReader);
+ }
+
+ return false;
+ }
+
+ private boolean cacheValue(LayerPointReader reader) throws IOException {
+ cachedTime = reader.currentTime();
+ cachedBoolean = !reader.isCurrentNull() && evaluate(false, reader.currentBoolean());
+ reader.readyForNext();
+ return true;
+ }
+
+ private boolean cacheValue(LayerPointReader leftPointReader, LayerPointReader rightPointReader)
+ throws IOException {
+ final boolean leftBoolean =
+ !leftPointReader.isCurrentNull() && leftPointReader.currentBoolean();
+ final boolean rightBoolean =
+ !rightPointReader.isCurrentNull() && rightPointReader.currentBoolean();
+
+ if (isCurrentConstant) {
+ cachedBoolean = evaluate(leftBoolean, rightBoolean);
+ return true;
+ }
+
+ if (isLeftPointReaderConstant) {
+ cachedTime = rightPointReader.currentTime();
+ cachedBoolean = evaluate(leftBoolean, rightBoolean);
+ rightPointReader.readyForNext();
+ return true;
+ }
+
+ if (isRightPointReaderConstant) {
+ cachedTime = leftPointReader.currentTime();
+ cachedBoolean = evaluate(leftBoolean, rightBoolean);
+ leftPointReader.readyForNext();
+ return true;
+ }
+
+ final long leftTime = leftPointReader.currentTime();
+ final long rightTime = rightPointReader.currentTime();
+
+ if (leftTime < rightTime) {
+ cachedTime = leftTime;
+ cachedBoolean = evaluate(leftBoolean, false);
+ leftPointReader.readyForNext();
+ return true;
+ }
+
+ if (rightTime < leftTime) {
+ cachedTime = rightTime;
+ cachedBoolean = evaluate(false, rightBoolean);
+ rightPointReader.readyForNext();
+ return true;
+ }
+
+ // == rightTime
+ cachedTime = leftTime;
+ cachedBoolean = evaluate(leftBoolean, rightBoolean);
+ leftPointReader.readyForNext();
+ rightPointReader.readyForNext();
+ return true;
}
protected abstract boolean evaluate(boolean leftOperand, boolean rightOperand);
+ @Override
+ protected void transformAndCache() throws QueryProcessException, IOException {
+ throw new UnsupportedOperationException();
+ }
+
@Override
public TSDataType getDataType() {
return TSDataType.BOOLEAN;