in src/main/java/org/apache/datasketches/server/DataQueryHandler.java [185:273]
private static JsonObject processQuantilesQuery(final JsonObject result, final JsonObject query, final Family type, final Object sketch) {
if (query == null || type == null || sketch == null) {
return null;
}
// check if we need a summary
final boolean addSummary = checkSummaryFlag(query);
String summary = null;
final boolean isEstimationMode;
final float maxValue;
final float minValue;
final long streamLength;
final double[] fractions = getFractionsArray(query);
float[] quantiles = null;
final float[] values = getValuesArray(query);
final String resultType = getResultType(query);
double[] ranks = null;
// since we know REQ is coming
switch (type) {
case KLL:
final KllFloatsSketch kll = (KllFloatsSketch) sketch;
isEstimationMode = kll.isEstimationMode();
maxValue = kll.getMaxValue();
minValue = kll.getMinValue();
streamLength = kll.getN();
// TODO: consider valuesPMF vs valuesCDF calls to allow a mix?
if (values != null) {
ranks = resultType.equals(QUERY_RESULT_TYPE_CDF) ? kll.getCDF(values) : kll.getPMF(values);
}
if (fractions != null) {
quantiles = kll.getQuantiles(fractions);
}
if (addSummary)
summary = kll.toString();
break;
default:
throw new SketchesException("processQuantilesQuery() received a non-quantiles sketch: " + type);
}
//final JsonObject result = new JsonObject();
result.addProperty(RESPONSE_STREAM_LENGTH, streamLength);
result.addProperty(RESPONSE_ESTIMATION_MODE_FIELD, isEstimationMode);
result.addProperty(RESPONSE_MIN_VALUE, minValue);
result.addProperty(RESPONSE_MAX_VALUE, maxValue);
if (ranks != null) {
final String label = resultType.equals(QUERY_RESULT_TYPE_PMF) ? RESPONSE_RESULT_MASS : RESPONSE_RESULT_RANK;
final JsonArray rankArray = new JsonArray();
for (int i = 0; i < ranks.length; ++i) {
final JsonObject rankPair = new JsonObject();
if (i == values.length) {
rankPair.addProperty(RESPONSE_RESULT_VALUE, maxValue);
} else {
rankPair.addProperty(RESPONSE_RESULT_VALUE, values[i]);
}
rankPair.addProperty(label, ranks[i]);
rankArray.add(rankPair);
}
if (resultType.equals(QUERY_RESULT_TYPE_CDF))
result.add(RESPONSE_CDF_LIST, rankArray);
else
result.add(RESPONSE_PMF_LIST, rankArray);
}
if (quantiles != null) {
final JsonArray quantileArray = new JsonArray();
for (int i = 0; i < quantiles.length; ++i) {
final JsonObject quantilePair = new JsonObject();
quantilePair.addProperty(RESPONSE_RESULT_RANK, fractions[i]);
quantilePair.addProperty(RESPONSE_RESULT_QUANTILE, quantiles[i]);
quantileArray.add(quantilePair);
}
result.add(RESPONSE_QUANTILE_LIST, quantileArray);
}
if (addSummary)
result.addProperty(RESPONSE_SUMMARY_FIELD, summary);
return result;
}