You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "Stamatis Zampetakis (Jira)" <ji...@apache.org> on 2021/12/24 12:08:00 UTC
[jira] [Commented] (CALCITE-4964) reduce recursion when push predicate into case
[ https://issues.apache.org/jira/browse/CALCITE-4964?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17465004#comment-17465004 ]
Stamatis Zampetakis commented on CALCITE-4964:
----------------------------------------------
Thanks for submitting this case [~Ziwei Liu] . It is not clear what this Jira is about.
Is it a performance improvement? Is it a bug fix? Is it refactoring for readability?
Please upgrade the description to better reflect the purpose of the change.
> reduce recursion when push predicate into case
> ----------------------------------------------
>
> Key: CALCITE-4964
> URL: https://issues.apache.org/jira/browse/CALCITE-4964
> Project: Calcite
> Issue Type: Improvement
> Reporter: Ziwei Liu
> Assignee: Ziwei Liu
> Priority: Major
>
> CaseShuttle's recursion can be reduced like:
> {code:java}
> @Override public RexNode visitCall(RexCall call) {
> call = (RexCall) super.visitCall(call);
> if (call instanceof OdpsLambdaRexCall) {
> return call;
> }
> final RexCall old = call;
> call = ReduceExpressionsRule.pushPredicateIntoCase(call);
> if (call == old) {
> return call;
> } else {
> boolean containCase = false;
> List<RexNode> newOps = new ArrayList<>(call.getOperands().size());
> // call will be like case when c1 then f(x1 ...)
> // check whether need push f into x1
> for (int i = 0; i < call.getOperands().size(); i ++) {
> RexNode op = call.getOperands().get(i);
> RexNode newOp = op;
> if (i % 2 == 1 || i == call.getOperands().size() - 1) {
> if (op instanceof RexCall) {
> newOp = ReduceExpressionsRule.pushPredicateIntoCase((RexCall) op);
> }
> }
> if (op != newOp) {
> containCase = true;
> }
> newOps.add(newOp);
> }
> if (!containCase) {
> return call;
> } else {
> return call.clone(call.getType(), newOps);
> }
> }
> } {code}
--
This message was sent by Atlassian Jira
(v8.20.1#820001)