You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by GitBox <gi...@apache.org> on 2022/06/22 11:30:43 UTC

[GitHub] [doris] Kikyou1997 opened a new pull request, #10343: [feature](nereids)Convert the expression from nereids to stale expr.

Kikyou1997 opened a new pull request, #10343:
URL: https://github.com/apache/doris/pull/10343

   # Proposed changes
   
    Add ExpressionConverter.java to convert the expression from nereids to stale expression.
   
   ## Problem Summary:
   
   We need the stale expr when build fragment to execute query, so add this class to do this job.
   
   ## Checklist(Required)
   
   1. Does it affect the original behavior: (No)
   2. Has unit tests been added: (No/)
   3. Has document been added or modified: (No)
   4. Does it need to update dependencies: (No)
   5. Are there any changes that cannot be rolled back: (No)
   
   ## Further comments
   
   If this is a relatively large or complex change, kick off the discussion at [dev@doris.apache.org](mailto:dev@doris.apache.org) by explaining why you chose the solution you did and what alternatives you considered, etc...
   


-- 
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: commits-unsubscribe@doris.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org


[GitHub] [doris] github-actions[bot] commented on pull request #10343: [feature](nereids)Convert the expression from nereids to stale expr.

Posted by GitBox <gi...@apache.org>.
github-actions[bot] commented on PR #10343:
URL: https://github.com/apache/doris/pull/10343#issuecomment-1166168780

   PR approved by at least one committer and no changes requested.


-- 
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: commits-unsubscribe@doris.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org


[GitHub] [doris] github-actions[bot] commented on pull request #10343: [feature](nereids)Convert the expression from nereids to stale expr.

Posted by GitBox <gi...@apache.org>.
github-actions[bot] commented on PR #10343:
URL: https://github.com/apache/doris/pull/10343#issuecomment-1165303983

   PR approved by at least one committer and no changes requested.


-- 
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: commits-unsubscribe@doris.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org


[GitHub] [doris] morrySnow commented on a diff in pull request #10343: [feature](nereids)Convert the expression from nereids to stale expr.

Posted by GitBox <gi...@apache.org>.
morrySnow commented on code in PR #10343:
URL: https://github.com/apache/doris/pull/10343#discussion_r903658087


##########
fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PhysicalPlanTranslator.java:
##########
@@ -63,7 +64,6 @@
 /**
  * Used to translate to physical plan generated by new optimizer to the plan fragments.
  */
-@SuppressWarnings("rawtypes")
 public class PhysicalPlanTranslator extends PlanOperatorVisitor<PlanFragment, PlanContext> {

Review Comment:
   we need to call PlanNode#convertToVectoriezd at the end of translate



-- 
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: commits-unsubscribe@doris.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org


[GitHub] [doris] morningman merged pull request #10343: [feature](nereids)Convert the expression from nereids to stale expr.

Posted by GitBox <gi...@apache.org>.
morningman merged PR #10343:
URL: https://github.com/apache/doris/pull/10343


-- 
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: commits-unsubscribe@doris.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org


[GitHub] [doris] morrySnow commented on a diff in pull request #10343: [feature](nereids)Convert the expression from nereids to stale expr.

Posted by GitBox <gi...@apache.org>.
morrySnow commented on code in PR #10343:
URL: https://github.com/apache/doris/pull/10343#discussion_r903649207


##########
fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanContext.java:
##########
@@ -70,4 +79,12 @@ public void addPlanFragment(PlanFragment planFragment) {
         this.planFragmentList.add(planFragment);
     }
 
+    public void addExprMapping(Expression expression, Expr expr) {

Review Comment:
   just use for SlotRef? or intent to use for other expr?



##########
fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanContext.java:
##########
@@ -37,6 +41,11 @@ public class PlanContext {
 
     private DescriptorTable descTable = new DescriptorTable();
 
+    /**
+     * Map expressions of new optimizer to the stale expr.
+     */
+    private Map<Expression, Expr> expressionToExecExpr = new HashMap<>();

Review Comment:
   maybe we need to rename this class to `PlanTranslatorContext` or something related to plan translator



##########
fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ExpressionConverter.java:
##########
@@ -17,18 +17,169 @@
 
 package org.apache.doris.nereids.trees.expressions;
 
+import org.apache.doris.analysis.ArithmeticExpr;
+import org.apache.doris.analysis.BinaryPredicate;
+import org.apache.doris.analysis.BinaryPredicate.Operator;
+import org.apache.doris.analysis.BoolLiteral;
 import org.apache.doris.analysis.Expr;
+import org.apache.doris.analysis.FloatLiteral;
+import org.apache.doris.analysis.FunctionCallExpr;
+import org.apache.doris.analysis.IntLiteral;
+import org.apache.doris.analysis.NullLiteral;
+import org.apache.doris.analysis.StringLiteral;
+import org.apache.doris.catalog.Type;
+import org.apache.doris.nereids.trees.NodeType;
+import org.apache.doris.nereids.trees.plans.PlanContext;
+import org.apache.doris.nereids.types.BooleanType;
+import org.apache.doris.nereids.types.DataType;
+import org.apache.doris.nereids.types.DoubleType;
+import org.apache.doris.nereids.types.IntegerType;
+import org.apache.doris.nereids.types.NullType;
+import org.apache.doris.nereids.types.StringType;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * Used to convert expression of new optimizer to stale expr.
  */
-public class ExpressionConverter {
+@SuppressWarnings("rawtypes")
+public class ExpressionConverter extends ExpressionVisitor<Expr, PlanContext> {
 
     public static ExpressionConverter converter = new ExpressionConverter();
 
-    // TODO: implement this, besides if expression is a slot, should set the slotId to
-    //       converted the org.apache.doris.analysis.Expr
-    public Expr convert(Expression expression) {
-        return null;
+    public static Expr convert(Expression expression, PlanContext planContext) {
+        return converter.visit(expression, planContext);
+    }
+
+    @Override
+    public Expr visit(Expression expr, PlanContext context) {
+        return expr.accept(this, context);
+    }
+
+    @Override
+    public Expr visitSlotReference(SlotReference slotReference, PlanContext context) {
+        return context.findExpr(slotReference);
+    }
+
+    @Override
+    public Expr visitEqualTo(EqualTo equalTo, PlanContext context) {
+        return new BinaryPredicate(Operator.EQ,
+                visit(equalTo.child(0), context),
+                visit(equalTo.child(1), context));
+    }
+
+    @Override
+    public Expr visitGreaterThan(GreaterThan greaterThan, PlanContext context) {
+        return new BinaryPredicate(Operator.GT,
+                visit(greaterThan.child(0), context),
+                visit(greaterThan.child(1), context));
+    }
+
+    @Override
+    public Expr visitGreaterThanEqual(GreaterThanEqual greaterThanEqual, PlanContext context) {
+        return new BinaryPredicate(Operator.GE,
+                visit(greaterThanEqual.child(0), context),
+                visit(greaterThanEqual.child(1), context));
+    }
+
+    @Override
+    public Expr visitLessThan(LessThan lessThan, PlanContext context) {
+        return new BinaryPredicate(Operator.LT,
+                visit(lessThan.child(0), context),
+                visit(lessThan.child(1), context));
+    }
+
+    @Override
+    public Expr visitLessThanEqual(LessThanEqual lessThanEqual, PlanContext context) {
+        return new BinaryPredicate(Operator.LE,
+                visit(lessThanEqual.child(0), context),
+                visit(lessThanEqual.child(1), context));
     }
+
+    @Override
+    public Expr visitNot(Not not, PlanContext context) {
+        return new org.apache.doris.analysis.CompoundPredicate(
+                org.apache.doris.analysis.CompoundPredicate.Operator.NOT,
+                visit(not.child(0), context),
+                null);
+    }
+
+    @Override
+    public Expr visitNullSafeEqual(NullSafeEqual nullSafeEqual, PlanContext context) {
+        return new BinaryPredicate(Operator.EQ_FOR_NULL,
+                visit(nullSafeEqual.child(0), context),
+                visit(nullSafeEqual.child(1), context));
+    }
+
+    /**
+     * Convert to stale literal.
+     */
+    @Override
+    public Expr visitLiteral(Literal literal, PlanContext context) {
+        DataType dataType = literal.getDataType();
+        if (dataType instanceof BooleanType) {
+            return new BoolLiteral((Boolean) literal.getValue());
+        } else if (dataType instanceof DoubleType) {
+            return new FloatLiteral((Double) literal.getValue(), Type.DOUBLE);
+        } else if (dataType instanceof IntegerType) {
+            return new IntLiteral((Long) literal.getValue());
+        } else if (dataType instanceof NullType) {
+            return new NullLiteral();
+        } else if (dataType instanceof StringType) {
+            return new StringLiteral((String) literal.getValue());
+        }
+        throw new RuntimeException(String.format("Unsupported data type: %s", dataType.toString()));
+    }
+
+    @Override
+    public Expr visitFunctionCall(FunctionCall function, PlanContext context) {
+        List<Expr> paramList = new ArrayList<>();
+        for (Expression expr : function.getFnParams().getExpression()) {
+            paramList.add(visit(expr, context));
+        }
+        return new FunctionCallExpr(function.getFnName().toString(), paramList);

Review Comment:
   add a todo to translator distinct or count(*)



##########
fe/fe-core/src/main/java/org/apache/doris/nereids/types/DataType.java:
##########
@@ -61,4 +61,8 @@ public static DataType convertFromCatalogDataType(Type catalogType) {
     }
 
     public abstract Type toCatalogDataType();
+
+    public String typeName() {

Review Comment:
   unuse?



##########
fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Arithmetic.java:
##########
@@ -37,27 +39,42 @@ enum OperatorPosition {
      */
     @SuppressWarnings("checkstyle:RegexpSingleline")
     public enum ArithmeticOperator {
-        MULTIPLY("*", "multiply", Arithmetic.OperatorPosition.BINARY_INFIX, TExprOpcode.MULTIPLY),
-        DIVIDE("/", "divide", Arithmetic.OperatorPosition.BINARY_INFIX, TExprOpcode.DIVIDE),
-        MOD("%", "mod", Arithmetic.OperatorPosition.BINARY_INFIX, TExprOpcode.MOD),
-        ADD("+", "add", Arithmetic.OperatorPosition.BINARY_INFIX, TExprOpcode.ADD),
-        SUBTRACT("-", "subtract", Arithmetic.OperatorPosition.BINARY_INFIX, TExprOpcode.SUBTRACT),
+        MULTIPLY("*", "multiply",
+                Arithmetic.OperatorPosition.BINARY_INFIX, TExprOpcode.MULTIPLY, Operator.MULTIPLY),
+        DIVIDE("/", "divide",
+                Arithmetic.OperatorPosition.BINARY_INFIX, TExprOpcode.DIVIDE, Operator.DIVIDE),
+        MOD("%", "mod",
+                Arithmetic.OperatorPosition.BINARY_INFIX, TExprOpcode.MOD, Operator.MOD),
+        ADD("+", "add",
+                Arithmetic.OperatorPosition.BINARY_INFIX, TExprOpcode.ADD, Operator.ADD),
+        SUBTRACT("-", "subtract",
+                Arithmetic.OperatorPosition.BINARY_INFIX, TExprOpcode.SUBTRACT, Operator.SUBTRACT),
         //TODO: The following functions will be added later.
-        BITAND("&", "bitand", Arithmetic.OperatorPosition.BINARY_INFIX, TExprOpcode.BITAND),
-        BITOR("|", "bitor", Arithmetic.OperatorPosition.BINARY_INFIX, TExprOpcode.BITOR),
-        BITXOR("^", "bitxor", Arithmetic.OperatorPosition.BINARY_INFIX, TExprOpcode.BITXOR),
-        BITNOT("~", "bitnot", Arithmetic.OperatorPosition.UNARY_PREFIX, TExprOpcode.BITNOT);
+        BITAND("&", "bitand",
+                Arithmetic.OperatorPosition.BINARY_INFIX, TExprOpcode.BITAND, Operator.BITAND),
+        BITOR("|", "bitor",
+                Arithmetic.OperatorPosition.BINARY_INFIX, TExprOpcode.BITOR, Operator.BITOR),
+        BITXOR("^", "bitxor",
+                Arithmetic.OperatorPosition.BINARY_INFIX, TExprOpcode.BITXOR, Operator.BITXOR),
+        BITNOT("~", "bitnot",
+                Arithmetic.OperatorPosition.UNARY_PREFIX, TExprOpcode.BITNOT, Operator.BITNOT);
 
         private final String description;
         private final String name;
         private final Arithmetic.OperatorPosition pos;
         private final TExprOpcode opcode;

Review Comment:
   i think this is useless, remove it



##########
fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ExpressionConverter.java:
##########
@@ -17,18 +17,169 @@
 
 package org.apache.doris.nereids.trees.expressions;
 
+import org.apache.doris.analysis.ArithmeticExpr;
+import org.apache.doris.analysis.BinaryPredicate;
+import org.apache.doris.analysis.BinaryPredicate.Operator;
+import org.apache.doris.analysis.BoolLiteral;
 import org.apache.doris.analysis.Expr;
+import org.apache.doris.analysis.FloatLiteral;
+import org.apache.doris.analysis.FunctionCallExpr;
+import org.apache.doris.analysis.IntLiteral;
+import org.apache.doris.analysis.NullLiteral;
+import org.apache.doris.analysis.StringLiteral;
+import org.apache.doris.catalog.Type;
+import org.apache.doris.nereids.trees.NodeType;
+import org.apache.doris.nereids.trees.plans.PlanContext;
+import org.apache.doris.nereids.types.BooleanType;
+import org.apache.doris.nereids.types.DataType;
+import org.apache.doris.nereids.types.DoubleType;
+import org.apache.doris.nereids.types.IntegerType;
+import org.apache.doris.nereids.types.NullType;
+import org.apache.doris.nereids.types.StringType;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * Used to convert expression of new optimizer to stale expr.
  */
-public class ExpressionConverter {
+@SuppressWarnings("rawtypes")
+public class ExpressionConverter extends ExpressionVisitor<Expr, PlanContext> {
 
     public static ExpressionConverter converter = new ExpressionConverter();
 
-    // TODO: implement this, besides if expression is a slot, should set the slotId to
-    //       converted the org.apache.doris.analysis.Expr
-    public Expr convert(Expression expression) {
-        return null;
+    public static Expr convert(Expression expression, PlanContext planContext) {
+        return converter.visit(expression, planContext);
+    }
+
+    @Override
+    public Expr visit(Expression expr, PlanContext context) {
+        return expr.accept(this, context);
+    }
+
+    @Override
+    public Expr visitSlotReference(SlotReference slotReference, PlanContext context) {
+        return context.findExpr(slotReference);
+    }
+
+    @Override
+    public Expr visitEqualTo(EqualTo equalTo, PlanContext context) {
+        return new BinaryPredicate(Operator.EQ,
+                visit(equalTo.child(0), context),
+                visit(equalTo.child(1), context));
+    }
+
+    @Override
+    public Expr visitGreaterThan(GreaterThan greaterThan, PlanContext context) {
+        return new BinaryPredicate(Operator.GT,
+                visit(greaterThan.child(0), context),
+                visit(greaterThan.child(1), context));
+    }
+
+    @Override
+    public Expr visitGreaterThanEqual(GreaterThanEqual greaterThanEqual, PlanContext context) {
+        return new BinaryPredicate(Operator.GE,
+                visit(greaterThanEqual.child(0), context),
+                visit(greaterThanEqual.child(1), context));
+    }
+
+    @Override
+    public Expr visitLessThan(LessThan lessThan, PlanContext context) {
+        return new BinaryPredicate(Operator.LT,
+                visit(lessThan.child(0), context),
+                visit(lessThan.child(1), context));
+    }
+
+    @Override
+    public Expr visitLessThanEqual(LessThanEqual lessThanEqual, PlanContext context) {
+        return new BinaryPredicate(Operator.LE,
+                visit(lessThanEqual.child(0), context),
+                visit(lessThanEqual.child(1), context));
     }
+
+    @Override
+    public Expr visitNot(Not not, PlanContext context) {
+        return new org.apache.doris.analysis.CompoundPredicate(
+                org.apache.doris.analysis.CompoundPredicate.Operator.NOT,
+                visit(not.child(0), context),
+                null);
+    }
+
+    @Override
+    public Expr visitNullSafeEqual(NullSafeEqual nullSafeEqual, PlanContext context) {
+        return new BinaryPredicate(Operator.EQ_FOR_NULL,
+                visit(nullSafeEqual.child(0), context),
+                visit(nullSafeEqual.child(1), context));
+    }
+
+    /**
+     * Convert to stale literal.
+     */
+    @Override
+    public Expr visitLiteral(Literal literal, PlanContext context) {
+        DataType dataType = literal.getDataType();
+        if (dataType instanceof BooleanType) {
+            return new BoolLiteral((Boolean) literal.getValue());
+        } else if (dataType instanceof DoubleType) {
+            return new FloatLiteral((Double) literal.getValue(), Type.DOUBLE);
+        } else if (dataType instanceof IntegerType) {
+            return new IntLiteral((Long) literal.getValue());
+        } else if (dataType instanceof NullType) {
+            return new NullLiteral();
+        } else if (dataType instanceof StringType) {
+            return new StringLiteral((String) literal.getValue());
+        }
+        throw new RuntimeException(String.format("Unsupported data type: %s", dataType.toString()));
+    }
+
+    @Override
+    public Expr visitFunctionCall(FunctionCall function, PlanContext context) {
+        List<Expr> paramList = new ArrayList<>();
+        for (Expression expr : function.getFnParams().getExpression()) {
+            paramList.add(visit(expr, context));
+        }
+        return new FunctionCallExpr(function.getFnName().toString(), paramList);
+    }
+
+    @Override
+    public Expr visitBetweenPredicate(BetweenPredicate betweenPredicate, PlanContext context) {
+        return new org.apache.doris.analysis.BetweenPredicate(
+                visit(betweenPredicate.getCompareExpr(), context),
+                visit(betweenPredicate.getLowerBound(), context),
+                visit(betweenPredicate.getUpperBound(), context),
+                // if there is a not key word, then the stale expr would be:
+                // CompoundPredicate(NOT, BetweenPredicate, null).
+                true
+        );
+    }
+
+    @Override
+    public Expr visitCompoundPredicate(CompoundPredicate compoundPredicate, PlanContext context) {
+        NodeType nodeType = compoundPredicate.getType();
+        org.apache.doris.analysis.CompoundPredicate.Operator staleOp = null;
+        switch (nodeType) {
+            case OR:
+                staleOp = org.apache.doris.analysis.CompoundPredicate.Operator.OR;
+                break;
+            case AND:
+                staleOp = org.apache.doris.analysis.CompoundPredicate.Operator.AND;
+                break;
+            case NOT:
+                staleOp = org.apache.doris.analysis.CompoundPredicate.Operator.NOT;
+                break;
+            default:
+                throw new RuntimeException(String.format("Unknown node type: %s", nodeType.name()));
+        }
+        return new org.apache.doris.analysis.CompoundPredicate(staleOp,
+                visit(compoundPredicate.child(0), context),
+                visit(compoundPredicate.child(1), context));
+    }
+
+    @Override
+    public Expr visitArithmetic(Arithmetic arithmetic, PlanContext context) {
+        return new ArithmeticExpr(arithmetic.getArithOperator().getStaleOp(),

Review Comment:
   currently, Arithmetic has both unary expr and binary expr



##########
fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ExpressionConverter.java:
##########
@@ -17,18 +17,169 @@
 
 package org.apache.doris.nereids.trees.expressions;
 
+import org.apache.doris.analysis.ArithmeticExpr;
+import org.apache.doris.analysis.BinaryPredicate;
+import org.apache.doris.analysis.BinaryPredicate.Operator;
+import org.apache.doris.analysis.BoolLiteral;
 import org.apache.doris.analysis.Expr;
+import org.apache.doris.analysis.FloatLiteral;
+import org.apache.doris.analysis.FunctionCallExpr;
+import org.apache.doris.analysis.IntLiteral;
+import org.apache.doris.analysis.NullLiteral;
+import org.apache.doris.analysis.StringLiteral;
+import org.apache.doris.catalog.Type;
+import org.apache.doris.nereids.trees.NodeType;
+import org.apache.doris.nereids.trees.plans.PlanContext;
+import org.apache.doris.nereids.types.BooleanType;
+import org.apache.doris.nereids.types.DataType;
+import org.apache.doris.nereids.types.DoubleType;
+import org.apache.doris.nereids.types.IntegerType;
+import org.apache.doris.nereids.types.NullType;
+import org.apache.doris.nereids.types.StringType;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * Used to convert expression of new optimizer to stale expr.
  */
-public class ExpressionConverter {
+@SuppressWarnings("rawtypes")
+public class ExpressionConverter extends ExpressionVisitor<Expr, PlanContext> {
 
     public static ExpressionConverter converter = new ExpressionConverter();
 
-    // TODO: implement this, besides if expression is a slot, should set the slotId to
-    //       converted the org.apache.doris.analysis.Expr
-    public Expr convert(Expression expression) {
-        return null;
+    public static Expr convert(Expression expression, PlanContext planContext) {
+        return converter.visit(expression, planContext);
+    }
+
+    @Override
+    public Expr visit(Expression expr, PlanContext context) {
+        return expr.accept(this, context);
+    }
+
+    @Override
+    public Expr visitSlotReference(SlotReference slotReference, PlanContext context) {
+        return context.findExpr(slotReference);
+    }
+
+    @Override
+    public Expr visitEqualTo(EqualTo equalTo, PlanContext context) {
+        return new BinaryPredicate(Operator.EQ,
+                visit(equalTo.child(0), context),
+                visit(equalTo.child(1), context));
+    }
+
+    @Override
+    public Expr visitGreaterThan(GreaterThan greaterThan, PlanContext context) {
+        return new BinaryPredicate(Operator.GT,
+                visit(greaterThan.child(0), context),
+                visit(greaterThan.child(1), context));
+    }
+
+    @Override
+    public Expr visitGreaterThanEqual(GreaterThanEqual greaterThanEqual, PlanContext context) {
+        return new BinaryPredicate(Operator.GE,
+                visit(greaterThanEqual.child(0), context),
+                visit(greaterThanEqual.child(1), context));
+    }
+
+    @Override
+    public Expr visitLessThan(LessThan lessThan, PlanContext context) {
+        return new BinaryPredicate(Operator.LT,
+                visit(lessThan.child(0), context),
+                visit(lessThan.child(1), context));
+    }
+
+    @Override
+    public Expr visitLessThanEqual(LessThanEqual lessThanEqual, PlanContext context) {
+        return new BinaryPredicate(Operator.LE,
+                visit(lessThanEqual.child(0), context),
+                visit(lessThanEqual.child(1), context));
     }
+
+    @Override
+    public Expr visitNot(Not not, PlanContext context) {
+        return new org.apache.doris.analysis.CompoundPredicate(
+                org.apache.doris.analysis.CompoundPredicate.Operator.NOT,
+                visit(not.child(0), context),
+                null);
+    }
+
+    @Override
+    public Expr visitNullSafeEqual(NullSafeEqual nullSafeEqual, PlanContext context) {
+        return new BinaryPredicate(Operator.EQ_FOR_NULL,
+                visit(nullSafeEqual.child(0), context),
+                visit(nullSafeEqual.child(1), context));
+    }
+
+    /**
+     * Convert to stale literal.
+     */
+    @Override
+    public Expr visitLiteral(Literal literal, PlanContext context) {
+        DataType dataType = literal.getDataType();
+        if (dataType instanceof BooleanType) {
+            return new BoolLiteral((Boolean) literal.getValue());
+        } else if (dataType instanceof DoubleType) {
+            return new FloatLiteral((Double) literal.getValue(), Type.DOUBLE);
+        } else if (dataType instanceof IntegerType) {
+            return new IntLiteral((Long) literal.getValue());
+        } else if (dataType instanceof NullType) {
+            return new NullLiteral();
+        } else if (dataType instanceof StringType) {
+            return new StringLiteral((String) literal.getValue());
+        }
+        throw new RuntimeException(String.format("Unsupported data type: %s", dataType.toString()));
+    }
+
+    @Override
+    public Expr visitFunctionCall(FunctionCall function, PlanContext context) {
+        List<Expr> paramList = new ArrayList<>();
+        for (Expression expr : function.getFnParams().getExpression()) {
+            paramList.add(visit(expr, context));
+        }
+        return new FunctionCallExpr(function.getFnName().toString(), paramList);
+    }
+
+    @Override
+    public Expr visitBetweenPredicate(BetweenPredicate betweenPredicate, PlanContext context) {
+        return new org.apache.doris.analysis.BetweenPredicate(

Review Comment:
   @EmmyMiao87 could be execute between predicate expr? if be cannot do that, we should throw exception if there have a BetweenPredicate



##########
fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ExpressionConverter.java:
##########
@@ -17,18 +17,169 @@
 
 package org.apache.doris.nereids.trees.expressions;
 
+import org.apache.doris.analysis.ArithmeticExpr;
+import org.apache.doris.analysis.BinaryPredicate;
+import org.apache.doris.analysis.BinaryPredicate.Operator;
+import org.apache.doris.analysis.BoolLiteral;
 import org.apache.doris.analysis.Expr;
+import org.apache.doris.analysis.FloatLiteral;
+import org.apache.doris.analysis.FunctionCallExpr;
+import org.apache.doris.analysis.IntLiteral;
+import org.apache.doris.analysis.NullLiteral;
+import org.apache.doris.analysis.StringLiteral;
+import org.apache.doris.catalog.Type;
+import org.apache.doris.nereids.trees.NodeType;
+import org.apache.doris.nereids.trees.plans.PlanContext;
+import org.apache.doris.nereids.types.BooleanType;
+import org.apache.doris.nereids.types.DataType;
+import org.apache.doris.nereids.types.DoubleType;
+import org.apache.doris.nereids.types.IntegerType;
+import org.apache.doris.nereids.types.NullType;
+import org.apache.doris.nereids.types.StringType;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * Used to convert expression of new optimizer to stale expr.
  */
-public class ExpressionConverter {
+@SuppressWarnings("rawtypes")
+public class ExpressionConverter extends ExpressionVisitor<Expr, PlanContext> {
 
     public static ExpressionConverter converter = new ExpressionConverter();
 
-    // TODO: implement this, besides if expression is a slot, should set the slotId to
-    //       converted the org.apache.doris.analysis.Expr
-    public Expr convert(Expression expression) {
-        return null;
+    public static Expr convert(Expression expression, PlanContext planContext) {
+        return converter.visit(expression, planContext);
+    }
+
+    @Override
+    public Expr visit(Expression expr, PlanContext context) {
+        return expr.accept(this, context);
+    }
+
+    @Override
+    public Expr visitSlotReference(SlotReference slotReference, PlanContext context) {
+        return context.findExpr(slotReference);
+    }
+
+    @Override
+    public Expr visitEqualTo(EqualTo equalTo, PlanContext context) {
+        return new BinaryPredicate(Operator.EQ,
+                visit(equalTo.child(0), context),
+                visit(equalTo.child(1), context));
+    }
+
+    @Override
+    public Expr visitGreaterThan(GreaterThan greaterThan, PlanContext context) {
+        return new BinaryPredicate(Operator.GT,
+                visit(greaterThan.child(0), context),
+                visit(greaterThan.child(1), context));
+    }
+
+    @Override
+    public Expr visitGreaterThanEqual(GreaterThanEqual greaterThanEqual, PlanContext context) {
+        return new BinaryPredicate(Operator.GE,
+                visit(greaterThanEqual.child(0), context),
+                visit(greaterThanEqual.child(1), context));
+    }
+
+    @Override
+    public Expr visitLessThan(LessThan lessThan, PlanContext context) {
+        return new BinaryPredicate(Operator.LT,
+                visit(lessThan.child(0), context),
+                visit(lessThan.child(1), context));
+    }
+
+    @Override
+    public Expr visitLessThanEqual(LessThanEqual lessThanEqual, PlanContext context) {
+        return new BinaryPredicate(Operator.LE,
+                visit(lessThanEqual.child(0), context),
+                visit(lessThanEqual.child(1), context));
     }
+
+    @Override
+    public Expr visitNot(Not not, PlanContext context) {
+        return new org.apache.doris.analysis.CompoundPredicate(
+                org.apache.doris.analysis.CompoundPredicate.Operator.NOT,
+                visit(not.child(0), context),
+                null);
+    }
+
+    @Override
+    public Expr visitNullSafeEqual(NullSafeEqual nullSafeEqual, PlanContext context) {
+        return new BinaryPredicate(Operator.EQ_FOR_NULL,
+                visit(nullSafeEqual.child(0), context),
+                visit(nullSafeEqual.child(1), context));
+    }
+
+    /**
+     * Convert to stale literal.
+     */
+    @Override
+    public Expr visitLiteral(Literal literal, PlanContext context) {
+        DataType dataType = literal.getDataType();
+        if (dataType instanceof BooleanType) {
+            return new BoolLiteral((Boolean) literal.getValue());
+        } else if (dataType instanceof DoubleType) {
+            return new FloatLiteral((Double) literal.getValue(), Type.DOUBLE);
+        } else if (dataType instanceof IntegerType) {
+            return new IntLiteral((Long) literal.getValue());
+        } else if (dataType instanceof NullType) {
+            return new NullLiteral();
+        } else if (dataType instanceof StringType) {
+            return new StringLiteral((String) literal.getValue());
+        }
+        throw new RuntimeException(String.format("Unsupported data type: %s", dataType.toString()));
+    }
+
+    @Override
+    public Expr visitFunctionCall(FunctionCall function, PlanContext context) {
+        List<Expr> paramList = new ArrayList<>();
+        for (Expression expr : function.getFnParams().getExpression()) {

Review Comment:
   getExpression rename it to getExpressions or getExpressionList



##########
fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PhysicalPlanTranslator.java:
##########
@@ -63,7 +64,6 @@
 /**
  * Used to translate to physical plan generated by new optimizer to the plan fragments.
  */
-@SuppressWarnings("rawtypes")
 public class PhysicalPlanTranslator extends PlanOperatorVisitor<PlanFragment, PlanContext> {

Review Comment:
   we need to call PlanNode#convertToVectoriezd at the end of translate



-- 
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: commits-unsubscribe@doris.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org


[GitHub] [doris] github-actions[bot] commented on pull request #10343: [feature](nereids)Convert the expression from nereids to stale expr.

Posted by GitBox <gi...@apache.org>.
github-actions[bot] commented on PR #10343:
URL: https://github.com/apache/doris/pull/10343#issuecomment-1164176210

   PR approved by anyone and no changes requested.


-- 
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: commits-unsubscribe@doris.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org