package org.apache.solr.request; import java.util.HashMap; import java.util.Map.Entry; import org.apache.lucene.util.OpenBitSet; import org.apache.solr.core.SolrCore; import org.apache.solr.search.BitDocSet; /** * 压缩的bitset * @author yannian.mu * */ public class MapBitSets { public static class LongBit{ Long bit; public LongBit(Long b) { this.bit=b; } } boolean isover=false; static int oversize=1024; protected HashMap<Integer, LongBit> bitMaps=new HashMap<Integer, LongBit>(); private OpenBitSet bitset; long numBits=0; public MapBitSets(long _numBits,boolean compress) { this.numBits=_numBits; if(compress) { this.bitset=null; }else{ this.bitset=null;//new OpenBitSet(_numBits); } } public void fastSet(int index) { if (isover) { return; } if(this.bitset!=null) { this.bitset.fastSet(index); return ; } int wordNum = index >> 6; int bit = index & 0x3f; long bitmask = 1L << bit; LongBit bv = bitMaps.get(wordNum); if (bv == null) { bv = new LongBit(0l); bitMaps.put(wordNum, bv); if (bitMaps.size() > oversize) { isover = true; bitMaps.clear(); bitMaps=null; return; } } bv.bit |= bitmask; } public void compress() { if(this.bitset==null) { return ; } long[] list=this.bitset.getBits(); int count=0; for(int i=0;i<list.length;i++) { long bit=list[i]; if(bit!=0) { bitMaps.put(i, new LongBit(bit)); } count++; if(count>oversize) { isover = true; break; } } this.bitset=null; if(isover) { this.bitMaps.clear(); this.bitMaps=null; } } public BitDocSet toOpenBit() { if (isover||bitMaps.size()<=0) { return null; } long startTime = System.currentTimeMillis(); int numwords=OpenBitSet.bits2words(numBits); long[] bits=new long[numwords]; for(Entry<Integer, LongBit> e:this.bitMaps.entrySet()) { bits[e.getKey()]=e.getValue().bit; } BitDocSet rtn= new BitDocSet(new OpenBitSet(bits, numwords)); long endTime = System.currentTimeMillis(); int ttime = (int)(endTime-startTime); if(ttime>1) { SolrCore.log.info("UnInverted toOpenBit "+ttime); } return rtn; } }