package org.apache.lucene.search; import java.io.IOException; import java.lang.ref.Reference; import java.lang.ref.SoftReference; import java.util.HashMap; import java.util.Map; import org.apache.commons.lang.NotImplementedException; import org.apache.lucene.index.DocValues; import org.apache.lucene.index.LeafReader; import org.apache.lucene.index.NumericDocValues; import org.apache.solr.uninverting.UninvertingReader; import org.apache.solr.uninverting.UninvertingReader.Type; public class LuceneCacheWrapper<T> implements CacheWrapper { String str; int hashCode; public Reference<T> cache; public LuceneCacheWrapper(Reference<T> cache) { this.cache = cache; this.str = internalToString(); // we cache these values because cache may disappear this.hashCode = internalHashCode(); } @Override public void init() { // do nothing } @Override public String toString() { return this.str; } @Override public int hashCode() { return this.hashCode; } @Override public int internalHashCode() { return cache.get().hashCode(); } @Override public void close() { cache.clear(); } @Override public String internalToString() { throw new NotImplementedException(); } public float getFloat(int docid) { throw new NotImplementedException(); } public static LuceneCacheWrapper<NumericDocValues> getFloatCache( String fieldName, Type type, LeafReader reader) throws IOException { Map<String, UninvertingReader.Type> mapping = new HashMap<String, UninvertingReader.Type>(); mapping.put(fieldName, type); UninvertingReader uninvertingReader = new UninvertingReader(reader, mapping); NumericDocValues values = uninvertingReader.getNumericDocValues(fieldName); if (values == null) values = DocValues.emptyNumeric(); final String fName = fieldName; LuceneCacheWrapper<NumericDocValues> newCache = new LuceneCacheWrapper<NumericDocValues>(new SoftReference<NumericDocValues>(values)) { @Override public String internalToString() { return "float[] " + fName; } @Override public float getFloat(int docid) { long v = this.cache.get().get(docid); return (float) v; } }; return newCache; } }