You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@calcite.apache.org by ha...@tutanota.com on 2019/06/23 22:29:38 UTC

Subquery

Although I can build a query which looks like

    val query = builder.scan("table1").filter(builder.equals(builder.field("filed_name1"), builder.literal("matched_value1"))).project(builder.field("field1_1"))

How can I place this query as subquery which might looks like sql statement 

select * from table2 where field2_1 in (select field1_1 from table1 where field_name1 = 'matched_value1')

Below code snippet doesn't get compiled 

buidler.scan("table2").filter(builder.call(IN, builder.field("field2_1"), /* query.getRexBuidler*/))

it's because I don't know how to convert query to RexNode. What is the correct way of building in clause within filter? Any suggestions? 

Current used calcite core version is 1.19.0

Thanks

回复:Subquery

Posted by Haisheng Yuan <h....@alibaba-inc.com>.
Try semiJoin in RelBuilder. Maybe that is what you want.





Thanks~
Haisheng Yuan------------------------------------------------------------------
发件人:<ha...@tutanota.com>
日 期:2019年06月24日 06:29:38
收件人:Dev<de...@calcite.apache.org>
主 题:Subquery


Although I can build a query which looks like

    val query = builder.scan("table1").filter(builder.equals(builder.field("filed_name1"), builder.literal("matched_value1"))).project(builder.field("field1_1"))

How can I place this query as subquery which might looks like sql statement 

select * from table2 where field2_1 in (select field1_1 from table1 where field_name1 = 'matched_value1')

Below code snippet doesn't get compiled 

buidler.scan("table2").filter(builder.call(IN, builder.field("field2_1"), /* query.getRexBuidler*/))

it's because I don't know how to convert query to RexNode. What is the correct way of building in clause within filter? Any suggestions? 

Current used calcite core version is 1.19.0

Thanks


Re: Subquery

Posted by Danny Chan <yu...@gmail.com>.
Hamishberridge, you can use RelBuilder#semiJoin [1], the pseudocode seems:

RelNode left = …
RelNode right = ...
relBuilder
  .push(left)
  .push(right)
  .semiJoin(conditions)

BTW, maybe you should use Calcite release 1.20.0 which would be released this week, the release has improve the join like expressions including SemiJoin.

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

Best,
Danny Chan
在 2019年6月24日 +0800 AM6:29,hamishberridge@tutanota.com,写道:
>
> Although I can build a query which looks like
>
>     val query = builder.scan("table1").filter(builder.equals(builder.field("filed_name1"), builder.literal("matched_value1"))).project(builder.field("field1_1"))
>
> How can I place this query as subquery which might looks like sql statement
>
> select * from table2 where field2_1 in (select field1_1 from table1 where field_name1 = 'matched_value1')
>
> Below code snippet doesn't get compiled
>
> buidler.scan("table2").filter(builder.call(IN, builder.field("field2_1"), /* query.getRexBuidler*/))
>
> it's because I don't know how to convert query to RexNode. What is the correct way of building in clause within filter? Any suggestions?
>
> Current used calcite core version is 1.19.0
>
> Thanks