private Set<FileRef> removeSmallest(Map<FileRef,DataFileValue> filesToCompact,
int maxFilesToCompact) {
if (filesToCompact.size() <= maxFilesToCompact) {
Set<FileRef> smallestFiles = new HashSet<>(filesToCompact.keySet());
filesToCompact.clear();
return smallestFiles;
}
PriorityQueue<Pair<FileRef,Long>> fileHeap = new PriorityQueue<>(filesToCompact.size(),
(o1, o2) -> {
if (o1.getSecond() == o2.getSecond())
return o1.getFirst().compareTo(o2.getFirst());
if (o1.getSecond() < o2.getSecond())
return -1;
return 1;
});
for (Iterator<Entry<FileRef,DataFileValue>> iterator = filesToCompact.entrySet()
.iterator(); iterator.hasNext();) {
Entry<FileRef,DataFileValue> entry = iterator.next();
fileHeap.add(new Pair<>(entry.getKey(), entry.getValue().getSize()));
}
Set<FileRef> smallestFiles = new HashSet<>();
while (smallestFiles.size() < maxFilesToCompact && fileHeap.size() > 0) {
Pair<FileRef,Long> pair = fileHeap.remove();
filesToCompact.remove(pair.getFirst());
smallestFiles.add(pair.getFirst());
}
return smallestFiles;
}