package com.github.ltsopensource.kv.iterator; import com.github.ltsopensource.kv.Entry; import com.github.ltsopensource.kv.cache.DataCache; import com.github.ltsopensource.kv.data.DataBlockEngine; import com.github.ltsopensource.kv.index.IndexItem; import com.github.ltsopensource.kv.index.MemIndex; import java.util.Iterator; import java.util.Map; /** * @author Robert HG (254963746@qq.com) on 12/18/15. */ public class MemIteratorImpl<K, V> implements DBIterator<Entry<K, V>> { private Iterator<Map.Entry<K, IndexItem<K>>> iterator; private DataBlockEngine<K, V> dataBlockEngine; private DataCache<K, V> dataCache; private MemIndex<K, V> index; public MemIteratorImpl(MemIndex<K, V> index, DataBlockEngine<K, V> dataBlockEngine, DataCache<K, V> dataCache) { this.index = index; this.dataBlockEngine = dataBlockEngine; this.dataCache = dataCache; this.iterator = index.getIndexMap().entrySet().iterator(); } @Override public boolean hasNext() { return iterator.hasNext(); } @Override public Entry<K, V> next() { Map.Entry<K, IndexItem<K>> entry = iterator.next(); IndexItem<K> index = entry.getValue(); // 1. 从缓存中读取 V value = dataCache.get(index.getKey()); if (value != null) { return new Entry<K, V>(entry.getKey(), value); } // 2. 从文件中读取 value = dataBlockEngine.getValue(index); if (value == null) { return null; } return new Entry<K, V>(entry.getKey(), value); } }