protected void convertDescriptionRows(SimilarityResult similarityResult, JsonArray descRows,
			VectorResult vectorResult, DescriptionManager manager, SignatureRecord sigRecord)
			throws ElasticException, LSHException {
		if (descRows.size() == 0) {
			return;
		}
		List<RowKeyElastic> parentIds = new ArrayList<>(descRows.size());
		Set<RowKeyElastic> parents = new TreeSet<>();
		RowKeyElastic eKey;
		String exeid;
		for (JsonElement descRow : descRows) {
			JsonObject hit = (JsonObject) descRow;
			JsonObject source = (JsonObject) hit.get("_source");
			JsonObject joinfield = (JsonObject) source.get("join_field");
			exeid = joinfield.get("parent").getAsString();
			eKey = RowKeyElastic.parseExeIdString(exeid);
			parentIds.add(eKey);
			if (manager.findExecutableByRow(eKey) == null) {
				parents.add(eKey);
			}
		}
		Iterator<RowKeyElastic> iter1 = parents.iterator();
		Iterator<RowKeyElastic> iter2 = parents.iterator();
		while (iter1.hasNext()) {
			queryExecutableRecordById(manager, iter1, iter2, 100);
		}

		JsonObject currow = (JsonObject) descRows.get(0);
		eKey = parentIds.get(0);
		ExecutableRecord curexe = manager.findExecutableByRow(eKey);
		FunctionDescription fres = convertDescriptionRow(currow, curexe, manager, sigRecord);
		if (similarityResult != null) {
			similarityResult.addNote(fres, vectorResult.sim, vectorResult.signif);
		}
		for (int i = 1; i < descRows.size(); ++i) {
			currow = (JsonObject) descRows.get(i);
			eKey = parentIds.get(i);
			curexe = manager.findExecutableByRow(eKey);
			fres = convertDescriptionRow(currow, curexe, manager, sigRecord);
			if (similarityResult != null) {
				similarityResult.addNote(fres, vectorResult.sim, vectorResult.signif);
			}
		}
	}
Convert function documents, presented as an array of JSON objects, that all
share a single feature vector returned by a nearest neighbor query, into
FunctionDescriptions and a full SimilarityResult.
Each function document will be parsed into a FunctionDescription,
and a SimilarityNote will be created describing its similarity to
the query vector based on the raw VectorResult data.
@param similarityResult is the container for the SimilarityNotes
@param descRows is the array of JSON function documents
@param vectorResult is the raw vector query result
@param manager is the container for new FunctionDescriptions
@param sigRecord is the shared feature vector
@throws ElasticException for communication problems with the server
@throws LSHException for problems adding new records to the container
Ghidra/Features/BSim/src/main/java/ghidra/features/bsim/query/elastic/ElasticDatabase.java