You don’t need to override RexShuttle.apply(List<RexNode>) (and in fact I don’t 
know whether it will be called). Create your own shuttle and override the 
methods for the sub-classes of RexNode that are of interest, e.g. the following 
prints all input refs

  RelNode r;
  r.accept(
      new RexShuttle() {
        @Override RexNode visitInputRef(RexInputRef ref) {
          System.out.println(“input ref “ + ref);
        }
      });

One problem of that approach is that it doesn’t give you the top-level 
expression or expressions, it goes deep.

If you know you are looking at a particular kind of operator (e.g. Project, 
Filter, Join, Sort), call the particular method that returns the expressions 
(Project.getProjects(), Filter.getCondition(), etc.).

Julian


> On Feb 2, 2022, at 7:09 AM, Chathura Widanage <chathurawidan...@gmail.com> 
> wrote:
> 
> Hi,
> 
> I'm upgrading a set of custom rules from 1.23.0 to the latest. We have a
> custom rule that uses org.apache.calcite.rel.RelNode#getChildExps and seems
> it's deprecated in latest versions. Although it suggests to use
> org.apache.calcite.rel.RelNode#accept(org.apache.calcite.rex.RexShuttle), I
> couldn't figureout a way to get a List<RexNode> out since
> org.apache.calcite.rex.RexShuttle#apply(java.util.List<T>) is final. Could
> you please let me know how I can replace
> org.apache.calcite.rel.RelNode#getChildExps?
> 
> Regards,
> Chathura

Reply via email to