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,[email protected],写道: > > 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
