TableData<ROW_OBJECT> getLowestLevelSourceDataForFilter(TableFilter<ROW_OBJECT> filter) {

		if (hasParentFilterOf(filter)) {
			return this; // my data is the correct start point for the given filter
		}

		// check my ancestry
		if (source == null) {
			return null;
		}

		TableData<ROW_OBJECT> parent = source.getLowestLevelSourceDataForFilter(filter);
		return parent;
	}
Starts at this data object and looks for a suitable dataset for the given filter.  If
this dataset is filtered and the filter is a more general case of the given filter, then
this dataset can be used for the given filter as a source of data.  If this dataset
is not suitable as a filter starting point, then this dataset's parent will be checked.
This operation will walk up the parent chain this way until the root dataset is reached.

@param filter the filter to check for compatibility with this dataset's filter
@return the correct dataset to use as a starting point for further filtering operations; 
        null if this dataset is not compatible with the given filter.
Ghidra/Framework/Docking/src/main/java/docking/widgets/table/threaded/TableData.java