Julian Hyde created CALCITE-4559:
------------------------------------
Summary: Create 'interface RexRule', a modular rewrite for
row-expressions
Key: CALCITE-4559
URL: https://issues.apache.org/jira/browse/CALCITE-4559
Project: Calcite
Issue Type: Bug
Reporter: Julian Hyde
We propose to add {{class RexRule}}, a rewrite rule for row-expressions
({{class RexNode}}).
{{class RexRule}} is analogous to how {{class RelRule}} (and the older {{class
RelOptRule}}) operates on relational expressions ({{interface RelNode}}). Also,
{{class RexRuleProgram}} is analogous to {{HepProgram}} and {{VolcanoPlanner}}
(it indexes rules so that we do not have to try every rule against every part
of the expression). And a rule describes which operands it matches using
{{RexRule.describe(RexRule.OperandBuilder)}}, similar to calling
{{RelRule.Config.operandSupplier().apply()}}.
The advantages of {{RexRule}} are similar to {{RelRule}}: rules can be defined
in a modular way, can be documented and tested individually, and can be enabled
individually.
The rules could be applied in various ways. {{RelBuilder.Config}} could contain
a {{RexRuleProgram}} that would be applied every time an expression is
simplified by a {{RelBuilder}}. There could also be a sub-class of {{interface
RelShuttle}} that applies the rules to every {{RexNode}} in a tree (e.g. inside
{{Filter}}, {{Project}} and {{Join}}).
I don't yet know whether, or how, rules might support 3-valued boolean logic
({{RexUnknownAs}}). For example, a rule that simplifies "x = x" to "TRUE" is
valid in an "unknownAsFalse" context (e.g. as top-level of {{Filter}}
condition), but not in an "unknownAsUnknown" context (e.g. in {{Project}}
expression).
This case is related to CALCITE-3470 (making relational and row-expression
rules more similar, as in CockroachDB), but would deliver an API rather than a
textual DSL.
I am working on a prototype that illustrates the key interfaces and
demonstrates a couple of rules and tests for them.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)