RelBuilder.call deals with a scalar function, and I think what you need is a table function. (In java both are just functions, but in SQL, or relational algebra, they are different beasts.)
Calcite has a TableFunctionScan, which is a RelNode, takes a function, 0 or more RelNode inputs, and 0 or more other arguments. RelBuilder does not support TableFunctionScan yet. Can you please log a JIRA case for that? (And implement it, if you are so inclined.) You don’t need to wait for support to be added to RelBuilder. You can create a TableFunctionScan manually, and send it to RelBuilder.push(). Julian > On Nov 28, 2016, at 4:52 AM, Nikolay Vasilishin <nikolay_vasilis...@epam.com> > wrote: > > Hi, devs. > I'm trying to implement RexVisitor#visitSubquery method for Flink Table API. > Can you help me with a problem? > > > 1. I have to construct a RexNode while having a RexNode with left side > of IN (name of column) and RelNode, which stands for table or subquery on the > right side of IN operator. If I'm using RexSubQuery.in(rel, rex), I'm failing > with exception: > > > > java.lang.ClassCastException: org.apache.calcite.rex.RexSubQuery cannot be > cast to org.apache.calcite.rex.RexLocalRef > > > > at > org.apache.calcite.rex.RexProgramBuilder.registerInput(RexProgramBuilder.java:291) > > at > org.apache.calcite.rex.RexProgramBuilder.addCondition(RexProgramBuilder.java:265) > > at > org.apache.calcite.rel.rules.FilterToCalcRule.onMatch(FilterToCalcRule.java:66) > > at > org.apache.calcite.plan.volcano.VolcanoRuleCall.onMatch(VolcanoRuleCall.java:213) > > at > org.apache.calcite.plan.volcano.VolcanoPlanner.findBestExp(VolcanoPlanner.java:819) > > at > org.apache.calcite.tools.Programs$RuleSetProgram.run(Programs.java:334) > > at > org.apache.flink.api.table.BatchTableEnvironment.optimize(BatchTableEnvironment.scala:252) > > at > org.apache.flink.api.table.BatchTableEnvironment.translate(BatchTableEnvironment.scala:287) > > at > org.apache.flink.api.scala.table.BatchTableEnvironment.toDataSet(BatchTableEnvironment.scala:139) > > at > org.apache.flink.api.scala.table.TableConversions.toDataSet(TableConversions.scala:41) > > at > org.apache.flink.api.scala.batch.table.InITCase.testInSubquery(InITCase.scala:72) > > > > RelBuilder#call doesn't take RelNode as parameter. Combining RelBuilder#call > with output of RexSubQuery.in(rel, rex) as RexNode causes duplicated IN > operator in logical plan: > > > > LogicalFilter(condition=[IN(IN($2, { > > LogicalProject(c=[$2]) > > LogicalFilter(condition=[=($1, 6)]) > > LogicalTableScan(table=[[_DataSetTable_0]]) > > }))]) > > LogicalTableScan(table=[[_DataSetTable_0]]) > > > > Besides, these classes look very similar. > So, the question is how to construct proper IN RexNode or how to cast from > RexSubQuery to RexNode. > > Thanks in advance, > > Nikolay Vasilishin > Junior Software Engineer > > Office: +7 812 611 10 94<tel:+7%20812%20611%2010%2094> x 61997<tel:61997> > Cell: +7 921 403 78 55<tel:+7%20921%20403%2078%2055> Email: > nikolay_vasilis...@epam.com<mailto:nikolay_vasilis...@epam.com> > Saint-Petersburg, Russia (GMT+3) epam.com<http://www.epam.com> > > CONFIDENTIALITY CAUTION AND DISCLAIMER > This message is intended only for the use of the individual(s) or entity(ies) > to which it is addressed and contains information that is legally privileged > and confidential. If you are not the intended recipient, or the person > responsible for delivering the message to the intended recipient, you are > hereby notified that any dissemination, distribution or copying of this > communication is strictly prohibited. All unintended recipients are obliged > to delete this message and destroy any printed copies. >