public override void AddSortedField(FieldInfo field, IEnumerable <BytesRef> values, IEnumerable <long> docToOrd) { // three cases for simulating the old writer: // 1. no missing // 2. missing (and empty string in use): remap ord=-1 -> ord=0 // 3. missing (and empty string not in use): remap all ords +1, insert empty string into values bool anyMissing = false; foreach (long n in docToOrd) { if ((long)n == -1) { anyMissing = true; break; } } bool hasEmptyString = false; foreach (BytesRef b in values) { hasEmptyString = b.Length == 0; break; } if (!anyMissing) { // nothing to do } else if (hasEmptyString) { docToOrd = MissingOrdRemapper.MapMissingToOrd0(docToOrd); } else { docToOrd = MissingOrdRemapper.MapAllOrds(docToOrd); values = MissingOrdRemapper.InsertEmptyValue(values); } // write the ordinals as numerics AddNumericField(field, docToOrd, false); // write the values as FST WriteFST(field, values); }
public override void AddSortedField(FieldInfo field, IEnumerable <BytesRef> values, IEnumerable <long?> docToOrd) { // examine the values to determine best type to use int minLength = int.MaxValue; int maxLength = int.MinValue; foreach (BytesRef b in values) { minLength = Math.Min(minLength, b.Length); maxLength = Math.Max(maxLength, b.Length); } // but dont use fixed if there are missing values (we are simulating how lucene40 wrote dv...) bool anyMissing = false; foreach (long n in docToOrd) { if ((long)n == -1) { anyMissing = true; break; } } bool success = false; IndexOutput data = null; IndexOutput index = null; string dataName = IndexFileNames.SegmentFileName(State.SegmentInfo.Name + "_" + Convert.ToString(field.Number), SegmentSuffix, "dat"); string indexName = IndexFileNames.SegmentFileName(State.SegmentInfo.Name + "_" + Convert.ToString(field.Number), SegmentSuffix, "idx"); try { data = Dir.CreateOutput(dataName, State.Context); index = Dir.CreateOutput(indexName, State.Context); if (minLength == maxLength && !anyMissing) { // fixed byte[] AddFixedSortedBytesField(field, data, index, values, docToOrd, minLength); } else { // var byte[] // three cases for simulating the old writer: // 1. no missing // 2. missing (and empty string in use): remap ord=-1 -> ord=0 // 3. missing (and empty string not in use): remap all ords +1, insert empty string into values if (!anyMissing) { AddVarSortedBytesField(field, data, index, values, docToOrd); } else if (minLength == 0) { AddVarSortedBytesField(field, data, index, values, MissingOrdRemapper.MapMissingToOrd0(docToOrd)); } else { AddVarSortedBytesField(field, data, index, MissingOrdRemapper.InsertEmptyValue(values), MissingOrdRemapper.MapAllOrds(docToOrd)); } } success = true; } finally { if (success) { IOUtils.Close(data, index); } else { IOUtils.CloseWhileHandlingException(data, index); } } }