package org.apache.solr.request.uninverted; import java.io.IOException; import java.util.ArrayList; import org.apache.lucene.index.DocValuesReader; import org.apache.solr.request.BlockBufferPool.BlockArray; import org.apache.solr.request.uninverted.TermIndex.IndexSearch; import org.apache.solr.request.uninverted.UnInvertedFieldUtils.FieldDatatype; import org.apache.solr.search.BitDocSet; import org.apache.solr.search.DocIterator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class RamDocValueFill { public static Logger log = LoggerFactory.getLogger(RamDocValueFill.class); public static int Fill(UnInvertedField inv, int maxdoc, boolean isinit, TermIndex ti, DocValuesReader quicktisInput, int fieldNumber, boolean isReadDouble, BitDocSet baseAdvanceDocs) throws IOException, CloneNotSupportedException { long l0=System.currentTimeMillis(); boolean isreadText=isinit&&(!isReadDouble); DocValuesReader docValues = (DocValuesReader) quicktisInput.clone(); docValues.seekTo(fieldNumber,isreadText ); int doc = -1; int tm = 0; long l1=System.currentTimeMillis(); if (inv.fieldDataType == FieldDatatype.d_double) { if (baseAdvanceDocs != null) { DocIterator iter = baseAdvanceDocs.iterator(); while (iter.hasNext()) { doc = iter.nextDoc(); tm = docValues.readTm(doc); inv.markDocTm(doc, tm, isinit); inv.bits.add(doc); if (isReadDouble) { inv.setTmValueDouble(tm,RamTermNumValue.EMPTY_FOR_MARK); } } } else { for (doc = 0; doc < maxdoc; doc++) { tm = docValues.readTm(doc); inv.markDocTm(doc, tm, isinit); inv.bits.add(doc); if (isReadDouble) { inv.setTmValueDouble(tm,RamTermNumValue.EMPTY_FOR_MARK); } } } } else { if (baseAdvanceDocs != null) { DocIterator iter = baseAdvanceDocs.iterator(); while (iter.hasNext()) { doc = iter.nextDoc(); tm = docValues.readTm(doc); inv.markDocTm(doc, tm, isinit); inv.bits.add(doc); if (isReadDouble) { inv.setTmValueLong(tm, (long) RamTermNumValue.EMPTY_FOR_MARK); } } } else { for (doc = 0; doc < maxdoc; doc++) { tm = docValues.readTm(doc); inv.markDocTm(doc, tm, isinit); inv.bits.add(doc); if (isReadDouble) { inv.setTmValueLong(tm, (long) RamTermNumValue.EMPTY_FOR_MARK); } } } } long l2=System.currentTimeMillis(); if (isReadDouble) { if (inv.fieldDataType == FieldDatatype.d_double) { BlockArray<Double> list = inv.getTmValueDouble(); for (int i = 0; i <=docValues.maxtm; i++) { if (list.get(i) <= RamTermNumValue.EMPTY_FOR_MARK_FORCMP) { double val = Double.longBitsToDouble(docValues.readTmValue(i,true)); list.set(i, val); } } } else { BlockArray<Long> list = inv.getTmValueLong(); for (int i = 0; i <=docValues.maxtm; i++) { if (list.get(i) <= RamTermNumValue.EMPTY_FOR_MARK_FORCMP) { long val = docValues.readTmValue(i,false); list.set(i, val); } } } } long l3=System.currentTimeMillis(); if (isreadText) { ArrayList<String> lst = docValues.lst; ti.nTerms = docValues.maxtm; ti.sizeOfStrings = docValues.sizeOfStrings; ti.index = new IndexSearch(); ti.index.index = lst != null ? lst.toArray(new String[lst.size()]) : new String[0]; }else if(isinit){ ti.nTerms = docValues.maxtm; ti.sizeOfStrings = 0; ti.index = new IndexSearch(); ti.index.index = new String[0]; } long l4=System.currentTimeMillis(); log.info("file timetaken:"+(l4-l3)+","+(l3-l2)+","+(l2-l1)+","+(l1-l0)); return docValues.maxtm; } }