Execute text search processing in parallel, yielding a 3x-4x speedup.
Previously all files in a text search were processed serially.
This change moves the work into Jobs and uses a JobGroup to
parallelize the processing. The following additional changes
* Some “global” state (e.g., FileCharSequenceProvider and
ReusableMatchAccess) that were previously accessed as class member
variables were changed to per-file or per-job instances.
* Access to FileSearchQuery.TextSearchResultCollector needed to be
synchronized. Its intermediate cache, which was previously an
ArrayList and assumed the last entry held the previous match from the
current file, was changed to a Map of IFile->ArrayList so that each
file’s results are segregated.
Converted spaces to tabs in the search() method to improve the Gerrit
code review experience.
Added minimal performance logging.
Signed-off-by: Terry Parker <firstname.lastname@example.org>