in core/src/main/java/org/apache/calcite/avatica/util/AbstractCursor.java [86:235]
protected Accessor createAccessor(ColumnMetaData columnMetaData,
Getter getter, Calendar localCalendar, ArrayImpl.Factory factory) {
switch (columnMetaData.type.rep) {
case NUMBER:
switch (columnMetaData.type.id) {
case Types.TINYINT:
case Types.SMALLINT:
case Types.INTEGER:
case Types.BIGINT:
case Types.REAL:
case Types.FLOAT:
case Types.DOUBLE:
case Types.NUMERIC:
case Types.DECIMAL:
return new NumberAccessor(getter, columnMetaData.scale);
}
}
switch (columnMetaData.type.id) {
case Types.TINYINT:
return new ByteAccessor(getter);
case Types.SMALLINT:
return new ShortAccessor(getter);
case Types.INTEGER:
return new IntAccessor(getter);
case Types.BIGINT:
return new LongAccessor(getter);
case Types.BOOLEAN:
case Types.BIT:
return new BooleanAccessor(getter);
case Types.REAL:
return new FloatAccessor(getter);
case Types.FLOAT:
case Types.DOUBLE:
return new DoubleAccessor(getter);
case Types.DECIMAL:
return new NumberAccessor(getter, columnMetaData.scale);
case Types.CHAR:
switch (columnMetaData.type.rep) {
case PRIMITIVE_CHAR:
case CHARACTER:
return new StringFromCharAccessor(getter, columnMetaData.displaySize);
default:
return new FixedStringAccessor(getter, columnMetaData.displaySize);
}
case Types.VARCHAR:
case Types.NVARCHAR:
return new StringAccessor(getter);
case Types.BINARY:
case Types.VARBINARY:
switch (columnMetaData.type.rep) {
case STRING:
return new BinaryFromStringAccessor(getter);
default:
return new BinaryAccessor(getter);
}
case Types.DATE:
switch (columnMetaData.type.rep) {
case PRIMITIVE_INT:
case INTEGER:
case NUMBER:
return new DateFromNumberAccessor(getter, localCalendar);
case JAVA_SQL_DATE:
return new DateAccessor(getter, localCalendar);
default:
throw new AssertionError("bad " + columnMetaData.type.rep);
}
case Types.TIME:
switch (columnMetaData.type.rep) {
case PRIMITIVE_INT:
case INTEGER:
case NUMBER:
return new TimeFromNumberAccessor(getter, localCalendar, columnMetaData.precision);
case JAVA_SQL_TIME:
return new TimeAccessor(getter, localCalendar);
default:
throw new AssertionError("bad " + columnMetaData.type.rep);
}
case Types.TIMESTAMP:
switch (columnMetaData.type.rep) {
case PRIMITIVE_LONG:
case LONG:
case NUMBER:
return new TimestampFromNumberAccessor(getter, localCalendar, columnMetaData.precision);
case JAVA_SQL_TIMESTAMP:
return new TimestampAccessor(getter, localCalendar, columnMetaData.precision);
case JAVA_UTIL_DATE:
return new TimestampFromUtilDateAccessor(getter, localCalendar, columnMetaData.precision);
default:
throw new AssertionError("bad " + columnMetaData.type.rep);
}
case Types.TIME_WITH_TIMEZONE:
switch (columnMetaData.type.rep) {
case STRING:
return new StringAccessor(getter);
default:
throw new AssertionError("bad " + columnMetaData.type.rep);
}
case Types.TIMESTAMP_WITH_TIMEZONE:
switch (columnMetaData.type.rep) {
case STRING:
return new StringAccessor(getter);
default:
throw new AssertionError("bad " + columnMetaData.type.rep);
}
case Types.ARRAY:
final ColumnMetaData.ArrayType arrayType =
(ColumnMetaData.ArrayType) columnMetaData.type;
final SlotGetter componentGetter = new SlotGetter();
final Accessor componentAccessor =
createAccessor(ColumnMetaData.dummy(arrayType.getComponent(), true),
componentGetter, localCalendar, factory);
return new ArrayAccessor(getter, arrayType.getComponent(), componentAccessor,
componentGetter, factory);
case Types.STRUCT:
switch (columnMetaData.type.rep) {
case OBJECT:
final ColumnMetaData.StructType structType =
(ColumnMetaData.StructType) columnMetaData.type;
List<Accessor> accessors = new ArrayList<>();
for (ColumnMetaData column : structType.columns) {
accessors.add(
createAccessor(column, new StructGetter(getter, column), localCalendar, factory));
}
return new StructAccessor(getter, accessors);
default:
throw new AssertionError("bad " + columnMetaData.type.rep);
}
case Types.JAVA_OBJECT:
case Types.NULL:
case Types.OTHER: // e.g. map
if (columnMetaData.type.getName().startsWith("INTERVAL_")) {
int end = columnMetaData.type.getName().indexOf("(");
if (end < 0) {
end = columnMetaData.type.getName().length();
}
TimeUnitRange range =
TimeUnitRange.valueOf(
columnMetaData.type.getName().substring("INTERVAL_".length(), end));
if (range.monthly()) {
return new IntervalYearMonthAccessor(getter, range);
} else {
return new IntervalDayTimeAccessor(getter, range,
columnMetaData.scale);
}
}
return new ObjectAccessor(getter);
default:
throw new RuntimeException("unknown type " + columnMetaData.type.id);
}
}