It looks like the operation is done by 1. Build main query * `main query= builder.scan(table name).build` 2. Then push the main table * `builder.push(main query)` 3. Build subquery * `sub query = builder.scan().filter().build` 4. Push the subquery * `builder.push(sub query)` 5. Then do semi-join operation on the condition field * `builder.semiJoin(builder.equals(builder.filed(...filed name), builder.filed(...field name)))`
Thanks for the suggestion, it's very helpful! On Tue, 25 Jun 2019 at 23:26, Haisheng Yuan <h.y...@alibaba-inc.com> wrote: > > The input parameter of semiJoin method should be join conditions, not just > fields. > Check the example usage in RelMetadataTest.java#checkPredicates L1435. > > - Haisheng > > ------------------------------------------------------------------ > 发件人:Chia-Hung Lin<cli...@googlemail.com.INVALID> > 日 期:2019年06月26日 05:38:30 > 收件人:<dev@calcite.apache.org> > 主 题:How to do SemiJoin? > > A quick question. I am trying to do semiJoin(). The code looks like below. > > val subquery = builder. > scan("foodmart", "customer"). > filter(builder.equals(builder.field("city"), > builder.literal("Albany"))). > project(builder.field("customer_id")). > build > > val mainquery = builder. > scan("foodmart", "sales_fact_1998"). > project(builder.field("unit_sales")). > build > > val relnode = builder.push(mainquery).push(subquery).semiJoin( > builder.field("customer_id") > ).build > > But when executing, it throws an error message saying > `java.lang.RuntimeException: java.sql.SQLException: Error while > preparing statement [null]`, and following another exception that > mentions > > Cause: org.codehaus.commons.compiler.CompileException: Line 18, Column > 66: No applicable constructor/method found for actual parameters > "java.math.BigDecimal"; candidates are: "public static boolean > org.apache.calcite.runtime.SqlFunctions.isTrue(java.lang.Boolean)" > > Although it looks like code generation issue, I suspect it's more > likely my incorrect usage to construct semiJoin function. What is the > correct way to use semiJoin? Is there any example or doc that may > contain related info? I have this question because I can not find such > info after searching on the internet. Most of semiJoin results found > on the internet are internal implementation which looks like not > related to the usage. > > Thanks