in core/src/main/java/org/apache/calcite/runtime/rtti/RuntimeTypeInformation.java [135:253]
public static Expression createExpression(RelDataType type) {
switch (type.getSqlTypeName()) {
case BOOLEAN:
return Expressions.new_(BasicSqlTypeRtti.class,
Expressions.constant(RuntimeSqlTypeName.BOOLEAN));
case TINYINT:
return Expressions.new_(BasicSqlTypeRtti.class,
Expressions.constant(RuntimeSqlTypeName.TINYINT));
case SMALLINT:
return Expressions.new_(BasicSqlTypeRtti.class,
Expressions.constant(RuntimeSqlTypeName.SMALLINT));
case INTEGER:
return Expressions.new_(BasicSqlTypeRtti.class,
Expressions.constant(RuntimeSqlTypeName.INTEGER));
case BIGINT:
return Expressions.new_(BasicSqlTypeRtti.class,
Expressions.constant(RuntimeSqlTypeName.BIGINT));
case DECIMAL:
return Expressions.new_(BasicSqlTypeRtti.class,
Expressions.constant(RuntimeSqlTypeName.DECIMAL));
case REAL:
return Expressions.new_(BasicSqlTypeRtti.class,
Expressions.constant(RuntimeSqlTypeName.REAL));
case FLOAT:
case DOUBLE:
return Expressions.new_(BasicSqlTypeRtti.class,
Expressions.constant(RuntimeSqlTypeName.DOUBLE));
case DATE:
return Expressions.new_(BasicSqlTypeRtti.class,
Expressions.constant(RuntimeSqlTypeName.DATE));
case TIME:
return Expressions.new_(BasicSqlTypeRtti.class,
Expressions.constant(RuntimeSqlTypeName.TIME));
case TIME_WITH_LOCAL_TIME_ZONE:
return Expressions.new_(BasicSqlTypeRtti.class,
Expressions.constant(RuntimeSqlTypeName.TIME_WITH_LOCAL_TIME_ZONE));
case TIME_TZ:
return Expressions.new_(BasicSqlTypeRtti.class,
Expressions.constant(RuntimeSqlTypeName.TIME_TZ));
case TIMESTAMP:
return Expressions.new_(BasicSqlTypeRtti.class,
Expressions.constant(RuntimeSqlTypeName.TIMESTAMP));
case TIMESTAMP_WITH_LOCAL_TIME_ZONE:
return Expressions.new_(BasicSqlTypeRtti.class,
Expressions.constant(RuntimeSqlTypeName.TIMESTAMP_WITH_LOCAL_TIME_ZONE));
case TIMESTAMP_TZ:
return Expressions.new_(BasicSqlTypeRtti.class,
Expressions.constant(RuntimeSqlTypeName.TIMESTAMP_TZ));
case INTERVAL_YEAR:
case INTERVAL_YEAR_MONTH:
case INTERVAL_MONTH:
return Expressions.new_(BasicSqlTypeRtti.class,
Expressions.constant(RuntimeSqlTypeName.INTERVAL_LONG));
case INTERVAL_DAY:
case INTERVAL_DAY_HOUR:
case INTERVAL_DAY_MINUTE:
case INTERVAL_DAY_SECOND:
case INTERVAL_HOUR:
case INTERVAL_HOUR_MINUTE:
case INTERVAL_HOUR_SECOND:
case INTERVAL_MINUTE:
case INTERVAL_MINUTE_SECOND:
case INTERVAL_SECOND:
return Expressions.new_(BasicSqlTypeRtti.class,
Expressions.constant(RuntimeSqlTypeName.INTERVAL_SHORT));
case CHAR:
case VARCHAR:
return Expressions.new_(BasicSqlTypeRtti.class,
Expressions.constant(RuntimeSqlTypeName.VARCHAR));
case BINARY:
case VARBINARY:
return Expressions.new_(BasicSqlTypeRtti.class,
Expressions.constant(RuntimeSqlTypeName.VARBINARY));
case NULL:
return Expressions.new_(BasicSqlTypeRtti.class,
Expressions.constant(RuntimeSqlTypeName.NULL));
case MULTISET: {
Expression comp = createExpression(requireNonNull(type.getComponentType()));
return Expressions.new_(GenericSqlTypeRtti.class,
Expressions.constant(RuntimeSqlTypeName.MULTISET), comp);
}
case ARRAY: {
Expression comp = createExpression(requireNonNull(type.getComponentType()));
return Expressions.new_(GenericSqlTypeRtti.class,
Expressions.constant(RuntimeSqlTypeName.ARRAY), comp);
}
case MAP: {
Expression key = createExpression(requireNonNull(type.getKeyType()));
Expression value = createExpression(requireNonNull(type.getValueType()));
return Expressions.new_(GenericSqlTypeRtti.class,
Expressions.constant(RuntimeSqlTypeName.MAP), key, value);
}
case ROW: {
Expression[] fields = new Expression[type.getFieldCount()];
int index = 0;
for (RelDataTypeField field : type.getFieldList()) {
String name = field.getName();
RelDataType fieldType = field.getType();
Expression fieldTypeExpression = createExpression(fieldType);
Expression nameExpression = Expressions.constant(name);
Expression entry =
Expressions.new_(AbstractMap.SimpleEntry.class, nameExpression, fieldTypeExpression);
fields[index++] = entry;
}
return Expressions.new_(RowSqlTypeRtti.class, fields);
}
case GEOMETRY:
return Expressions.new_(BasicSqlTypeRtti.class,
Expressions.constant(RuntimeSqlTypeName.GEOMETRY));
case VARIANT:
return Expressions.new_(BasicSqlTypeRtti.class,
Expressions.constant(RuntimeSqlTypeName.VARIANT));
case UUID:
return Expressions.new_(BasicSqlTypeRtti.class,
Expressions.constant(RuntimeSqlTypeName.UUID));
default:
throw new RuntimeException("Unexpected type " + type);
}
}