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());
+    }
+  }
+}


Reply via email to