@Override public boolean evaluate(Tuple tuple, ImmutableBytesWritable ptr) { // Reset buffer so that it gets initialized with the current datatype of the column buffer = null; if (cachedResult == null) { columnExp = (ColumnExpression) exps.get(0); // Second exp will be a LiteralExpression of Boolean type indicating // whether the ordering to be ASC/DESC LiteralExpression isAscendingExpression = (LiteralExpression) exps.get(1); boolean isAscending = (Boolean) isAscendingExpression.getValue(); // Third expression will be LiteralExpression LiteralExpression percentileExp = (LiteralExpression) exps.get(2); float p = ((Number) percentileExp.getValue()).floatValue(); Map<Object, Integer> sorted = getSortedValueVsCount(isAscending, columnExp.getDataType()); int currValue = 0; Object result = null; // Here the Percentile_disc returns the cum_dist() that is greater or equal to the // Percentile (p) specified in the query. So the result set will be of that of the // datatype of the column being selected for (Entry<Object, Integer> entry : sorted.entrySet()) { result = entry.getKey(); Integer value = entry.getValue(); currValue += value; float cum_dist = (float) currValue / (float) totalCount; if (cum_dist >= p) { break; } } this.cachedResult = result; } if (buffer == null) { // Initialize based on the datatype // columnExp cannot be null buffer = new byte[columnExp.getDataType().getByteSize()]; } // Copy the result to the buffer. System.arraycopy( columnExp.getDataType().toBytes(this.cachedResult), 0, buffer, 0, buffer.length); ptr.set(buffer); return true; }
@Override protected PDataType getResultDataType() { return columnExp.getDataType(); }