in core/src/main/java/com/datastax/oss/driver/internal/core/type/codec/registry/CachingCodecRegistry.java [475:587]
protected DataType inferCqlTypeFromValue(@NonNull Object value) {
if (value instanceof List) {
List<?> list = (List<?>) value;
if (list.isEmpty()) {
return CQL_TYPE_FOR_EMPTY_LISTS;
}
Object firstElement = list.get(0);
if (firstElement == null) {
throw new IllegalArgumentException(
"Can't infer list codec because the first element is null "
+ "(note that CQL does not allow null values in collections)");
}
DataType elementType = inferCqlTypeFromValue(firstElement);
if (elementType == null) {
return null;
}
return DataTypes.listOf(elementType);
} else if (value instanceof Set) {
Set<?> set = (Set<?>) value;
if (set.isEmpty()) {
return CQL_TYPE_FOR_EMPTY_SETS;
}
Object firstElement = set.iterator().next();
if (firstElement == null) {
throw new IllegalArgumentException(
"Can't infer set codec because the first element is null "
+ "(note that CQL does not allow null values in collections)");
}
DataType elementType = inferCqlTypeFromValue(firstElement);
if (elementType == null) {
return null;
}
return DataTypes.setOf(elementType);
} else if (value instanceof Map) {
Map<?, ?> map = (Map<?, ?>) value;
if (map.isEmpty()) {
return CQL_TYPE_FOR_EMPTY_MAPS;
}
Entry<?, ?> firstEntry = map.entrySet().iterator().next();
Object firstKey = firstEntry.getKey();
Object firstValue = firstEntry.getValue();
if (firstKey == null || firstValue == null) {
throw new IllegalArgumentException(
"Can't infer map codec because the first key and/or value is null "
+ "(note that CQL does not allow null values in collections)");
}
DataType keyType = inferCqlTypeFromValue(firstKey);
DataType valueType = inferCqlTypeFromValue(firstValue);
if (keyType == null || valueType == null) {
return null;
}
return DataTypes.mapOf(keyType, valueType);
} else if (value instanceof CqlVector) {
CqlVector<?> vector = (CqlVector<?>) value;
if (vector.isEmpty()) {
return CQL_TYPE_FOR_EMPTY_VECTORS;
}
Object firstElement = vector.iterator().next();
if (firstElement == null) {
throw new IllegalArgumentException(
"Can't infer vector codec because the first element is null "
+ "(note that CQL does not allow null values in collections)");
}
DataType elementType = inferCqlTypeFromValue(firstElement);
if (elementType == null) {
return null;
}
return DataTypes.vectorOf(elementType, vector.size());
}
Class<?> javaClass = value.getClass();
if (ByteBuffer.class.isAssignableFrom(javaClass)) {
return DataTypes.BLOB;
} else if (String.class.equals(javaClass)) {
return DataTypes.TEXT;
} else if (Long.class.equals(javaClass)) {
return DataTypes.BIGINT;
} else if (Boolean.class.equals(javaClass)) {
return DataTypes.BOOLEAN;
} else if (BigDecimal.class.equals(javaClass)) {
return DataTypes.DECIMAL;
} else if (Double.class.equals(javaClass)) {
return DataTypes.DOUBLE;
} else if (Float.class.equals(javaClass)) {
return DataTypes.FLOAT;
} else if (Integer.class.equals(javaClass)) {
return DataTypes.INT;
} else if (Instant.class.equals(javaClass)) {
return DataTypes.TIMESTAMP;
} else if (UUID.class.equals(javaClass)) {
return DataTypes.UUID;
} else if (BigInteger.class.equals(javaClass)) {
return DataTypes.VARINT;
} else if (InetAddress.class.isAssignableFrom(javaClass)) {
return DataTypes.INET;
} else if (LocalDate.class.equals(javaClass)) {
return DataTypes.DATE;
} else if (LocalTime.class.equals(javaClass)) {
return DataTypes.TIME;
} else if (Short.class.equals(javaClass)) {
return DataTypes.SMALLINT;
} else if (Byte.class.equals(javaClass)) {
return DataTypes.TINYINT;
} else if (CqlDuration.class.equals(javaClass)) {
return DataTypes.DURATION;
} else if (UdtValue.class.isAssignableFrom(javaClass)) {
return ((UdtValue) value).getType();
} else if (TupleValue.class.isAssignableFrom(javaClass)) {
return ((TupleValue) value).getType();
}
// This might mean that the java type is a custom type with a custom codec,
// so don't throw CodecNotFoundException just yet.
return null;
}