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 57b9194a459 Optimizing the Binary comparison method in
CompareBinaryColumnTransformer
57b9194a459 is described below
commit 57b9194a4591b9f3a9a4b1ab48e8aab42ceb0dd5
Author: Liao Lanyu <[email protected]>
AuthorDate: Wed Nov 29 02:00:44 2023 +0800
Optimizing the Binary comparison method in CompareBinaryColumnTransformer
---
.../fragment/FragmentInstanceContext.java | 1 +
.../binary/CompareBinaryColumnTransformer.java | 33 ++++++++---------
.../column/ternary/BetweenColumnTransformer.java | 21 +++--------
.../binary/CompareEqualToTransformer.java | 5 +--
.../binary/CompareGreaterEqualTransformer.java | 5 +--
.../binary/CompareGreaterThanTransformer.java | 5 +--
.../binary/CompareLessEqualTransformer.java | 5 +--
.../binary/CompareLessThanTransformer.java | 5 +--
.../binary/CompareNonEqualTransformer.java | 5 +--
.../transformer/ternary/BetweenTransformer.java | 15 ++------
.../transformation/dag/util/TransformUtils.java | 41 +++++++---------------
11 files changed, 40 insertions(+), 101 deletions(-)
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/FragmentInstanceContext.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/FragmentInstanceContext.java
index dcba7d71648..195986aae3f 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/FragmentInstanceContext.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/FragmentInstanceContext.java
@@ -417,6 +417,7 @@ public class FragmentInstanceContext extends QueryContext {
allDriversClosed.await();
break;
} catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
LOGGER.warn(
"Interrupted when await on allDriversClosed, FragmentInstance Id
is {}", this.getId());
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/CompareBinaryColumnTransformer.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/CompareBinaryColumnTransformer.java
index 917ff174647..15c481c5cea 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/CompareBinaryColumnTransformer.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/CompareBinaryColumnTransformer.java
@@ -21,9 +21,9 @@ package
org.apache.iotdb.db.queryengine.transformation.dag.column.binary;
import
org.apache.iotdb.db.queryengine.transformation.dag.column.ColumnTransformer;
import org.apache.iotdb.db.queryengine.transformation.dag.util.TransformUtils;
-import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
import org.apache.iotdb.tsfile.read.common.block.column.Column;
import org.apache.iotdb.tsfile.read.common.block.column.ColumnBuilder;
+import org.apache.iotdb.tsfile.read.common.block.column.RunLengthEncodedColumn;
import org.apache.iotdb.tsfile.read.common.type.Type;
import org.apache.iotdb.tsfile.read.common.type.TypeEnum;
@@ -37,33 +37,34 @@ public abstract class CompareBinaryColumnTransformer
extends BinaryColumnTransfo
@Override
protected void doTransform(
Column leftColumn, Column rightColumn, ColumnBuilder builder, int
positionCount) {
+ // if either column is all null, append nullCount. For now, a
RunLengthEncodeColumn with
+ // mayHaveNull == true is all null
+ if ((leftColumn.mayHaveNull() && leftColumn instanceof
RunLengthEncodedColumn)
+ || (rightColumn.mayHaveNull() && rightColumn instanceof
RunLengthEncodedColumn)) {
+ builder.appendNull(positionCount);
+ return;
+ }
for (int i = 0; i < positionCount; i++) {
if (!leftColumn.isNull(i) && !rightColumn.isNull(i)) {
boolean flag = false;
// compare binary type
- if (leftTransformer.getType().getTypeEnum().equals(TypeEnum.BINARY)) {
+ if (TypeEnum.BINARY.equals(leftTransformer.getType().getTypeEnum())) {
flag =
transform(
TransformUtils.compare(
- leftTransformer
- .getType()
- .getBinary(leftColumn, i)
- .getStringValue(TSFileConfig.STRING_CHARSET),
- rightTransformer
- .getType()
- .getBinary(rightColumn, i)
- .getStringValue(TSFileConfig.STRING_CHARSET)));
- } else if
(leftTransformer.getType().getTypeEnum().equals(TypeEnum.BOOLEAN)) {
+ leftTransformer.getType().getBinary(leftColumn, i),
+ rightTransformer.getType().getBinary(rightColumn, i)));
+ } else if
(TypeEnum.BOOLEAN.equals(leftTransformer.getType().getTypeEnum())) {
flag =
transform(
Boolean.compare(
leftTransformer.getType().getBoolean(leftColumn, i),
rightTransformer.getType().getBoolean(rightColumn, i)));
} else {
- double left = leftTransformer.getType().getDouble(leftColumn, i);
- double right = rightTransformer.getType().getDouble(rightColumn, i);
+ final double left = leftTransformer.getType().getDouble(leftColumn,
i);
+ final double right =
rightTransformer.getType().getDouble(rightColumn, i);
if (!Double.isNaN(left) && !Double.isNaN(right)) {
- flag = transform(compare(left, right));
+ flag = transform(Double.compare(left, right));
}
}
returnType.writeBoolean(builder, flag);
@@ -83,10 +84,6 @@ public abstract class CompareBinaryColumnTransformer extends
BinaryColumnTransfo
throw new UnsupportedOperationException("Unsupported Type");
}
- protected int compare(double d1, double d2) {
- return Double.compare(d1, d2);
- }
-
/**
* Transform int value of flag to corresponding boolean value.
*
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ternary/BetweenColumnTransformer.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ternary/BetweenColumnTransformer.java
index 1d240b27766..fc30f03a584 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ternary/BetweenColumnTransformer.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ternary/BetweenColumnTransformer.java
@@ -21,7 +21,6 @@ package
org.apache.iotdb.db.queryengine.transformation.dag.column.ternary;
import
org.apache.iotdb.db.queryengine.transformation.dag.column.ColumnTransformer;
import org.apache.iotdb.db.queryengine.transformation.dag.util.TransformUtils;
-import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
import org.apache.iotdb.tsfile.read.common.block.column.Column;
import org.apache.iotdb.tsfile.read.common.block.column.ColumnBuilder;
import org.apache.iotdb.tsfile.read.common.type.BinaryType;
@@ -53,24 +52,12 @@ public class BetweenColumnTransformer extends
CompareTernaryColumnTransformer {
if (firstColumnTransformer.getType() instanceof BinaryType) {
flag =
((TransformUtils.compare(
- firstColumnTransformer
- .getType()
- .getBinary(firstColumn, i)
- .getStringValue(TSFileConfig.STRING_CHARSET),
- secondColumnTransformer
- .getType()
- .getBinary(secondColumn, i)
- .getStringValue(TSFileConfig.STRING_CHARSET))
+
firstColumnTransformer.getType().getBinary(firstColumn, i),
+
secondColumnTransformer.getType().getBinary(secondColumn, i))
>= 0)
&& (TransformUtils.compare(
- firstColumnTransformer
- .getType()
- .getBinary(firstColumn, i)
- .getStringValue(TSFileConfig.STRING_CHARSET),
- thirdColumnTransformer
- .getType()
- .getBinary(thirdColumn, i)
- .getStringValue(TSFileConfig.STRING_CHARSET))
+
firstColumnTransformer.getType().getBinary(firstColumn, i),
+
thirdColumnTransformer.getType().getBinary(thirdColumn, i))
<= 0))
^ isNotBetween;
} else {
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/transformer/binary/CompareEqualToTransformer.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/transformer/binary/CompareEqualToTransformer.java
index 244b83d68b0..cc1914e10b0 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/transformer/binary/CompareEqualToTransformer.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/transformer/binary/CompareEqualToTransformer.java
@@ -21,7 +21,6 @@ package
org.apache.iotdb.db.queryengine.transformation.dag.transformer.binary;
import org.apache.iotdb.db.queryengine.transformation.api.LayerPointReader;
import org.apache.iotdb.db.queryengine.transformation.dag.util.TransformUtils;
-import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
public class CompareEqualToTransformer extends CompareBinaryTransformer {
@@ -42,9 +41,7 @@ public class CompareEqualToTransformer extends
CompareBinaryTransformer {
@Override
protected Evaluator constructTextEvaluator() {
return () ->
- TransformUtils.compare(
-
leftPointReader.currentBinary().getStringValue(TSFileConfig.STRING_CHARSET),
-
rightPointReader.currentBinary().getStringValue(TSFileConfig.STRING_CHARSET))
+ TransformUtils.compare(leftPointReader.currentBinary(),
rightPointReader.currentBinary())
== 0;
}
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/transformer/binary/CompareGreaterEqualTransformer.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/transformer/binary/CompareGreaterEqualTransformer.java
index 1fa8a78f437..223a08132c6 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/transformer/binary/CompareGreaterEqualTransformer.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/transformer/binary/CompareGreaterEqualTransformer.java
@@ -21,7 +21,6 @@ package
org.apache.iotdb.db.queryengine.transformation.dag.transformer.binary;
import org.apache.iotdb.db.queryengine.transformation.api.LayerPointReader;
import org.apache.iotdb.db.queryengine.transformation.dag.util.TransformUtils;
-import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
public class CompareGreaterEqualTransformer extends CompareBinaryTransformer {
@@ -42,9 +41,7 @@ public class CompareGreaterEqualTransformer extends
CompareBinaryTransformer {
@Override
protected Evaluator constructTextEvaluator() {
return () ->
- TransformUtils.compare(
-
leftPointReader.currentBinary().getStringValue(TSFileConfig.STRING_CHARSET),
-
rightPointReader.currentBinary().getStringValue(TSFileConfig.STRING_CHARSET))
+ TransformUtils.compare(leftPointReader.currentBinary(),
rightPointReader.currentBinary())
>= 0;
}
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/transformer/binary/CompareGreaterThanTransformer.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/transformer/binary/CompareGreaterThanTransformer.java
index 9932a472ea1..3eeadd8dff9 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/transformer/binary/CompareGreaterThanTransformer.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/transformer/binary/CompareGreaterThanTransformer.java
@@ -21,7 +21,6 @@ package
org.apache.iotdb.db.queryengine.transformation.dag.transformer.binary;
import org.apache.iotdb.db.queryengine.transformation.api.LayerPointReader;
import org.apache.iotdb.db.queryengine.transformation.dag.util.TransformUtils;
-import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
public class CompareGreaterThanTransformer extends CompareBinaryTransformer {
@@ -42,9 +41,7 @@ public class CompareGreaterThanTransformer extends
CompareBinaryTransformer {
@Override
protected Evaluator constructTextEvaluator() {
return () ->
- TransformUtils.compare(
-
leftPointReader.currentBinary().getStringValue(TSFileConfig.STRING_CHARSET),
-
rightPointReader.currentBinary().getStringValue(TSFileConfig.STRING_CHARSET))
+ TransformUtils.compare(leftPointReader.currentBinary(),
rightPointReader.currentBinary())
> 0;
}
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/transformer/binary/CompareLessEqualTransformer.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/transformer/binary/CompareLessEqualTransformer.java
index 97074a49a17..07b0856b852 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/transformer/binary/CompareLessEqualTransformer.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/transformer/binary/CompareLessEqualTransformer.java
@@ -21,7 +21,6 @@ package
org.apache.iotdb.db.queryengine.transformation.dag.transformer.binary;
import org.apache.iotdb.db.queryengine.transformation.api.LayerPointReader;
import org.apache.iotdb.db.queryengine.transformation.dag.util.TransformUtils;
-import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
public class CompareLessEqualTransformer extends CompareBinaryTransformer {
@@ -42,9 +41,7 @@ public class CompareLessEqualTransformer extends
CompareBinaryTransformer {
@Override
protected Evaluator constructTextEvaluator() {
return () ->
- TransformUtils.compare(
-
leftPointReader.currentBinary().getStringValue(TSFileConfig.STRING_CHARSET),
-
rightPointReader.currentBinary().getStringValue(TSFileConfig.STRING_CHARSET))
+ TransformUtils.compare(leftPointReader.currentBinary(),
rightPointReader.currentBinary())
<= 0;
}
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/transformer/binary/CompareLessThanTransformer.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/transformer/binary/CompareLessThanTransformer.java
index a71b4a932e4..b191d8f23ca 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/transformer/binary/CompareLessThanTransformer.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/transformer/binary/CompareLessThanTransformer.java
@@ -21,7 +21,6 @@ package
org.apache.iotdb.db.queryengine.transformation.dag.transformer.binary;
import org.apache.iotdb.db.queryengine.transformation.api.LayerPointReader;
import org.apache.iotdb.db.queryengine.transformation.dag.util.TransformUtils;
-import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
public class CompareLessThanTransformer extends CompareBinaryTransformer {
@@ -42,9 +41,7 @@ public class CompareLessThanTransformer extends
CompareBinaryTransformer {
@Override
protected Evaluator constructTextEvaluator() {
return () ->
- TransformUtils.compare(
-
leftPointReader.currentBinary().getStringValue(TSFileConfig.STRING_CHARSET),
-
rightPointReader.currentBinary().getStringValue(TSFileConfig.STRING_CHARSET))
+ TransformUtils.compare(leftPointReader.currentBinary(),
rightPointReader.currentBinary())
< 0;
}
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/transformer/binary/CompareNonEqualTransformer.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/transformer/binary/CompareNonEqualTransformer.java
index 797240d0938..02229b7ed45 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/transformer/binary/CompareNonEqualTransformer.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/transformer/binary/CompareNonEqualTransformer.java
@@ -21,7 +21,6 @@ package
org.apache.iotdb.db.queryengine.transformation.dag.transformer.binary;
import org.apache.iotdb.db.queryengine.transformation.api.LayerPointReader;
import org.apache.iotdb.db.queryengine.transformation.dag.util.TransformUtils;
-import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
import org.apache.iotdb.tsfile.exception.write.UnSupportedDataTypeException;
public class CompareNonEqualTransformer extends CompareBinaryTransformer {
@@ -44,9 +43,7 @@ public class CompareNonEqualTransformer extends
CompareBinaryTransformer {
@Override
protected Evaluator constructTextEvaluator() {
return () ->
- TransformUtils.compare(
-
leftPointReader.currentBinary().getStringValue(TSFileConfig.STRING_CHARSET),
-
rightPointReader.currentBinary().getStringValue(TSFileConfig.STRING_CHARSET))
+ TransformUtils.compare(leftPointReader.currentBinary(),
rightPointReader.currentBinary())
!= 0;
}
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/transformer/ternary/BetweenTransformer.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/transformer/ternary/BetweenTransformer.java
index 6941bf24f0b..4329a0b1f9a 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/transformer/ternary/BetweenTransformer.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/transformer/ternary/BetweenTransformer.java
@@ -23,7 +23,6 @@ package
org.apache.iotdb.db.queryengine.transformation.dag.transformer.ternary;
import org.apache.iotdb.db.queryengine.transformation.api.LayerPointReader;
import org.apache.iotdb.db.queryengine.transformation.dag.util.TransformUtils;
-import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
public class BetweenTransformer extends CompareTernaryTransformer {
@@ -57,20 +56,10 @@ public class BetweenTransformer extends
CompareTernaryTransformer {
protected Evaluator constructTextEvaluator() {
return () ->
((TransformUtils.compare(
- firstPointReader
- .currentBinary()
- .getStringValue(TSFileConfig.STRING_CHARSET),
- secondPointReader
- .currentBinary()
- .getStringValue(TSFileConfig.STRING_CHARSET))
+ firstPointReader.currentBinary(),
secondPointReader.currentBinary())
>= 0)
&& (TransformUtils.compare(
- firstPointReader
- .currentBinary()
- .getStringValue(TSFileConfig.STRING_CHARSET),
- thirdPointReader
- .currentBinary()
- .getStringValue(TSFileConfig.STRING_CHARSET))
+ firstPointReader.currentBinary(),
thirdPointReader.currentBinary())
<= 0))
^ isNotBetween;
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/util/TransformUtils.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/util/TransformUtils.java
index 6eedeb7ec1c..cf6c1f5e064 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/util/TransformUtils.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/util/TransformUtils.java
@@ -35,8 +35,6 @@ import
org.apache.iotdb.tsfile.read.common.block.column.IntColumn;
import org.apache.iotdb.tsfile.read.common.block.column.LongColumn;
import org.apache.iotdb.tsfile.utils.Binary;
-import org.apache.commons.lang3.Validate;
-
import java.io.IOException;
import java.util.Objects;
import java.util.Optional;
@@ -47,28 +45,16 @@ public class TransformUtils {
throw new IllegalStateException("TransformUtils should not be
instantiated.");
}
- public static int compare(CharSequence cs1, CharSequence cs2) {
- if (Objects.requireNonNull(cs1) == Objects.requireNonNull(cs2)) {
+ public static int compare(Binary first, Binary second) {
+ if (Objects.requireNonNull(first) == Objects.requireNonNull(second)) {
return 0;
}
- if (cs1.getClass() == cs2.getClass() && cs1 instanceof Comparable) {
- return ((Comparable<Object>) cs1).compareTo(cs2);
- }
-
- for (int i = 0, len = Math.min(cs1.length(), cs2.length()); i < len; i++) {
- char a = cs1.charAt(i);
- char b = cs2.charAt(i);
- if (a != b) {
- return a - b;
- }
- }
-
- return cs1.length() - cs2.length();
+ return first.compareTo(second);
}
public static Column transformConstantOperandToColumn(ConstantOperand
constantOperand) {
- Validate.notNull(constantOperand);
+ Objects.requireNonNull(constantOperand);
try {
Object value =
@@ -80,21 +66,17 @@ public class TransformUtils {
switch (constantOperand.getDataType()) {
case INT32:
- return new IntColumn(1, Optional.of(new boolean[] {false}), new
int[] {(int) value});
+ return new IntColumn(1, Optional.empty(), new int[] {(int) value});
case INT64:
- return new LongColumn(1, Optional.of(new boolean[] {false}), new
long[] {(long) value});
+ return new LongColumn(1, Optional.empty(), new long[] {(long)
value});
case FLOAT:
- return new FloatColumn(
- 1, Optional.of(new boolean[] {false}), new float[] {(float)
value});
+ return new FloatColumn(1, Optional.empty(), new float[] {(float)
value});
case DOUBLE:
- return new DoubleColumn(
- 1, Optional.of(new boolean[] {false}), new double[] {(double)
value});
+ return new DoubleColumn(1, Optional.empty(), new double[] {(double)
value});
case TEXT:
- return new BinaryColumn(
- 1, Optional.of(new boolean[] {false}), new Binary[] {(Binary)
value});
+ return new BinaryColumn(1, Optional.empty(), new Binary[] {(Binary)
value});
case BOOLEAN:
- return new BooleanColumn(
- 1, Optional.of(new boolean[] {false}), new boolean[] {(boolean)
value});
+ return new BooleanColumn(1, Optional.empty(), new boolean[]
{(boolean) value});
default:
throw new UnSupportedDataTypeException(
"Unsupported type: " + constantOperand.getDataType());
@@ -173,7 +155,8 @@ public class TransformUtils {
}
break;
default:
- throw new RuntimeException("The data type of the state window strategy
is not valid.");
+ throw new UnsupportedOperationException(
+ "The data type of the state window strategy is not valid.");
}
return res;
}