You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ro...@apache.org on 2022/05/31 08:49:30 UTC

[iotdb] branch IOTDB-3348 created (now e6af88e001)

This is an automated email from the ASF dual-hosted git repository.

rong pushed a change to branch IOTDB-3348
in repository https://gitbox.apache.org/repos/asf/iotdb.git


      at e6af88e001 [IOTDB-3348] Miss some data while using or value filter

This branch includes the following new commits:

     new e6af88e001 [IOTDB-3348] Miss some data while using or value filter

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[iotdb] 01/01: [IOTDB-3348] Miss some data while using or value filter

Posted by ro...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rong pushed a commit to branch IOTDB-3348
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit e6af88e0019a8cf8e78d842e03d2164820d64114
Author: Steve Yurong Su <ro...@apache.org>
AuthorDate: Tue May 31 16:48:58 2022 +0800

    [IOTDB-3348] Miss some data while using or value filter
---
 .../dag/transformer/binary/BinaryTransformer.java  |  4 +-
 .../transformer/binary/LogicBinaryTransformer.java | 78 +++++++++++++++++++++-
 2 files changed, 79 insertions(+), 3 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..37d72180ca 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,88 @@ public abstract class LogicBinaryTransformer extends BinaryTransformer {
   }
 
   @Override
-  protected void transformAndCache() throws QueryProcessException, IOException {
+  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 = evaluate(false, leftPointReader.currentBoolean());
+    leftPointReader.readyForNext();
+    return true;
+  }
+
+  private boolean cacheValue(LayerPointReader leftPointReader, LayerPointReader rightPointReader)
+      throws IOException {
+    if (isCurrentConstant) {
+      cachedBoolean = evaluate(leftPointReader.currentBoolean(), rightPointReader.currentBoolean());
+      return true;
+    }
+
+    if (isLeftPointReaderConstant) {
+      cachedTime = rightPointReader.currentTime();
+      cachedBoolean = evaluate(leftPointReader.currentBoolean(), rightPointReader.currentBoolean());
+      rightPointReader.readyForNext();
+      return true;
+    }
+
+    if (isRightPointReaderConstant) {
+      cachedTime = leftPointReader.currentTime();
+      cachedBoolean = evaluate(leftPointReader.currentBoolean(), rightPointReader.currentBoolean());
+      leftPointReader.readyForNext();
+      return true;
+    }
+
+    final long leftTime = leftPointReader.currentTime();
+    final long rightTime = rightPointReader.currentTime();
+
+    if (leftTime < rightTime) {
+      cachedTime = leftTime;
+      cachedBoolean = evaluate(leftPointReader.currentBoolean(), false);
+      leftPointReader.readyForNext();
+      return true;
+    }
+
+    if (rightTime < leftTime) {
+      cachedTime = rightTime;
+      cachedBoolean = evaluate(false, rightPointReader.currentBoolean());
+      rightPointReader.readyForNext();
+      return true;
+    }
+
+    // == rightTime
+    cachedTime = leftTime;
     cachedBoolean = evaluate(leftPointReader.currentBoolean(), rightPointReader.currentBoolean());
+    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;