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

ZiLin Chen commented on CALCITE-4677:
-------------------------------------

Actually, I have some rules that can only match several physical Convention 
RelNodes (not just like ConvertRule only match a single RelNode, enforcer can 
not help), so these rules can only be applied when physical RelNodes are  on 
produce.

It works pretty well on IterativeRuleDriver, however, TopDownRuleDriver can't 
work in some case (the example in description) .

I found that DeriveTraitTask has a  of code which can help.

// In case some implementations use rules to convert between different physical 
conventions.
// Note that this is deprecated and will be removed in the future.
tasks.push(new ApplyRules(mExpr, group, false));

 

> Different physical conventions conversion on  new physical node producing
> -------------------------------------------------------------------------
>
>                 Key: CALCITE-4677
>                 URL: https://issues.apache.org/jira/browse/CALCITE-4677
>             Project: Calcite
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 1.28.0
>            Reporter: ZiLin Chen
>            Priority: Major
>              Labels: pull-request-available
>          Time Spent: 20m
>  Remaining Estimate: 0h
>
> Whenever new physical nodes are on produce, we need to fire rules in case of 
> different physical conventions conversion.
> DeriveTrait Task deal with this case, while some physical node maybe missing.
>  
> There 3 rules, but in TopDownRuleDriver rule 3 can not be applied.
> 1. LogicalSortToTopNRule
> 2. LogicalSortToLimitMemSortRule
> 3. TopNToSomeRelNodeRule (Need Match Physical Convention Node like TopN)
>  
> LogicalAggreate          -> 1. RelSet1 
>   - LogicalSort              -> 2. RelSet2 fires LogicalSortToTopNRule and 
> LogicalSortToLimitMemSortRule
>     - OtherNode             -> 3. RelSet3
>  
> ApplyRuleTask LogicalSortToLimitMemSortRule is already scheduled.
> ApplyRuleTask LogicalSortToTopNRule still on the stack.
>  
> when RelSet3 on Merge (Merge with other RelSets), then RelSet2 
> clearProcessed(): subset.resetTaskState() and then RelSet1 clearProcessed(): 
> subset.resetTaskState()
> because RelSet1 is root so OptimizeGroup will be scheduled again
>  
> Now the task stack
>  Task Stack:
> Task about RelSet1
> Task about RelSet2 ApplyRuleTask LogicalSortToTopNRule
> Task about RelSet3
> Task about RelSet1 root schedule again
> Task about RelSet2
> Task about RelSet3 (current task)
>  
> next
> Task Stack:
> Task about RelSet1
> Task about RelSet2
> Task about RelSet3
> Task about RelSet1 
> Task about RelSet2 RelSubSet setOptimized so taskState -> Completed.  rels on 
> RelSet (LogicalSort and LimitMemSort)
>  
> next...
> Task Stack:
> Task about RelSet1
> Task about RelSet2 ApplyRuleTask LogicalSortToTopNRule. 
> Here we found when TopN is on produce, every RelSubSet can not fire 
> OptimizeInputTask. so TopNToSomeRelNodeRule can not fire 



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

Reply via email to