BitSet* ChainedFilter::bits( IndexReader* reader, int logic ) { BitSet* bts = NULL; Filter** filter = filters; // see discussion at top of file if( *filter ) { BitSet* tmp = (*filter)->bits( reader ); if ( (*filter)->shouldDeleteBitSet(tmp) ) //if we are supposed to delete this BitSet, then bts = tmp; //we can safely call it our own else if ( tmp == NULL ){ int32_t len = reader->maxDoc(); bts = _CLNEW BitSet( len ); //bitset returned null, which means match _all_ for (int32_t i=0;i<len;i++ ) bts->set(i); }else{ bts = tmp->clone(); //else it is probably cached, so we need to copy it before using it. } filter++; } else bts = _CLNEW BitSet( reader->maxDoc() ); while( *filter ) { doChain( bts, reader, logic, *filter ); filter++; } return bts; }