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 <[email protected]>
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;

Reply via email to