You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@calcite.apache.org by hongkang jiang <jh...@gmail.com> on 2021/11/23 07:00:16 UTC

Why calcite does not support outer join in materialized view

Hello everyone,
I have a question about that Calcite does not support outer join in
materialized view. I have been thinking for a long time and still haven't
figured it out. Could anyone help me answer the reason? Thanks very much.
I also found in Calcite's materialization a annotation like that Currently
we only support tablescan-project-filter-inner Join , And the method
MaterializedViewRule. IsValidRelNodePlan () will filter out the outer join.

Re: Why calcite does not support outer join in materialized view

Posted by hongkang jiang <jh...@gmail.com>.
I found a reason for not supporting materialized view outer join.
There is the verification code in JoinOnLeftCalcToJoinUnifyRule class
apply() method:

if (joinRelType != JoinRelType.INNER
    && !(joinRelType.isOuterJoin() && qInput1Cond.isAlwaysTrue())) {
  return null;
}

then, I try to remove it and test the previous case, the result is rewrite
successfully, the result is as follows:



*SELECT *FROM "hr"."MV0"WHERE "deptno" > 20*

But, I need to further analyze this part of the code to see if this
adjustment is possible.



On Tue, Nov 23, 2021 at 8:19 PM hongkang jiang <jh...@gmail.com> wrote:

> Hi,  Chunwei.
>
> Thank you very much for your reply and I read it carefully. Then I tried
> running a test in the MaterializedViewSubstitutionVisitorTest unit test
> class.
> I expected it to rewrite successfully, but not. The test is as follows:
>
> @Test void test() {
>   String mv = ""
>       + "select \"emps\".\"empid\", \"emps\".\"deptno\", \"depts\".\"deptno\" from\n"
>       + "\"hr\".\"emps\" left join \"hr\".\"depts\"\n"
>       + "on \"emps\".\"deptno\" = \"depts\".\"deptno\"\n"
>       + "where \"emps\".\"deptno\" > 10";
>   String query = ""
>       + "select \"emps\".\"empid\", \"emps\".\"deptno\", \"depts\".\"deptno\" from\n"
>       + "\"hr\".\"emps\" left join \"hr\".\"depts\"\n"
>       + "on \"emps\".\"deptno\" = \"depts\".\"deptno\"\n"
>       + "where \"emps\".\"deptno\" > 20";
>   sql(mv, query).ok();
> }
>
> Next, I will read the source code to find out why it is not supported. If
> possible, I will support out of join queries in materialization view in the
> next month.
>
>
> On Tue, Nov 23, 2021 at 4:09 PM Chunwei Lei <ch...@gmail.com>
> wrote:
>
>> Hi, Hongkang.
>>
>> Calcite has two ways to do query-rewriting, namely substitution, and
>> rules[1]. MaterializedViewRule builds on the ideas presented in the
>> paper[2], which does not talk much about outer-join rewriting. If you want
>> to support outer join, you can try to use
>> MaterializedViewSubstitutionVisitor.
>>
>>
>>
>>
>> [1]
>> https://calcite.apache.org/docs/materialized_views.html#union-rewriting.
>> [2] https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.95.113
>>
>> Best,
>> Chunwei
>>
>>
>> On Tue, Nov 23, 2021 at 3:00 PM hongkang jiang <jh...@gmail.com>
>> wrote:
>>
>> > Hello everyone,
>> > I have a question about that Calcite does not support outer join in
>> > materialized view. I have been thinking for a long time and still
>> haven't
>> > figured it out. Could anyone help me answer the reason? Thanks very
>> much.
>> > I also found in Calcite's materialization a annotation like that
>> Currently
>> > we only support tablescan-project-filter-inner Join , And the method
>> > MaterializedViewRule. IsValidRelNodePlan () will filter out the outer
>> join.
>> >
>>
>
>
> --
> Best,
> Hongkang.
>

Re: Why calcite does not support outer join in materialized view

Posted by hongkang jiang <jh...@gmail.com>.
Hi,  Chunwei.

Thank you very much for your reply and I read it carefully. Then I tried
running a test in the MaterializedViewSubstitutionVisitorTest unit test
class.
I expected it to rewrite successfully, but not. The test is as follows:

@Test void test() {
  String mv = ""
      + "select \"emps\".\"empid\", \"emps\".\"deptno\",
\"depts\".\"deptno\" from\n"
      + "\"hr\".\"emps\" left join \"hr\".\"depts\"\n"
      + "on \"emps\".\"deptno\" = \"depts\".\"deptno\"\n"
      + "where \"emps\".\"deptno\" > 10";
  String query = ""
      + "select \"emps\".\"empid\", \"emps\".\"deptno\",
\"depts\".\"deptno\" from\n"
      + "\"hr\".\"emps\" left join \"hr\".\"depts\"\n"
      + "on \"emps\".\"deptno\" = \"depts\".\"deptno\"\n"
      + "where \"emps\".\"deptno\" > 20";
  sql(mv, query).ok();
}

Next, I will read the source code to find out why it is not supported. If
possible, I will support out of join queries in materialization view in the
next month.


On Tue, Nov 23, 2021 at 4:09 PM Chunwei Lei <ch...@gmail.com> wrote:

> Hi, Hongkang.
>
> Calcite has two ways to do query-rewriting, namely substitution, and
> rules[1]. MaterializedViewRule builds on the ideas presented in the
> paper[2], which does not talk much about outer-join rewriting. If you want
> to support outer join, you can try to use
> MaterializedViewSubstitutionVisitor.
>
>
>
>
> [1]
> https://calcite.apache.org/docs/materialized_views.html#union-rewriting.
> [2] https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.95.113
>
> Best,
> Chunwei
>
>
> On Tue, Nov 23, 2021 at 3:00 PM hongkang jiang <jh...@gmail.com>
> wrote:
>
> > Hello everyone,
> > I have a question about that Calcite does not support outer join in
> > materialized view. I have been thinking for a long time and still haven't
> > figured it out. Could anyone help me answer the reason? Thanks very much.
> > I also found in Calcite's materialization a annotation like that
> Currently
> > we only support tablescan-project-filter-inner Join , And the method
> > MaterializedViewRule. IsValidRelNodePlan () will filter out the outer
> join.
> >
>


-- 
Best,
Hongkang.

Re: Why calcite does not support outer join in materialized view

Posted by Chunwei Lei <ch...@gmail.com>.
Hi, Hongkang.

Calcite has two ways to do query-rewriting, namely substitution, and
rules[1]. MaterializedViewRule builds on the ideas presented in the
paper[2], which does not talk much about outer-join rewriting. If you want
to support outer join, you can try to use
MaterializedViewSubstitutionVisitor.




[1] https://calcite.apache.org/docs/materialized_views.html#union-rewriting.
[2] https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.95.113

Best,
Chunwei


On Tue, Nov 23, 2021 at 3:00 PM hongkang jiang <jh...@gmail.com> wrote:

> Hello everyone,
> I have a question about that Calcite does not support outer join in
> materialized view. I have been thinking for a long time and still haven't
> figured it out. Could anyone help me answer the reason? Thanks very much.
> I also found in Calcite's materialization a annotation like that Currently
> we only support tablescan-project-filter-inner Join , And the method
> MaterializedViewRule. IsValidRelNodePlan () will filter out the outer join.
>