You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@calcite.apache.org by Xiangwei Wei <wx...@gmail.com> on 2020/03/05 05:43:46 UTC

Why can't RexLiteral.getValue2() get a double/float value?

In RexLiteral.getValue2(), it treats Decimal just by `return
getValueAs(Long.class);`.
In this instance, we can't get a correct double/float value because it's
considered as Decimal type here. Is this a problem or is there a reason
here?

-- 
Best,
Xiangwei Wei

Re: Why can't RexLiteral.getValue2() get a double/float value?

Posted by Xiangwei Wei <wx...@gmail.com>.
Thank you. I will try that.

Scott Reynolds <sd...@gmail.com> 于2020年3月6日周五 上午12:42写道:

> Use a switch Statement on literal.getTypeName(). Then for each SqlTypeName,
> call literal.getValueAs() with the appropriate java class type.
>
> Been meaning to update the Cassandra Adapter for this as well:
>
> https://github.com/apache/calcite/blob/master/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraFilter.java#L182
>
> On Thu, Mar 5, 2020 at 7:41 AM Xiangwei Wei <wx...@gmail.com> wrote:
>
> > Maybe I don't express myself clearly. If I input a literal 1.23, I just
> > want to get 1.23 whatever its type is, but the getValue2() returns 123 AS
> > long. Is the only way to judge its type before and invoke
> > literal.getValueAs(Double.class)?
> >
> > Danny Chan <yu...@gmail.com> 于2020年3月5日周四 下午10:20写道:
> >
> > > Literal actually does not have a exact data type, 1.23 can be both
> float
> > or
> > > decimal, in order not to lose precision,we represent it as decimal
> > > internal.
> > >
> > > Xiangwei Wei <wx...@gmail.com>于2020年3月5日 周四下午5:09写道:
> > >
> > > > Thank you for reply. What I want is a getValue() method which returns
> > > > exactly the value of literal based on its type. You are right that I
> > can
> > > > use literal.getValueAs(Double.class) to get a Double value, but maybe
> > > it's
> > > > better to provide a method like what I say. What do you think?
> > > >
> > > > Julian Hyde <jh...@apache.org> 于2020年3月5日周四 下午2:20写道:
> > > >
> > > > > As the java doc says, RexLiteral.getValue2 returns values in the
> form
> > > > that
> > > > > the calculator builder needs them. That may not be the form that
> you
> > > need
> > > > > them. In which case, don’t use that method.
> > > > >
> > > > > If you want a Double, have you tried
> > literal.getValueAs(Double.class)?
> > > > >
> > > > > (We don’t tend to use Float and Double much because when we’re
> > > compiling
> > > > > queries we can’t afford any loss of precision. If the user typed
> 1.1
> > we
> > > > > want exactly 1.1, whereas Decimal might be something like
> > > > 1.000000000987.)
> > > > >
> > > > > > On Mar 4, 2020, at 9:43 PM, Xiangwei Wei <wx...@gmail.com>
> > > > wrote:
> > > > > >
> > > > > > In RexLiteral.getValue2(), it treats Decimal just by `return
> > > > > > getValueAs(Long.class);`.
> > > > > > In this instance, we can't get a correct double/float value
> because
> > > > it's
> > > > > > considered as Decimal type here. Is this a problem or is there a
> > > reason
> > > > > > here?
> > > > > >
> > > > > > --
> > > > > > Best,
> > > > > > Xiangwei Wei
> > > > >
> > > > >
> > > >
> > > > --
> > > > Best,
> > > > Xiangwei Wei
> > > >
> > >
> >
> >
> > --
> > Best,
> > Xiangwei Wei
> >
>


-- 
Best,
Xiangwei Wei

Re: Why can't RexLiteral.getValue2() get a double/float value?

Posted by Scott Reynolds <sd...@gmail.com>.
Use a switch Statement on literal.getTypeName(). Then for each SqlTypeName,
call literal.getValueAs() with the appropriate java class type.

Been meaning to update the Cassandra Adapter for this as well:
https://github.com/apache/calcite/blob/master/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraFilter.java#L182

On Thu, Mar 5, 2020 at 7:41 AM Xiangwei Wei <wx...@gmail.com> wrote:

> Maybe I don't express myself clearly. If I input a literal 1.23, I just
> want to get 1.23 whatever its type is, but the getValue2() returns 123 AS
> long. Is the only way to judge its type before and invoke
> literal.getValueAs(Double.class)?
>
> Danny Chan <yu...@gmail.com> 于2020年3月5日周四 下午10:20写道:
>
> > Literal actually does not have a exact data type, 1.23 can be both float
> or
> > decimal, in order not to lose precision,we represent it as decimal
> > internal.
> >
> > Xiangwei Wei <wx...@gmail.com>于2020年3月5日 周四下午5:09写道:
> >
> > > Thank you for reply. What I want is a getValue() method which returns
> > > exactly the value of literal based on its type. You are right that I
> can
> > > use literal.getValueAs(Double.class) to get a Double value, but maybe
> > it's
> > > better to provide a method like what I say. What do you think?
> > >
> > > Julian Hyde <jh...@apache.org> 于2020年3月5日周四 下午2:20写道:
> > >
> > > > As the java doc says, RexLiteral.getValue2 returns values in the form
> > > that
> > > > the calculator builder needs them. That may not be the form that you
> > need
> > > > them. In which case, don’t use that method.
> > > >
> > > > If you want a Double, have you tried
> literal.getValueAs(Double.class)?
> > > >
> > > > (We don’t tend to use Float and Double much because when we’re
> > compiling
> > > > queries we can’t afford any loss of precision. If the user typed 1.1
> we
> > > > want exactly 1.1, whereas Decimal might be something like
> > > 1.000000000987.)
> > > >
> > > > > On Mar 4, 2020, at 9:43 PM, Xiangwei Wei <wx...@gmail.com>
> > > wrote:
> > > > >
> > > > > In RexLiteral.getValue2(), it treats Decimal just by `return
> > > > > getValueAs(Long.class);`.
> > > > > In this instance, we can't get a correct double/float value because
> > > it's
> > > > > considered as Decimal type here. Is this a problem or is there a
> > reason
> > > > > here?
> > > > >
> > > > > --
> > > > > Best,
> > > > > Xiangwei Wei
> > > >
> > > >
> > >
> > > --
> > > Best,
> > > Xiangwei Wei
> > >
> >
>
>
> --
> Best,
> Xiangwei Wei
>

Re: Why can't RexLiteral.getValue2() get a double/float value?

Posted by Xiangwei Wei <wx...@gmail.com>.
Maybe I don't express myself clearly. If I input a literal 1.23, I just
want to get 1.23 whatever its type is, but the getValue2() returns 123 AS
long. Is the only way to judge its type before and invoke
literal.getValueAs(Double.class)?

Danny Chan <yu...@gmail.com> 于2020年3月5日周四 下午10:20写道:

> Literal actually does not have a exact data type, 1.23 can be both float or
> decimal, in order not to lose precision,we represent it as decimal
> internal.
>
> Xiangwei Wei <wx...@gmail.com>于2020年3月5日 周四下午5:09写道:
>
> > Thank you for reply. What I want is a getValue() method which returns
> > exactly the value of literal based on its type. You are right that I can
> > use literal.getValueAs(Double.class) to get a Double value, but maybe
> it's
> > better to provide a method like what I say. What do you think?
> >
> > Julian Hyde <jh...@apache.org> 于2020年3月5日周四 下午2:20写道:
> >
> > > As the java doc says, RexLiteral.getValue2 returns values in the form
> > that
> > > the calculator builder needs them. That may not be the form that you
> need
> > > them. In which case, don’t use that method.
> > >
> > > If you want a Double, have you tried literal.getValueAs(Double.class)?
> > >
> > > (We don’t tend to use Float and Double much because when we’re
> compiling
> > > queries we can’t afford any loss of precision. If the user typed 1.1 we
> > > want exactly 1.1, whereas Decimal might be something like
> > 1.000000000987.)
> > >
> > > > On Mar 4, 2020, at 9:43 PM, Xiangwei Wei <wx...@gmail.com>
> > wrote:
> > > >
> > > > In RexLiteral.getValue2(), it treats Decimal just by `return
> > > > getValueAs(Long.class);`.
> > > > In this instance, we can't get a correct double/float value because
> > it's
> > > > considered as Decimal type here. Is this a problem or is there a
> reason
> > > > here?
> > > >
> > > > --
> > > > Best,
> > > > Xiangwei Wei
> > >
> > >
> >
> > --
> > Best,
> > Xiangwei Wei
> >
>


-- 
Best,
Xiangwei Wei

Re: Why can't RexLiteral.getValue2() get a double/float value?

Posted by Danny Chan <yu...@gmail.com>.
Literal actually does not have a exact data type, 1.23 can be both float or
decimal, in order not to lose precision,we represent it as decimal internal.

Xiangwei Wei <wx...@gmail.com>于2020年3月5日 周四下午5:09写道:

> Thank you for reply. What I want is a getValue() method which returns
> exactly the value of literal based on its type. You are right that I can
> use literal.getValueAs(Double.class) to get a Double value, but maybe it's
> better to provide a method like what I say. What do you think?
>
> Julian Hyde <jh...@apache.org> 于2020年3月5日周四 下午2:20写道:
>
> > As the java doc says, RexLiteral.getValue2 returns values in the form
> that
> > the calculator builder needs them. That may not be the form that you need
> > them. In which case, don’t use that method.
> >
> > If you want a Double, have you tried literal.getValueAs(Double.class)?
> >
> > (We don’t tend to use Float and Double much because when we’re compiling
> > queries we can’t afford any loss of precision. If the user typed 1.1 we
> > want exactly 1.1, whereas Decimal might be something like
> 1.000000000987.)
> >
> > > On Mar 4, 2020, at 9:43 PM, Xiangwei Wei <wx...@gmail.com>
> wrote:
> > >
> > > In RexLiteral.getValue2(), it treats Decimal just by `return
> > > getValueAs(Long.class);`.
> > > In this instance, we can't get a correct double/float value because
> it's
> > > considered as Decimal type here. Is this a problem or is there a reason
> > > here?
> > >
> > > --
> > > Best,
> > > Xiangwei Wei
> >
> >
>
> --
> Best,
> Xiangwei Wei
>

Re: Why can't RexLiteral.getValue2() get a double/float value?

Posted by Xiangwei Wei <wx...@gmail.com>.
Thank you for reply. What I want is a getValue() method which returns
exactly the value of literal based on its type. You are right that I can
use literal.getValueAs(Double.class) to get a Double value, but maybe it's
better to provide a method like what I say. What do you think?

Julian Hyde <jh...@apache.org> 于2020年3月5日周四 下午2:20写道:

> As the java doc says, RexLiteral.getValue2 returns values in the form that
> the calculator builder needs them. That may not be the form that you need
> them. In which case, don’t use that method.
>
> If you want a Double, have you tried literal.getValueAs(Double.class)?
>
> (We don’t tend to use Float and Double much because when we’re compiling
> queries we can’t afford any loss of precision. If the user typed 1.1 we
> want exactly 1.1, whereas Decimal might be something like 1.000000000987.)
>
> > On Mar 4, 2020, at 9:43 PM, Xiangwei Wei <wx...@gmail.com> wrote:
> >
> > In RexLiteral.getValue2(), it treats Decimal just by `return
> > getValueAs(Long.class);`.
> > In this instance, we can't get a correct double/float value because it's
> > considered as Decimal type here. Is this a problem or is there a reason
> > here?
> >
> > --
> > Best,
> > Xiangwei Wei
>
>

-- 
Best,
Xiangwei Wei

Re: Why can't RexLiteral.getValue2() get a double/float value?

Posted by Julian Hyde <jh...@apache.org>.
As the java doc says, RexLiteral.getValue2 returns values in the form that the calculator builder needs them. That may not be the form that you need them. In which case, don’t use that method.

If you want a Double, have you tried literal.getValueAs(Double.class)?

(We don’t tend to use Float and Double much because when we’re compiling queries we can’t afford any loss of precision. If the user typed 1.1 we want exactly 1.1, whereas Decimal might be something like 1.000000000987.)

> On Mar 4, 2020, at 9:43 PM, Xiangwei Wei <wx...@gmail.com> wrote:
> 
> In RexLiteral.getValue2(), it treats Decimal just by `return
> getValueAs(Long.class);`.
> In this instance, we can't get a correct double/float value because it's
> considered as Decimal type here. Is this a problem or is there a reason
> here?
> 
> -- 
> Best,
> Xiangwei Wei