Class RelDataTypeImpl
- java.lang.Object
-
- org.apache.calcite.rel.type.RelDataTypeImpl
-
- All Implemented Interfaces:
RelDataType
,RelDataTypeFamily
- Direct Known Subclasses:
AbstractSqlType
,DynamicRecordType
,RelCrossType
,RelDataTypeFactoryImpl.JavaType
,RelRecordType
public abstract class RelDataTypeImpl extends java.lang.Object implements RelDataType, RelDataTypeFamily
RelDataTypeImpl is an abstract base for implementations ofRelDataType
.Identity is based upon the
digest
field, which each derived class should set during construction.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static class
RelDataTypeImpl.Slot
-
Field Summary
Fields Modifier and Type Field Description protected java.lang.String
digest
protected java.util.List<RelDataTypeField>
fieldList
-
Fields inherited from interface org.apache.calcite.rel.type.RelDataType
PRECISION_NOT_SPECIFIED, SCALE_NOT_SPECIFIED
-
-
Constructor Summary
Constructors Modifier Constructor Description protected
RelDataTypeImpl()
Default constructor, to allow derived classes such asBasicSqlType
to beSerializable
.protected
RelDataTypeImpl(java.util.List<? extends RelDataTypeField> fieldList)
Creates a RelDataTypeImpl.
-
Method Summary
All Methods Static Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description protected void
computeDigest()
Computes the digest field.boolean
equals(java.lang.Object obj)
static RelDataTypeField
extra(RelDataType rowType)
Returns the "extra" field in a row type whose presence signals that fields will come into existence just by asking for them.protected abstract void
generateTypeString(java.lang.StringBuilder sb, boolean withDetail)
Generates a string representation of this type.java.nio.charset.Charset
getCharset()
Gets this type's character set, or null if this type cannot carry a character set or has no character set defined.SqlCollation
getCollation()
Gets this type's collation, or null if this type cannot carry a collation or has no collation defined.RelDataTypeComparability
getComparability()
RelDataType
getComponentType()
Gets the component type if this type is a collection, otherwise null.RelDataTypeFamily
getFamily()
Gets a canonical object representing the family of this type.RelDataTypeField
getField(java.lang.String fieldName, boolean caseSensitive, boolean elideRecord)
Looks up a field by name.int
getFieldCount()
Returns the number of fields in a struct type.java.util.List<RelDataTypeField>
getFieldList()
Gets the fields in a struct type.java.util.List<java.lang.String>
getFieldNames()
Returns the names of the fields in a struct type.private static void
getFieldRecurse(java.util.List<RelDataTypeImpl.Slot> slots, RelDataType type, int depth, java.lang.String fieldName, boolean caseSensitive)
java.lang.String
getFullTypeString()
Gets a string representation of this type with full detail such as character set and nullability.SqlIntervalQualifier
getIntervalQualifier()
Gets this type's interval qualifier, or null if this is not an interval type.RelDataType
getKeyType()
Gets the key type if this type is a map, otherwise null.RelDataTypePrecedenceList
getPrecedenceList()
int
getPrecision()
Gets the JDBC-defined precision for values of this type.int
getScale()
Gets the scale of this type.SqlIdentifier
getSqlIdentifier()
Gets theSqlIdentifier
associated with this type.SqlTypeName
getSqlTypeName()
Gets theSqlTypeName
of this type.StructKind
getStructKind()
Returns the rule for resolving the fields of a structured type, orStructKind.NONE
if this is not a structured type.RelDataType
getValueType()
Gets the value type if this type is a map, otherwise null.int
hashCode()
boolean
isDynamicStruct()
boolean
isNullable()
Queries whether this type allows null values.boolean
isStruct()
Queries whether this is a structured type.static RelProtoDataType
proto(RelDataType protoType)
Returns an implementation ofRelProtoDataType
that copies a given type using the given type factory.static RelProtoDataType
proto(SqlTypeName typeName, boolean nullable)
Returns aRelProtoDataType
that will create a typetypeName
.static RelProtoDataType
proto(SqlTypeName typeName, int precision, boolean nullable)
Returns aRelProtoDataType
that will create a typetypeName(precision)
.static RelProtoDataType
proto(SqlTypeName typeName, int precision, int scale, boolean nullable)
Returns aRelProtoDataType
that will create a typetypeName(precision, scale)
.java.lang.String
toString()
Gets a string representation of this type without detail such as character set and nullability.
-
-
-
Field Detail
-
fieldList
protected final java.util.List<RelDataTypeField> fieldList
-
digest
protected java.lang.String digest
-
-
Constructor Detail
-
RelDataTypeImpl
protected RelDataTypeImpl(java.util.List<? extends RelDataTypeField> fieldList)
Creates a RelDataTypeImpl.- Parameters:
fieldList
- List of fields
-
RelDataTypeImpl
protected RelDataTypeImpl()
Default constructor, to allow derived classes such asBasicSqlType
to beSerializable
.(The serialization specification says that a class can be serializable even if its base class is not serializable, provided that the base class has a public or protected zero-args constructor.)
-
-
Method Detail
-
getField
public RelDataTypeField getField(java.lang.String fieldName, boolean caseSensitive, boolean elideRecord)
Description copied from interface:RelDataType
Looks up a field by name.NOTE: Be careful choosing the value of
caseSensitive
:- If the field name was supplied by an end-user (e.g. as a column alias in SQL), use your session's case-sensitivity setting.
- Only hard-code
true
if you are sure that the field name is internally generated. - Hard-coding
false
is almost certainly wrong.
- Specified by:
getField
in interfaceRelDataType
- Parameters:
fieldName
- Name of field to findcaseSensitive
- Whether match is case-sensitiveelideRecord
- Whether to find fields nested within records- Returns:
- named field, or null if not found
-
getFieldRecurse
private static void getFieldRecurse(java.util.List<RelDataTypeImpl.Slot> slots, RelDataType type, int depth, java.lang.String fieldName, boolean caseSensitive)
-
getFieldList
public java.util.List<RelDataTypeField> getFieldList()
Description copied from interface:RelDataType
Gets the fields in a struct type. The field count is equal to the size of the returned list.- Specified by:
getFieldList
in interfaceRelDataType
- Returns:
- read-only list of fields
-
getFieldNames
public java.util.List<java.lang.String> getFieldNames()
Description copied from interface:RelDataType
Returns the names of the fields in a struct type. The field count is equal to the size of the returned list.- Specified by:
getFieldNames
in interfaceRelDataType
- Returns:
- read-only list of field names
-
getFieldCount
public int getFieldCount()
Description copied from interface:RelDataType
Returns the number of fields in a struct type.This method is equivalent to
.RelDataType.getFieldList()
.size()- Specified by:
getFieldCount
in interfaceRelDataType
-
getStructKind
public StructKind getStructKind()
Description copied from interface:RelDataType
Returns the rule for resolving the fields of a structured type, orStructKind.NONE
if this is not a structured type.- Specified by:
getStructKind
in interfaceRelDataType
- Returns:
- the StructKind that determines how this type's fields are resolved
-
getComponentType
public RelDataType getComponentType()
Description copied from interface:RelDataType
Gets the component type if this type is a collection, otherwise null.- Specified by:
getComponentType
in interfaceRelDataType
- Returns:
- canonical type descriptor for components
-
getKeyType
public RelDataType getKeyType()
Description copied from interface:RelDataType
Gets the key type if this type is a map, otherwise null.- Specified by:
getKeyType
in interfaceRelDataType
- Returns:
- canonical type descriptor for key
-
getValueType
public RelDataType getValueType()
Description copied from interface:RelDataType
Gets the value type if this type is a map, otherwise null.- Specified by:
getValueType
in interfaceRelDataType
- Returns:
- canonical type descriptor for value
-
isStruct
public boolean isStruct()
Description copied from interface:RelDataType
Queries whether this is a structured type.- Specified by:
isStruct
in interfaceRelDataType
- Returns:
- whether this type has fields; examples include rows and user-defined structured types in SQL, and classes in Java
-
equals
public boolean equals(java.lang.Object obj)
- Overrides:
equals
in classjava.lang.Object
-
hashCode
public int hashCode()
- Overrides:
hashCode
in classjava.lang.Object
-
getFullTypeString
public java.lang.String getFullTypeString()
Description copied from interface:RelDataType
Gets a string representation of this type with full detail such as character set and nullability. The string must serve as a "digest" for this type, meaning two types can be considered identical iff their digests are equal.- Specified by:
getFullTypeString
in interfaceRelDataType
- Returns:
- full type string
-
isNullable
public boolean isNullable()
Description copied from interface:RelDataType
Queries whether this type allows null values.- Specified by:
isNullable
in interfaceRelDataType
- Returns:
- whether type allows null values
-
getCharset
public java.nio.charset.Charset getCharset()
Description copied from interface:RelDataType
Gets this type's character set, or null if this type cannot carry a character set or has no character set defined.- Specified by:
getCharset
in interfaceRelDataType
- Returns:
- charset of type
-
getCollation
public SqlCollation getCollation()
Description copied from interface:RelDataType
Gets this type's collation, or null if this type cannot carry a collation or has no collation defined.- Specified by:
getCollation
in interfaceRelDataType
- Returns:
- collation of type
-
getIntervalQualifier
public SqlIntervalQualifier getIntervalQualifier()
Description copied from interface:RelDataType
Gets this type's interval qualifier, or null if this is not an interval type.- Specified by:
getIntervalQualifier
in interfaceRelDataType
- Returns:
- interval qualifier
-
getPrecision
public int getPrecision()
Description copied from interface:RelDataType
Gets the JDBC-defined precision for values of this type. Note that this is not always the same as the user-specified precision. For example, the type INTEGER has no user-specified precision, but this method returns 10 for an INTEGER type.Returns
RelDataType.PRECISION_NOT_SPECIFIED
(-1) if precision is not applicable for this type.- Specified by:
getPrecision
in interfaceRelDataType
- Returns:
- number of decimal digits for exact numeric types; number of decimal digits in mantissa for approximate numeric types; number of decimal digits for fractional seconds of datetime types; length in characters for character types; length in bytes for binary types; length in bits for bit types; 1 for BOOLEAN; -1 if precision is not valid for this type
-
getScale
public int getScale()
Description copied from interface:RelDataType
Gets the scale of this type. ReturnsRelDataType.SCALE_NOT_SPECIFIED
(-1) if scale is not valid for this type.- Specified by:
getScale
in interfaceRelDataType
- Returns:
- number of digits of scale
-
getSqlTypeName
public SqlTypeName getSqlTypeName()
Description copied from interface:RelDataType
Gets theSqlTypeName
of this type.- Specified by:
getSqlTypeName
in interfaceRelDataType
- Returns:
- SqlTypeName, or null if this is not an SQL predefined type
-
getSqlIdentifier
public SqlIdentifier getSqlIdentifier()
Description copied from interface:RelDataType
Gets theSqlIdentifier
associated with this type. For a predefined type, this is a simple identifier based onRelDataType.getSqlTypeName()
. For a user-defined type, this is a compound identifier which uniquely names the type.- Specified by:
getSqlIdentifier
in interfaceRelDataType
- Returns:
- SqlIdentifier, or null if this is not an SQL type
-
getFamily
public RelDataTypeFamily getFamily()
Description copied from interface:RelDataType
Gets a canonical object representing the family of this type. Two values can be compared if and only if their types are in the same family.- Specified by:
getFamily
in interfaceRelDataType
- Returns:
- canonical object representing type family
-
generateTypeString
protected abstract void generateTypeString(java.lang.StringBuilder sb, boolean withDetail)
Generates a string representation of this type.- Parameters:
sb
- StringBuffer into which to generate the stringwithDetail
- when true, all detail information needed to compute a unique digest (and return from getFullTypeString) should be included;
-
computeDigest
protected void computeDigest()
Computes the digest field. This should be called in every non-abstract subclass constructor once the type is fully defined.
-
toString
public java.lang.String toString()
Description copied from interface:RelDataType
Gets a string representation of this type without detail such as character set and nullability.- Specified by:
toString
in interfaceRelDataType
- Overrides:
toString
in classjava.lang.Object
- Returns:
- abbreviated type string
-
getPrecedenceList
public RelDataTypePrecedenceList getPrecedenceList()
- Specified by:
getPrecedenceList
in interfaceRelDataType
- Returns:
- precedence list for this type
-
getComparability
public RelDataTypeComparability getComparability()
- Specified by:
getComparability
in interfaceRelDataType
- Returns:
- the category of comparison operators which make sense when applied to values of this type
-
proto
public static RelProtoDataType proto(RelDataType protoType)
Returns an implementation ofRelProtoDataType
that copies a given type using the given type factory.
-
proto
public static RelProtoDataType proto(SqlTypeName typeName, boolean nullable)
Returns aRelProtoDataType
that will create a typetypeName
.For example,
proto(SqlTypeName.DATE), false
will createDATE NOT NULL
.- Parameters:
typeName
- Type namenullable
- Whether nullable- Returns:
- Proto data type
-
proto
public static RelProtoDataType proto(SqlTypeName typeName, int precision, boolean nullable)
Returns aRelProtoDataType
that will create a typetypeName(precision)
.For example,
proto(SqlTypeName.VARCHAR, 100, false)
will createVARCHAR(100) NOT NULL
.- Parameters:
typeName
- Type nameprecision
- Precisionnullable
- Whether nullable- Returns:
- Proto data type
-
proto
public static RelProtoDataType proto(SqlTypeName typeName, int precision, int scale, boolean nullable)
Returns aRelProtoDataType
that will create a typetypeName(precision, scale)
.For example,
proto(SqlTypeName.DECIMAL, 7, 2, false)
will createDECIMAL(7, 2) NOT NULL
.- Parameters:
typeName
- Type nameprecision
- Precisionscale
- Scalenullable
- Whether nullable- Returns:
- Proto data type
-
extra
public static RelDataTypeField extra(RelDataType rowType)
Returns the "extra" field in a row type whose presence signals that fields will come into existence just by asking for them.- Parameters:
rowType
- Row type- Returns:
- The "extra" field, or null
-
isDynamicStruct
public boolean isDynamicStruct()
- Specified by:
isDynamicStruct
in interfaceRelDataType
- Returns:
- whether it has dynamic structure (for "schema-on-read" table)
-
-