package org.reldb.rel.v0.storage.temporary;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map.Entry;
import org.reldb.rel.v0.values.TupleIterator;
import org.reldb.rel.v0.values.ValueTuple;
// Memory-based temporary tuple storage.
class TempIndexMemory implements TempIndex {
private HashMap<ValueTuple, LinkedList<ValueTuple>> storage;
Iterator<Entry<ValueTuple, LinkedList<ValueTuple>>> iterator() {
return storage.entrySet().iterator();
}
public TempIndexMemory() {
storage = new HashMap<ValueTuple, LinkedList<ValueTuple>>();
}
public void close() {
storage = null;
}
public void put(ValueTuple keyTuple, ValueTuple valueTuple) {
LinkedList<ValueTuple> values = storage.get(keyTuple);
if (values == null) {
values = new LinkedList<ValueTuple>();
storage.put(keyTuple, values);
}
values.add(valueTuple);
}
@Override
// Get a TupleIterator on values which iterates all values for a given Key
public TupleIterator keySearch(final ValueTuple key) {
return new TupleIterator() {
LinkedList<ValueTuple> list = storage.get(key);
Iterator<ValueTuple> listIterator;
@Override
public boolean hasNext() {
if (list == null)
return false;
if (listIterator == null)
listIterator = list.iterator();
return listIterator.hasNext();
}
@Override
public ValueTuple next() {
if (!hasNext())
return null;
return listIterator.next();
}
@Override
public void close() {
}
};
}
}