private static JsonObject processQuantilesQuery()

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