private void createCombinedFilterWithEmptyTextFilter(TableFilter<TestRowObject> nonTextFilter) {

		DefaultRowFilterTransformer<TestRowObject> transformer =
			new DefaultRowFilterTransformer<>(model, table.getColumnModel());

		TextFilter allPassesFilter = new EmptyTextFilter();
		spyFilter = new SpyTextFilter<>(allPassesFilter, transformer, recorder);

		CombinedTableFilter<TestRowObject> combinedFilter =
			new CombinedTableFilter<>(spyFilter, nonTextFilter, null);

		recorder.record("Before setting the new filter");
		runSwing(() -> model.setTableFilter(combinedFilter));
		recorder.record("\tafter setting filter");

		waitForNotBusy();
		waitForTableModel(model);
		waitForSwing();
	}
Specifically tests the sub-filtering behavior of the {@link ThreadedTableModel}, as well
as some other more complicated filtering combinations
Ghidra/Framework/Docking/src/test.slow/java/docking/widgets/table/threaded/DefaultThreadedTableFilterTest.java