in core/src/main/java/org/apache/calcite/sql/SqlLiteral.java [300:411]
public <T extends Object> T getValueAs(Class<T> clazz) {
Object value = this.value;
if (clazz.isInstance(value)) {
return clazz.cast(value);
}
if (typeName == SqlTypeName.NULL) {
return clazz.cast(NullSentinel.INSTANCE);
}
requireNonNull(value, "value");
final SqlIntervalQualifier qualifier;
switch (typeName) {
case CHAR:
if (clazz == String.class) {
return clazz.cast(((NlsString) value).getValue());
}
break;
case BINARY:
if (clazz == byte[].class) {
return clazz.cast(((BitString) value).getAsByteArray());
}
break;
case DECIMAL:
if (clazz == Long.class) {
return clazz.cast(((BigDecimal) value).longValueExact());
}
// fall through
case BIGINT:
case INTEGER:
case SMALLINT:
case TINYINT:
case DOUBLE:
case REAL:
case FLOAT:
if (clazz == Long.class) {
return clazz.cast(((BigDecimal) value).longValueExact());
} else if (clazz == Integer.class) {
return clazz.cast(((BigDecimal) value).intValueExact());
} else if (clazz == Short.class) {
return clazz.cast(((BigDecimal) value).shortValueExact());
} else if (clazz == Byte.class) {
return clazz.cast(((BigDecimal) value).byteValueExact());
} else if (clazz == Double.class) {
return clazz.cast(((BigDecimal) value).doubleValue());
} else if (clazz == Float.class) {
return clazz.cast(((BigDecimal) value).floatValue());
}
break;
case DATE:
if (clazz == Calendar.class) {
return clazz.cast(((DateString) value).toCalendar());
}
break;
case TIME:
if (clazz == Calendar.class) {
return clazz.cast(((TimeString) value).toCalendar());
}
break;
case TIMESTAMP:
if (clazz == Calendar.class) {
return clazz.cast(((TimestampString) value).toCalendar());
}
break;
case INTERVAL_YEAR:
case INTERVAL_YEAR_MONTH:
case INTERVAL_MONTH:
final SqlIntervalLiteral.IntervalValue valMonth =
(SqlIntervalLiteral.IntervalValue) value;
qualifier = valMonth.getIntervalQualifier();
if (clazz == Long.class) {
return clazz.cast(valMonth.getSign()
* SqlParserUtil.intervalToMonths(valMonth));
} else if (clazz == BigDecimal.class) {
return clazz.cast(BigDecimal.valueOf(getValueAs(Long.class)));
} else if (clazz == TimeUnitRange.class) {
return clazz.cast(qualifier.timeUnitRange);
} else if (clazz == TimeUnit.class) {
return clazz.cast(qualifier.timeUnitRange.startUnit);
} else if (clazz == SqlIntervalQualifier.class) {
return clazz.cast(qualifier);
}
break;
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:
final SqlIntervalLiteral.IntervalValue valTime =
(SqlIntervalLiteral.IntervalValue) value;
qualifier = valTime.getIntervalQualifier();
if (clazz == Long.class) {
return clazz.cast(valTime.getSign()
* SqlParserUtil.intervalToMillis(valTime));
} else if (clazz == BigDecimal.class) {
return clazz.cast(BigDecimal.valueOf(getValueAs(Long.class)));
} else if (clazz == TimeUnitRange.class) {
return clazz.cast(qualifier.timeUnitRange);
} else if (clazz == TimeUnit.class) {
return clazz.cast(qualifier.timeUnitRange.startUnit);
} else if (clazz == SqlIntervalQualifier.class) {
return clazz.cast(qualifier);
}
break;
default:
break;
}
throw new AssertionError("cannot cast " + value + " as " + clazz);
}