I can see how it would be somewhat useful to register a rule that match a 
variety of patterns. However, the only efficient implementation I can imagine 
would have multiple rule instances in the engine, each with a particular set of 
operands directed at particular classes. Therefore this would be syntactic 
sugar - kind of like how bash globs wildcards in file names and other 
command-line arguments but the command sees the expanded arguments.

Another problem is how the rule identifies relational expressions. Suppose you 
write a rule that matches both {Project -> Filter} and {Filter -> Project}. Now 
you need to get those expressions. Remember that the matched relational 
expression are retrieved by their ordinal in a tree-walk over the operands. So, 
for the first rule variant you’d write

  public void onMatch(RelOptRuleCall call) {
    final Project p = call.rel(0);
    final Filter f = call.rel(1);

but for the second you’d need

  public void onMatch(RelOptRuleCall call) {
    final Filter f = call.rel(0);
    final Project p = call.rel(1);

And you’d also probably be interested in which variant matched. I expect that 
you’d need a separate piece of handler code for each variant, and where better 
to put the handler but in a separate instance (and anonymous sub-class) of the 
rule?

Julian
  


 
> On Jul 13, 2017, at 8:04 AM, aka.fe2s <[email protected]> wrote:
> 
> Clarification
> 
> it should not apply **here**
> 
> **Join** ->
>     Join -> Project -> Filter -> TableScan
>     Join -> Project -> Filter -> TableScan
> 
> but should apply in the nested joins
> 
> --
> Алексей
> 
> On Thu, Jul 13, 2017 at 6:01 PM, aka.fe2s <[email protected]> wrote:
> 
>> Hi,
>> 
>> Can I somehow declare RelOptRule to apply only on top of any combination
>> of listed children without explicitly declaring all possible combinations?
>> 
>> Example, I want to apply MyJoinRule only on top of [Project, Filter and
>> TableScan] in any combination.
>> It should apply on
>> 1) Join -> Project -> Filter -> TableScan
>> 2) Join -> Project -> TableScan
>> 3) Join -> Filter -> TableScan
>> 
>> but it should not apply on
>> 
>> Join ->
>>     Join -> Project -> Filter -> TableScan
>>     Join -> Project -> Filter -> TableScan
>> 
>> The only way I found so far is to create many rules to explicitly declare
>> all supported trees.
>> I was looking into some() and unordered() methods without success.
>> 
>> Is there any better ways?
>> 
>> --
>> Oleksiy
>> 

Reply via email to