private void queryCallgraph(DescriptionManager manager) throws LSHException, ElasticException {
		if (!info.trackcallgraph) {
			throw new LSHException("Database does not track callgraph");
		}
		TreeMap<RowKey, FunctionDescription> funcmap = new TreeMap<>();
		manager.generateFunctionIdMap(funcmap);
		for (ExecutableRecord exeRec : manager.getExecutableRecordSet()) {
			if (exeRec.isLibrary()) {
				continue;
			}
			List<FunctionDescription> funclist = new ArrayList<>();
			Iterator<FunctionDescription> iter = manager.listFunctions(exeRec);
			while (iter.hasNext()) { // Build a static copy of the list of functions
				funclist.add(iter.next());
			}
			for (FunctionDescription element : funclist) {
				fillinChildren(element, manager, funcmap);
			}
		}
	}
For every function currently in the manager, fill in its call-graph information.
This involves querying the database for child information, adding the cross-link
information (CallgraphEntry) between FunctionDescriptions, and possibly querying
for new library executables and functions
@param manager is the collection of functions to link
@throws LSHException for problems updating the container
@throws ElasticException for communication problems with the server
Ghidra/Features/BSim/src/main/java/ghidra/features/bsim/query/elastic/ElasticDatabase.java