package org.apache.solr.request.uninverted; import java.io.IOException; import org.apache.lucene.index.DocValuesReader; import org.apache.lucene.index.SegmentReader; import org.apache.solr.schema.IndexSchema; import org.apache.solr.search.BitDocSet; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class MakeUnivertedFieldBySigment{ public static Logger log = LoggerFactory.getLogger(MakeUnivertedFieldBySigment.class); static boolean isforbiden=false; public static boolean makeInit(UnInvertedField uni,BitDocSet baseAdvanceDocs,String field, SegmentReader reader,IndexSchema schema,boolean isreadDouble) throws IOException, CloneNotSupportedException { long t1=System.currentTimeMillis(); int fieldNumber=reader.getFieldNum(field); if(isforbiden||!reader.isSupportQuick()||fieldNumber<0) { return false; } uni.init( field, reader, schema); long t2=System.currentTimeMillis(); uni.baseAdvanceDocs=UnInvertedField.ajustBase(4,baseAdvanceDocs, reader); long t3=System.currentTimeMillis(); if(uni.checkEmpty()) { return true; } log.info("makeInit start:" + uni.field + " ,this.baseAdvanceDocs="+(uni.baseAdvanceDocs==null?0:uni.baseAdvanceDocs.size())); int maxDoc = reader.maxDoc(); uni.startRamDocValue(maxDoc, reader, isreadDouble); long t4=System.currentTimeMillis(); DocValuesReader docvalues=reader.getDocValues(); int maxtm=RamDocValueFill.Fill(uni,reader.maxDoc(), true, uni.ti, docvalues, fieldNumber, isreadDouble, uni.baseAdvanceDocs); long t5=System.currentTimeMillis(); uni.endRamDocValue(isreadDouble,maxtm); uni.tnr = uni.ramDocValue.getDocReader(); uni.baseAdvanceDocs=null; long t6=System.currentTimeMillis(); log.info("####makeInit end####:" +uni.field+","+(t6-t5)+"@"+(t5-t4)+"@"+(t4-t3)+"@"+(t3-t2)+"@"+(t2-t1)); return true; } public static boolean addDoclist(UnInvertedField uni, BitDocSet docs, String field, SegmentReader reader, IndexSchema schema, boolean isreadDouble) throws IOException, CloneNotSupportedException { int fieldNumber = reader.getFieldNum(field); if (isforbiden||!reader.isSupportQuick() || fieldNumber < 0) { return false; } if (uni.checkEmpty()) { return true; } BitDocSet tmp = null; if (docs != null) { tmp = (BitDocSet) docs.andNot(uni.bits); if (tmp != null && tmp.size() <= 0) { return true; } } log.info("addDoclist start" + uni.field + " ,this.baseAdvanceDocs="+(uni.baseAdvanceDocs==null?0:uni.baseAdvanceDocs.size())); uni.baseAdvanceDocs = UnInvertedField.ajustBase(4,tmp, reader); DocValuesReader docvalues = reader.getDocValues(); RamDocValueFill.Fill(uni, reader.maxDoc(),false, uni.ti, docvalues, fieldNumber, isreadDouble,uni.baseAdvanceDocs); uni.baseAdvanceDocs=null; return true; } }