@Override
public boolean evaluate(Tuple tuple, ImmutableBytesWritable ptr) {
if (cachedResult == null) {
BigDecimal ssd = sumSquaredDeviation();
ssd = ssd.divide(new BigDecimal(getDataPointsCount()), PDataType.DEFAULT_MATH_CONTEXT);
int resultPrecision = colPrecision;
for (int i = 1; i < this.totalCount; i++) {
if (resultPrecision >= PDataType.MAX_PRECISION) break;
Pair<Integer, Integer> precisionScale = BigDecimalUtil.getResultPrecisionScale(this.colPrecision,
this.colScale, this.colPrecision, this.colScale, Operation.OTHERS);
resultPrecision = precisionScale.getFirst();
}
cachedResult = new BigDecimal(Math.sqrt(ssd.doubleValue()), new MathContext(resultPrecision,
RoundingMode.HALF_UP));
cachedResult.setScale(this.colScale, RoundingMode.HALF_UP);
}
if (buffer == null) {
initBuffer();
}
buffer = PDataType.DECIMAL.toBytes(cachedResult);
ptr.set(buffer);
return true;
}