private FieldInfo AddOrUpdateInternal(string name, int preferredFieldNumber, bool isIndexed, bool storeTermVector, bool omitNorms, bool storePayloads, IndexOptions indexOptions, DocValuesType docValues, DocValuesType normType) { // LUCENENET: Bypass FieldInfo method so we can access the quick boolean check if (!TryGetFieldInfo(name, out FieldInfo fi) || fi is null) { // this field wasn't yet added to this in-RAM // segment's FieldInfo, so now we get a global // number for this field. If the field was seen // before then we'll get the same name and number, // else we'll allocate a new one: int fieldNumber = globalFieldNumbers.AddOrGet(name, preferredFieldNumber, docValues); fi = new FieldInfo(name, isIndexed, fieldNumber, storeTermVector, omitNorms, storePayloads, indexOptions, docValues, normType, null); if (Debugging.AssertsEnabled) { Debugging.Assert(!byName.ContainsKey(fi.Name)); Debugging.Assert(globalFieldNumbers.ContainsConsistent(fi.Number, fi.Name, fi.DocValuesType)); } byName[fi.Name] = fi; } else { fi.Update(isIndexed, storeTermVector, omitNorms, storePayloads, indexOptions); if (docValues != DocValuesType.NONE) { // only pay the synchronization cost if fi does not already have a DVType bool updateGlobal = !fi.HasDocValues; fi.DocValuesType = docValues; // this will also perform the consistency check. if (updateGlobal) { // must also update docValuesType map so it's // aware of this field's DocValueType globalFieldNumbers.SetDocValuesType(fi.Number, name, docValues); } } if (!fi.OmitsNorms && normType != DocValuesType.NONE) { fi.NormType = normType; } } return(fi); }
internal FieldInfo AddOrUpdateInternal(string name, int preferredFieldNumber, bool isIndexed, bool storeTermVector, bool omitNorms, bool storePayloads, FieldInfo.IndexOptions?indexOptions, DocValuesType_e?docValues, DocValuesType_e?normType) { FieldInfo fi = FieldInfo(name); if (fi == null) { // this field wasn't yet added to this in-RAM // segment's FieldInfo, so now we get a global // number for this field. If the field was seen // before then we'll get the same name and number, // else we'll allocate a new one: int fieldNumber = GlobalFieldNumbers.AddOrGet(name, preferredFieldNumber, docValues); fi = new FieldInfo(name, isIndexed, fieldNumber, storeTermVector, omitNorms, storePayloads, indexOptions, docValues, normType, null); Debug.Assert(!ByName.ContainsKey(fi.Name)); Debug.Assert(GlobalFieldNumbers.ContainsConsistent(Convert.ToInt32(fi.Number), fi.Name, fi.DocValuesType)); ByName[fi.Name] = fi; } else { fi.Update(isIndexed, storeTermVector, omitNorms, storePayloads, indexOptions); if (docValues != null) { // only pay the synchronization cost if fi does not already have a DVType bool updateGlobal = !fi.HasDocValues(); fi.DocValuesType = docValues; // this will also perform the consistency check. if (updateGlobal) { // must also update docValuesType map so it's // aware of this field's DocValueType GlobalFieldNumbers.SetDocValuesType(fi.Number, name, docValues); } } if (!fi.OmitsNorms() && normType != null) { fi.NormType = normType; } } return(fi); }