private MemoryMatchTableLoader createLoader(MemorySearcher searcher, Combiner combiner) {
		if (!hasResults()) {
			hasDeleted = false;
			return new NewSearchTableLoader(searcher);
		}

		// We have existing results.  Will they be merged?
		if (combiner.isMerge()) {

			// If we have existing results, the combiner determines how the new search results get
			// combined with the existing results.
			// 
			// However, if the combiner is the "Replace" combiner, the results are not combined
			// and only the new results are kept. In this case, it is preferred to use the same
			// loader as if doing an initial search because you get incremental loading and also
			// don't need to copy the existing results to feed to a combiner.
			hasCombined = true;
			List<MemoryMatch> previousResults = tableModel.getModelData();
			return new CombinedMatchTableLoader(searcher, previousResults, combiner);
		}

		// We have results, but we are going to replace them.  A new load of data means any previous
		// manual deletes are now irrelevant
		hasDeleted = false;
		return new NewSearchTableLoader(searcher);
	}
Internal panel of the memory search window that manages the display of the search results
in a table. This panel also includes most of the search logic as it has direct access to the
table for showing the results.
Ghidra/Features/Base/src/main/java/ghidra/features/base/memsearch/gui/MemorySearchResultsPanel.java