@Nonnull
	public Results search(@Nonnull Workspace workspace, @Nonnull List<Query> queries, @Nonnull SearchFeedback feedback) {
		Results results = new Results();

		// Build visitors
		AndroidClassSearchVisitor androidClassVisitorTemp = null;
		JvmClassSearchVisitor jvmClassVisitorTemp = null;
		FileSearchVisitor fileVisitorTemp = null;
		for (Query query : queries) {
			if (query instanceof AndroidClassQuery androidClassQuery)
				androidClassVisitorTemp = androidClassQuery.visitor(androidClassVisitorTemp);
			if (query instanceof JvmClassQuery jvmClassQuery)
				jvmClassVisitorTemp = jvmClassQuery.visitor(jvmClassVisitorTemp);
			if (query instanceof FileQuery fileQuery)
				fileVisitorTemp = fileQuery.visitor(fileVisitorTemp);
		}
		AndroidClassSearchVisitor androidClassVisitor = androidClassVisitorTemp;
		JvmClassSearchVisitor jvmClassVisitor = jvmClassVisitorTemp;
		FileSearchVisitor fileVisitor = fileVisitorTemp;

		// Run visitors on contents of workspace
		ExecutorService service = ThreadPoolFactory.newFixedThreadPool(SERVICE_ID + ":" + queries.hashCode());
		WorkspacePathNode workspaceNode = PathNodes.workspacePath(workspace);
		for (WorkspaceResource resource : workspace.getAllResources(false))
			searchResource(results, service, feedback, resource, workspaceNode,
					androidClassVisitor, jvmClassVisitor, fileVisitor);
		ThreadUtil.blockUntilComplete(service);

		// Notify feedback of search completion
		feedback.onCompletion();

		return results;
	}
@param workspace
		Workspace to search in.
@param queries
		Multiple queries of search parameters.
@param feedback
		Search visitation feedback. Allows early cancellation of searches.

@return Results of search.
recaf-core/src/main/java/software/coley/recaf/services/search/SearchService.java