[ 
https://issues.apache.org/jira/browse/CALCITE-3923?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17085192#comment-17085192
 ] 

Julian Hyde commented on CALCITE-3923:
--------------------------------------

There are now several commits on that branch. The main commit to review is 
[c9fd10d5|https://github.com/julianhyde/calcite/commit/c9fd10d5bb5a53bade27474c9fb9c4bbdb726708].

Commit 
[2ede648a|https://github.com/julianhyde/calcite/commit/2ede648ad07aaafb6aaa05a0b67b54f29b678ccb]
 proposes a new way to create the immutable trees of {{RelOptRuleOperand}} 
objects. It is separate but complementary, because operands are a central part 
of the definition of a rule, and operands often need to be tweaked (e.g. 
changing Filter.class to LogicalFilter.class) when you create a derivative rule.

The other commits illustrate how the API changes would affect the code base.

In 
[5345c909|https://github.com/julianhyde/calcite/commit/5345c90974ccdd4d1af02236273b001e870006bb],
 I'd love someone to check whether weak keys, soft values are the right way to 
ensure that handlers can be garbage-collected when a class is unloaded.

> Refactor how planner rules are parameterized
> --------------------------------------------
>
>                 Key: CALCITE-3923
>                 URL: https://issues.apache.org/jira/browse/CALCITE-3923
>             Project: Calcite
>          Issue Type: Bug
>            Reporter: Julian Hyde
>            Assignee: Julian Hyde
>            Priority: Major
>
> People often want different variants of planner rules. An example is 
> {{FilterJoinRule}}, which has a 'boolean smart’ parameter, a predicate (which 
> returns whether to pull up filter conditions), operands (which determine the 
> precise sub-classes of {{RelNode}} that the rule should match) and a 
> {{RelBuilderFactory}} (which controls the type of {{RelNode}} created by this 
> rule).
> Suppose you have an instance of {{FilterJoinRule}} and you want to change 
> {{smart}} from true to false. The {{smart}} parameter is immutable (good!) 
> but you can’t easily create a clone of the rule because you don’t know the 
> values of the other parameters. Your instance might even be (unbeknownst to 
> you) a sub-class with extra parameters and a private constructor.
> So, my proposal is to put all of the config information of a {{RelOptRule}} 
> into a single {{config}} parameter that contains all relevant properties. 
> Each sub-class of {{RelOptRule}} would have one constructor with just a 
> ‘config’ parameter. Each config knows which sub-class of {{RelOptRule}} to 
> create. Therefore it is easy to copy a config, change one or more properties, 
> and create a new rule instance.
> Adding a property to a rule’s config does not require us to add or deprecate 
> any constructors.
> The operands are part of the config, so if you have a rule that matches a 
> {{EnumerableFilter}} on an {{EnumerableJoin}} and you want to make it match 
> an {{EnumerableFilter}} on an {{EnumerableNestedLoopJoin}}, you can easily 
> create one with one changed operand.
> The config is immutable and self-describing, so we can use it to 
> automatically generate a unique description for each rule instance.
> (See the email thread [[DISCUSS] Refactor how planner rules are 
> parameterized|https://lists.apache.org/thread.html/rfdf6f9b7821988bdd92b0377e3d293443a6376f4773c4c658c891cf9%40%3Cdev.calcite.apache.org%3E].)



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to