package org.reldb.rel.v0.storage.temporary; import java.util.Iterator; import java.util.LinkedList; import java.util.Map.Entry; import org.reldb.rel.v0.storage.RelDatabase; import org.reldb.rel.v0.values.TupleIterator; import org.reldb.rel.v0.values.ValueTuple; public class TempIndexImplementation implements TempIndex { // TODO - this should either be tunable or dynamic private static final long storageMemoryLimit = 100; private TempIndex storageImplementation; private long storageCount = 0; private RelDatabase database; public TempIndexImplementation(RelDatabase db) { database = db; storageImplementation = new TempIndexMemory(); } /* (non-Javadoc) * @see org.reldb.rel.v0.storage.TempStorageTuplesInterface#close() */ @Override public void close() { storageImplementation.close(); } @Override public void put(ValueTuple keyTuple, ValueTuple valueTuple) { storageImplementation.put(keyTuple, valueTuple); storageCount++; if (storageCount == storageMemoryLimit) { TempIndexDisk target = new TempIndexDisk(database); Iterator<Entry<ValueTuple, LinkedList<ValueTuple>>> source = ((TempIndexMemory)storageImplementation).iterator(); while (source.hasNext()) { Entry<ValueTuple, LinkedList<ValueTuple>> entry = source.next(); LinkedList<ValueTuple> values = entry.getValue(); Iterator<ValueTuple> valueIterator = values.iterator(); while (valueIterator.hasNext()) target.put(entry.getKey(), valueIterator.next()); } storageImplementation.close(); storageImplementation = target; } } // Get a TupleIterator on values which iterates all values for a given Key /* (non-Javadoc) * @see org.reldb.rel.v0.storage.TempStorageTuplesInterface#keySearch(org.reldb.rel.v0.generator.Generator, org.reldb.rel.v0.values.ValueTuple) */ @Override public TupleIterator keySearch(ValueTuple key) { return storageImplementation.keySearch(key); } }