public static ExprEval bestEffortOf()

in processing/src/main/java/org/apache/druid/math/expr/ExprEval.java [380:491]


  public static ExprEval bestEffortOf(@Nullable Object val)
  {
    if (val == null) {
      return StringExprEval.OF_NULL;
    }
    if (val instanceof ExprEval) {
      return (ExprEval) val;
    }
    if (val instanceof String) {
      return new StringExprEval((String) val);
    }
    if (val instanceof Number) {
      if (val instanceof Float || val instanceof Double || val instanceof BigDecimal) {
        return new DoubleExprEval((Number) val);
      }
      return new LongExprEval((Number) val);
    }
    if (val instanceof Boolean) {
      return ofLongBoolean((Boolean) val);
    }
    if (val instanceof Long[]) {
      final Long[] inputArray = (Long[]) val;
      final Object[] array = new Object[inputArray.length];
      for (int i = 0; i < inputArray.length; i++) {
        array[i] = inputArray[i];
      }
      return new ArrayExprEval(ExpressionType.LONG_ARRAY, array);
    }
    if (val instanceof long[]) {
      final long[] longArray = (long[]) val;
      final Object[] array = new Object[longArray.length];
      for (int i = 0; i < longArray.length; i++) {
        array[i] = longArray[i];
      }
      return new ArrayExprEval(ExpressionType.LONG_ARRAY, array);
    }
    if (val instanceof Integer[]) {
      final Integer[] inputArray = (Integer[]) val;
      final Object[] array = new Object[inputArray.length];
      for (int i = 0; i < inputArray.length; i++) {
        array[i] = inputArray[i] != null ? inputArray[i].longValue() : null;
      }
      return new ArrayExprEval(ExpressionType.LONG_ARRAY, array);
    }
    if (val instanceof int[]) {
      final int[] longArray = (int[]) val;
      final Object[] array = new Object[longArray.length];
      for (int i = 0; i < longArray.length; i++) {
        array[i] = (long) longArray[i];
      }
      return new ArrayExprEval(ExpressionType.LONG_ARRAY, array);
    }
    if (val instanceof Double[]) {
      final Double[] inputArray = (Double[]) val;
      final Object[] array = new Object[inputArray.length];
      for (int i = 0; i < inputArray.length; i++) {
        array[i] = inputArray[i] != null ? inputArray[i] : null;
      }
      return new ArrayExprEval(ExpressionType.DOUBLE_ARRAY, array);
    }
    if (val instanceof double[]) {
      final double[] inputArray = (double[]) val;
      final Object[] array = new Object[inputArray.length];
      for (int i = 0; i < inputArray.length; i++) {
        array[i] = inputArray[i];
      }
      return new ArrayExprEval(ExpressionType.DOUBLE_ARRAY, array);
    }
    if (val instanceof Float[]) {
      final Float[] inputArray = (Float[]) val;
      final Object[] array = new Object[inputArray.length];
      for (int i = 0; i < inputArray.length; i++) {
        array[i] = inputArray[i] != null ? inputArray[i].doubleValue() : null;
      }
      return new ArrayExprEval(ExpressionType.DOUBLE_ARRAY, array);
    }
    if (val instanceof float[]) {
      final float[] inputArray = (float[]) val;
      final Object[] array = new Object[inputArray.length];
      for (int i = 0; i < inputArray.length; i++) {
        array[i] = (double) inputArray[i];
      }
      return new ArrayExprEval(ExpressionType.DOUBLE_ARRAY, array);
    }
    if (val instanceof String[]) {
      final String[] inputArray = (String[]) val;
      final Object[] array = new Object[inputArray.length];
      for (int i = 0; i < inputArray.length; i++) {
        array[i] = inputArray[i];
      }
      return new ArrayExprEval(ExpressionType.STRING_ARRAY, array);
    }

    if (val instanceof List || val instanceof Object[]) {
      final List<?> theList = val instanceof List ? ((List<?>) val) : Arrays.asList((Object[]) val);
      return bestEffortArray(theList);
    }
    // in 'best effort' mode, we couldn't possibly use byte[] as a complex or anything else useful without type
    // knowledge, so lets turn it into a base64 encoded string so at least something downstream can use it by decoding
    // back into bytes
    if (val instanceof byte[]) {
      return new StringExprEval(StringUtils.encodeBase64String((byte[]) val));
    }


    if (val instanceof Map) {
      return ofComplex(ExpressionType.NESTED_DATA, val);
    }

    // is this cool?
    return ofComplex(ExpressionType.UNKNOWN_COMPLEX, val);
  }