public T getValueAs()

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);
  }