This is an automated email from the ASF dual-hosted git repository.
hui pushed a commit to branch lmh/refactorFilter
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/lmh/refactorFilter by this
push:
new 8e369a01a59 fix sonar
8e369a01a59 is described below
commit 8e369a01a5961b6e4f235b7b634b4bea156bf7ad
Author: Minghui Liu <[email protected]>
AuthorDate: Mon Nov 20 23:01:24 2023 +0800
fix sonar
---
.../queryengine/plan/analyze/PredicateUtils.java | 2 +-
.../plan/expression/ExpressionFactory.java | 4 +-
.../plan/expression/unary/LikeExpression.java | 4 +-
.../plan/expression/unary/RegularExpression.java | 2 +-
.../plan/planner/OperatorTreeGenerator.java | 2 +-
.../plan/planner/plan/node/PlanGraphPrinter.java | 6 +-
.../iotdb/tsfile/read/filter/basic/Filter.java | 16 +-
.../tsfile/read/filter/basic/IStatefulFilter.java | 2 +-
.../tsfile/read/filter/factory/ValueFilter.java | 177 +++++++--------------
.../iotdb/tsfile/read/filter/operator/And.java | 10 +-
.../read/filter/operator/GroupByMonthFilter.java | 7 +-
.../iotdb/tsfile/read/filter/operator/Not.java | 13 +-
.../iotdb/tsfile/read/filter/operator/Or.java | 10 +-
.../read/filter/operator/ValueFilterOperators.java | 80 +++++-----
.../org/apache/iotdb/tsfile/utils/RegexUtils.java | 95 +++++++++++
15 files changed, 234 insertions(+), 196 deletions(-)
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/PredicateUtils.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/PredicateUtils.java
index 167e28a96fd..a2e05e596f9 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/PredicateUtils.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/PredicateUtils.java
@@ -281,7 +281,7 @@ public class PredicateUtils {
}
public static Filter convertPredicateToTimeFilter(Expression predicate) {
- if(predicate == null) {
+ if (predicate == null) {
return null;
}
return predicate.accept(new ConvertExpressionToTimeFilterVisitor(), null);
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/ExpressionFactory.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/ExpressionFactory.java
index 90e2732aff0..0a7802ca7e1 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/ExpressionFactory.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/ExpressionFactory.java
@@ -150,8 +150,8 @@ public class ExpressionFactory {
return new LogicNotExpression(expression);
}
- public static InExpression in(Expression Expression, LinkedHashSet<String>
values) {
- return new InExpression(Expression, false, values);
+ public static InExpression in(Expression expression, LinkedHashSet<String>
values) {
+ return new InExpression(expression, false, values);
}
public static GroupByTimeExpression groupByTime(GroupByTimeParameter
parameter) {
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/unary/LikeExpression.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/unary/LikeExpression.java
index c7f11f1ec46..27785491707 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/unary/LikeExpression.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/unary/LikeExpression.java
@@ -29,8 +29,8 @@ import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.regex.Pattern;
-import static
org.apache.iotdb.tsfile.read.filter.factory.ValueFilter.compileRegex;
-import static
org.apache.iotdb.tsfile.read.filter.factory.ValueFilter.parseLikePatternToRegex;
+import static org.apache.iotdb.tsfile.utils.RegexUtils.compileRegex;
+import static org.apache.iotdb.tsfile.utils.RegexUtils.parseLikePatternToRegex;
public class LikeExpression extends UnaryExpression {
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/unary/RegularExpression.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/unary/RegularExpression.java
index 828b4b64aa4..de86da391b8 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/unary/RegularExpression.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/unary/RegularExpression.java
@@ -31,7 +31,7 @@ import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.regex.Pattern;
-import static
org.apache.iotdb.tsfile.read.filter.factory.ValueFilter.compileRegex;
+import static org.apache.iotdb.tsfile.utils.RegexUtils.compileRegex;
public class RegularExpression extends UnaryExpression {
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java
index 75a43acd77e..b5fa659affc 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java
@@ -501,7 +501,7 @@ public class OperatorTreeGenerator extends
PlanVisitor<Operator, LocalExecutionP
SeriesScanOptions.Builder scanOptionsBuilder = new
SeriesScanOptions.Builder();
Filter globalTimeFilter = context.getGlobalTimeFilter();
- if(globalTimeFilter != null) {
+ if (globalTimeFilter != null) {
scanOptionsBuilder.withGlobalTimeFilter(globalTimeFilter.copy());
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanGraphPrinter.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanGraphPrinter.java
index 4d516f720ea..a9193a4cc0a 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanGraphPrinter.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanGraphPrinter.java
@@ -99,7 +99,8 @@ public class PlanGraphPrinter extends
PlanVisitor<List<String>, PlanGraphPrinter
boxValue.add(String.format("SeriesScan-%s", node.getPlanNodeId().getId()));
boxValue.add(String.format("Series: %s", node.getSeriesPath()));
- long limit = node.getPushDownLimit(), offset = node.getPushDownOffset();
+ long limit = node.getPushDownLimit();
+ long offset = node.getPushDownOffset();
if (limit > 0) {
boxValue.add(String.format("Limit: %s", limit));
}
@@ -119,7 +120,8 @@ public class PlanGraphPrinter extends
PlanVisitor<List<String>, PlanGraphPrinter
"Series: %s%s",
node.getAlignedPath().getDevice(),
node.getAlignedPath().getMeasurementList()));
- long limit = node.getPushDownLimit(), offset = node.getPushDownOffset();
+ long limit = node.getPushDownLimit();
+ long offset = node.getPushDownOffset();
if (limit > 0) {
boxValue.add(String.format("Limit: %s", limit));
}
diff --git
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/Filter.java
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/Filter.java
index 7f2d6882f9f..475f5e3589c 100755
---
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/Filter.java
+++
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/Filter.java
@@ -27,6 +27,14 @@ import java.util.List;
/** Filter is a top level filter abstraction. */
public interface Filter {
+ /**
+ * To examine whether the single point(with time and value) is satisfied
with the filter.
+ *
+ * @param time single point time
+ * @param value single point value
+ */
+ boolean satisfy(long time, Object value);
+
/**
* To examine whether there are data points satisfied with the filter.
*
@@ -41,14 +49,6 @@ public interface Filter {
*/
boolean allSatisfy(Statistics statistics);
- /**
- * To examine whether the single point(with time and value) is satisfied
with the filter.
- *
- * @param time single point time
- * @param value single point value
- */
- boolean satisfy(long time, Object value);
-
/**
* To examine whether the min time and max time are satisfied with the
filter.
*
diff --git
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/IStatefulFilter.java
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/IStatefulFilter.java
index 24bfdc5c7ab..14968f0ee52 100644
---
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/IStatefulFilter.java
+++
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/IStatefulFilter.java
@@ -21,5 +21,5 @@ package org.apache.iotdb.tsfile.read.filter.basic;
public interface IStatefulFilter extends Filter {
- Filter copy();
+ Filter copy();
}
diff --git
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/factory/ValueFilter.java
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/factory/ValueFilter.java
index c68e226b19d..6a8fb291e2e 100644
---
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/factory/ValueFilter.java
+++
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/factory/ValueFilter.java
@@ -31,10 +31,10 @@ import
org.apache.iotdb.tsfile.read.filter.operator.ValueFilterOperators.ValueNo
import
org.apache.iotdb.tsfile.read.filter.operator.ValueFilterOperators.ValueNotIn;
import
org.apache.iotdb.tsfile.read.filter.operator.ValueFilterOperators.ValueNotRegexp;
import
org.apache.iotdb.tsfile.read.filter.operator.ValueFilterOperators.ValueRegexp;
+import org.apache.iotdb.tsfile.utils.RegexUtils;
import java.util.Set;
import java.util.regex.Pattern;
-import java.util.regex.PatternSyntaxException;
public class ValueFilter {
@@ -48,185 +48,120 @@ public class ValueFilter {
return new ValueGt<>(FAKE_MEASUREMENT, value);
}
- public static <T extends Comparable<T>> ValueGtEq<T> gtEq(T value) {
- return new ValueGtEq<>(FAKE_MEASUREMENT, value);
- }
-
- public static <T extends Comparable<T>> ValueLt<T> lt(T value) {
- return new ValueLt<>(FAKE_MEASUREMENT, value);
+ public static <T extends Comparable<T>> ValueGt<T> gt(String measurement, T
value) {
+ return new ValueGt<>(measurement, value);
}
- public static <T extends Comparable<T>> ValueLtEq<T> ltEq(T value) {
- return new ValueLtEq<>(FAKE_MEASUREMENT, value);
+ public static <T extends Comparable<T>> ValueGtEq<T> gtEq(T value) {
+ return new ValueGtEq<>(FAKE_MEASUREMENT, value);
}
- public static <T extends Comparable<T>> ValueEq<T> eq(T value) {
- return new ValueEq<>(FAKE_MEASUREMENT, value);
+ public static <T extends Comparable<T>> ValueGtEq<T> gtEq(String
measurement, T value) {
+ return new ValueGtEq<>(measurement, value);
}
- public static <T extends Comparable<T>> ValueNotEq<T> notEq(T value) {
- return new ValueNotEq<>(FAKE_MEASUREMENT, value);
+ public static <T extends Comparable<T>> ValueLt<T> lt(T value) {
+ return new ValueLt<>(FAKE_MEASUREMENT, value);
}
- public static <T extends Comparable<T>> ValueBetweenAnd<T> between(T value1,
T value2) {
- return new ValueBetweenAnd<>(FAKE_MEASUREMENT, value1, value2);
+ public static <T extends Comparable<T>> ValueLt<T> lt(String measurement, T
value) {
+ return new ValueLt<>(measurement, value);
}
- public static <T extends Comparable<T>> ValueNotBetweenAnd<T> notBetween(T
value1, T value2) {
- return new ValueNotBetweenAnd<>(FAKE_MEASUREMENT, value1, value2);
+ public static <T extends Comparable<T>> ValueLtEq<T> ltEq(T value) {
+ return new ValueLtEq<>(FAKE_MEASUREMENT, value);
}
- public static ValueRegexp like(String likePattern) {
- return regexp(FAKE_MEASUREMENT, parseLikePatternToRegex(likePattern));
+ public static <T extends Comparable<T>> ValueLtEq<T> ltEq(String
measurement, T value) {
+ return new ValueLtEq<>(measurement, value);
}
- public static ValueNotRegexp notLike(String likePattern) {
- return notRegexp(FAKE_MEASUREMENT, parseLikePatternToRegex(likePattern));
+ public static <T extends Comparable<T>> ValueEq<T> eq(T value) {
+ return new ValueEq<>(FAKE_MEASUREMENT, value);
}
- public static ValueRegexp regexp(String regex) {
- return new ValueRegexp(FAKE_MEASUREMENT, compileRegex(regex));
+ public static <T extends Comparable<T>> ValueEq<T> eq(String measurement, T
value) {
+ return new ValueEq<>(measurement, value);
}
- public static ValueNotRegexp notRegexp(String regex) {
- return new ValueNotRegexp(FAKE_MEASUREMENT, compileRegex(regex));
+ public static <T extends Comparable<T>> ValueNotEq<T> notEq(T value) {
+ return new ValueNotEq<>(FAKE_MEASUREMENT, value);
}
- public static <T extends Comparable<T>> ValueIn<T> in(Set<T> values) {
- return new ValueIn<>(FAKE_MEASUREMENT, values);
+ public static <T extends Comparable<T>> ValueNotEq<T> notEq(String
measurement, T value) {
+ return new ValueNotEq<>(measurement, value);
}
- public static <T extends Comparable<T>> ValueNotIn<T> notIn(Set<T> values) {
- return new ValueNotIn<>(FAKE_MEASUREMENT, values);
+ public static <T extends Comparable<T>> ValueBetweenAnd<T> between(T value1,
T value2) {
+ return new ValueBetweenAnd<>(FAKE_MEASUREMENT, value1, value2);
}
- public static <T extends Comparable<T>> ValueGt<T> gt(String measurement, T
value) {
- return new ValueGt<>(measurement, value);
+ public static <T extends Comparable<T>> ValueBetweenAnd<T> between(
+ String measurement, T value1, T value2) {
+ return new ValueBetweenAnd<>(measurement, value1, value2);
}
- public static <T extends Comparable<T>> ValueGtEq<T> gtEq(String
measurement, T value) {
- return new ValueGtEq<>(measurement, value);
+ public static <T extends Comparable<T>> ValueNotBetweenAnd<T> notBetween(T
value1, T value2) {
+ return new ValueNotBetweenAnd<>(FAKE_MEASUREMENT, value1, value2);
}
- public static <T extends Comparable<T>> ValueLt<T> lt(String measurement, T
value) {
- return new ValueLt<>(measurement, value);
+ public static <T extends Comparable<T>> ValueNotBetweenAnd<T> notBetween(
+ String measurement, T value1, T value2) {
+ return new ValueNotBetweenAnd<>(measurement, value1, value2);
}
- public static <T extends Comparable<T>> ValueLtEq<T> ltEq(String
measurement, T value) {
- return new ValueLtEq<>(measurement, value);
+ public static ValueRegexp like(String likePattern) {
+ return regexp(FAKE_MEASUREMENT,
RegexUtils.parseLikePatternToRegex(likePattern));
}
- public static <T extends Comparable<T>> ValueEq<T> eq(String measurement, T
value) {
- return new ValueEq<>(measurement, value);
+ public static ValueRegexp like(String measurement, String likePattern) {
+ return regexp(measurement,
RegexUtils.parseLikePatternToRegex(likePattern));
}
- public static <T extends Comparable<T>> ValueNotEq<T> notEq(String
measurement, T value) {
- return new ValueNotEq<>(measurement, value);
+ public static ValueNotRegexp notLike(String likePattern) {
+ return notRegexp(FAKE_MEASUREMENT,
RegexUtils.parseLikePatternToRegex(likePattern));
}
- public static <T extends Comparable<T>> ValueBetweenAnd<T> between(
- String measurement, T value1, T value2) {
- return new ValueBetweenAnd<>(measurement, value1, value2);
+ public static ValueNotRegexp notLike(String measurement, String likePattern)
{
+ return notRegexp(measurement,
RegexUtils.parseLikePatternToRegex(likePattern));
}
- public static <T extends Comparable<T>> ValueNotBetweenAnd<T> notBetween(
- String measurement, T value1, T value2) {
- return new ValueNotBetweenAnd<>(measurement, value1, value2);
+ public static ValueRegexp regexp(String regex) {
+ return new ValueRegexp(FAKE_MEASUREMENT, RegexUtils.compileRegex(regex));
}
- public static ValueRegexp like(String measurement, String likePattern) {
- return regexp(measurement, parseLikePatternToRegex(likePattern));
+ public static ValueRegexp regexp(String measurement, String regex) {
+ return new ValueRegexp(measurement, RegexUtils.compileRegex(regex));
}
- public static ValueNotRegexp notLike(String measurement, String likePattern)
{
- return notRegexp(measurement, parseLikePatternToRegex(likePattern));
+ public static ValueRegexp regexp(String measurement, Pattern pattern) {
+ return new ValueRegexp(measurement, pattern);
}
- public static ValueRegexp regexp(String measurement, String regex) {
- return new ValueRegexp(measurement, compileRegex(regex));
+ public static ValueNotRegexp notRegexp(String regex) {
+ return new ValueNotRegexp(FAKE_MEASUREMENT,
RegexUtils.compileRegex(regex));
}
public static ValueNotRegexp notRegexp(String measurement, String regex) {
- return new ValueNotRegexp(measurement, compileRegex(regex));
- }
-
- public static ValueRegexp regexp(String measurement, Pattern pattern) {
- return new ValueRegexp(measurement, pattern);
+ return new ValueNotRegexp(measurement, RegexUtils.compileRegex(regex));
}
public static ValueNotRegexp notRegexp(String measurement, Pattern pattern) {
return new ValueNotRegexp(measurement, pattern);
}
- /**
- * The main idea of this part comes from
- *
https://codereview.stackexchange.com/questions/36861/convert-sql-like-to-regex/36864
- */
- public static String parseLikePatternToRegex(String likePattern) {
- String unescapeValue = unescapeString(likePattern);
- String specialRegexStr = ".^$*+?{}[]|()";
- StringBuilder patternStrBuild = new StringBuilder();
- patternStrBuild.append("^");
- for (int i = 0; i < unescapeValue.length(); i++) {
- String ch = String.valueOf(unescapeValue.charAt(i));
- if (specialRegexStr.contains(ch)) {
- ch = "\\" + unescapeValue.charAt(i);
- }
- if (i == 0
- || !"\\".equals(String.valueOf(unescapeValue.charAt(i - 1)))
- || i >= 2
- && "\\\\"
- .equals(
- patternStrBuild.substring(
- patternStrBuild.length() - 2,
patternStrBuild.length()))) {
- String replaceStr = ch.replace("%", ".*?").replace("_", ".");
- patternStrBuild.append(replaceStr);
- } else {
- patternStrBuild.append(ch);
- }
- }
- patternStrBuild.append("$");
- return patternStrBuild.toString();
- }
-
- /**
- * This Method is for un-escaping strings except '\' before special string
'%', '_', '\', because
- * we need to use '\' to judge whether to replace this to regexp string
- */
- private static String unescapeString(String value) {
- StringBuilder stringBuilder = new StringBuilder();
- int curIndex = 0;
- for (; curIndex < value.length(); curIndex++) {
- String ch = String.valueOf(value.charAt(curIndex));
- if ("\\".equals(ch)) {
- if (curIndex < value.length() - 1) {
- String nextChar = String.valueOf(value.charAt(curIndex + 1));
- if ("%".equals(nextChar) || "_".equals(nextChar) ||
"\\".equals(nextChar)) {
- stringBuilder.append(ch);
- }
- if ("\\".equals(nextChar)) {
- curIndex++;
- }
- }
- } else {
- stringBuilder.append(ch);
- }
- }
- return stringBuilder.toString();
- }
-
- public static Pattern compileRegex(String regex) {
- try {
- return Pattern.compile(regex);
- } catch (PatternSyntaxException e) {
- throw new PatternSyntaxException("Illegal regex expression: ", regex,
e.getIndex());
- }
+ public static <T extends Comparable<T>> ValueIn<T> in(Set<T> values) {
+ return new ValueIn<>(FAKE_MEASUREMENT, values);
}
public static <T extends Comparable<T>> ValueIn<T> in(String measurement,
Set<T> values) {
return new ValueIn<>(measurement, values);
}
+ public static <T extends Comparable<T>> ValueNotIn<T> notIn(Set<T> values) {
+ return new ValueNotIn<>(FAKE_MEASUREMENT, values);
+ }
+
public static <T extends Comparable<T>> ValueNotIn<T> notIn(String
measurement, Set<T> values) {
return new ValueNotIn<>(measurement, values);
}
diff --git
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/And.java
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/And.java
index 4fb536661e9..b1a526f063a 100644
---
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/And.java
+++
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/And.java
@@ -33,6 +33,11 @@ public class And extends BinaryLogicalFilter implements
Filter {
super(left, right);
}
+ @Override
+ public boolean satisfy(long time, Object value) {
+ return left.satisfy(time, value) && right.satisfy(time, value);
+ }
+
@Override
public boolean satisfy(Statistics statistics) {
return left.satisfy(statistics) && right.satisfy(statistics);
@@ -43,11 +48,6 @@ public class And extends BinaryLogicalFilter implements
Filter {
return left.allSatisfy(statistics) && right.allSatisfy(statistics);
}
- @Override
- public boolean satisfy(long time, Object value) {
- return left.satisfy(time, value) && right.satisfy(time, value);
- }
-
@Override
public boolean satisfyStartEndTime(long startTime, long endTime) {
return left.satisfyStartEndTime(startTime, endTime)
diff --git
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/GroupByMonthFilter.java
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/GroupByMonthFilter.java
index 3871664e66b..f3a8955a6c5 100644
---
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/GroupByMonthFilter.java
+++
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/GroupByMonthFilter.java
@@ -217,6 +217,11 @@ public class GroupByMonthFilter extends GroupByFilter
implements IStatefulFilter
@Override
public Filter copy() {
return new GroupByMonthFilter(
- originalInterval, originalSlidingStep, originalStartTime,
originalEndTime, timeZone, currPrecision);
+ originalInterval,
+ originalSlidingStep,
+ originalStartTime,
+ originalEndTime,
+ timeZone,
+ currPrecision);
}
}
diff --git
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Not.java
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Not.java
index 165bf8fb9ab..2d5cce4c07c 100644
---
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Not.java
+++
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Not.java
@@ -33,7 +33,8 @@ public class Not implements Filter {
private final String toString;
public static final String CONTAIN_NOT_ERR_MSG =
- "This predicate contains a not! Did you forget to run this predicate
through PredicateRemoveNotRewriter? ";
+ "This predicate contains a not! "
+ + "Did you forget to run this predicate through
PredicateRemoveNotRewriter? ";
public Not(Filter filter) {
this.filter = Objects.requireNonNull(filter, "filter cannot be null");
@@ -41,18 +42,18 @@ public class Not implements Filter {
}
@Override
- public boolean satisfy(Statistics statistics) {
- throw new UnsupportedOperationException(CONTAIN_NOT_ERR_MSG + this);
+ public boolean satisfy(long time, Object value) {
+ return !filter.satisfy(time, value);
}
@Override
- public boolean allSatisfy(Statistics statistics) {
+ public boolean satisfy(Statistics statistics) {
throw new UnsupportedOperationException(CONTAIN_NOT_ERR_MSG + this);
}
@Override
- public boolean satisfy(long time, Object value) {
- return !filter.satisfy(time, value);
+ public boolean allSatisfy(Statistics statistics) {
+ throw new UnsupportedOperationException(CONTAIN_NOT_ERR_MSG + this);
}
@Override
diff --git
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Or.java
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Or.java
index c2290c1ad29..b678d9459cd 100644
---
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Or.java
+++
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Or.java
@@ -34,6 +34,11 @@ public class Or extends BinaryLogicalFilter implements
Filter {
super(left, right);
}
+ @Override
+ public boolean satisfy(long time, Object value) {
+ return left.satisfy(time, value) || right.satisfy(time, value);
+ }
+
@Override
public boolean satisfy(Statistics statistics) {
return left.satisfy(statistics) || right.satisfy(statistics);
@@ -44,11 +49,6 @@ public class Or extends BinaryLogicalFilter implements
Filter {
return left.allSatisfy(statistics) || right.allSatisfy(statistics);
}
- @Override
- public boolean satisfy(long time, Object value) {
- return left.satisfy(time, value) || right.satisfy(time, value);
- }
-
@Override
public boolean satisfyStartEndTime(long startTime, long endTime) {
return left.satisfyStartEndTime(startTime, endTime)
diff --git
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/ValueFilterOperators.java
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/ValueFilterOperators.java
index 8edf9e47cad..a4e2349882e 100644
---
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/ValueFilterOperators.java
+++
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/ValueFilterOperators.java
@@ -90,6 +90,11 @@ public final class ValueFilterOperators {
super(measurement, constant);
}
+ @Override
+ public boolean satisfy(long time, Object value) {
+ return constant.equals(value);
+ }
+
@Override
public boolean satisfy(Statistics statistics) {
if (statistics.getType() == TSDataType.TEXT || statistics.getType() ==
TSDataType.BOOLEAN) {
@@ -108,11 +113,6 @@ public final class ValueFilterOperators {
&& constant.compareTo((T) statistics.getMaxValue()) == 0;
}
- @Override
- public boolean satisfy(long time, Object value) {
- return constant.equals(value);
- }
-
@Override
public Filter reverse() {
return new ValueNotEq<>(measurement, constant);
@@ -127,6 +127,11 @@ public final class ValueFilterOperators {
super(measurement, constant);
}
+ @Override
+ public boolean satisfy(long time, Object value) {
+ return !constant.equals(value);
+ }
+
@Override
public boolean satisfy(Statistics statistics) {
if (statistics.getType() == TSDataType.TEXT || statistics.getType() ==
TSDataType.BOOLEAN) {
@@ -145,11 +150,6 @@ public final class ValueFilterOperators {
|| constant.compareTo((T) statistics.getMaxValue()) > 0;
}
- @Override
- public boolean satisfy(long time, Object value) {
- return !constant.equals(value);
- }
-
@Override
public Filter reverse() {
return new ValueEq<>(measurement, constant);
@@ -163,6 +163,11 @@ public final class ValueFilterOperators {
super(measurement, Objects.requireNonNull(constant, "constant cannot be
null"));
}
+ @Override
+ public boolean satisfy(long time, Object value) {
+ return constant.compareTo((T) value) > 0;
+ }
+
@Override
public boolean satisfy(Statistics statistics) {
if (statistics.getType() == TSDataType.TEXT || statistics.getType() ==
TSDataType.BOOLEAN) {
@@ -179,11 +184,6 @@ public final class ValueFilterOperators {
return constant.compareTo((T) statistics.getMaxValue()) > 0;
}
- @Override
- public boolean satisfy(long time, Object value) {
- return constant.compareTo((T) value) > 0;
- }
-
@Override
public Filter reverse() {
return new ValueGtEq<>(measurement, constant);
@@ -197,6 +197,11 @@ public final class ValueFilterOperators {
super(measurement, Objects.requireNonNull(constant, "constant cannot be
null"));
}
+ @Override
+ public boolean satisfy(long time, Object value) {
+ return constant.compareTo((T) value) >= 0;
+ }
+
@Override
public boolean satisfy(Statistics statistics) {
if (statistics.getType() == TSDataType.TEXT || statistics.getType() ==
TSDataType.BOOLEAN) {
@@ -213,11 +218,6 @@ public final class ValueFilterOperators {
return constant.compareTo((T) statistics.getMaxValue()) >= 0;
}
- @Override
- public boolean satisfy(long time, Object value) {
- return constant.compareTo((T) value) >= 0;
- }
-
@Override
public Filter reverse() {
return new ValueGt<>(measurement, constant);
@@ -231,6 +231,11 @@ public final class ValueFilterOperators {
super(measurement, Objects.requireNonNull(constant, "constant cannot be
null"));
}
+ @Override
+ public boolean satisfy(long time, Object value) {
+ return constant.compareTo((T) value) < 0;
+ }
+
@Override
public boolean satisfy(Statistics statistics) {
if (statistics.getType() == TSDataType.TEXT || statistics.getType() ==
TSDataType.BOOLEAN) {
@@ -247,11 +252,6 @@ public final class ValueFilterOperators {
return constant.compareTo((T) statistics.getMinValue()) < 0;
}
- @Override
- public boolean satisfy(long time, Object value) {
- return constant.compareTo((T) value) < 0;
- }
-
@Override
public Filter reverse() {
return new ValueLtEq<>(measurement, constant);
@@ -265,6 +265,11 @@ public final class ValueFilterOperators {
super(measurement, Objects.requireNonNull(constant, "constant cannot be
null"));
}
+ @Override
+ public boolean satisfy(long time, Object value) {
+ return constant.compareTo((T) value) <= 0;
+ }
+
@Override
public boolean satisfy(Statistics statistics) {
if (statistics.getType() == TSDataType.TEXT || statistics.getType() ==
TSDataType.BOOLEAN) {
@@ -281,11 +286,6 @@ public final class ValueFilterOperators {
return constant.compareTo((T) statistics.getMinValue()) <= 0;
}
- @Override
- public boolean satisfy(long time, Object value) {
- return constant.compareTo((T) value) <= 0;
- }
-
@Override
public Filter reverse() {
return new ValueLt<>(measurement, constant);
@@ -338,6 +338,11 @@ public final class ValueFilterOperators {
super(measurement, min, max);
}
+ @Override
+ public boolean satisfy(long time, Object value) {
+ return min.compareTo((T) value) <= 0 && max.compareTo((T) value) >= 0;
+ }
+
@Override
public boolean satisfy(Statistics statistics) {
if (statistics.getType() == TSDataType.TEXT || statistics.getType() ==
TSDataType.BOOLEAN) {
@@ -356,11 +361,6 @@ public final class ValueFilterOperators {
&& ((T) statistics.getMaxValue()).compareTo(max) <= 0);
}
- @Override
- public boolean satisfy(long time, Object value) {
- return min.compareTo((T) value) <= 0 && max.compareTo((T) value) >= 0;
- }
-
@Override
public Filter reverse() {
return new ValueNotBetweenAnd<>(measurement, min, max);
@@ -374,6 +374,11 @@ public final class ValueFilterOperators {
super(measurement, min, max);
}
+ @Override
+ public boolean satisfy(long time, Object value) {
+ return min.compareTo((T) value) > 0 || max.compareTo((T) value) < 0;
+ }
+
@Override
public boolean satisfy(Statistics statistics) {
if (statistics.getType() == TSDataType.TEXT || statistics.getType() ==
TSDataType.BOOLEAN) {
@@ -392,11 +397,6 @@ public final class ValueFilterOperators {
|| ((T) statistics.getMaxValue()).compareTo(min) < 0);
}
- @Override
- public boolean satisfy(long time, Object value) {
- return min.compareTo((T) value) > 0 || max.compareTo((T) value) < 0;
- }
-
@Override
public Filter reverse() {
return new ValueBetweenAnd<>(measurement, min, max);
diff --git
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/utils/RegexUtils.java
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/utils/RegexUtils.java
new file mode 100644
index 00000000000..bc646b3a9d5
--- /dev/null
+++
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/utils/RegexUtils.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.tsfile.utils;
+
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
+
+public class RegexUtils {
+
+ private RegexUtils() {
+ // util class
+ }
+
+ /**
+ * The main idea of this part comes from
+ *
https://codereview.stackexchange.com/questions/36861/convert-sql-like-to-regex/36864
+ */
+ public static String parseLikePatternToRegex(String likePattern) {
+ String unescapeValue = unescapeString(likePattern);
+ String specialRegexStr = ".^$*+?{}[]|()";
+ StringBuilder patternStrBuild = new StringBuilder();
+ patternStrBuild.append("^");
+ for (int i = 0; i < unescapeValue.length(); i++) {
+ String ch = String.valueOf(unescapeValue.charAt(i));
+ if (specialRegexStr.contains(ch)) {
+ ch = "\\" + unescapeValue.charAt(i);
+ }
+ if (i == 0
+ || !"\\".equals(String.valueOf(unescapeValue.charAt(i - 1)))
+ || i >= 2
+ && "\\\\"
+ .equals(
+ patternStrBuild.substring(
+ patternStrBuild.length() - 2,
patternStrBuild.length()))) {
+ String replaceStr = ch.replace("%", ".*?").replace("_", ".");
+ patternStrBuild.append(replaceStr);
+ } else {
+ patternStrBuild.append(ch);
+ }
+ }
+ patternStrBuild.append("$");
+ return patternStrBuild.toString();
+ }
+
+ /**
+ * This Method is for un-escaping strings except '\' before special string
'%', '_', '\', because
+ * we need to use '\' to judge whether to replace this to regexp string
+ */
+ private static String unescapeString(String value) {
+ StringBuilder stringBuilder = new StringBuilder();
+ int curIndex = 0;
+ for (; curIndex < value.length(); curIndex++) {
+ String ch = String.valueOf(value.charAt(curIndex));
+ if ("\\".equals(ch)) {
+ if (curIndex < value.length() - 1) {
+ String nextChar = String.valueOf(value.charAt(curIndex + 1));
+ if ("%".equals(nextChar) || "_".equals(nextChar) ||
"\\".equals(nextChar)) {
+ stringBuilder.append(ch);
+ }
+ if ("\\".equals(nextChar)) {
+ curIndex++;
+ }
+ }
+ } else {
+ stringBuilder.append(ch);
+ }
+ }
+ return stringBuilder.toString();
+ }
+
+ public static Pattern compileRegex(String regex) {
+ try {
+ return Pattern.compile(regex);
+ } catch (PatternSyntaxException e) {
+ throw new PatternSyntaxException("Illegal regex expression: ", regex,
e.getIndex());
+ }
+ }
+}