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