JackieTien97 commented on code in PR #15960:
URL: https://github.com/apache/iotdb/pull/15960#discussion_r2212223532


##########
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/PredicateCombineIntoTableScanChecker.java:
##########
@@ -41,17 +41,23 @@
 
 import static 
org.apache.iotdb.db.queryengine.plan.relational.analyzer.predicate.PredicatePushIntoScanChecker.isLiteral;
 import static 
org.apache.iotdb.db.queryengine.plan.relational.analyzer.predicate.PredicatePushIntoScanChecker.isSymbolReference;
+import static 
org.apache.iotdb.db.queryengine.plan.relational.planner.ir.GlobalTimePredicateExtractVisitor.isExtractTimeColumn;
 
 public class PredicateCombineIntoTableScanChecker extends 
PredicateVisitor<Boolean, Void> {
 
   private final Set<String> measurementColumns;
+  private final String timeColumnName;

Review Comment:
   no need to add this field?, timeColumnName has already been put in 
`measurementColumns`.
   <img width="1426" height="1460" alt="image" 
src="https://github.com/user-attachments/assets/0fdba63e-567a-4b5c-98ae-278abbf63c06";
 />
   maybe you can add some comments about `measurementColumns` and change it 
name from `measurementColumns` to `timeAndFieldsColumnNames`



##########
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/IrTypeAnalyzer.java:
##########
@@ -306,6 +307,11 @@ protected Type 
visitArithmeticUnary(ArithmeticUnaryExpression node, Context cont
       return setExpressionType(node, process(node.getValue(), context));
     }
 
+    @Override
+    protected Type visitExtract(Extract node, Context context) {
+      return setExpressionType(node, INT64);

Review Comment:
   ```suggestion
         process(node.getExpression(), context);
         return setExpressionType(node, INT64);
   ```



##########
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/GlobalTimePredicateExtractVisitor.java:
##########
@@ -269,9 +271,18 @@ public static boolean isTimeColumn(Expression e, String 
timeColumnName) {
         && ((SymbolReference) e).getName().equalsIgnoreCase(timeColumnName);
   }
 
+  public static boolean isExtractTimeColumn(Expression e, String 
timeColumnName) {
+    return e instanceof Extract
+        && ((SymbolReference) ((Extract) e).getExpression())

Review Comment:
   what if express of Extract is a constant, like `where EXTRACT(HOUR FROM 
2025/07/08 01:18:51.123) =1`



##########
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/ExpressionAnalyzer.java:
##########
@@ -1555,6 +1557,22 @@ protected Type visitParameter(Parameter node, 
StackableAstVisitorContext<Context
       return setExpressionType(node, resultType);
     }
 
+    @Override
+    protected Type visitExtract(Extract node, 
StackableAstVisitorContext<Context> context) {
+      if (node.getExpression() instanceof LongLiteral) {
+        // Don't visit child here to avoid setting its Type to INT32
+        setExpressionType(node.getExpression(), INT64);

Review Comment:
   duplicated with the last return statement?



##########
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/PredicateCombineIntoTableScanChecker.java:
##########
@@ -115,14 +121,19 @@ protected Boolean 
visitLogicalExpression(LogicalExpression node, Void context) {
   @Override
   protected Boolean visitComparisonExpression(ComparisonExpression node, Void 
context) {
     return (isMeasurementColumn(node.getLeft()) && isLiteral(node.getRight()))
-        || (isMeasurementColumn(node.getRight()) && isLiteral(node.getLeft()));
+        || (isMeasurementColumn(node.getRight()) && isLiteral(node.getLeft()))
+        || (isExtractTimeColumn(node.getLeft(), timeColumnName) && 
isLiteral(node.getRight()))

Review Comment:
   even if extract from a field, we should also push it down into tableScan



##########
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushPredicateIntoTableScan.java:
##########
@@ -530,7 +531,7 @@ private SplitExpression splitPredicate(DeviceTableScanNode 
node, Expression pred
           if (PredicatePushIntoMetadataChecker.check(idOrAttributeColumnNames, 
expression)) {
             metadataExpressions.add(expression);
           } else if (PredicateCombineIntoTableScanChecker.check(
-              measurementColumnNames, expression)) {
+              measurementColumnNames, timeColumnName, expression)) {

Review Comment:
   ```suggestion
                 measurementColumnNames, expression)) {
   ```



##########
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushPredicateIntoTableScan.java:
##########
@@ -543,7 +544,8 @@ private SplitExpression splitPredicate(DeviceTableScanNode 
node, Expression pred
 
       if (PredicatePushIntoMetadataChecker.check(idOrAttributeColumnNames, 
predicate)) {
         metadataExpressions.add(predicate);
-      } else if 
(PredicateCombineIntoTableScanChecker.check(measurementColumnNames, predicate)) 
{
+      } else if (PredicateCombineIntoTableScanChecker.check(
+          measurementColumnNames, timeColumnName, predicate)) {

Review Comment:
   ```suggestion
             measurementColumnNames, predicate)) {
   ```



##########
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/GlobalTimePredicateExtractVisitor.java:
##########
@@ -269,9 +271,18 @@ public static boolean isTimeColumn(Expression e, String 
timeColumnName) {
         && ((SymbolReference) e).getName().equalsIgnoreCase(timeColumnName);
   }
 
+  public static boolean isExtractTimeColumn(Expression e, String 
timeColumnName) {
+    return e instanceof Extract
+        && ((SymbolReference) ((Extract) e).getExpression())

Review Comment:
   have a try using `IrExpressionInterpreter` to do the constant fold



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to