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

Julian Hyde commented on CALCITE-5332:
--------------------------------------

I had forgotten about that recommendation. I haven't been in that code for a 
while.

IIRC, the recommendation to create a {{DEFAULT}} was more about about managing 
dependencies (i.e. creating a sane order to load classes) and avoiding 
duplicated code (if there are several similar instances of a rule). I think 
that it would be OK if a {{DEFAULT}} were package-private, for example.

I'm not laying down absolute rules here, but the general pattern we want to 
encourage is for users to use an instance of a rule to create a new instance of 
a rule.

It was a mistake to make the rule instances have type {{RelOptRule}} rather 
than {{RelRule}} or some more specific sub-class.

> Configuring PruneEmptyRules is cumbersome
> -----------------------------------------
>
>                 Key: CALCITE-5332
>                 URL: https://issues.apache.org/jira/browse/CALCITE-5332
>             Project: Calcite
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 1.32.0
>            Reporter: Stamatis Zampetakis
>            Assignee: Stamatis Zampetakis
>            Priority: Major
>              Labels: pull-request-available
>             Fix For: 1.33.0
>
>          Time Spent: 20m
>  Remaining Estimate: 0h
>
> After CALCITE-4787/CALCITE-4839 (release 1.28.0) it is pretty complicated to 
> create new PruneEmptyRule instances with slightly different configurations.
> The most common use-case is to modify a rule, for instance 
> [PruneEmptyProject|https://github.com/apache/calcite/blob/2c30a56158cdd351d35725006bc1f76bb6aac75b/core/src/main/java/org/apache/calcite/rel/rules/PruneEmptyRules.java#L178],
>  and change the operands to enlarge or restrict the matching scope; e.g., 
> instead of matching the general {{Project.class}} match only 
> {{HiveProject.class}}.
> At the moment this task is not straightforward for various reasons.
> We cannot create the new rule by obtaining the configuration from the 
> existing instance (e.g., PROJECT_INSTANCE) cause the latter is declared as 
> RelOptRule. Unless we cast the instance to {{RelRule}} we cannot get access 
> to its configuration and change it.
> {{ImmutableRemoveEmptySingleRuleConfig}} is package private as every other 
> immutable class so again we cannot start from there.
> The constructors of {{RemoveEmptySingleRule}} are either deprecated or 
> package private so cannot/should not be used.
> [RemoveEmptySingleRuleConfig|https://github.com/apache/calcite/blob/2c30a56158cdd351d35725006bc1f76bb6aac75b/core/src/main/java/org/apache/calcite/rel/rules/PruneEmptyRules.java#L351]
>  does not provide a {{DEFAULT}} configuration instance.
> The only way "recommended" way to create a new rule instance at the moment is 
> to implement the respective config interface. This is unnecessary and 
> requires quite a bit of work if the consumer is not using the immutables 
> library annotation processor.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to