protected override int GetFields <T>(T instance, LazyStringValue key, object document, JsonOperationContext indexContext) { int newFields = 0; if (key != null) { instance.Add(GetOrCreateKeyField(key)); newFields++; } var boostedValue = document as BoostedValue; var documentToProcess = boostedValue == null ? document : boostedValue.Value; IPropertyAccessor accessor; if (_isMultiMap == false) { accessor = _propertyAccessor ?? (_propertyAccessor = PropertyAccessor.Create(documentToProcess.GetType(), documentToProcess)); } else { accessor = TypeConverter.GetPropertyAccessor(documentToProcess); } var reduceResult = _reduceOutput ? new DynamicJsonValue() : null; foreach (var property in accessor.GetPropertiesInOrder(documentToProcess)) { var value = property.Value; IndexField field; try { field = _fields[property.Key]; } catch (KeyNotFoundException e) { throw new InvalidOperationException($"Field '{property.Key}' is not defined. Available fields: {string.Join(", ", _fields.Keys)}.", e); } var numberOfCreatedFields = GetRegularFields(instance, field, value, indexContext); newFields += numberOfCreatedFields; if (boostedValue != null) { var fields = instance.GetFields(); for (int idx = fields.Count - 1; numberOfCreatedFields > 0; numberOfCreatedFields--, idx--) { var luceneField = fields[idx]; luceneField.Boost = boostedValue.Boost; luceneField.OmitNorms = false; } } if (reduceResult != null && numberOfCreatedFields > 0) { reduceResult[property.Key] = TypeConverter.ToBlittableSupportedType(value, flattenArrays: true); } } if (_reduceOutput) { instance.Add(GetReduceResultValueField(Scope.CreateJson(reduceResult, indexContext))); newFields++; } return(newFields); }
protected override int GetFields <T>(T instance, LazyStringValue key, LazyStringValue sourceDocumentId, object document, JsonOperationContext indexContext, IWriteOperationBuffer writeBuffer) { int newFields = 0; if (key != null) { instance.Add(GetOrCreateKeyField(key)); newFields++; } if (sourceDocumentId != null) { instance.Add(GetOrCreateSourceDocumentIdField(sourceDocumentId)); newFields++; } var boostedValue = document as BoostedValue; var documentToProcess = boostedValue == null ? document : boostedValue.Value; IPropertyAccessor accessor; if (_isMultiMap == false) { accessor = _propertyAccessor ?? (_propertyAccessor = PropertyAccessor.Create(documentToProcess.GetType(), documentToProcess)); } else { accessor = TypeConverter.GetPropertyAccessor(documentToProcess); } var storedValue = _storeValue ? new DynamicJsonValue() : null; foreach (var property in accessor.GetPropertiesInOrder(documentToProcess)) { var value = property.Value; IndexField field; try { field = _fields[property.Key]; } catch (KeyNotFoundException e) { throw new InvalidOperationException($"Field '{property.Key}' is not defined. Available fields: {string.Join(", ", _fields.Keys)}.", e); } var numberOfCreatedFields = GetRegularFields(instance, field, value, indexContext, out var shouldSkip); newFields += numberOfCreatedFields; if (boostedValue != null) { var fields = instance.GetFields(); for (int idx = fields.Count - 1; numberOfCreatedFields > 0; numberOfCreatedFields--, idx--) { var luceneField = fields[idx]; luceneField.Boost = boostedValue.Boost; luceneField.OmitNorms = false; } } if (storedValue != null && shouldSkip == false) { var blittableValue = TypeConverter.ToBlittableSupportedType(value, out TypeConverter.BlittableSupportedReturnType returnType, flattenArrays: true); if (returnType == TypeConverter.BlittableSupportedReturnType.Ignored) { continue; } storedValue[property.Key] = blittableValue; } } if (_storeValue) { instance.Add(GetStoredValueField(Scope.CreateJson(storedValue, indexContext), writeBuffer)); newFields++; } return(newFields); }