Exemple #1
0
        /*
         * private class IterableAnonymousInnerClassHelper3 : IEnumerable<BytesRef>
         * {
         *  private readonly DocValuesConsumer OuterInstance;
         *
         *  private SortedDocValues[] Dvs;
         *  private OrdinalMap Map;
         *
         *  public IterableAnonymousInnerClassHelper3(DocValuesConsumer outerInstance, SortedDocValues[] dvs, OrdinalMap map)
         *  {
         *      this.OuterInstance = outerInstance;
         *      this.Dvs = dvs;
         *      this.Map = map;
         *  }
         *
         *      // ord -> value
         *  public virtual IEnumerator<BytesRef> GetEnumerator()
         *  {
         *    return new IteratorAnonymousInnerClassHelper3(this);
         *  }
         *
         *  private class IteratorAnonymousInnerClassHelper3 : IEnumerator<BytesRef>
         *  {
         *      private readonly IterableAnonymousInnerClassHelper3 OuterInstance;
         *
         *      public IteratorAnonymousInnerClassHelper3(IterableAnonymousInnerClassHelper3 outerInstance)
         *      {
         *          this.OuterInstance = outerInstance;
         *          scratch = new BytesRef();
         *      }
         *
         *      internal readonly BytesRef scratch;
         *      internal int currentOrd;
         *
         *      public virtual bool HasNext()
         *      {
         *        return currentOrd < OuterInstance.Map.ValueCount;
         *      }
         *
         *      public virtual BytesRef Next()
         *      {
         *        if (!HasNext())
         *        {
         *          throw new Exception();
         *        }
         *        int segmentNumber = OuterInstance.Map.GetFirstSegmentNumber(currentOrd);
         *        int segmentOrd = (int)OuterInstance.Map.GetFirstSegmentOrd(currentOrd);
         *        OuterInstance.Dvs[segmentNumber].LookupOrd(segmentOrd, scratch);
         *        currentOrd++;
         *        return scratch;
         *      }
         *
         *      public virtual void Remove()
         *      {
         *        throw new System.NotSupportedException();
         *      }
         *  }
         * }
         *
         * private class IterableAnonymousInnerClassHelper4 : IEnumerable<Number>
         * {
         *  private readonly DocValuesConsumer OuterInstance;
         *
         *  private AtomicReader[] Readers;
         *  private SortedDocValues[] Dvs;
         *  private OrdinalMap Map;
         *
         *  public IterableAnonymousInnerClassHelper4(DocValuesConsumer outerInstance, AtomicReader[] readers, SortedDocValues[] dvs, OrdinalMap map)
         *  {
         *      this.OuterInstance = outerInstance;
         *      this.Readers = readers;
         *      this.Dvs = dvs;
         *      this.Map = map;
         *  }
         *
         *  public virtual IEnumerator<Number> GetEnumerator()
         *  {
         *    return new IteratorAnonymousInnerClassHelper4(this);
         *  }
         *
         *  private class IteratorAnonymousInnerClassHelper4 : IEnumerator<Number>
         *  {
         *      private readonly IterableAnonymousInnerClassHelper4 OuterInstance;
         *
         *      public IteratorAnonymousInnerClassHelper4(IterableAnonymousInnerClassHelper4 outerInstance)
         *      {
         *          this.OuterInstance = outerInstance;
         *          readerUpto = -1;
         *      }
         *
         *      internal int readerUpto;
         *      internal int docIDUpto;
         *      internal int nextValue;
         *      internal AtomicReader currentReader;
         *      internal Bits currentLiveDocs;
         *      internal bool nextIsSet;
         *
         *      public virtual bool HasNext()
         *      {
         *        return nextIsSet || SetNext();
         *      }
         *
         *      public virtual void Remove()
         *      {
         *        throw new System.NotSupportedException();
         *      }
         *
         *      public virtual Number Next()
         *      {
         *        if (!HasNext())
         *        {
         *          throw new NoSuchElementException();
         *        }
         *        Debug.Assert(nextIsSet);
         *        nextIsSet = false;
         *        // TODO make a mutable number
         *        return nextValue;
         *      }
         *
         *      private bool SetNext()
         *      {
         *        while (true)
         *        {
         *          if (readerUpto == OuterInstance.Readers.Length)
         *          {
         *            return false;
         *          }
         *
         *          if (currentReader == null || docIDUpto == currentReader.MaxDoc)
         *          {
         *            readerUpto++;
         *            if (readerUpto < OuterInstance.Readers.Length)
         *            {
         *              currentReader = OuterInstance.Readers[readerUpto];
         *              currentLiveDocs = currentReader.LiveDocs;
         *            }
         *            docIDUpto = 0;
         *            continue;
         *          }
         *
         *          if (currentLiveDocs == null || currentLiveDocs.get(docIDUpto))
         *          {
         *            nextIsSet = true;
         *            int segOrd = OuterInstance.Dvs[readerUpto].GetOrd(docIDUpto);
         *            nextValue = segOrd == -1 ? - 1 : (int) OuterInstance.Map.GetGlobalOrd(readerUpto, segOrd);
         *            docIDUpto++;
         *            return true;
         *          }
         *
         *          docIDUpto++;
         *        }
         *      }
         *  }
         * }*/

        /// <summary>
        /// Merges the sortedset docvalues from <code>toMerge</code>.
        /// <p>
        /// The default implementation calls <seealso cref="#addSortedSetField"/>, passing
        /// an Iterable that merges ordinals and values and filters deleted documents .
        /// </summary>
        public virtual void MergeSortedSetField(FieldInfo fieldInfo, MergeState mergeState, IList <SortedSetDocValues> toMerge)
        {
            AtomicReader[]       readers = mergeState.Readers.ToArray();
            SortedSetDocValues[] dvs     = toMerge.ToArray();

            // step 1: iterate thru each sub and mark terms still in use
            TermsEnum[] liveTerms = new TermsEnum[dvs.Length];
            for (int sub = 0; sub < liveTerms.Length; sub++)
            {
                AtomicReader       reader = readers[sub];
                SortedSetDocValues dv     = dvs[sub];
                Bits liveDocs             = reader.LiveDocs;
                if (liveDocs == null)
                {
                    liveTerms[sub] = dv.TermsEnum();
                }
                else
                {
                    LongBitSet bitset = new LongBitSet(dv.ValueCount);
                    for (int i = 0; i < reader.MaxDoc; i++)
                    {
                        if (liveDocs.Get(i))
                        {
                            dv.Document = i;
                            long ord;
                            while ((ord = dv.NextOrd()) != SortedSetDocValues.NO_MORE_ORDS)
                            {
                                bitset.Set(ord);
                            }
                        }
                    }
                    liveTerms[sub] = new BitsFilteredTermsEnum(dv.TermsEnum(), bitset);
                }
            }

            // step 2: create ordinal map (this conceptually does the "merging")
            OrdinalMap map = new OrdinalMap(this, liveTerms);

            // step 3: add field
            AddSortedSetField(fieldInfo, GetMergeSortedSetValuesEnumerable(map, dvs),
                              // doc -> ord count
                              GetMergeSortedSetDocToOrdCountEnumerable(readers, dvs),
                              // ords
                              GetMergeSortedSetOrdsEnumerable(readers, dvs, map)
                              );
        }
Exemple #2
0
			/// <exception cref="System.IO.IOException"></exception>
			public override void SetNextReader(AtomicReaderContext context)
			{
				if (segmentFacetCounts != null)
				{
					segmentResults.AddItem(((TermGroupFacetCollector.MV.SegmentResult)CreateSegmentResult
						()));
				}
				groupFieldTermsIndex = FieldCache.DEFAULT.GetTermsIndex(((AtomicReader)context.Reader
					()), groupField);
				facetFieldDocTermOrds = FieldCache.DEFAULT.GetDocTermOrds(((AtomicReader)context.
					Reader()), facetField);
				facetFieldNumTerms = (int)facetFieldDocTermOrds.GetValueCount();
				if (facetFieldNumTerms == 0)
				{
					facetOrdTermsEnum = null;
				}
				else
				{
					facetOrdTermsEnum = facetFieldDocTermOrds.TermsEnum();
				}
				// [facetFieldNumTerms() + 1] for all possible facet values and docs not containing facet field
				segmentFacetCounts = new int[facetFieldNumTerms + 1];
				segmentTotalCount = 0;
				segmentGroupedFacetHits.Clear();
				foreach (GroupedFacetHit groupedFacetHit in groupedFacetHits)
				{
					int groupOrd = groupedFacetHit.groupValue == null ? -1 : groupFieldTermsIndex.LookupTerm
						(groupedFacetHit.groupValue);
					if (groupedFacetHit.groupValue != null && groupOrd < 0)
					{
						continue;
					}
					int facetOrd;
					if (groupedFacetHit.facetValue != null)
					{
						if (facetOrdTermsEnum == null || !facetOrdTermsEnum.SeekExact(groupedFacetHit.facetValue
							))
						{
							continue;
						}
						facetOrd = (int)facetOrdTermsEnum.Ord();
					}
					else
					{
						facetOrd = facetFieldNumTerms;
					}
					// (facetFieldDocTermOrds.numTerms() + 1) for all possible facet values and docs not containing facet field
					int segmentGroupedFacetsIndex = groupOrd * (facetFieldNumTerms + 1) + facetOrd;
					segmentGroupedFacetHits.Put(segmentGroupedFacetsIndex);
				}
				if (facetPrefix != null)
				{
					TermsEnum.SeekStatus seekStatus;
					if (facetOrdTermsEnum != null)
					{
						seekStatus = facetOrdTermsEnum.SeekCeil(facetPrefix);
					}
					else
					{
						seekStatus = TermsEnum.SeekStatus.END;
					}
					if (seekStatus != TermsEnum.SeekStatus.END)
					{
						startFacetOrd = (int)facetOrdTermsEnum.Ord();
					}
					else
					{
						startFacetOrd = 0;
						endFacetOrd = 0;
						return;
					}
					BytesRef facetEndPrefix = BytesRef.DeepCopyOf(facetPrefix);
					facetEndPrefix.Append(UnicodeUtil.BIG_TERM);
					seekStatus = facetOrdTermsEnum.SeekCeil(facetEndPrefix);
					if (seekStatus != TermsEnum.SeekStatus.END)
					{
						endFacetOrd = (int)facetOrdTermsEnum.Ord();
					}
					else
					{
						endFacetOrd = facetFieldNumTerms;
					}
				}
				else
				{
					// Don't include null...
					startFacetOrd = 0;
					endFacetOrd = facetFieldNumTerms + 1;
				}
			}
 public override TermsEnum Iterator(TermsEnum reuse)
 {
     return(DocTermOrds.TermsEnum());
 }