コード例 #1
0
ファイル: MultiDocValues.cs プロジェクト: zhuthree/lucenenet
            /// <summary>
            /// Creates an ordinal map that allows mapping ords to/from a merged
            /// space from <c>subs</c>. </summary>
            /// <param name="owner"> a cache key </param>
            /// <param name="subs"> <see cref="TermsEnum"/>s that support <see cref="TermsEnum.Ord"/>. They need
            ///             not be dense (e.g. can be FilteredTermsEnums). </param>
            /// <exception cref="System.IO.IOException"> if an I/O error occurred. </exception>
            public OrdinalMap(object owner, TermsEnum[] subs)
            {
                // create the ordinal mappings by pulling a termsenum over each sub's
                // unique terms, and walking a multitermsenum over those
                this.owner      = owner;
                globalOrdDeltas = new MonotonicAppendingInt64Buffer(PackedInt32s.COMPACT);
                firstSegments   = new AppendingPackedInt64Buffer(PackedInt32s.COMPACT);
                ordDeltas       = new MonotonicAppendingInt64Buffer[subs.Length];
                for (int i = 0; i < ordDeltas.Length; i++)
                {
                    ordDeltas[i] = new MonotonicAppendingInt64Buffer();
                }
                long[]           segmentOrds = new long[subs.Length];
                ReaderSlice[]    slices      = new ReaderSlice[subs.Length];
                TermsEnumIndex[] indexes     = new TermsEnumIndex[slices.Length];
                for (int i = 0; i < slices.Length; i++)
                {
                    slices[i]  = new ReaderSlice(0, 0, i);
                    indexes[i] = new TermsEnumIndex(subs[i], i);
                }
                MultiTermsEnum mte = new MultiTermsEnum(slices);

                mte.Reset(indexes);
                long globalOrd = 0;

                while (mte.Next() != null)
                {
                    TermsEnumWithSlice[] matches = mte.MatchArray;
                    for (int i = 0; i < mte.MatchCount; i++)
                    {
                        int  segmentIndex = matches[i].Index;
                        long segmentOrd   = matches[i].Terms.Ord;
                        long delta        = globalOrd - segmentOrd;
                        // for each unique term, just mark the first segment index/delta where it occurs
                        if (i == 0)
                        {
                            firstSegments.Add(segmentIndex);
                            globalOrdDeltas.Add(delta);
                        }
                        // for each per-segment ord, map it back to the global term.
                        while (segmentOrds[segmentIndex] <= segmentOrd)
                        {
                            ordDeltas[segmentIndex].Add(delta);
                            segmentOrds[segmentIndex]++;
                        }
                    }
                    globalOrd++;
                }
                firstSegments.Freeze();
                globalOrdDeltas.Freeze();
                for (int i = 0; i < ordDeltas.Length; ++i)
                {
                    ordDeltas[i].Freeze();
                }
            }
コード例 #2
0
 /// <summary>
 /// Returns {@code true} if this instance can be reused by
 ///  the provided <seealso cref="MultiTermsEnum"/>.
 /// </summary>
 public bool CanReuse(MultiTermsEnum parent)
 {
     return(this.parent == parent);
 }
コード例 #3
0
 /// <summary>
 /// Sole constructor. </summary>
 public MultiDocsAndPositionsEnum(MultiTermsEnum parent, int subReaderCount)
 {
     this.parent             = parent;
     subDocsAndPositionsEnum = new DocsAndPositionsEnum[subReaderCount];
 }
コード例 #4
0
ファイル: MultiDocsEnum.cs プロジェクト: zfxsss/lucenenet
 /// <summary>
 /// Sole constructor </summary>
 /// <param name="parent"> The <seealso cref="MultiTermsEnum"/> that created us. </param>
 /// <param name="subReaderCount"> How many sub-readers are being merged.  </param>
 public MultiDocsEnum(MultiTermsEnum parent, int subReaderCount)
 {
     this.Parent = parent;
     SubDocsEnum = new DocsEnum[subReaderCount];
 }