private void addCustomColumns(DatabaseInformation info, LSHVectorFactory lshVectorFactory) {
		if (info == null) {
			return; // Info can be null, even if FunctionDatabase return Ready  (not created yet)
		}
		if (info.execats != null) {
			for (String element : info.execats) {
				addTableColumn(new ExecCategoryColumn(element));
			}
		}
		if (info.functionTags != null) {
			int mask = 1;
			mask <<= FunctionTagBSimFilterType.RESERVED_BITS;
			for (String element : info.functionTags) {
				addTableColumn(new FunctionTagColumn(element, mask));
				mask <<= 1;
			}
		}
		if (info.dateColumnName != null) {
			addTableColumn(new ExecDateColumn(info.dateColumnName));
		}
		else {
			addTableColumn(new ExecDateColumn("Ingest Date"));
		}

		// Must add this column here because it requires that the queryManager
		// be available. At the time createTableColumnDescriptor() is called this
		// is not the case. The index is set to '-1' so it will be placed at the end
		// of the list.
		if (lshVectorFactory != null) {
			addTableColumn(new SelfSignificanceColumn(lshVectorFactory), -1, false);
		}
	}
Table model for BSim Similar function search results
Ghidra/Features/BSim/src/main/java/ghidra/features/bsim/gui/search/results/BSimMatchResultsModel.java