So If I have a JdbcJoin node with the inputs (*JdbcTableScan* &
*JdbcJoin *(With
2 *JdbcTableScan*s as input)), the whole join composed of the 3 tables is
implemented in a single SQL statement.

I thought a *JdbcJoin* node can be composed of only *JdbcTableScan* nodes
but after I tried what you said, it's working as I want it to now.

*---------------------*
*Muhammad Gelbana*
http://www.linkedin.com/in/mgelbana

On Tue, May 30, 2017 at 10:36 PM, Julian Hyde <[email protected]> wrote:

> What do you mean by “multi join”? Join is a binary operation. You can
> group more than one join together (e.g. a join b join c all on the same
> join key) but it’s just an optimization; it does the same as pair-wise
> joins.
>
> We have multi-join internally — it allows us to determine join order for a
> large number of joins with reasonable efficiency — but the multi-join is
> expanded to pair-wise joins for later phases in the planing process.
> MultiJoin has complex semantics so it is difficult to make it interact with
> other relational operators.
>
> Julian
>
>
> > On May 28, 2017, at 5:16 AM, Muhammad Gelbana <[email protected]>
> wrote:
> >
> > My ultimate goal is to pushdown joins from Drill to a JDBC datasource.
> >
> > To do that, I wrote a converter rule to convert LogicalJoins
> > <https://calcite.apache.org/apidocs/org/apache/calcite/
> rel/logical/LogicalJoin.html>
> > to
> > a custom descendant of the JdbcJoin
> > <https://calcite.apache.org/apidocs/org/apache/calcite/
> adapter/jdbc/JdbcRules.JdbcJoin.html>
> > class
> > which worked fine so far.
> >
> > Now I need to do the same for multi joins too but I believe 3 classes are
> > missing.
> >
> >   1. A JdbcRel
> >   <https://calcite.apache.org/apidocs/org/apache/calcite/
> adapter/jdbc/JdbcRel.html>
> > descendant
> >   (Not JdbcJoin
> >   <https://calcite.apache.org/apidocs/org/apache/calcite/
> adapter/jdbc/JdbcRules.JdbcJoin.html>,
> >   because it extends BiRel
> >   <https://calcite.apache.org/apidocs/org/apache/calcite/rel/BiRel.html>
> which
> >   wouldn't be valid because we are considering a node with more than two
> >   operands) for multijoins (Example: *JdbcMultiJoin*)
> >   2. A SqlCall
> >   <https://calcite.apache.org/apidocs/org/apache/calcite/
> sql/SqlCall.html>\
> >   SqlJoin
> >   <https://calcite.apache.org/apidocs/org/apache/calcite/
> sql/SqlJoin.html>
> > descendant
> >   for multijoins (Example: *SqlMultiJoin*) to be created while
> implementing
> >   <https://calcite.apache.org/apidocs/org/apache/calcite/
> adapter/jdbc/JdbcRel.html#implement-org.apache.calcite.
> adapter.jdbc.JdbcImplementor->
> >    the *JdbcMultiJoin* class.
> >   3. A JDBC rule for converting MultiJoins
> >   <https://calcite.apache.org/apidocs/org/apache/calcite/
> rel/rules/MultiJoin.html>
> > to
> >   the newly created *JdbcMultiJoin*
> >
> > Am I correct or is this already implemented somewhere ?
> >
> > *---------------------*
> > *Muhammad Gelbana*
> > http://www.linkedin.com/in/mgelbana
>
>

Reply via email to