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 47689551c50 Support the pushdown of between predicate to schema region
47689551c50 is described below

commit 47689551c5044a8e67e6c2529826077e53377a77
Author: Caideyipi <[email protected]>
AuthorDate: Mon Sep 9 14:22:00 2024 +0800

    Support the pushdown of between predicate to schema region
---
 .../iotdb/relational/it/schema/IoTDBDeviceIT.java  |  5 +-
 .../PredicatePushIntoMetadataChecker.java          | 11 +++-
 .../schema/CheckSchemaPredicateVisitor.java        |  6 +-
 .../ConvertSchemaPredicateToFilterVisitor.java     | 23 +++++--
 .../schema/ExtractPredicateColumnNameVisitor.java  | 27 +++++----
 .../plan/relational/metadata/Metadata.java         | 35 ++++++-----
 .../metadata/fetcher/SchemaPredicateUtil.java      | 70 +++++++++++++---------
 .../metric/SchemaRegionCachedMetric.java           |  2 +-
 .../rescon/MemSchemaRegionStatistics.java          | 31 +++++-----
 .../schemaregion/impl/SchemaRegionPBTreeImpl.java  |  2 +-
 .../plan/relational/analyzer/AnalyzerTest.java     | 15 +++++
 11 files changed, 144 insertions(+), 83 deletions(-)

diff --git 
a/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBDeviceIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBDeviceIT.java
index 63cb87ff350..c4f8bcafb29 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBDeviceIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBDeviceIT.java
@@ -89,7 +89,8 @@ public class IoTDBDeviceIT {
       // Test show / count with where expression
       // Test AND
       TestUtils.assertResultSetEqual(
-          statement.executeQuery("show devices from table0 where region_id = 
'1' and model = 'A'"),
+          statement.executeQuery(
+              "show devices from table0 where region_id between '0' and '2' 
and model = 'A'"),
           "region_id,plant_id,device_id,model,",
           Collections.singleton("1,5,3,A,"));
       // Test OR
@@ -114,7 +115,7 @@ public class IoTDBDeviceIT {
           Collections.singleton("1,"));
       TestUtils.assertResultSetEqual(
           statement.executeQuery(
-              "count devices from table0 where substring(region_id, 
cast((cast(plant_id as int32) - 4) as int32 ) , 1) < plant_id"),
+              "count devices from table0 where substring(region_id, 
cast((cast(plant_id as int32) - 4) as int32), 1) < plant_id"),
           "count(devices),",
           Collections.singleton("1,"));
       // Test get from cache
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/PredicatePushIntoMetadataChecker.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/PredicatePushIntoMetadataChecker.java
index c01ba634bfd..b4dd31d74fc 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/PredicatePushIntoMetadataChecker.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/PredicatePushIntoMetadataChecker.java
@@ -106,8 +106,11 @@ public class PredicatePushIntoMetadataChecker extends 
PredicateVisitor<Boolean,
 
   @Override
   protected Boolean visitComparisonExpression(final ComparisonExpression node, 
final Void context) {
-    return (isIdOrAttributeColumn(node.getLeft()) || 
isStringLiteral(node.getLeft()))
-        && (isIdOrAttributeColumn(node.getRight()) || 
isStringLiteral(node.getRight()));
+    return isIdOrAttributeOrLiteral(node.getLeft()) && 
isIdOrAttributeOrLiteral(node.getRight());
+  }
+
+  private boolean isIdOrAttributeOrLiteral(final Expression expression) {
+    return isIdOrAttributeColumn(expression) || isStringLiteral(expression);
   }
 
   private boolean isIdOrAttributeColumn(final Expression expression) {
@@ -138,7 +141,9 @@ public class PredicatePushIntoMetadataChecker extends 
PredicateVisitor<Boolean,
 
   @Override
   protected Boolean visitBetweenPredicate(final BetweenPredicate node, final 
Void context) {
-    return Boolean.FALSE;
+    return isIdOrAttributeOrLiteral(node.getValue())
+        && isIdOrAttributeOrLiteral(node.getMin())
+        && isIdOrAttributeOrLiteral(node.getMax());
   }
 
   public static boolean isStringLiteral(final Expression expression) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/schema/CheckSchemaPredicateVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/schema/CheckSchemaPredicateVisitor.java
index 154facb7b43..8efdfd028e5 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/schema/CheckSchemaPredicateVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/schema/CheckSchemaPredicateVisitor.java
@@ -38,6 +38,7 @@ import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.NotExpression;
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.NullIfExpression;
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.SearchedCaseExpression;
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.SimpleCaseExpression;
+import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.SymbolReference;
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.TableExpressionType;
 
 import org.slf4j.Logger;
@@ -136,7 +137,10 @@ public class CheckSchemaPredicateVisitor
 
   @Override
   protected Boolean visitBetweenPredicate(final BetweenPredicate node, final 
Context context) {
-    return visitExpression(node, context);
+    return node.getValue() instanceof SymbolReference
+            && (node.getMin() instanceof SymbolReference
+                || node.getMax() instanceof SymbolReference)
+        || processColumn(node, context);
   }
 
   private boolean processColumn(final Expression node, final Context context) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/schema/ConvertSchemaPredicateToFilterVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/schema/ConvertSchemaPredicateToFilterVisitor.java
index ef275ed9921..6130f507215 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/schema/ConvertSchemaPredicateToFilterVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/schema/ConvertSchemaPredicateToFilterVisitor.java
@@ -126,38 +126,49 @@ public class ConvertSchemaPredicateToFilterVisitor
       final ComparisonExpression node, final Context context) {
     final String columnName;
     final String value;
+    final boolean isOrdered;
     if (node.getLeft() instanceof Literal) {
       value = ((StringLiteral) (node.getLeft())).getValue();
       checkArgument(isSymbolReference(node.getRight()));
       columnName = ((SymbolReference) (node.getRight())).getName();
+      isOrdered = false;
     } else {
       value = ((StringLiteral) (node.getRight())).getValue();
       checkArgument(isSymbolReference(node.getLeft()));
       columnName = ((SymbolReference) (node.getLeft())).getName();
+      isOrdered = true;
     }
 
     return wrapIdOrAttributeFilter(
         node.getOperator() == ComparisonExpression.Operator.EQUAL
             ? new PreciseFilter(value)
             : new ComparisonFilter(
-                convertExpressionOperator2SchemaOperator(node.getOperator()), 
value),
+                convertExpressionOperator2SchemaOperator(node.getOperator(), 
isOrdered), value),
         columnName,
         context);
   }
 
   private ComparisonFilter.Operator convertExpressionOperator2SchemaOperator(
-      final ComparisonExpression.Operator operator) {
+      final ComparisonExpression.Operator operator, final boolean isOrdered) {
     switch (operator) {
       case NOT_EQUAL:
         return ComparisonFilter.Operator.NOT_EQUAL;
       case LESS_THAN:
-        return ComparisonFilter.Operator.LESS_THAN;
+        return isOrdered
+            ? ComparisonFilter.Operator.LESS_THAN
+            : ComparisonFilter.Operator.GREATER_THAN;
       case LESS_THAN_OR_EQUAL:
-        return ComparisonFilter.Operator.LESS_THAN_OR_EQUAL;
+        return isOrdered
+            ? ComparisonFilter.Operator.LESS_THAN_OR_EQUAL
+            : ComparisonFilter.Operator.GREATER_THAN_OR_EQUAL;
       case GREATER_THAN:
-        return ComparisonFilter.Operator.GREATER_THAN;
+        return isOrdered
+            ? ComparisonFilter.Operator.GREATER_THAN
+            : ComparisonFilter.Operator.LESS_THAN;
       case GREATER_THAN_OR_EQUAL:
-        return ComparisonFilter.Operator.GREATER_THAN_OR_EQUAL;
+        return isOrdered
+            ? ComparisonFilter.Operator.GREATER_THAN_OR_EQUAL
+            : ComparisonFilter.Operator.LESS_THAN_OR_EQUAL;
       default:
         throw new UnsupportedOperationException("Unsupported operator " + 
operator);
     }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/schema/ExtractPredicateColumnNameVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/schema/ExtractPredicateColumnNameVisitor.java
index 004f4166340..92cb4d6408d 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/schema/ExtractPredicateColumnNameVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/schema/ExtractPredicateColumnNameVisitor.java
@@ -77,13 +77,23 @@ public class ExtractPredicateColumnNameVisitor extends 
PredicateVisitor<String,
 
   @Override
   protected String visitComparisonExpression(final ComparisonExpression node, 
final Void context) {
-    final String columnName;
-    if (node.getLeft() instanceof Literal) {
-      columnName = node.getRight().accept(this, context);
-    } else {
-      columnName = node.getLeft().accept(this, context);
+    return node.getLeft() instanceof Literal
+        ? node.getRight().accept(this, context)
+        : node.getLeft().accept(this, context);
+  }
+
+  @Override
+  protected String visitBetweenPredicate(final BetweenPredicate node, final 
Void context) {
+    if (node.getValue() instanceof SymbolReference) {
+      return node.getValue().accept(this, context);
+    }
+    if (node.getMin() instanceof SymbolReference) {
+      return node.getMin().accept(this, context);
+    }
+    if (node.getMax() instanceof SymbolReference) {
+      return node.getMax().accept(this, context);
     }
-    return columnName;
+    return null;
   }
 
   @Override
@@ -112,11 +122,6 @@ public class ExtractPredicateColumnNameVisitor extends 
PredicateVisitor<String,
     return null;
   }
 
-  @Override
-  protected String visitBetweenPredicate(final BetweenPredicate node, final 
Void context) {
-    return null;
-  }
-
   private static class ExtractPredicateColumnVisitorContainer {
     private static final ExtractPredicateColumnNameVisitor instance =
         new ExtractPredicateColumnNameVisitor();
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/Metadata.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/Metadata.java
index cda9925825f..01fd54e206b 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/Metadata.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/Metadata.java
@@ -40,7 +40,7 @@ import java.util.Optional;
 
 public interface Metadata {
 
-  boolean tableExists(QualifiedObjectName name);
+  boolean tableExists(final QualifiedObjectName name);
 
   /**
    * Return table schema definition for the specified table handle. Table 
schema definition is a set
@@ -48,19 +48,20 @@ public interface Metadata {
    *
    * @throws RuntimeException if table handle is no longer valid
    */
-  Optional<TableSchema> getTableSchema(SessionInfo session, 
QualifiedObjectName name);
+  Optional<TableSchema> getTableSchema(final SessionInfo session, final 
QualifiedObjectName name);
 
-  Type getOperatorReturnType(OperatorType operatorType, List<? extends Type> 
argumentTypes)
+  Type getOperatorReturnType(
+      final OperatorType operatorType, final List<? extends Type> 
argumentTypes)
       throws OperatorNotFoundException;
 
-  Type getFunctionReturnType(String functionName, List<? extends Type> 
argumentTypes);
+  Type getFunctionReturnType(final String functionName, final List<? extends 
Type> argumentTypes);
 
   boolean isAggregationFunction(
-      SessionInfo session, String functionName, AccessControl accessControl);
+      final SessionInfo session, final String functionName, final 
AccessControl accessControl);
 
-  Type getType(TypeSignature signature) throws TypeNotFoundException;
+  Type getType(final TypeSignature signature) throws TypeNotFoundException;
 
-  boolean canCoerce(Type from, Type to);
+  boolean canCoerce(final Type from, final Type to);
 
   IPartitionFetcher getPartitionFetcher();
 
@@ -103,7 +104,10 @@ public interface Metadata {
    *     are not STRING or Category, Type of any missing ColumnSchema is null
    */
   Optional<TableSchema> validateTableHeaderSchema(
-      String database, TableSchema tableSchema, MPPQueryContext context, 
boolean allowCreateTable);
+      final String database,
+      final TableSchema tableSchema,
+      final MPPQueryContext context,
+      final boolean allowCreateTable);
 
   /**
    * This method is used for table device validation and should be invoked 
after column validation.
@@ -115,7 +119,8 @@ public interface Metadata {
    *
    * <p>If validation failed, a SemanticException will be thrown.
    */
-  void validateDeviceSchema(ITableDeviceSchemaValidation schemaValidation, 
MPPQueryContext context);
+  void validateDeviceSchema(
+      final ITableDeviceSchemaValidation schemaValidation, final 
MPPQueryContext context);
 
   /**
    * Get or create data partition, used in cluster write scenarios. if 
enableAutoCreateSchema is
@@ -125,7 +130,7 @@ public interface Metadata {
    * @param userName
    */
   default DataPartition getOrCreateDataPartition(
-      List<DataPartitionQueryParam> dataPartitionQueryParams, String userName) 
{
+      final List<DataPartitionQueryParam> dataPartitionQueryParams, final 
String userName) {
     throw new UnsupportedOperationException();
   }
 
@@ -139,7 +144,7 @@ public interface Metadata {
    * <p>The device id shall be [table, seg1, ....]
    */
   SchemaPartition getOrCreateSchemaPartition(
-      String database, List<IDeviceID> deviceIDList, String userName);
+      final String database, final List<IDeviceID> deviceIDList, final String 
userName);
 
   /**
    * For data query with completed id.
@@ -148,7 +153,7 @@ public interface Metadata {
    *
    * <p>The device id shall be [table, seg1, ....]
    */
-  SchemaPartition getSchemaPartition(String database, List<IDeviceID> 
deviceIDList);
+  SchemaPartition getSchemaPartition(final String database, final 
List<IDeviceID> deviceIDList);
 
   /**
    * For data query with partial device id conditions.
@@ -157,7 +162,7 @@ public interface Metadata {
    *
    * <p>The device id shall be [table, seg1, ....]
    */
-  SchemaPartition getSchemaPartition(String database);
+  SchemaPartition getSchemaPartition(final String database);
 
   // ======================== Table Model Data Partition Interface 
========================
   /**
@@ -167,7 +172,7 @@ public interface Metadata {
    * @param sgNameToQueryParamsMap database name -> the list of 
DataPartitionQueryParams
    */
   DataPartition getDataPartition(
-      String database, List<DataPartitionQueryParam> sgNameToQueryParamsMap);
+      final String database, final List<DataPartitionQueryParam> 
sgNameToQueryParamsMap);
 
   /**
    * Get data partition, used in query scenarios which contains time filter 
like: time < XX or time
@@ -177,5 +182,5 @@ public interface Metadata {
    * @return sgNameToQueryParamsMap database name -> the list of 
DataPartitionQueryParams
    */
   DataPartition getDataPartitionWithUnclosedTimeRange(
-      String database, List<DataPartitionQueryParam> sgNameToQueryParamsMap);
+      final String database, final List<DataPartitionQueryParam> 
sgNameToQueryParamsMap);
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/SchemaPredicateUtil.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/SchemaPredicateUtil.java
index b470a2465b1..06f6c3af5cf 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/SchemaPredicateUtil.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/SchemaPredicateUtil.java
@@ -31,11 +31,10 @@ import 
org.apache.iotdb.db.queryengine.common.MPPQueryContext;
 import 
org.apache.iotdb.db.queryengine.plan.relational.analyzer.predicate.schema.CheckSchemaPredicateVisitor;
 import 
org.apache.iotdb.db.queryengine.plan.relational.analyzer.predicate.schema.ConvertSchemaPredicateToFilterVisitor;
 import org.apache.iotdb.db.queryengine.plan.relational.planner.ir.IrUtils;
+import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.BetweenPredicate;
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ComparisonExpression;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Expression;
-import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Literal;
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.LogicalExpression;
-import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.SymbolReference;
 
 import org.apache.tsfile.utils.Pair;
 
@@ -44,6 +43,7 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 public class SchemaPredicateUtil {
@@ -63,18 +63,52 @@ public class SchemaPredicateUtil {
     final CheckSchemaPredicateVisitor.Context context =
         new CheckSchemaPredicateVisitor.Context(table, queryContext, 
isDirectDeviceQuery);
     for (final Expression expression : expressionList) {
-      if (expression == null) {
+      if (Objects.isNull(expression)) {
         continue;
       }
-      if (Boolean.TRUE.equals(expression.accept(visitor, context))) {
-        idFuzzyList.add(expression);
-      } else {
-        idDeterminedList.add(expression);
+      if (expression instanceof BetweenPredicate) {
+        final BetweenPredicate predicate = (BetweenPredicate) expression;
+
+        // Separate the between predicate to simply the logic and to handle 
cases like
+        // '2' between id1 and attr2 / id1 between '2' and attr1
+        separateExpression(
+            new ComparisonExpression(
+                ComparisonExpression.Operator.LESS_THAN_OR_EQUAL,
+                predicate.getMin(),
+                predicate.getValue()),
+            idDeterminedList,
+            idFuzzyList,
+            visitor,
+            context);
+        separateExpression(
+            new ComparisonExpression(
+                ComparisonExpression.Operator.LESS_THAN_OR_EQUAL,
+                predicate.getValue(),
+                predicate.getMax()),
+            idDeterminedList,
+            idFuzzyList,
+            visitor,
+            context);
+        continue;
       }
+      separateExpression(expression, idDeterminedList, idFuzzyList, visitor, 
context);
     }
     return new Pair<>(idDeterminedList, idFuzzyList);
   }
 
+  private static void separateExpression(
+      final Expression expression,
+      final List<Expression> idDeterminedList,
+      final List<Expression> idFuzzyList,
+      final CheckSchemaPredicateVisitor visitor,
+      final CheckSchemaPredicateVisitor.Context context) {
+    if (Boolean.TRUE.equals(expression.accept(visitor, context))) {
+      idFuzzyList.add(expression);
+    } else {
+      idDeterminedList.add(expression);
+    }
+  }
+
   // input and-concat filter list
   // return or concat filter list, inner which all filter is and concat
   // e.g. (a OR b) AND (c OR d) -> (a AND c) OR (a AND d) OR (b AND c) OR (b 
AND d)
@@ -91,10 +125,7 @@ public class SchemaPredicateUtil {
             .map(IrUtils::extractOrPredicatesWithInExpanded)
             .collect(Collectors.toList());
     final int orSize = orConcatList.size();
-    int remainingCaseNum = 1;
-    for (final List<Expression> filterList : orConcatList) {
-      remainingCaseNum *= filterList.size();
-    }
+    int remainingCaseNum = orConcatList.stream().map(List::size).reduce(1, (a, 
b) -> a * b);
     final List<Map<Integer, List<SchemaFilter>>> result = new ArrayList<>();
     final int[] indexes = new int[orSize]; // index count, each case 
represents one possible result
     boolean hasConflictFilter;
@@ -182,23 +213,6 @@ public class SchemaPredicateUtil {
     return true;
   }
 
-  public static String getColumnName(Expression expression) {
-    ComparisonExpression node = (ComparisonExpression) expression;
-    String columnName;
-    if (node.getLeft() instanceof Literal) {
-      if (!(node.getRight() instanceof SymbolReference)) {
-        throw new IllegalStateException("Can only be SymbolReference, now is " 
+ node.getRight());
-      }
-      columnName = ((SymbolReference) (node.getRight())).getName();
-    } else {
-      if (!(node.getLeft() instanceof SymbolReference)) {
-        throw new IllegalStateException("Can only be SymbolReference, now is " 
+ node.getLeft());
-      }
-      columnName = ((SymbolReference) (node.getLeft())).getName();
-    }
-    return columnName;
-  }
-
   static List<Integer> extractIdSingleMatchExpressionCases(
       final List<Map<Integer, List<SchemaFilter>>> index2FilterMapList,
       final TsTable tableInstance) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/metric/SchemaRegionCachedMetric.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/metric/SchemaRegionCachedMetric.java
index 92024799aa7..91ed7a54eec 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/metric/SchemaRegionCachedMetric.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/metric/SchemaRegionCachedMetric.java
@@ -151,7 +151,7 @@ public class SchemaRegionCachedMetric implements 
ISchemaRegionMetric {
         Metric.SCHEMA_REGION.toString(),
         MetricLevel.IMPORTANT,
         regionStatistics,
-        CachedSchemaRegionStatistics::getMlogLength,
+        CachedSchemaRegionStatistics::getMLogLength,
         Tag.NAME.toString(),
         MLOG_LENGTH,
         Tag.REGION.toString(),
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/rescon/MemSchemaRegionStatistics.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/rescon/MemSchemaRegionStatistics.java
index be960b3807b..eaec23ebcdc 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/rescon/MemSchemaRegionStatistics.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/rescon/MemSchemaRegionStatistics.java
@@ -38,9 +38,10 @@ public class MemSchemaRegionStatistics implements 
ISchemaRegionStatistics {
   private final AtomicLong viewNumber = new AtomicLong(0);
   private final Map<Integer, Integer> templateUsage = new 
ConcurrentHashMap<>();
 
-  private long mlogLength = 0;
+  private long mLogLength = 0;
 
-  public MemSchemaRegionStatistics(int schemaRegionId, ISchemaEngineStatistics 
engineStatistics) {
+  public MemSchemaRegionStatistics(
+      final int schemaRegionId, final ISchemaEngineStatistics 
engineStatistics) {
     this.schemaEngineStatistics = 
engineStatistics.getAsMemSchemaEngineStatistics();
     this.schemaRegionId = schemaRegionId;
   }
@@ -50,18 +51,18 @@ public class MemSchemaRegionStatistics implements 
ISchemaRegionStatistics {
     return schemaEngineStatistics.isAllowToCreateNewSeries();
   }
 
-  public void requestMemory(long size) {
+  public void requestMemory(final long size) {
     memoryUsage.addAndGet(size);
     schemaEngineStatistics.requestMemory(size);
   }
 
-  public void releaseMemory(long size) {
+  public void releaseMemory(final long size) {
     memoryUsage.addAndGet(-size);
     schemaEngineStatistics.releaseMemory(size);
   }
 
   @Override
-  public long getSeriesNumber(boolean includeView) {
+  public long getSeriesNumber(final boolean includeView) {
     if (includeView) {
       return viewNumber.get() + measurementNumber.get() + 
getTemplateSeriesNumber();
     } else {
@@ -69,7 +70,7 @@ public class MemSchemaRegionStatistics implements 
ISchemaRegionStatistics {
     }
   }
 
-  public void addMeasurement(long addedNum) {
+  public void addMeasurement(final long addedNum) {
     measurementNumber.addAndGet(addedNum);
     schemaEngineStatistics.addMeasurement(addedNum);
   }
@@ -79,12 +80,12 @@ public class MemSchemaRegionStatistics implements 
ISchemaRegionStatistics {
     schemaEngineStatistics.deleteMeasurement(deletedNum);
   }
 
-  public void addView(long addedNum) {
+  public void addView(final long addedNum) {
     viewNumber.addAndGet(addedNum);
     schemaEngineStatistics.addView(addedNum);
   }
 
-  public void deleteView(long deletedNum) {
+  public void deleteView(final long deletedNum) {
     viewNumber.addAndGet(-deletedNum);
     schemaEngineStatistics.deleteView(deletedNum);
   }
@@ -111,7 +112,7 @@ public class MemSchemaRegionStatistics implements 
ISchemaRegionStatistics {
 
   @Override
   public long getTemplateSeriesNumber() {
-    ClusterTemplateManager clusterTemplateManager = 
ClusterTemplateManager.getInstance();
+    final ClusterTemplateManager clusterTemplateManager = 
ClusterTemplateManager.getInstance();
     return templateUsage.entrySet().stream()
         .mapToLong(
             i -> {
@@ -121,12 +122,12 @@ public class MemSchemaRegionStatistics implements 
ISchemaRegionStatistics {
         .sum();
   }
 
-  public void activateTemplate(int templateId) {
+  public void activateTemplate(final int templateId) {
     templateUsage.compute(templateId, (k, v) -> (v == null) ? 1 : v + 1);
     schemaEngineStatistics.activateTemplate(templateId);
   }
 
-  public void deactivateTemplate(int templateId) {
+  public void deactivateTemplate(final int templateId) {
     templateUsage.compute(templateId, (k, v) -> (v == null || v == 1) ? null : 
v - 1);
     schemaEngineStatistics.deactivateTemplate(templateId, 1);
   }
@@ -141,12 +142,12 @@ public class MemSchemaRegionStatistics implements 
ISchemaRegionStatistics {
     return schemaRegionId;
   }
 
-  public void setMlogLength(long mlogLength) {
-    this.mlogLength = mlogLength;
+  public void setMLogLength(final long mLogLength) {
+    this.mLogLength = mLogLength;
   }
 
-  public long getMlogLength() {
-    return mlogLength;
+  public long getMLogLength() {
+    return mLogLength;
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionPBTreeImpl.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionPBTreeImpl.java
index 12fcadc3ccc..cce4f0384be 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionPBTreeImpl.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionPBTreeImpl.java
@@ -330,7 +330,7 @@ public class SchemaRegionPBTreeImpl implements 
ISchemaRegion {
   public void writeToMLog(ISchemaRegionPlan schemaRegionPlan) throws 
IOException {
     if (usingMLog && !isRecovering) {
       logWriter.write(schemaRegionPlan);
-      regionStatistics.setMlogLength(logWriter.position());
+      regionStatistics.setMLogLength(logWriter.position());
     }
   }
 
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java
index 365628f7063..433ebe797a4 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java
@@ -672,6 +672,21 @@ public class AnalyzerTest {
     tableScanNode = (TableScanNode) rootNode.getChildren().get(0);
     assertNull(tableScanNode.getPushDownPredicate());
     assertFalse(tableScanNode.getTimePredicate().isPresent());
+
+    // 7. Between
+    sql = "SELECT * FROM table1 WHERE tag1 Between attr1 and '2'";
+    context = new MPPQueryContext(sql, queryId, sessionInfo, null, null);
+    analysis = analyzeSQL(sql, metadata, context);
+    logicalQueryPlan =
+        new TableLogicalPlanner(context, metadata, sessionInfo, 
WarningCollector.NOOP)
+            .plan(analysis);
+    rootNode = logicalQueryPlan.getRootNode();
+
+    assertFalse(rootNode.getChildren().get(0) instanceof FilterNode);
+    assertTrue(rootNode.getChildren().get(0) instanceof TableScanNode);
+    tableScanNode = (TableScanNode) rootNode.getChildren().get(0);
+    assertNull(tableScanNode.getPushDownPredicate());
+    assertFalse(tableScanNode.getTimePredicate().isPresent());
   }
 
   @Test

Reply via email to