public class RexLiteral extends RexNode
There are several methods for creating literals in RexBuilder
:
RexBuilder.makeLiteral(boolean)
and so forth.
How is the value stored? In that respect, the class is somewhat of a black
box. There is a getValue()
method which returns the value as an
object, but the type of that value is implementation detail, and it is best
that your code does not depend upon that knowledge. It is better to use
task-oriented methods such as getValue2()
and
toJavaString(java.lang.Comparable, org.apache.calcite.sql.type.SqlTypeName, org.apache.calcite.rel.type.RelDataType, org.apache.calcite.rex.RexDigestIncludeType)
.
The allowable types and combinations are:
TypeName | Meaning | Value type |
---|---|---|
SqlTypeName.NULL |
The null value. It has its own special type. | null |
SqlTypeName.BOOLEAN |
Boolean, namely TRUE , FALSE or
UNKNOWN . |
Boolean , or null represents the UNKNOWN value |
SqlTypeName.DECIMAL |
Exact number, for example 0 , -.5 ,
12345 . |
BigDecimal |
SqlTypeName.DOUBLE |
Approximate number, for example 6.023E-23 . |
BigDecimal |
SqlTypeName.DATE |
Date, for example DATE '1969-04'29' |
Calendar ;
also Calendar (UTC time zone)
and Integer (days since POSIX epoch) |
SqlTypeName.TIME |
Time, for example TIME '18:37:42.567' |
Calendar ;
also Calendar (UTC time zone)
and Integer (milliseconds since midnight) |
SqlTypeName.TIMESTAMP |
Timestamp, for example TIMESTAMP '1969-04-29
18:37:42.567' |
TimestampString ;
also Calendar (UTC time zone)
and Long (milliseconds since POSIX epoch) |
SqlTypeName.INTERVAL_DAY ,
SqlTypeName.INTERVAL_DAY_HOUR ,
SqlTypeName.INTERVAL_DAY_MINUTE ,
SqlTypeName.INTERVAL_DAY_SECOND ,
SqlTypeName.INTERVAL_HOUR ,
SqlTypeName.INTERVAL_HOUR_MINUTE ,
SqlTypeName.INTERVAL_HOUR_SECOND ,
SqlTypeName.INTERVAL_MINUTE ,
SqlTypeName.INTERVAL_MINUTE_SECOND ,
SqlTypeName.INTERVAL_SECOND |
Interval, for example INTERVAL '4:3:2' HOUR TO SECOND |
BigDecimal ;
also Long (milliseconds) |
SqlTypeName.INTERVAL_YEAR ,
SqlTypeName.INTERVAL_YEAR_MONTH ,
SqlTypeName.INTERVAL_MONTH |
Interval, for example INTERVAL '2-3' YEAR TO MONTH |
BigDecimal ;
also Integer (months) |
SqlTypeName.CHAR |
Character constant, for example 'Hello, world!' ,
'' , _N'Bonjour' , _ISO-8859-1'It''s superman!'
COLLATE SHIFT_JIS$ja_JP$2 . These are always CHAR, never VARCHAR. |
NlsString ;
also String |
SqlTypeName.BINARY |
Binary constant, for example X'7F34' . (The number of hexits
must be even; see above.) These constants are always BINARY, never
VARBINARY. |
ByteBuffer ;
also byte[] |
SqlTypeName.SYMBOL |
A symbol is a special type used to make parsing easier; it is not part of
the SQL standard, and is not exposed to end-users. It is used to hold a flag,
such as the LEADING flag in a call to the function
TRIM([LEADING|TRAILING|BOTH] chars FROM string) . |
An enum class |
Modifier and Type | Field and Description |
---|---|
private static com.google.common.collect.ImmutableList<org.apache.calcite.avatica.util.TimeUnit> |
TIME_UNITS |
private RelDataType |
type
The real type of this literal, as reported by
getType() . |
private SqlTypeName |
typeName
An indication of the broad type of this literal -- even if its type isn't
a SQL type.
|
private java.lang.Comparable |
value
The value of this literal.
|
Constructor and Description |
---|
RexLiteral(java.lang.Comparable value,
RelDataType type,
SqlTypeName typeName)
Creates a
RexLiteral . |
Modifier and Type | Method and Description |
---|---|
<R,P> R |
accept(RexBiVisitor<R,P> visitor,
P arg)
Accepts a visitor with a payload, dispatching to the right overloaded
RexBiVisitor.visitInputRef(RexInputRef, Object) visitXxx} method. |
<R> R |
accept(RexVisitor<R> visitor)
Accepts a visitor, dispatching to the right overloaded
visitXxx method. |
private static void |
appendAsJava(java.lang.Comparable value,
java.lang.Appendable destination,
SqlTypeName typeName,
boolean java,
RexDigestIncludeType includeType)
Appends the specified value in the provided destination as a Java string.
|
static boolean |
booleanValue(RexNode node) |
java.lang.String |
computeDigest(RexDigestIncludeType includeType)
Returns a string which concisely describes the definition of this
rex literal.
|
(package private) RexDigestIncludeType |
digestIncludesType()
Returns true if
RexDigestIncludeType.OPTIONAL digest would include data type. |
boolean |
equals(java.lang.Object obj) |
private static boolean |
equals(java.lang.Object o1,
java.lang.Object o2) |
private static java.lang.Comparable |
findValue(RexNode node) |
static RexLiteral |
fromJdbcString(RelDataType type,
SqlTypeName typeName,
java.lang.String literal)
Converts a Jdbc string into a RexLiteral.
|
private static java.lang.String |
getCalendarFormat(SqlTypeName typeName) |
SqlKind |
getKind()
Returns the kind of node this is.
|
private static java.util.List<org.apache.calcite.avatica.util.TimeUnit> |
getTimeUnits(SqlTypeName typeName)
Returns a list of the time units covered by an interval type such
as HOUR TO SECOND.
|
RelDataType |
getType() |
SqlTypeName |
getTypeName() |
java.lang.Comparable |
getValue()
Returns the value of this literal.
|
java.lang.Object |
getValue2()
Returns the value of this literal, in the form that the calculator
program builder wants it.
|
java.lang.Object |
getValue3()
Returns the value of this literal, in the form that the rex-to-lix
translator wants it.
|
java.lang.Comparable |
getValue4()
Returns the value of this literal, in the form that
RexInterpreter
wants it. |
<T> T |
getValueAs(java.lang.Class<T> clazz)
Returns the value of this literal as an instance of the specified class.
|
int |
hashCode() |
private java.lang.String |
intervalString(java.math.BigDecimal v) |
static int |
intValue(RexNode node) |
boolean |
isAlwaysFalse()
Returns whether this expression always returns false.
|
boolean |
isAlwaysTrue()
Returns whether this expression always returns true.
|
boolean |
isNull()
Returns whether this literal's value is null.
|
static boolean |
isNullLiteral(RexNode node) |
private static void |
pad(java.lang.StringBuilder b,
java.lang.String s,
int width) |
void |
printAsJava(java.io.PrintWriter pw)
Prints the value this literal as a Java string constant.
|
private static RexDigestIncludeType |
shouldIncludeType(java.lang.Comparable value,
RelDataType type)
Computes if data type can be omitted from the digset.
|
static java.lang.String |
stringValue(RexNode node) |
private static java.lang.String |
toJavaString(java.lang.Comparable value,
SqlTypeName typeName,
RelDataType type,
RexDigestIncludeType includeType) |
static boolean |
validConstant(java.lang.Object o,
Litmus litmus)
Returns whether a value is valid as a constant value, using the same
criteria as
valueMatchesType(java.lang.Comparable, org.apache.calcite.sql.type.SqlTypeName, boolean) . |
static java.lang.Comparable |
value(RexNode node) |
static boolean |
valueMatchesType(java.lang.Comparable value,
SqlTypeName typeName,
boolean strict) |
private static int |
width(org.apache.calcite.avatica.util.TimeUnit timeUnit) |
private final java.lang.Comparable value
valueMatchesType(java.lang.Comparable, org.apache.calcite.sql.type.SqlTypeName, boolean)
. For example, you can't store an
Integer
value here just because you feel like it -- all numbers are
represented by a BigDecimal
. But since this field is private, it
doesn't really matter how the values are stored.private final RelDataType type
getType()
.private final SqlTypeName typeName
SqlTypeName.DECIMAL
. See valueMatchesType(java.lang.Comparable, org.apache.calcite.sql.type.SqlTypeName, boolean)
for the
definitive story.private static final com.google.common.collect.ImmutableList<org.apache.calcite.avatica.util.TimeUnit> TIME_UNITS
RexLiteral(java.lang.Comparable value, RelDataType type, SqlTypeName typeName)
RexLiteral
.public final java.lang.String computeDigest(RexDigestIncludeType includeType)
The digest does not contain the expression's identity, but does include the identity of children.
Technically speaking 1:INT differs from 1:FLOAT, so we need data type in the literal's
digest, however we want to avoid extra verbosity of the RelOptNode.getDigest()
for
readability purposes, so we omit type info in certain cases.
For instance, 1:INT becomes 1 (INT is implied by default), however 1:BIGINT always holds
the type
Here's a non-exhaustive list of the "well known cases":
RexCall.computeDigest(boolean)
For instance: =(true. null) means null is BOOL. =($0, null) means the type
of null matches the type of $0.
includeType
- whether the digest should include type or notRexDigestIncludeType digestIncludesType()
RexDigestIncludeType.OPTIONAL
digest would include data type.RexDigestIncludeType.OPTIONAL
digest would include data typeRexCall.computeDigest(boolean)
public static boolean valueMatchesType(java.lang.Comparable value, SqlTypeName typeName, boolean strict)
private static java.lang.String toJavaString(java.lang.Comparable value, SqlTypeName typeName, RelDataType type, RexDigestIncludeType includeType)
private static RexDigestIncludeType shouldIncludeType(java.lang.Comparable value, RelDataType type)
For instance, 1:BIGINT
has to keep data type while 1:INT
should be represented as just 1
.
Implementation assumption: this method should be fast. In fact might call
NlsString.getValue()
which could decode the string, however we rely on the cache there.
value
- value of the literaltype
- type of the literalcomputeDigest(RexDigestIncludeType)
public static boolean validConstant(java.lang.Object o, Litmus litmus)
valueMatchesType(java.lang.Comparable, org.apache.calcite.sql.type.SqlTypeName, boolean)
.private static java.util.List<org.apache.calcite.avatica.util.TimeUnit> getTimeUnits(SqlTypeName typeName)
private java.lang.String intervalString(java.math.BigDecimal v)
private static void pad(java.lang.StringBuilder b, java.lang.String s, int width)
private static int width(org.apache.calcite.avatica.util.TimeUnit timeUnit)
public void printAsJava(java.io.PrintWriter pw)
private static void appendAsJava(java.lang.Comparable value, java.lang.Appendable destination, SqlTypeName typeName, boolean java, RexDigestIncludeType includeType)
valueMatchesType(java.lang.Comparable, org.apache.calcite.sql.type.SqlTypeName, boolean)
.
Typical return values:
The destination where the value is appended must not incur I/O operations. This method is not meant to be used for writing the values to permanent storage.
value
- a value to be appended to the provided destination as a Java stringdestination
- a destination where to append the specified valuetypeName
- a type name to be used for the transformation of the value to a Java stringincludeType
- an indicator whether to include the data type in the Java representationjava.lang.IllegalStateException
- if the appending to the destination Appendable
fails
due to I/Opublic static RexLiteral fromJdbcString(RelDataType type, SqlTypeName typeName, java.lang.String literal)
If a null literal is provided, then a null pointer will be returned.
type
- data type of literal to be readtypeName
- type family of literalliteral
- the (non-SQL encoded) string representation, as returned
by the Jdbc call to return a column as a stringprivate static java.lang.String getCalendarFormat(SqlTypeName typeName)
public SqlTypeName getTypeName()
public RelDataType getType()
public SqlKind getKind()
RexNode
public boolean isNull()
public java.lang.Comparable getValue()
For backwards compatibility, returns DATE. TIME and TIMESTAMP as a
Calendar
value in UTC time zone.
public java.lang.Object getValue2()
public java.lang.Object getValue3()
public java.lang.Comparable getValue4()
RexInterpreter
wants it.public <T> T getValueAs(java.lang.Class<T> clazz)
The following SQL types allow more than one form:
NlsString
or String
TimeString
,
Integer
(milliseconds since midnight),
Calendar
(in UTC)
DateString
,
Integer
(days since 1970-01-01),
Calendar
TimestampString
,
Long
(milliseconds since 1970-01-01 00:00:00),
Calendar
BigDecimal
or Long
Called with clazz
= Comparable
, returns the value in
its native form.
T
- Return typeclazz
- Desired return typepublic static boolean booleanValue(RexNode node)
public boolean isAlwaysTrue()
RexNode
TRUE
.)isAlwaysTrue
in class RexNode
public boolean isAlwaysFalse()
RexNode
FALSE
.)isAlwaysFalse
in class RexNode
public boolean equals(java.lang.Object obj)
RexNode
Every node must implement RexNode.equals(java.lang.Object)
based on its content
public int hashCode()
RexNode
Every node must implement RexNode.hashCode()
consistent with
RexNode.equals(java.lang.Object)
public static java.lang.Comparable value(RexNode node)
public static int intValue(RexNode node)
public static java.lang.String stringValue(RexNode node)
private static java.lang.Comparable findValue(RexNode node)
public static boolean isNullLiteral(RexNode node)
private static boolean equals(java.lang.Object o1, java.lang.Object o2)
public <R> R accept(RexVisitor<R> visitor)
RexNode
visitXxx
method.
Also see RexUtil.apply(RexVisitor, java.util.List, RexNode)
,
which applies a visitor to several expressions simultaneously.
public <R,P> R accept(RexBiVisitor<R,P> visitor, P arg)
RexNode
RexBiVisitor.visitInputRef(RexInputRef, Object)
visitXxx} method.Copyright © 2012–2019 The Apache Software Foundation. All rights reserved.