in core/src/main/java/org/apache/calcite/avatica/remote/TypedValue.java [534:654]
private static void writeToProtoWithType(Common.TypedValue.Builder builder, Object o,
Common.Rep type) {
builder.setType(type);
switch (type) {
case BOOLEAN:
case PRIMITIVE_BOOLEAN:
builder.setBoolValue((boolean) o);
return;
case BYTE_STRING:
byte[] bytes;
// Serial representation is b64. We don't need to do that for protobuf
if (o instanceof String) {
// Backwards compatibility for client CALCITE-1209
builder.setStringValue((String) o);
// Assume strings are already b64 encoded
bytes = ByteString.parseBase64((String) o);
} else {
// Backwards compatibility for client CALCITE-1209
builder.setStringValue(Base64.encodeBytes((byte[]) o));
// Use the byte array
bytes = (byte[]) o;
}
builder.setBytesValue(UnsafeByteOperations.unsafeWrap(bytes));
return;
case STRING:
String s;
if (DateTimeUtils.isOffsetDateTime(o)) {
s = DateTimeUtils.offsetDateTimeValue(o);
} else {
s = (String) o;
}
builder.setStringValueBytes(UnsafeByteOperations.unsafeWrap(s.getBytes(UTF_8)));
return;
case PRIMITIVE_CHAR:
case CHARACTER:
builder.setStringValue(Character.toString((char) o));
return;
case BYTE:
case PRIMITIVE_BYTE:
builder.setNumberValue(Byte.valueOf((byte) o).longValue());
return;
case DOUBLE:
case PRIMITIVE_DOUBLE:
builder.setDoubleValue((double) o);
return;
case FLOAT:
case PRIMITIVE_FLOAT:
builder.setNumberValue(Float.floatToIntBits((float) o));
return;
case INTEGER:
case PRIMITIVE_INT:
builder.setNumberValue(Integer.valueOf((int) o).longValue());
return;
case PRIMITIVE_SHORT:
case SHORT:
builder.setNumberValue(Short.valueOf((short) o).longValue());
return;
case LONG:
case PRIMITIVE_LONG:
builder.setNumberValue((long) o);
return;
case JAVA_SQL_DATE:
case JAVA_SQL_TIME:
long sqlDateOrTime;
if (o instanceof java.sql.Date) {
sqlDateOrTime = ((java.sql.Date) o).getTime();
} else if (o instanceof java.sql.Time) {
sqlDateOrTime = ((java.sql.Time) o).getTime();
} else if (o instanceof Integer) {
sqlDateOrTime = ((Integer) o).longValue();
} else {
sqlDateOrTime = (long) o;
}
// Persisted as numbers
builder.setNumberValue(sqlDateOrTime);
return;
case JAVA_SQL_TIMESTAMP:
case JAVA_UTIL_DATE:
long sqlTimestampOrUtilDate;
if (o instanceof java.sql.Timestamp) {
sqlTimestampOrUtilDate = ((java.sql.Timestamp) o).getTime();
} else if (o instanceof java.util.Date) {
sqlTimestampOrUtilDate = ((java.util.Date) o).getTime();
} else {
sqlTimestampOrUtilDate = (long) o;
}
// Persisted as longs
builder.setNumberValue(sqlTimestampOrUtilDate);
return;
case BIG_INTEGER:
byte[] byteRep = ((BigInteger) o).toByteArray();
builder.setBytesValue(com.google.protobuf.ByteString.copyFrom(byteRep));
return;
case BIG_DECIMAL:
final BigDecimal bigDecimal = (BigDecimal) o;
builder.setStringValue(bigDecimal.toString());
return;
case NUMBER:
builder.setNumberValue(((Number) o).longValue());
return;
case NULL:
builder.setNull(true);
return;
case OBJECT:
if (null == o) {
// We can persist a null value through easily
builder.setNull(true);
return;
}
// Intentional fall-through to RTE because we can't serialize something we have no type
// insight into.
// fall through
case UNRECOGNIZED:
// Fail?
throw new RuntimeException("Unhandled value: " + type + " " + o.getClass());
default:
// Fail?
throw new RuntimeException("Unknown serialized type: " + type);
}
}