package org.reldb.rel.v0.values;
import java.util.HashSet;
import java.util.NoSuchElementException;
/** A TupleIteratorUnique is a TupleIterator that removes all duplicate ValueTuple's. */
public class TupleIteratorUnique extends TupleIterator {
private TupleIterator source;
private HashSet<ValueTuple> tupleSet;
private ValueTuple current;
// TODO - MEM - modify TupleIteratorUnique to prevent out-of-memory on high-cardinality relations
public TupleIteratorUnique(TupleIterator source) {
this.source = source;
tupleSet = new HashSet<ValueTuple>();
current = null;
}
@Override
public boolean hasNext() {
if (current != null)
return true;
do {
if (!source.hasNext())
return false;
current = source.next();
} while (tupleSet.contains(current));
tupleSet.add(current);
return true;
}
@Override
public ValueTuple next() {
if (hasNext())
try {
return current;
} finally {
current = null;
}
throw new NoSuchElementException();
}
public void close() {
source.close();
}
}