Il mer 25 set 2019, 23:38 Stamatis Zampetakis <zabe...@gmail.com> ha
scritto:

> Hi Enrico,
>
> The ReduceExpressionsRule.FILTER_INSTANCE is using the simplifier so if it
> works
> correctly I don't think there is anything more to be done.
>

Fine.

Cheers
Enrico

>
> Best,
> Stamatis
>
> On Wed, Sep 25, 2019 at 5:31 PM Enrico Olivelli <eolive...@gmail.com>
> wrote:
>
> > Thank you for your feedback.
> >
> > Actually ReduceExpressionsRule.FILTER_INSTANCE fixes the problem.
> >
> > RelOptPlanner optPlanner = cluster.getPlanner();
> > optPlanner.addRule(ReduceExpressionsRule.FILTER_INSTANCE);
> >
> > This code I had was wrong:
> >  final FrameworkConfig config = Frameworks.newConfigBuilder()
> >                 .parserConfig(SQL_PARSER_CONFIG)
> >                 .defaultSchema(subSchema)
> >                 .traitDefs(TRAITS)
> >                 .programs(Programs.ofRules(Programs.RULE_SET))
> >                 .build();
> >
> > as the 'programs' property of FrameworkConfig is applied only if you are
> > using Planner#transform .
> >
> > @Julian do I have to create a JIRA case for RexSimplify ? Honestly I
> don't
> > have enough knowledge to explain the problem and create a meaning full
> > issue.
> >
> > Is it work to add ReduceExpressionsRule.FILTER_INSTANCE to the default
> > rules ?
> >
> > As far as I can see the "default rules" are in CalcitePrepareImpl, is
> that
> > correct?
> >
> >
> > Cheers
> > Enrico
> >
> >
> > Il giorno mar 24 set 2019 alle ore 20:01 Julian Hyde <jh...@apache.org>
> ha
> > scritto:
> >
> > > A few thoughts on this.
> > >
> > >
> > > 0. I am surprised that this simplification does not happen, and I think
> > we
> > > should do it. Specifically, "filter(x = 0 and x is not null)" should
> > > simplify to “filter(x = 0)”.
> > >
> > > 1. Enrico, please log a JIRA case now, and transcribe the key points of
> > > this discussion into the JIRA case when the discussion has finished.
> > >
> > > 2. The most obvious way to achieve this is via simplification, i.e.
> > > RexSimplify, which occurs when building expressions via RelBuilder. It
> > does
> > > not require planner rules.
> > >
> > > 3. An algorithm to achieve this would be to gather the implied
> predicates
> > > as we go through a conjunction. After generating the condition “x = 0”
> we
> > > arrive at “x is not null”. We know that “x = 0” holds, therefore we
> could
> > > also deduce that “x is not null” holds (we could also deduce other
> > > conditions, such as “x < 100” holds).
> > >
> > > 4. Another way to achieve this is via
> > > ReduceExpressionsRule.FILTER_INSTANCE. The algorithm would be as
> follows.
> > > First note the condition “x = 0” and therefore constant-reduce x to 0
> in
> > > the expression “0 is not null”. This algorithm has similar problems to
> > the
> > > algorithm in 2 - it passes along the conjunctive predicates in strict
> > order
> > > and therefore only works if they are in a particular order. Also, as a
> > > planner rule, this algorithm is more expensive, so would not be applied
> > as
> > > early/often as the RexSimplify implementation.
> > >
> > > 5. We could also simplify “filter(x is not null and x = 0)” to
> “filter(x
> > =
> > > 0)”, and people would reasonably expect that we would. But that is a
> more
> > > complex algorithm because it would require, for instance, re-ordering
> > > predicates. In the past, we have discussed re-ordering predicates as
> part
> > > of simplification; I am cautious about doing it because it would
> affect a
> > > lot of existing plans (and tests). There is no perfect order for
> > > predicates, so we might come back in 6 months and want to change the
> > order
> > > again. Better to sort them during simplification but then spit them out
> > in
> > > the original order.
> > >
> > > Julian
> > >
> > >
> > >
> > > > On Sep 24, 2019, at 8:34 AM, Enrico Olivelli <eolive...@gmail.com>
> > > wrote:
> > > >
> > > > Il giorno mar 24 set 2019 alle ore 13:45 XING JIN <
> > > jinxing.co...@gmail.com <mailto:jinxing.co...@gmail.com>>
> > > > ha scritto:
> > > >
> > > >> "v = 1 and v is null"
> > > >> cannot be simplified to "v = 1" not matter v is nullable or not
> > nullable
> > > >>
> > > >> If you really mean that "v is not null", I made below test case in
> > > >> RelOptRulesTest.java for illustration:
> > > >>
> > > >>
> > > >> // mgr is nullable
> > > >>  @Test public void testDEV() throws Exception {
> > > >>    HepProgram program = new HepProgramBuilder()
> > > >>      .addRuleInstance(ReduceExpressionsRule.FILTER_INSTANCE)
> > > >>      .build();
> > > >>
> > > >>    final String sql = "select deptno"
> > > >>      + " from emp"
> > > >>      + " where mgr = 10 and mgr is not null";
> > > >>    checkPlanning(new HepPlanner(program), sql);
> > > >>  }
> > > >>
> > > >> The plan is
> > > >> LogicalProject(DEPTNO=[$7])
> > > >>  LogicalFilter(condition=[=($3, 10)])
> > > >>    LogicalTableScan(table=[[CATALOG, SALES, EMP]])
> > > >>
> > > >> Enrico ~ you may try ReduceExpressionsRule.FILTER_INSTANCE
> > > >>
> > > >
> > > >
> > > > @XING JIN
> > > > thank you.
> > > > I am with Calcite 1.19 and VolcanoPlanner
> > > >
> > > > Original query:
> > > >
> > > > select * from pippo where n1 is null AND n1 is not null
> > > >
> > > > Logical plan:
> > > >
> > > > LogicalFilter(condition=[AND(IS NULL($1), IS NOT NULL($1))]):
> rowcount
> > =
> > > > 1.35, cumulative cost = {7.35 rows, 13.0 cpu, 0.0 io}, id = 48
> > > >
> > > >    EnumerableTableScan(table=[[herd, pippo]]): rowcount = 6.0,
> > cumulative
> > > > cost = {6.0 rows, 7.0 cpu, 0.0 io}, id = 47
> > > >
> > > > Final Plan:
> > > >
> > > > BindableTableScan(table=[[herd, pippo]], filters=[[AND(IS NULL($1),
> IS
> > > NOT
> > > > NULL($1))]]): rowcount = 6.0, cumulative cost = {0.03 rows, 0.035
> cpu,
> > > 0.0
> > > > io}, id = 59
> > > >
> > > >
> > > > It seems that ReduceExpressionsRule.FILTER_INSTANCE does not have any
> > > > effect.
> > > > May it be a problem of 1.19 or VolcanoPlanner ?
> > > >
> > > > This is my "program" now:
> > > >
> > > > public static final ImmutableSet<RelOptRule> RULE_SET =
> > > >      ImmutableSet.of(
> > > >          EnumerableRules.ENUMERABLE_JOIN_RULE,
> > > >          EnumerableRules.ENUMERABLE_MERGE_JOIN_RULE,
> > > >          EnumerableRules.ENUMERABLE_SEMI_JOIN_RULE,
> > > >          EnumerableRules.ENUMERABLE_CORRELATE_RULE,
> > > >          EnumerableRules.ENUMERABLE_PROJECT_RULE,
> > > >          EnumerableRules.ENUMERABLE_FILTER_RULE,
> > > >          EnumerableRules.ENUMERABLE_AGGREGATE_RULE,
> > > >          EnumerableRules.ENUMERABLE_SORT_RULE,
> > > >          EnumerableRules.ENUMERABLE_LIMIT_RULE,
> > > >          EnumerableRules.ENUMERABLE_UNION_RULE,
> > > >          EnumerableRules.ENUMERABLE_INTERSECT_RULE,
> > > >          EnumerableRules.ENUMERABLE_MINUS_RULE,
> > > >          EnumerableRules.ENUMERABLE_TABLE_MODIFICATION_RULE,
> > > >          EnumerableRules.ENUMERABLE_VALUES_RULE,
> > > >          EnumerableRules.ENUMERABLE_WINDOW_RULE,
> > > >          SemiJoinRule.PROJECT,
> > > >          SemiJoinRule.JOIN,
> > > >          TableScanRule.INSTANCE,
> > > >          CalciteSystemProperty.COMMUTE.value()
> > > >              ? JoinAssociateRule.INSTANCE
> > > >              : ProjectMergeRule.INSTANCE,
> > > >          AggregateStarTableRule.INSTANCE,
> > > >          AggregateStarTableRule.INSTANCE2,
> > > >          FilterTableScanRule.INSTANCE,
> > > >          FilterProjectTransposeRule.INSTANCE,
> > > >          FilterJoinRule.FILTER_ON_JOIN,
> > > >          AggregateExpandDistinctAggregatesRule.INSTANCE,
> > > >          AggregateReduceFunctionsRule.INSTANCE,
> > > >          FilterAggregateTransposeRule.INSTANCE,
> > > >          JoinCommuteRule.INSTANCE,
> > > >          JoinPushThroughJoinRule.RIGHT,
> > > >          JoinPushThroughJoinRule.LEFT,
> > > >          SortProjectTransposeRule.INSTANCE,
> > > >          ReduceExpressionsRule.FILTER_INSTANCE);    <------ HERE
> > > >
> > > > Enrico
> > > >
> > > >
> > > >
> > > >>
> > > >> Feng Zhu <wellfeng...@gmail.com> 于2019年9月24日周二 下午5:50写道:
> > > >>
> > > >>> Hi, Enrico,
> > > >>> I'm a little confused about your expectations. Could you clarify
> it?
> > > >>> Moreover, is it right for the below simplification (do you mean v
> is
> > > not
> > > >>> null)?
> > > >>> (v=1 and v is null) -> v=1
> > > >>> (do you mean v is not null?)
> > > >>>
> > > >>> Best regards
> > > >>>
> > > >>> Enrico Olivelli <eolive...@gmail.com> 于2019年9月24日周二 下午5:41写道:
> > > >>>
> > > >>>> Hi,
> > > >>>> I have a query like
> > > >>>> SELECT * FROM MYTABLE WHERE v = 1 and v is null
> > > >>>>
> > > >>>> I am expecting Calcite to simplify it to
> > > >>>> SELECT * FROM MYTABLE WHERE v = 1
> > > >>>>
> > > >>>> but this does not happen.
> > > >>>>
> > > >>>> Is any rule I should enable in order to make it happen ?
> > > >>>>
> > > >>>> This is the configuration of my Volcano planner:
> > > >>>>
> > > >>>>  final FrameworkConfig config = Frameworks.newConfigBuilder()
> > > >>>>                .parserConfig(....)
> > > >>>>                .defaultSchema(...)
> > > >>>>                .traitDefs(....)
> > > >>>>                .programs(Programs.ofRules(Programs.RULE_SET))
> > > >>>>                .build();
> > > >>>>
> > > >>>> Best regards
> > > >>>> Enrico
> > >
> > >
> >
>

Reply via email to