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 <[email protected]>
> 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