public override void Flush(SegmentWriteState state, DocValuesConsumer dvConsumer) { int maxDoc = state.SegmentInfo.DocCount; Debug.Assert(pending.Count == maxDoc); int valueCount = hash.Count; int[] sortedValues = hash.Sort(BytesRef.UTF8SortedAsUnicodeComparer); int[] ordMap = new int[valueCount]; for (int ord = 0; ord < valueCount; ord++) { ordMap[sortedValues[ord]] = ord; } dvConsumer.AddSortedField(fieldInfo, GetBytesRefEnumberable(valueCount, sortedValues), // doc -> ord GetOrdsEnumberable(maxDoc, ordMap)); }
public override void AddSortedField(FieldInfo field, IEnumerable <BytesRef> values, IEnumerable <long?> docToOrd) { int valueCount = 0; BytesRef lastValue = null; foreach (BytesRef b in values) { Debug.Assert(b != null); Debug.Assert(b.IsValid()); if (valueCount > 0) { Debug.Assert(b.CompareTo(lastValue) > 0); } lastValue = BytesRef.DeepCopyOf(b); valueCount++; } Debug.Assert(valueCount <= maxDoc); FixedBitSet seenOrds = new FixedBitSet(valueCount); int count = 0; foreach (long?v in docToOrd) { Debug.Assert(v != null); int ord = (int)v.Value; Debug.Assert(ord >= -1 && ord < valueCount); if (ord >= 0) { seenOrds.Set(ord); } count++; } Debug.Assert(count == maxDoc); Debug.Assert(seenOrds.Cardinality() == valueCount); CheckIterator(values.GetEnumerator(), valueCount, false); CheckIterator(docToOrd.GetEnumerator(), maxDoc, false); @in.AddSortedField(field, values, docToOrd); }