package org.yamcs.yarch.rocksdb;
import java.util.Comparator;
import java.util.List;
import java.util.PriorityQueue;
/**
* Merges data from multiple iterators sorting the output
*
*
* @author nm
*
*/
class MergingIterator implements DbIterator {
final Comparator<byte[]> keyComparator;
PriorityQueue <DbIterator> priorityQueue;
final List<DbIterator> itList;
public MergingIterator(List<DbIterator> itList, Comparator<byte[]> keyComparator) {
this.keyComparator = keyComparator;
this.itList = itList;
priorityQueue = new PriorityQueue<>(new IteratorComparator(keyComparator));
init(itList);
}
private void init(List<DbIterator> itList) {
for(DbIterator it:itList) {
if(it.isValid()) {
priorityQueue.add(it);
} else {
it.close();
}
}
}
@Override
public boolean isValid() {
return !priorityQueue.isEmpty();
}
@Override
public void next() {
DbIterator it = priorityQueue.poll();
it.next();
if(it.isValid()) {
priorityQueue.add(it);
} else {
it.close();
}
}
@Override
public void prev() {
DbIterator it = priorityQueue.poll();
it.prev();
if(it.isValid()) {
priorityQueue.add(it);
} else {
it.close();
}
}
/**
* closes all subiterators
*/
@Override
public void close() {
while(!priorityQueue.isEmpty()) {
DbIterator it = priorityQueue.poll();
it.close();
}
}
@Override
public byte[] key() {
DbIterator it = priorityQueue.peek();
return it.key();
}
@Override
public byte[] value() {
DbIterator it = priorityQueue.peek();
return it.value();
}
class IteratorComparator implements Comparator<DbIterator> {
final Comparator<byte[]> keyComparator;
public IteratorComparator(Comparator<byte[]> keyComparator) {
this.keyComparator = keyComparator;
}
@Override
public int compare(DbIterator it1, DbIterator it2) {
return keyComparator.compare(it1.key(), it2.key());
}
}
}