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