if (p == null) {
Logger.getLogger(PersonList.class.getName()).log(Level.SEVERE, "FIND PERSON called with no person data.");
return resp;
}
PersonMatch searchTerms = new PersonMatch(p);
CandidateSet candidateSet = new CandidateSet();
Set<SiteCandidate> siteCandidateSet = siteList.findIfNeeded(searchTerms);
searchTerms.setSiteCandidateSet(siteCandidateSet);
DateMatch.setToday();
//
// Make a special case if we are searching by GUID and not trying to match fingerprints.
// In this case, just look to see if we have person matching the GUID search term.
// If we do, then we are done. If not, then we test for matching the usual way...
//
PersonMatch guidMatch = null;
if (p.getPersonGuid() != null
&& (p.getFingerprintList() == null || p.getFingerprintList().isEmpty())) {
guidMatch = this.get(p.getPersonGuid());
//TODO: Fix logic.
if (guidMatch != null) {
final double GUID_MATCH_SCORE = 1.0;
final double GUID_MATCH_WEIGHT = 1.0;
Scorecard s = new Scorecard();
s.addScore(GUID_MATCH_SCORE, GUID_MATCH_WEIGHT);
candidateSet.add(guidMatch, s);
if (Mediator.testLoggerLevel(Level.FINEST)) {
Mediator.getLogger(PersonList.class.getName()).log(Level.FINEST,
"Score {0},{1} total {2},{3} comparing GUID {4} with {5}",
new Object[]{GUID_MATCH_SCORE, GUID_MATCH_WEIGHT, s.getTotalScore(), s.getTotalWeight(),
p.getPersonGuid(), guidMatch.getPerson().getPersonGuid()});
}
}
}
int personMatchCount = personList.size();
if (guidMatch == null && personMatchCount > 0) { // Skip if matched already, or if MPI is empty
int threadCount = Mpi.getMaxThreadCount();
if (threadCount > personMatchCount) {
threadCount = personMatchCount;
}
int countPerThread = (personMatchCount + threadCount - 1) / threadCount;
long startTime = System.currentTimeMillis();
List<Thread> threadArray = new ArrayList<Thread>();
for (int i = 0; i < threadCount; i++) {
int startIndex = countPerThread * i;
int endIndex = (countPerThread * (i + 1)) - 1;
if (endIndex >= personMatchCount) {
endIndex = personMatchCount - 1;
}
FindPersonThread fpt = new FindPersonThread(this, searchTerms, candidateSet, startIndex, endIndex);
Thread t = new Thread(fpt);
threadArray.add(t);
t.start();
}
for (Thread t : threadArray) {
try {
t.join();
} catch (InterruptedException ex) {
Logger.getLogger(PersonList.class.getName()).log(Level.SEVERE, "Error joining FindPersonThread", ex);
}
}
double timeInterval = (System.currentTimeMillis() - startTime);
Mediator.getLogger(PersonList.class.getName()).log(Level.FINE,
"Searched {0} entries in {1} milliseconds.",
new Object[]{personMatchCount, timeInterval});
}
List<Person> candidateList = candidateSet.export();
resp.setPersonList(candidateList);
resp.setSuccessful(true);
SearchHistory.create(req);
return resp;
}