You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "Maksim Gramin (Jira)" <ji...@apache.org> on 2021/12/11 22:29:00 UTC

[jira] [Created] (CALCITE-4936) Using LogicalCalc in ProjectCalcMergeRule and FilterCalcMergeRule

Maksim Gramin created CALCITE-4936:
--------------------------------------

             Summary: Using LogicalCalc in ProjectCalcMergeRule and FilterCalcMergeRule
                 Key: CALCITE-4936
                 URL: https://issues.apache.org/jira/browse/CALCITE-4936
             Project: Calcite
          Issue Type: Improvement
          Components: core
    Affects Versions: 1.28.0
            Reporter: Maksim Gramin


I noticed that rules ProjectCalcMergeRule and FilterCalcMergeRule
strictly dependent on LogicalCalc class (e.g. casting call.rel to
LogicalCalc, using LogicalCalc.create method and etc). I suggest
making them more generalized (like CalcMergeRule) and use only
Project, Filter and Calc interfaces, which will expand the range of
their applying.

Concrete:

1. In FilterCalcMergeRule get rid of casting to LogicalCalc and LogicalFilter:
{code:java}
@Override public void onMatch(RelOptRuleCall call) {
  final Filter filter = call.rel(0);
  final Calc calc = call.rel(1);{code}


2. In FilterCalcMergeRule and FilterCalcMergeRule replace
LogicalCalc.create with calc.copy:
{code:java}
final Calc newCalc = calc.copy(calc.getTraitSet(), calc.getInput(),
mergedProgram);{code}


3. In ProjectCalcMergeRule replace the code:
{code:java}
if (RexOver.containsOver(program)) {
  LogicalCalc projectAsCalc = LogicalCalc.create(calc, program);
  call.transformTo(projectAsCalc);
  return;
}{code}

with a simple one:
{code:java}
if (RexOver.containsOver(program)) {
  return;
}{code}

because special rule ProjectToCalcRule convert LogicalProject to LogicalCalc.



--
This message was sent by Atlassian Jira
(v8.20.1#820001)