You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "Chunwei Lei (Jira)" <ji...@apache.org> on 2019/12/26 02:36:00 UTC
[jira] [Commented] (CALCITE-3630) Improve ReduceExpressionsRule
[ https://issues.apache.org/jira/browse/CALCITE-3630?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17003436#comment-17003436 ]
Chunwei Lei commented on CALCITE-3630:
--------------------------------------
Though we might recommend users not to use {{setImportance(0)}}, IMO, if we already do it in this rule[1], it makes sense to do it to be consistent.
[1] [https://github.com/apache/calcite/blob/master/core/src/main/java/org/apache/calcite/rel/rules/ReduceExpressionsRule.java#L216]
> Improve ReduceExpressionsRule
> -----------------------------
>
> Key: CALCITE-3630
> URL: https://issues.apache.org/jira/browse/CALCITE-3630
> Project: Calcite
> Issue Type: Bug
> Components: core
> Affects Versions: 1.21.0
> Reporter: Chunwei Lei
> Assignee: Chunwei Lei
> Priority: Major
> Labels: pull-request-available
> Time Spent: 0.5h
> Remaining Estimate: 0h
>
> In {{FilterReduceExpressionsRule}}, if the expression is a IS [NOT] NULL on a non-nullable column, then we can either remove the filter or replace it with an Empty(namely {{reduceNotNullableFilter}}). In such a case, we can set importance to 0 to reduce search space.
>
> {code:java}
> // code placeholder
> private void reduceNotNullableFilter(
> RelOptRuleCall call,
> Filter filter,
> RexNode rexNode,
> boolean reverse) {
> // If the expression is a IS [NOT] NULL on a non-nullable
> // column, then we can either remove the filter or replace
> // it with an Empty.
> boolean alwaysTrue;
> switch (rexNode.getKind()) {
> case IS_NULL:
> case IS_UNKNOWN:
> alwaysTrue = false;
> break;
> case IS_NOT_NULL:
> alwaysTrue = true;
> break;
> default:
> return;
> }
> if (reverse) {
> alwaysTrue = !alwaysTrue;
> }
> RexNode operand = ((RexCall) rexNode).getOperands().get(0);
> if (operand instanceof RexInputRef) {
> RexInputRef inputRef = (RexInputRef) operand;
> if (!inputRef.getType().isNullable()) {
> if (alwaysTrue) {
> call.transformTo(filter.getInput());
> } else {
> call.transformTo(createEmptyRelOrEquivalent(call, filter));
> }
> }
> }
> }
> }
> {code}
>
--
This message was sent by Atlassian Jira
(v8.3.4#803005)