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;
