protected DataType inferCqlTypeFromValue()

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