Hi Julian,
> RelBuilder does not support TableFunctionScan yet. Can you please log a JIRA 
> case for that? (And implement it, if you are so inclined.)

Do you mean add In RelBuilder TableFunctionScanFactory which will create 
LogicalTableFunctionScan like as for LogicalTableScan [1] and factory for 
others RelNodes?

[1] 
https://github.com/apache/calcite/blob/master/core/src/main/java/org/apache/calcite/tools/RelBuilder.java#L125

-----Original Message-----
From: Julian Hyde [mailto:jh...@apache.org] 
Sent: Monday, November 28, 2016 8:45 PM
To: dev@calcite.apache.org
Subject: Re: Convert RexSubQuery to RexNode

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(RexProgramBuild
> er.java:291)
> 
>                at 
> org.apache.calcite.rex.RexProgramBuilder.addCondition(RexProgramBuilde
> r.java:265)
> 
>                at 
> org.apache.calcite.rel.rules.FilterToCalcRule.onMatch(FilterToCalcRule
> .java:66)
> 
>                at 
> org.apache.calcite.plan.volcano.VolcanoRuleCall.onMatch(VolcanoRuleCal
> l.java:213)
> 
>                at 
> org.apache.calcite.plan.volcano.VolcanoPlanner.findBestExp(VolcanoPlan
> ner.java:819)
> 
>                at 
> org.apache.calcite.tools.Programs$RuleSetProgram.run(Programs.java:334
> )
> 
>                at 
> org.apache.flink.api.table.BatchTableEnvironment.optimize(BatchTableEn
> vironment.scala:252)
> 
>                at 
> org.apache.flink.api.table.BatchTableEnvironment.translate(BatchTableE
> nvironment.scala:287)
> 
>                at 
> org.apache.flink.api.scala.table.BatchTableEnvironment.toDataSet(Batch
> TableEnvironment.scala:139)
> 
>                at 
> org.apache.flink.api.scala.table.TableConversions.toDataSet(TableConve
> rsions.scala:41)
> 
>                at 
> org.apache.flink.api.scala.batch.table.InITCase.testInSubquery(InITCas
> e.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.
> 

Reply via email to