Thanks Julian.

My original idea is moving all input refs to the left to the comparison
operator and moving constants to the right.  for example,   variable1 >=
variable2 + monthDiff(20210801, 20210101)

results variable1 - variable2 >= monthDiff(20210801, 20210101) = 7.



Julian Hyde <jhyde.apa...@gmail.com> 于2021年7月31日周六 上午6:55写道:

> Calcite doesn’t transform
>
>   a + b = c” to “a = c - b
>
> for good reason… someone would also want to transform
>
>   a - b = c” to “a = c + b
>
> and the two transforms would cycle.
>
> To put it another way: Calcite’s expression simplification is not
> smart/powerful enough to do theorem proving. Our rule of thumb is that
> simplification rules must convert to something simpler. If it’s equivalent
> but not (by some measure) simpler, we don’t do it.
>
> That said, I think there’s a way we could handle your case. We could have
> a rule that recognizes
>
>   variable1 - constant1 = constant2
>
> and converts to
>
>   variable1 = constant2 + constant1
>
> (which matches your date_sub case). If someone were to add a rule that
> recognizes
>
> variable1 + constant1 = constant2
>
> and converts to
>
>   variable1 = constant2 + constant1
>
> it wouldn’t form a cycle.
>
> Can you please add a JIRA case for this? You should cover all forms of
> “+”: arithmetic plus, DATETIME_PLUS (e.g. date + interval), and interval +
> interval.
>
> One thing to watch out for (and test carefully) is arithmetic near the
> limits of data types. If a, b and c are SQL INTEGER values then “a + b = c”
> is always equivalent to “a = c - b”, but I don’t  think that’s the case if
> they are DOUBLE values.
>
> By the way, I am working on making RexSimplifier more pluggable (via a new
> interface RexRule) [1] and this would be a nice implementation of RexRule.
>
> Julian
>
> [1] https://issues.apache.org/jira/browse/CALCITE-4559
>
>
> > On Jul 29, 2021, at 1:58 AM, Yanjing Wang <zhuangzixiao...@gmail.com>
> wrote:
> >
> > Hi, guys
> >  I have a scenario to calculate the input ref in an expression, for
> > example:
> >  date_sub(dt, 1) = '2021-07-29' to dt = date_add('2021-07-29', 1)
> >  thus I can conclude that dt =  '2021-07-30'.
> >
> >  I start from the most simplest form dt + 1 = 3. but it can't be
> > simplified or reduced.
> >  I tried dt = 3 - 1 and it can be reduced to dt = 2.
> >  I wonder if I can transform dt + 1 = 3 to dt = 3 - 1, the dt will be
> > calculated.
> >
> >  So I think if we need a transformation rule to implement this kind of
> > commute for expression,
> >  or we have other existing solution.
> >
> >  Thanks for any suggestions.
>
>

Reply via email to