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;