public virtual void Search(Weight weight, Filter filter, Collector collector, int start, IBoboMapFunctionWrapper mapReduceWrapper) { FacetValidator validator = CreateFacetValidator(); int target = 0; if (filter == null) { for (int i = 0; i < _subReaders.Length; i++) { // search each subreader int docStart = start + _docStarts[i]; collector.SetNextReader(_subReaders[i], docStart); validator.SetNextReader(_subReaders[i], docStart); Scorer scorer = weight.Scorer(_subReaders[i], true, true); if (scorer != null) { collector.SetScorer(scorer); target = scorer.NextDoc(); while (target != DocIdSetIterator.NO_MORE_DOCS) { if (validator.Validate(target)) { collector.Collect(target); target = scorer.NextDoc(); } else { target = validator._nextTarget; target = scorer.Advance(target); } } } if (mapReduceWrapper != null) { mapReduceWrapper.MapFullIndexReader(_subReaders[i], validator.GetCountCollectors()); } } return; } for (int i = 0; i < _subReaders.Length; i++) { DocIdSet filterDocIdSet = filter.GetDocIdSet(_subReaders[i]); if (filterDocIdSet == null) { return; //shall we use return or continue here ?? } int docStart = start + _docStarts[i]; collector.SetNextReader(_subReaders[i], docStart); validator.SetNextReader(_subReaders[i], docStart); Scorer scorer = weight.Scorer(_subReaders[i], true, false); if (scorer != null) { collector.SetScorer(scorer); DocIdSetIterator filterDocIdIterator = filterDocIdSet.Iterator(); // CHECKME: use ConjunctionScorer here? if (filterDocIdIterator == null) { continue; } int doc = -1; target = filterDocIdIterator.NextDoc(); if (mapReduceWrapper == null) { while (target < DocIdSetIterator.NO_MORE_DOCS) { if (doc < target) { doc = scorer.Advance(target); } if (doc == target) // permitted by filter { if (validator.Validate(doc)) { collector.Collect(doc); target = filterDocIdIterator.NextDoc(); } else { // skip to the next possible docid target = filterDocIdIterator.Advance(validator._nextTarget); } } else // doc > target { if (doc == DocIdSetIterator.NO_MORE_DOCS) { break; } target = filterDocIdIterator.Advance(doc); } } } else { //MapReduce wrapper is not null while (target < DocIdSetIterator.NO_MORE_DOCS) { if (doc < target) { doc = scorer.Advance(target); } if (doc == target) // permitted by filter { if (validator.Validate(doc)) { mapReduceWrapper.MapSingleDocument(doc, _subReaders[i]); collector.Collect(doc); target = filterDocIdIterator.NextDoc(); } else { // skip to the next possible docid target = filterDocIdIterator.Advance(validator._nextTarget); } } else // doc > target { if (doc == DocIdSetIterator.NO_MORE_DOCS) { break; } target = filterDocIdIterator.Advance(doc); } } mapReduceWrapper.FinalizeSegment(_subReaders[i], validator.GetCountCollectors()); } } } }
public virtual void Search(Weight weight, Filter filter, ICollector collector, int start, IBoboMapFunctionWrapper mapReduceWrapper) { FacetValidator validator = CreateFacetValidator(); int target = 0; IndexReader reader = this.IndexReader; IndexReaderContext indexReaderContext = reader.Context; if (filter == null) { for (int i = 0; i < m_subReaders.Length; i++) { AtomicReaderContext atomicContext = indexReaderContext.Children == null ? (AtomicReaderContext)indexReaderContext : (AtomicReaderContext)(indexReaderContext.Children.Get(i)); int docStart = start; // NOTE: This code calls an internal constructor. Apparently, this was in the same namespace as Lucene, // but was added to this project, which presumably allows you to call internal constructors in Java. // In .NET, we can just use Activator.CreateInstance. Not great, but this code will be removed // when applying commit https://github.com/senseidb/bobo/commit/924c8579d90dbb5d56103976d39b47daa2242ef3 // which includes several major changes after the 4.0.2 release. // atomicContext = AtomicReaderContextUtil.UpdateDocBase(atomicContext, docStart); object[] args = new object[] { (CompositeReaderContext)null, atomicContext.AtomicReader, 0, 0, 0, docStart }; Type[] constructorSignature = { typeof(CompositeReaderContext), typeof(AtomicReader), typeof(int), typeof(int), typeof(int), typeof(int) }; var constr = typeof(AtomicReaderContext).GetTypeInfo().DeclaredConstructors .Single(constructor => constructor.GetParameters() .Select(parameter => parameter.ParameterType) .SequenceEqual(constructorSignature)); atomicContext = (AtomicReaderContext)constr.Invoke(args); if (reader is BoboMultiReader) { docStart = start + ((BoboMultiReader)reader).SubReaderBase(i); } collector.SetNextReader(atomicContext); validator.SetNextReader(m_subReaders[i], docStart); // NOTE: The Weight.Scorer method lost the scoreDocsInOrder and topScorer parameters between // Lucene 4.3.0 and 4.8.0. They are not used by BoboBrowse anyway, so the code here diverges // from the original Java source to remove these two parameters. // Scorer scorer = weight.Scorer(atomicContext, true, true, _subReaders[i].LiveDocs); Scorer scorer = weight.GetScorer(atomicContext, m_subReaders[i].LiveDocs); if (scorer != null) { collector.SetScorer(scorer); target = scorer.NextDoc(); while (target != DocIdSetIterator.NO_MORE_DOCS) { if (validator.Validate(target)) { collector.Collect(target); target = scorer.NextDoc(); } else { target = validator.m_nextTarget; target = scorer.Advance(target); } } } if (mapReduceWrapper != null) { mapReduceWrapper.MapFullIndexReader(m_subReaders[i], validator.GetCountCollectors()); } } return; } for (int i = 0; i < m_subReaders.Length; i++) { AtomicReaderContext atomicContext = indexReaderContext.Children == null ? (AtomicReaderContext)indexReaderContext : (AtomicReaderContext)(indexReaderContext.Children.Get(i)); DocIdSet filterDocIdSet = filter.GetDocIdSet(atomicContext, m_subReaders[i].LiveDocs); if (filterDocIdSet == null) { return; //shall we use return or continue here ?? } int docStart = start; if (reader is BoboMultiReader) { docStart = start + ((BoboMultiReader)reader).SubReaderBase(i); } collector.SetNextReader(atomicContext); validator.SetNextReader(m_subReaders[i], docStart); // NOTE: The Weight.Scorer method lost the scoreDocsInOrder and topScorer parameters between // Lucene 4.3.0 and 4.8.0. They are not used by BoboBrowse anyway, so the code here diverges // from the original Java source to remove these two parameters. // Scorer scorer = weight.Scorer(atomicContext, true, false, _subReaders[i].LiveDocs); Scorer scorer = weight.GetScorer(atomicContext, m_subReaders[i].LiveDocs); if (scorer != null) { collector.SetScorer(scorer); DocIdSetIterator filterDocIdIterator = filterDocIdSet.GetIterator(); // CHECKME: use ConjunctionScorer here? if (filterDocIdIterator == null) { continue; } int doc = -1; target = filterDocIdIterator.NextDoc(); if (mapReduceWrapper == null) { while (target < DocIdSetIterator.NO_MORE_DOCS) { if (doc < target) { doc = scorer.Advance(target); } if (doc == target) // permitted by filter { if (validator.Validate(doc)) { collector.Collect(doc); target = filterDocIdIterator.NextDoc(); } else { // skip to the next possible docid target = filterDocIdIterator.Advance(validator.m_nextTarget); } } else // doc > target { if (doc == DocIdSetIterator.NO_MORE_DOCS) { break; } target = filterDocIdIterator.Advance(doc); } } } else { //MapReduce wrapper is not null while (target < DocIdSetIterator.NO_MORE_DOCS) { if (doc < target) { doc = scorer.Advance(target); } if (doc == target) // permitted by filter { if (validator.Validate(doc)) { mapReduceWrapper.MapSingleDocument(doc, m_subReaders[i]); collector.Collect(doc); target = filterDocIdIterator.NextDoc(); } else { // skip to the next possible docid target = filterDocIdIterator.Advance(validator.m_nextTarget); } } else // doc > target { if (doc == DocIdSetIterator.NO_MORE_DOCS) { break; } target = filterDocIdIterator.Advance(doc); } } mapReduceWrapper.FinalizeSegment(m_subReaders[i], validator.GetCountCollectors()); } } } }