in hollow/src/main/java/com/netflix/hollow/tools/diff/exact/mapper/DiffEqualityTypeMapper.java [95:162]
protected DiffEqualOrdinalMap mapMatchingFromOrdinals(final int[] hashedToOrdinals) {
PopulatedOrdinalListener listener = fromState.getListener(PopulatedOrdinalListener.class);
final BitSet fromPopulatedOrdinals = listener.getPopulatedOrdinals();
final int ordinalSpaceLength = fromPopulatedOrdinals.length();
SimultaneousExecutor executor = new SimultaneousExecutor(1.5d, getClass(), "map-matching-from-ordinals");
final int numThreads = executor.getCorePoolSize();
final LongList[] matchPairResults = new LongList[numThreads];
for(int i=0;i<numThreads;i++) {
final int threadNumber = i;
matchPairResults[threadNumber] = new LongList();
executor.execute(() -> {
EqualityDeterminer equalityDeterminer = getEqualityDeterminer();
for(int t=threadNumber;t <ordinalSpaceLength;t+=numThreads) {
if(fromPopulatedOrdinals.get(t)) {
int hashCode = fromRecordHashCode(t);
if(hashCode != -1) {
int bucket = hashCode & (hashedToOrdinals.length - 1);
while(hashedToOrdinals[bucket] != -1) {
if(equalityDeterminer.recordsAreEqual(t, hashedToOrdinals[bucket])) {
matchPairResults[threadNumber].add(((long) t << 32) | hashedToOrdinals[bucket]);
}
bucket = (bucket + 1) & (hashedToOrdinals.length - 1);
}
}
}
}
});
}
try {
executor.awaitSuccessfulCompletion();
} catch (InterruptedException | ExecutionException e) {
throw new RuntimeException(e);
}
int numMatches = 0;
for(int i=0;i<matchPairResults.length;i++) {
numMatches += matchPairResults[i].size();
}
CombinedMatchPairResultsIterator resultsIterator = new CombinedMatchPairResultsIterator(matchPairResults);
DiffEqualOrdinalMap ordinalMap = new DiffEqualOrdinalMap(numMatches);
if(oneToOne) {
BitSet alreadyMappedToOrdinals = new BitSet(toState.maxOrdinal() + 1);
while(resultsIterator.next()) {
int fromOrdinal = resultsIterator.fromOrdinal();
IntList toOrdinals = resultsIterator.toOrdinals();
for(int i=0;i<toOrdinals.size();i++) {
if(!alreadyMappedToOrdinals.get(toOrdinals.get(i))) {
alreadyMappedToOrdinals.set(toOrdinals.get(i));
ordinalMap.putEqualOrdinal(fromOrdinal, toOrdinals.get(i));
break;
}
}
}
} else {
while(resultsIterator.next()) {
ordinalMap.putEqualOrdinals(resultsIterator.fromOrdinal(), resultsIterator.toOrdinals());
}
}
return ordinalMap;
}