private ColumnStatistics evalCastFunc()

in exec/java-exec/src/main/java/org/apache/drill/exec/expr/StatisticsProvider.java [164:289]


  private ColumnStatistics<?> evalCastFunc(FunctionHolderExpression holderExpr, ColumnStatistics<T> input) {
    try {

      T minValue = ComparisonPredicate.getMinValue(input);
      T maxValue = ComparisonPredicate.getMaxValue(input);
      if (minValue == null && maxValue == null) {
        // no need to evaluate cast for null arguments
        return input;
      }

      TypeProtos.MinorType srcType = holderExpr.args.get(0).getMajorType().getMinorType();
      TypeProtos.MinorType destType = holderExpr.getMajorType().getMinorType();

      if (srcType.equals(destType)) {
        // same type cast ==> NoOp.
        return input;
      } else if (!CAST_FUNC.containsKey(srcType) || !CAST_FUNC.get(srcType).contains(destType)) {
        return null; // cast func between srcType and destType is NOT allowed.
      }

      ValueHolder minHolder;
      ValueHolder maxHolder;

      switch (srcType) {
        case INT :
          minHolder = ValueHolderHelper.getIntHolder((Integer) minValue);
          maxHolder = ValueHolderHelper.getIntHolder((Integer) maxValue);
          break;
        case BIGINT:
          minHolder = ValueHolderHelper.getBigIntHolder((Long) minValue);
          maxHolder = ValueHolderHelper.getBigIntHolder((Long) maxValue);
          break;
        case FLOAT4:
          minHolder = ValueHolderHelper.getFloat4Holder((Float) minValue);
          maxHolder = ValueHolderHelper.getFloat4Holder((Float) maxValue);
          break;
        case FLOAT8:
          minHolder = ValueHolderHelper.getFloat8Holder((Double) minValue);
          maxHolder = ValueHolderHelper.getFloat8Holder((Double) maxValue);
          break;
        case DATE:
          minHolder = ValueHolderHelper.getDateHolder((Long) minValue);
          maxHolder = ValueHolderHelper.getDateHolder((Long) maxValue);
          break;
        case VARCHAR:
          minHolder = ValueHolderHelper.getVarCharHolder(udfUtilities.getManagedBuffer(), (String) minValue);
          maxHolder = ValueHolderHelper.getVarCharHolder(udfUtilities.getManagedBuffer(), (String) maxValue);
          break;
        default:
          return null;
      }

      ValueHolder[] args1 = {minHolder};
      ValueHolder[] args2 = {maxHolder};

      DrillSimpleFuncHolder funcHolder = (DrillSimpleFuncHolder) holderExpr.getHolder();

      DrillSimpleFunc interpreter = funcHolder.createInterpreter();

      ValueHolder minFuncHolder = InterpreterEvaluator.evaluateFunction(interpreter, args1, holderExpr.getName());
      ValueHolder maxFuncHolder = InterpreterEvaluator.evaluateFunction(interpreter, args2, holderExpr.getName());

      switch (destType) {
        case BIT:
          return StatisticsProvider.getColumnStatistics(
            ((BitHolder) minFuncHolder).value,
            ((BitHolder) maxFuncHolder).value,
            ColumnStatisticsKind.NULLS_COUNT.getFrom(input),
            destType);
        case INT:
          return StatisticsProvider.getColumnStatistics(
              ((IntHolder) minFuncHolder).value,
              ((IntHolder) maxFuncHolder).value,
              ColumnStatisticsKind.NULLS_COUNT.getFrom(input),
              destType);
        case BIGINT:
          return StatisticsProvider.getColumnStatistics(
              ((BigIntHolder) minFuncHolder).value,
              ((BigIntHolder) maxFuncHolder).value,
              ColumnStatisticsKind.NULLS_COUNT.getFrom(input),
              destType);
        case FLOAT4:
          return StatisticsProvider.getColumnStatistics(
              ((Float4Holder) minFuncHolder).value,
              ((Float4Holder) maxFuncHolder).value,
              ColumnStatisticsKind.NULLS_COUNT.getFrom(input),
              destType);
        case FLOAT8:
          return StatisticsProvider.getColumnStatistics(
              ((Float8Holder) minFuncHolder).value,
              ((Float8Holder) maxFuncHolder).value,
              ColumnStatisticsKind.NULLS_COUNT.getFrom(input),
              destType);
        case DATE:
          return StatisticsProvider.getColumnStatistics(
            ((DateHolder) minFuncHolder).value,
            ((DateHolder) maxFuncHolder).value,
            ColumnStatisticsKind.NULLS_COUNT.getFrom(input),
            destType);
        case TIME:
          return StatisticsProvider.getColumnStatistics(
            ((TimeHolder) minFuncHolder).value,
            ((TimeHolder) maxFuncHolder).value,
            ColumnStatisticsKind.NULLS_COUNT.getFrom(input),
            destType);
        case TIMESTAMP:
          return StatisticsProvider.getColumnStatistics(
              ((TimeStampHolder) minFuncHolder).value,
              ((TimeStampHolder) maxFuncHolder).value,
              ColumnStatisticsKind.NULLS_COUNT.getFrom(input),
              destType);
        case VARDECIMAL:
          VarDecimalHolder minVarDecimalHolder = (VarDecimalHolder) minFuncHolder;
          VarDecimalHolder maxVarDecimalHolder = (VarDecimalHolder) maxFuncHolder;
          return StatisticsProvider.getColumnStatistics(
            DecimalUtility.getBigDecimalFromDrillBuf(minVarDecimalHolder.buffer, minVarDecimalHolder.start, minVarDecimalHolder.scale, minVarDecimalHolder.precision),
            DecimalUtility.getBigDecimalFromDrillBuf(maxVarDecimalHolder.buffer, maxVarDecimalHolder.start, maxVarDecimalHolder.scale, maxVarDecimalHolder.precision),
            ColumnStatisticsKind.NULLS_COUNT.getFrom(input),
            destType);
        default:
          return null;
      }
    } catch (Exception e) {
      throw new DrillRuntimeException("Error in evaluating function of " + holderExpr.getName());
    }
  }