public override DocsAndPositionsEnum DocsAndPositions(FieldInfo field, BlockTermState _termState, Bits liveDocs,
                                                              DocsAndPositionsEnum reuse,
                                                              int flags)
        {
            var termState = (PulsingTermState)_termState;

            if (termState.PostingsSize != -1)
            {
                PulsingDocsAndPositionsEnum postings;
                if (reuse is PulsingDocsAndPositionsEnum)
                {
                    postings = (PulsingDocsAndPositionsEnum)reuse;
                    if (!postings.CanReuse(field))
                    {
                        postings = new PulsingDocsAndPositionsEnum(field);
                    }
                }
                else
                {
                    // the 'reuse' is actually the wrapped enum
                    var previous = (PulsingDocsAndPositionsEnum)GetOther(reuse);
                    if (previous != null && previous.CanReuse(field))
                    {
                        postings = previous;
                    }
                    else
                    {
                        postings = new PulsingDocsAndPositionsEnum(field);
                    }
                }
                if (reuse != postings)
                {
                    SetOther(postings, reuse); // postings.other = reuse
                }
                return(postings.Reset(liveDocs, termState));
            }

            if (!(reuse is PulsingDocsAndPositionsEnum))
            {
                return(_wrappedPostingsReader.DocsAndPositions(field, termState.WrappedTermState, liveDocs, reuse,
                                                               flags));
            }

            var wrapped = _wrappedPostingsReader.DocsAndPositions(field,
                                                                  termState.WrappedTermState,
                                                                  liveDocs, (DocsAndPositionsEnum)GetOther(reuse),
                                                                  flags);

            SetOther(wrapped, reuse); // wrapped.other = reuse
            return(wrapped);
        }
예제 #2
0
        public override DocsAndPositionsEnum DocsAndPositions(FieldInfo field, BlockTermState _termState, Bits liveDocs,
            DocsAndPositionsEnum reuse,
            int flags)
        {

            PulsingTermState termState = (PulsingTermState) _termState;

            if (termState.PostingsSize != -1)
            {
                PulsingDocsAndPositionsEnum postings;
                if (reuse is PulsingDocsAndPositionsEnum)
                {
                    postings = (PulsingDocsAndPositionsEnum) reuse;
                    if (!postings.CanReuse(field))
                    {
                        postings = new PulsingDocsAndPositionsEnum(field);
                    }
                }
                else
                {
                    // the 'reuse' is actually the wrapped enum
                    PulsingDocsAndPositionsEnum previous = (PulsingDocsAndPositionsEnum) GetOther(reuse);
                    if (previous != null && previous.CanReuse(field))
                    {
                        postings = previous;
                    }
                    else
                    {
                        postings = new PulsingDocsAndPositionsEnum(field);
                    }
                }
                if (reuse != postings)
                {
                    SetOther(postings, reuse); // postings.other = reuse 
                }
                return postings.reset(liveDocs, termState);
            }
            else
            {
                if (reuse is PulsingDocsAndPositionsEnum)
                {
                    DocsAndPositionsEnum wrapped = _wrappedPostingsReader.DocsAndPositions(field,
                        termState.WrappedTermState,
                        liveDocs, (DocsAndPositionsEnum) GetOther(reuse),
                        flags);
                    SetOther(wrapped, reuse); // wrapped.other = reuse
                    return wrapped;
                }
                else
                {
                    return _wrappedPostingsReader.DocsAndPositions(field, termState.WrappedTermState, liveDocs, reuse,
                        flags);
                }
            }
        }