package org.apache.solr.request.uninverted; import java.io.IOException; import org.apache.lucene.index.IndexReader; import org.apache.solr.request.BlockBufferPool; import org.apache.solr.request.BlockBufferPool.BlockArray; import org.apache.solr.schema.FieldType; public class RamTermNumValue { private static long MIN_VALUE=Integer.MIN_VALUE; public static long TERMNUM_NAN_VALUE =MIN_VALUE+100; public static long TERMNUM_NAN_VALUE_FORCMP=TERMNUM_NAN_VALUE+10; public static long EMPTY_FOR_MARK = MIN_VALUE+2; public static long EMPTY_FOR_MARK_FORCMP =EMPTY_FOR_MARK+10; public BlockArray<Double> termValueDouble = null; public BlockArray<Long> termValueLong = null; public UnInvertedFieldUtils.FieldDatatype fieldDataType = null; public int nullTermNum = -1; public RamTermNumValue(UnInvertedFieldUtils.FieldDatatype fieldDataType) { this.fieldDataType=fieldDataType; } public void startInitValue(int maxDoc, IndexReader reader,boolean isReadDouble) { if (!isReadDouble) { return ; } int maxDocOffset = maxDoc + 2; if(this.fieldDataType.equals(UnInvertedFieldUtils.FieldDatatype.d_double)) { this.termValueDouble = BlockBufferPool.DOUBLE_POOL.calloc(maxDocOffset, BlockBufferPool.DOUBLE_CREATE,(double)RamTermNumValue.TERMNUM_NAN_VALUE); }else{ this.termValueLong = BlockBufferPool.LONG_POOL.calloc(maxDocOffset, BlockBufferPool.LONG_CREATE,RamTermNumValue.TERMNUM_NAN_VALUE); } } public void endInitValue(boolean isReadDouble, int maxTermNum) { this.nullTermNum = maxTermNum + 1; if (!isReadDouble) { return ; } int fillSize=nullTermNum+1; if(this.fieldDataType.equals(UnInvertedFieldUtils.FieldDatatype.d_double)) { this.termValueDouble = BlockBufferPool.DOUBLE_POOL.reCalloc(this.termValueDouble,fillSize, BlockBufferPool.DOUBLE_CREATE, (double)RamTermNumValue.TERMNUM_NAN_VALUE); this.termValueDouble.set(this.nullTermNum, (double)RamTermNumValue.TERMNUM_NAN_VALUE); }else{ this.termValueLong = BlockBufferPool.LONG_POOL.reCalloc(this.termValueLong,fillSize,BlockBufferPool.LONG_CREATE, RamTermNumValue.TERMNUM_NAN_VALUE); this.termValueLong.set(this.nullTermNum, (long)RamTermNumValue.TERMNUM_NAN_VALUE); } } public void free() { if (this.termValueDouble != null) { BlockBufferPool.DOUBLE_POOL.recycleByteBlocks(this.termValueDouble); this.termValueDouble=null; } if (this.termValueLong != null) { BlockBufferPool.LONG_POOL.recycleByteBlocks(this.termValueLong); this.termValueLong=null; } } public int getmemsize() { int sz = 0; if (termValueDouble != null) sz += termValueDouble.getMemSize() * 8; if (termValueLong != null) sz += termValueLong.getMemSize() * 8; return sz; } public String toString() { StringBuffer membuffer = new StringBuffer(); if (termValueDouble != null) { membuffer.append(",").append( "termValueDouble=" + termValueDouble.getMemSize() + "@" + termValueDouble.getSize()); } if (termValueLong != null) { membuffer.append(",").append( "termValueLong=" + termValueLong.getMemSize() + "@" + termValueLong.getSize()); } return membuffer.toString(); } public TermDoubleValue getTermDoubleValue() { if (fieldDataType.equals(UnInvertedFieldUtils.FieldDatatype.d_long)) { return new TermDoubleValue_long(this); } if (fieldDataType.equals(UnInvertedFieldUtils.FieldDatatype.d_string)) { return new TermDoubleValue_long(this); } if (fieldDataType.equals(UnInvertedFieldUtils.FieldDatatype.d_double)) { return new TermDoubleValue_double(this); } return new TermDoubleValue_nan(); } private static class TermDoubleValue_long extends TermDoubleValue { private BlockArray<Long> termValueLong; private RamTermNumValue tv; public TermDoubleValue_long( RamTermNumValue tv) { this.termValueLong = tv.termValueLong; this.tv=tv; } public double tm(int tm, FieldType ft, TermNumEnumerator te) { if(tm >= tv.nullTermNum) { return TERMNUM_NAN_VALUE; } return this.termValueLong.get(tm); } } private static class TermDoubleValue_double extends TermDoubleValue { private BlockArray<Double> termValueDouble; private RamTermNumValue tv; public TermDoubleValue_double(RamTermNumValue tv) { this.termValueDouble = tv.termValueDouble; this.tv=tv; } public double tm(int tm, FieldType ft, TermNumEnumerator te) { if(tm >= tv.nullTermNum) { return TERMNUM_NAN_VALUE; } return this.termValueDouble.get(tm); } } private static class TermDoubleValue_nan extends TermDoubleValue { public double tm(int tm, FieldType ft, TermNumEnumerator te) throws IOException { throw new RuntimeException("TermDoubleValue_nan"); // return TERMNUM_NAN_VALUE; } } public abstract static class TermDoubleValue { public abstract double tm(int tm, FieldType ft, TermNumEnumerator te) throws IOException; } }