protected JsonObject processQuery()

in src/main/java/org/apache/datasketches/server/MergeHandler.java [82:138]


  protected JsonObject processQuery(final JsonObject query) {
    // optional targets:
    // If no QUERY_MERGE_TGT_FIELD serialize the result, but then need specify QUERY_MERGE_K_FIELD.
    // If a valid target is present, any value of QUERY_MERGE_K_FIELD is ignored
    final JsonElement dstElement = query.get(SketchConstants.QUERY_MERGE_TGT_FIELD);
    final String dst = dstElement != null ? dstElement.getAsString() : null;
    if (dst != null && !sketches.contains(dst)) {
      throw new IllegalArgumentException("Specified target sketch does not exist: " + dst);
    }

    int k = 0;
    if (dst == null) {
      final JsonElement kElement = query.get(SketchConstants.QUERY_MERGE_K_FIELD);
      if (kElement == null) {
        throw new IllegalArgumentException("Must specify either \"" + SketchConstants.QUERY_MERGE_TGT_FIELD
            + "\" or \"" + SketchConstants.QUERY_MERGE_K_FIELD + "\". Neither found.");
      }
      k = kElement.getAsInt();
    }

    final JsonElement srcElement = query.get(SketchConstants.QUERY_MERGE_SRC_FIELD);
    if (srcElement == null || !srcElement.isJsonArray()) {
      throw new IllegalArgumentException("Merge source data must be a JSON Array");
    }
    final JsonArray srcList = srcElement.getAsJsonArray();

    SketchStorage.SketchEntry se = null;
    Family dstFamily = null;
    if (dst != null) {
      se = sketches.getSketch(dst);
      dstFamily = se.family_;
    }

    // we'll process (and dedup) any stored sketches before we handle encoded inputs
    // but we'll run through all of them before doing anything
    final ArrayList<MergeEntry> srcSketches = new ArrayList<>(srcList.size());

    dstFamily = prepareSketches(srcList, dstFamily, dst, srcSketches);
    final byte[] skBytes;
    // need to synchronize if we have a named sketch
    if (se == null) {
      skBytes = mergeSketches(dstFamily, k, null, srcSketches);
    } else {
      synchronized (se.name_.intern()) {
        skBytes = mergeSketches(dstFamily, k, se, srcSketches);
      }
    }

    // skBytes == null if merging into another sketch; only non-null if returning a serialized image
    if (skBytes != null) {
      final JsonObject result = new JsonObject();
      result.addProperty(SketchConstants.QUERY_SKETCH_FIELD, Base64.getUrlEncoder().encodeToString(skBytes));
      return result;
    } else {
      return null;
    }
  }