private FixedBitSet InitialResult(AtomicReaderContext context, int logic, int[] index) { AtomicReader reader = context.AtomicReader; FixedBitSet result = new FixedBitSet(reader.MaxDoc); if (logic == AND) { result.Or(GetDISI(chain[index[0]], context)); ++index[0]; } else if (logic == ANDNOT) { result.Or(GetDISI(chain[index[0]], context)); result.Flip(0, reader.MaxDoc); // NOTE: may set bits for deleted docs. ++index[0]; } return(result); }
public DocumentFilteredAtomicIndexReader(AtomicReaderContext context, Filter preserveFilter, bool negateFilter) : base(context.AtomicReader) { int maxDoc = m_input.MaxDoc; FixedBitSet bits = new FixedBitSet(maxDoc); // ignore livedocs here, as we filter them later: DocIdSet docs = preserveFilter.GetDocIdSet(context, null); if (docs != null) { DocIdSetIterator it = docs.GetIterator(); if (it != null) { bits.Or(it); } } if (negateFilter) { bits.Flip(0, maxDoc); } if (m_input.HasDeletions) { IBits oldLiveDocs = m_input.LiveDocs; if (Debugging.AssertsEnabled) { Debugging.Assert(oldLiveDocs != null); } DocIdSetIterator it = bits.GetIterator(); for (int i = it.NextDoc(); i < maxDoc; i = it.NextDoc()) { if (!oldLiveDocs.Get(i)) { // we can safely modify the current bit, as the iterator already stepped over it: bits.Clear(i); } } } this.liveDocs = bits; this.numDocs = bits.Cardinality(); }