diff --git a/src/Nest/ExposedInternals/NestSerializer.cs b/src/Nest/ExposedInternals/NestSerializer.cs index f4545546d7c..d68c9ba7c3a 100644 --- a/src/Nest/ExposedInternals/NestSerializer.cs +++ b/src/Nest/ExposedInternals/NestSerializer.cs @@ -89,7 +89,7 @@ internal JsonSerializerSettings CreateSettings(JsonConverter piggyBackJsonConver var piggyBackState = new JsonConverterPiggyBackState { ActualJsonConverter = piggyBackJsonConverter }; var settings = new JsonSerializerSettings() { - ContractResolver = new ElasticContractResolver(this._settings) { PiggyBackState = piggyBackState }, + ContractResolver = new ElasticContractResolver(this._settings), DefaultValueHandling = DefaultValueHandling.Include, NullValueHandling = NullValueHandling.Ignore }; @@ -97,6 +97,8 @@ internal JsonSerializerSettings CreateSettings(JsonConverter piggyBackJsonConver if (_settings.ModifyJsonSerializerSettings != null) _settings.ModifyJsonSerializerSettings(settings); + settings.ContractResolver = new SettingsContractResolver(settings.ContractResolver, this._settings) { PiggyBackState = piggyBackState }; + return settings; } @@ -111,11 +113,11 @@ public string SerializeBulkDescriptor(BulkDescriptor bulkDescriptor) { var command = operation._Operation; var index = operation._Index - ?? inferrer.IndexName(bulkDescriptor._Index) - ?? inferrer.IndexName(operation._ClrType); + ?? inferrer.IndexName(bulkDescriptor._Index) + ?? inferrer.IndexName(operation._ClrType); var typeName = operation._Type - ?? inferrer.TypeName(bulkDescriptor._Type) - ?? inferrer.TypeName(operation._ClrType); + ?? inferrer.TypeName(bulkDescriptor._Type) + ?? inferrer.TypeName(operation._ClrType); var id = operation.GetIdForObject(inferrer); operation._Index = index; diff --git a/src/Nest/Nest.csproj b/src/Nest/Nest.csproj index 57432422c65..de13c08a242 100644 --- a/src/Nest/Nest.csproj +++ b/src/Nest/Nest.csproj @@ -822,6 +822,7 @@ + @@ -874,4 +875,4 @@ --> - + \ No newline at end of file diff --git a/src/Nest/Resolvers/Converters/ConcreteTypeConverter.cs b/src/Nest/Resolvers/Converters/ConcreteTypeConverter.cs index 9bf03f9cc42..7131bc6439e 100644 --- a/src/Nest/Resolvers/Converters/ConcreteTypeConverter.cs +++ b/src/Nest/Resolvers/Converters/ConcreteTypeConverter.cs @@ -78,7 +78,7 @@ public ConcreteTypeConverter(Func, Type> concreteTypeSelec public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { - var elasticContractResolver = serializer.ContractResolver as ElasticContractResolver; + var elasticContractResolver = serializer.ContractResolver as SettingsContractResolver; if (elasticContractResolver != null && elasticContractResolver.PiggyBackState != null && elasticContractResolver.PiggyBackState.ActualJsonConverter != null) { @@ -161,7 +161,7 @@ internal static Type GetConcreteTypeUsingSelector( JObject jObject, out object selection) where T: class { - var elasticContractResolver = serializer.ContractResolver as ElasticContractResolver; + var elasticContractResolver = serializer.ContractResolver as SettingsContractResolver; var baseType = realConcreteConverter._baseType; var selector = realConcreteConverter._concreteTypeSelector; diff --git a/src/Nest/Resolvers/Converters/DictionaryKeysAreNotPropertyNamesJsonConverter.cs b/src/Nest/Resolvers/Converters/DictionaryKeysAreNotPropertyNamesJsonConverter.cs index 8e488b06754..fac420e0c76 100644 --- a/src/Nest/Resolvers/Converters/DictionaryKeysAreNotPropertyNamesJsonConverter.cs +++ b/src/Nest/Resolvers/Converters/DictionaryKeysAreNotPropertyNamesJsonConverter.cs @@ -30,7 +30,7 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { - var contract = serializer.ContractResolver as ElasticContractResolver; + var contract = serializer.ContractResolver as SettingsContractResolver; IDictionary dictionary = (IDictionary) value; writer.WriteStartObject(); diff --git a/src/Nest/Resolvers/Converters/FieldNameFilterConverter.cs b/src/Nest/Resolvers/Converters/FieldNameFilterConverter.cs index 49b8e60b3a0..6bf6208f07e 100644 --- a/src/Nest/Resolvers/Converters/FieldNameFilterConverter.cs +++ b/src/Nest/Resolvers/Converters/FieldNameFilterConverter.cs @@ -84,7 +84,7 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s if (fieldName == null) return; - var contract = serializer.ContractResolver as ElasticContractResolver; + var contract = serializer.ContractResolver as SettingsContractResolver; if (contract == null) return; diff --git a/src/Nest/Resolvers/Converters/FieldNameQueryConverter.cs b/src/Nest/Resolvers/Converters/FieldNameQueryConverter.cs index fde9723f11d..1a4d1d006b1 100644 --- a/src/Nest/Resolvers/Converters/FieldNameQueryConverter.cs +++ b/src/Nest/Resolvers/Converters/FieldNameQueryConverter.cs @@ -72,7 +72,7 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s if (fieldName == null) return; - var contract = serializer.ContractResolver as ElasticContractResolver; + var contract = serializer.ContractResolver as SettingsContractResolver; if (contract == null) return; diff --git a/src/Nest/Resolvers/Converters/Filters/GeoBoundingFilterConverter.cs b/src/Nest/Resolvers/Converters/Filters/GeoBoundingFilterConverter.cs index 102d2c02f2d..a75f5288c24 100644 --- a/src/Nest/Resolvers/Converters/Filters/GeoBoundingFilterConverter.cs +++ b/src/Nest/Resolvers/Converters/Filters/GeoBoundingFilterConverter.cs @@ -22,7 +22,7 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s var f = value as IGeoBoundingBoxFilter; if (f == null || (f.IsConditionless && !f.IsVerbatim)) return; - var contract = serializer.ContractResolver as ElasticContractResolver; + var contract = serializer.ContractResolver as SettingsContractResolver; if (contract == null) return; diff --git a/src/Nest/Resolvers/Converters/Filters/GeoDistanceFilterConverter.cs b/src/Nest/Resolvers/Converters/Filters/GeoDistanceFilterConverter.cs index d5d7b87d28c..30899497e43 100644 --- a/src/Nest/Resolvers/Converters/Filters/GeoDistanceFilterConverter.cs +++ b/src/Nest/Resolvers/Converters/Filters/GeoDistanceFilterConverter.cs @@ -22,7 +22,7 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s var f = value as IGeoDistanceFilter; if (f == null || (f.IsConditionless && !f.IsVerbatim)) return; - var contract = serializer.ContractResolver as ElasticContractResolver; + var contract = serializer.ContractResolver as SettingsContractResolver; if (contract == null) return; diff --git a/src/Nest/Resolvers/Converters/Filters/GeoDistanceRangeFilterConverter.cs b/src/Nest/Resolvers/Converters/Filters/GeoDistanceRangeFilterConverter.cs index 0b8ea4463d0..ac4e9320741 100644 --- a/src/Nest/Resolvers/Converters/Filters/GeoDistanceRangeFilterConverter.cs +++ b/src/Nest/Resolvers/Converters/Filters/GeoDistanceRangeFilterConverter.cs @@ -22,7 +22,7 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s var f = value as IGeoDistanceRangeFilter; if (f == null || (f.IsConditionless && !f.IsVerbatim)) return; - var contract = serializer.ContractResolver as ElasticContractResolver; + var contract = serializer.ContractResolver as SettingsContractResolver; if (contract == null) return; diff --git a/src/Nest/Resolvers/Converters/Filters/PrefixFilterConverter.cs b/src/Nest/Resolvers/Converters/Filters/PrefixFilterConverter.cs index f390b00f291..1cb019fa478 100644 --- a/src/Nest/Resolvers/Converters/Filters/PrefixFilterConverter.cs +++ b/src/Nest/Resolvers/Converters/Filters/PrefixFilterConverter.cs @@ -22,7 +22,7 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s var f = value as IPrefixFilter; if (f == null || (f.IsConditionless && !f.IsVerbatim)) return; - var contract = serializer.ContractResolver as ElasticContractResolver; + var contract = serializer.ContractResolver as SettingsContractResolver; if (contract == null) return; diff --git a/src/Nest/Resolvers/Converters/Filters/TermFilterConverter.cs b/src/Nest/Resolvers/Converters/Filters/TermFilterConverter.cs index de2b8b7c951..42fe3b9f6a9 100644 --- a/src/Nest/Resolvers/Converters/Filters/TermFilterConverter.cs +++ b/src/Nest/Resolvers/Converters/Filters/TermFilterConverter.cs @@ -22,7 +22,7 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s var f = value as ITermFilter; if (f == null || (f.IsConditionless && !f.IsVerbatim)) return; - var contract = serializer.ContractResolver as ElasticContractResolver; + var contract = serializer.ContractResolver as SettingsContractResolver; if (contract == null) return; diff --git a/src/Nest/Resolvers/Converters/Filters/TermsFilterConverter.cs b/src/Nest/Resolvers/Converters/Filters/TermsFilterConverter.cs index 9720877fab8..44622354563 100644 --- a/src/Nest/Resolvers/Converters/Filters/TermsFilterConverter.cs +++ b/src/Nest/Resolvers/Converters/Filters/TermsFilterConverter.cs @@ -22,7 +22,7 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s var f = value as ITermsBaseFilter; if (f == null || (f.IsConditionless && !f.IsVerbatim)) return; - var contract = serializer.ContractResolver as ElasticContractResolver; + var contract = serializer.ContractResolver as SettingsContractResolver; if (contract == null) return; diff --git a/src/Nest/Resolvers/Converters/IndexNameMarkerConverter.cs b/src/Nest/Resolvers/Converters/IndexNameMarkerConverter.cs index f67b21e0a79..7a5164fc88e 100644 --- a/src/Nest/Resolvers/Converters/IndexNameMarkerConverter.cs +++ b/src/Nest/Resolvers/Converters/IndexNameMarkerConverter.cs @@ -23,7 +23,7 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s return; } - var contract = serializer.ContractResolver as ElasticContractResolver; + var contract = serializer.ContractResolver as SettingsContractResolver; if (contract != null && contract.ConnectionSettings != null) { var indexName = contract.Infer.IndexName(marker); diff --git a/src/Nest/Resolvers/Converters/IndexSettingsConverter.cs b/src/Nest/Resolvers/Converters/IndexSettingsConverter.cs index 4aa56c43861..651cf3875cd 100644 --- a/src/Nest/Resolvers/Converters/IndexSettingsConverter.cs +++ b/src/Nest/Resolvers/Converters/IndexSettingsConverter.cs @@ -72,7 +72,7 @@ private static void WriteWarmers(JsonWriter writer, JsonSerializer serializer, I private static void WriteMappings(JsonWriter writer, JsonSerializer serializer, IndexSettings indexSettings) { if (indexSettings.Mappings.Count <= 0) return; - var contract = serializer.ContractResolver as ElasticContractResolver; + var contract = serializer.ContractResolver as SettingsContractResolver; if (contract == null || contract.ConnectionSettings == null) return; writer.WritePropertyName("mappings"); diff --git a/src/Nest/Resolvers/Converters/MultiGetHitConverter.cs b/src/Nest/Resolvers/Converters/MultiGetHitConverter.cs index cf1b55e89c9..64ee570651d 100644 --- a/src/Nest/Resolvers/Converters/MultiGetHitConverter.cs +++ b/src/Nest/Resolvers/Converters/MultiGetHitConverter.cs @@ -41,7 +41,7 @@ private static void CreateMultiHit(MultiHitTuple tuple, JsonSerializer serial var reader = tuple.Hit.CreateReader(); serializer.Populate(reader, hit); - var contract = serializer.ContractResolver as ElasticContractResolver; + var contract = serializer.ContractResolver as SettingsContractResolver; var settings = contract.ConnectionSettings; var f = new FieldSelection(settings); var source = tuple.Hit["fields"]; @@ -59,7 +59,7 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist { if (this._descriptor == null) { - var elasticContractResolver = serializer.ContractResolver as ElasticContractResolver; + var elasticContractResolver = serializer.ContractResolver as SettingsContractResolver; if (elasticContractResolver == null) return new MultiGetResponse { IsValid = false }; var piggyBackState = elasticContractResolver.PiggyBackState; diff --git a/src/Nest/Resolvers/Converters/MultiSearchConverter.cs b/src/Nest/Resolvers/Converters/MultiSearchConverter.cs index 3902ba4e494..e56ab977d86 100644 --- a/src/Nest/Resolvers/Converters/MultiSearchConverter.cs +++ b/src/Nest/Resolvers/Converters/MultiSearchConverter.cs @@ -67,7 +67,7 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist { if (this._settings == null) { - var elasticContractResolver = serializer.ContractResolver as ElasticContractResolver; + var elasticContractResolver = serializer.ContractResolver as SettingsContractResolver; if (elasticContractResolver == null) return new MultiSearchResponse { IsValid = false }; var piggyBackState = elasticContractResolver.PiggyBackState; diff --git a/src/Nest/Resolvers/Converters/Queries/FuzzyQueryJsonConverter.cs b/src/Nest/Resolvers/Converters/Queries/FuzzyQueryJsonConverter.cs index b3d0b101f9f..d1b41251d70 100644 --- a/src/Nest/Resolvers/Converters/Queries/FuzzyQueryJsonConverter.cs +++ b/src/Nest/Resolvers/Converters/Queries/FuzzyQueryJsonConverter.cs @@ -98,7 +98,7 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s if (fieldName == null) return; - var contract = serializer.ContractResolver as ElasticContractResolver; + var contract = serializer.ContractResolver as SettingsContractResolver; if (contract == null) return; diff --git a/src/Nest/Resolvers/Converters/Queries/MatchQueryJsonConverter.cs b/src/Nest/Resolvers/Converters/Queries/MatchQueryJsonConverter.cs index a65c46c6126..00f2ac258c7 100644 --- a/src/Nest/Resolvers/Converters/Queries/MatchQueryJsonConverter.cs +++ b/src/Nest/Resolvers/Converters/Queries/MatchQueryJsonConverter.cs @@ -85,7 +85,7 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s if (fieldName == null) return; - var contract = serializer.ContractResolver as ElasticContractResolver; + var contract = serializer.ContractResolver as SettingsContractResolver; if (contract == null) return; diff --git a/src/Nest/Resolvers/Converters/Queries/SpanTermQueryConverter.cs b/src/Nest/Resolvers/Converters/Queries/SpanTermQueryConverter.cs index 4297b793e16..88441759b19 100644 --- a/src/Nest/Resolvers/Converters/Queries/SpanTermQueryConverter.cs +++ b/src/Nest/Resolvers/Converters/Queries/SpanTermQueryConverter.cs @@ -62,7 +62,7 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s var sq = value as ISpanTermQuery; if (sq == null) return; - var contract = serializer.ContractResolver as ElasticContractResolver; + var contract = serializer.ContractResolver as SettingsContractResolver; if (contract == null) return; diff --git a/src/Nest/Resolvers/Converters/Queries/TermsQueryJsonConverter.cs b/src/Nest/Resolvers/Converters/Queries/TermsQueryJsonConverter.cs index b72d0ab7318..8599dd035db 100644 --- a/src/Nest/Resolvers/Converters/Queries/TermsQueryJsonConverter.cs +++ b/src/Nest/Resolvers/Converters/Queries/TermsQueryJsonConverter.cs @@ -24,7 +24,7 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s string field = null; - var contract = serializer.ContractResolver as ElasticContractResolver; + var contract = serializer.ContractResolver as SettingsContractResolver; if (contract != null && contract.ConnectionSettings != null) field = contract.Infer.PropertyPath(t.Field); diff --git a/src/Nest/Resolvers/Converters/TypeNameMarkerConverter.cs b/src/Nest/Resolvers/Converters/TypeNameMarkerConverter.cs index 6207e1e627c..35f5efbb39e 100644 --- a/src/Nest/Resolvers/Converters/TypeNameMarkerConverter.cs +++ b/src/Nest/Resolvers/Converters/TypeNameMarkerConverter.cs @@ -22,7 +22,7 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s writer.WriteNull(); return; } - var contract = serializer.ContractResolver as ElasticContractResolver; + var contract = serializer.ContractResolver as SettingsContractResolver; if (contract != null && contract.ConnectionSettings != null) { var typeName = contract.Infer.TypeName(marker); diff --git a/src/Nest/Resolvers/ElasticContractResolver.cs b/src/Nest/Resolvers/ElasticContractResolver.cs index a2d0f9ec692..61238b6a92c 100644 --- a/src/Nest/Resolvers/ElasticContractResolver.cs +++ b/src/Nest/Resolvers/ElasticContractResolver.cs @@ -23,19 +23,10 @@ public class ElasticContractResolver : DefaultContractResolver /// public IConnectionSettingsValues ConnectionSettings { get; private set; } - public ElasticInferrer Infer { get; private set; } - - /// - /// Signals to custom converter that it can get serialization state from one of the converters - /// Ugly but massive performance gain - /// - internal JsonConverterPiggyBackState PiggyBackState { get; set; } - public ElasticContractResolver(IConnectionSettingsValues connectionSettings) : base(true) { this.ConnectionSettings = connectionSettings; - this.Infer = new ElasticInferrer(this.ConnectionSettings); } protected override JsonContract CreateContract(Type objectType) diff --git a/src/Nest/Resolvers/SettingsContractResolver.cs b/src/Nest/Resolvers/SettingsContractResolver.cs new file mode 100644 index 00000000000..92d6c2b0cbb --- /dev/null +++ b/src/Nest/Resolvers/SettingsContractResolver.cs @@ -0,0 +1,38 @@ +using Newtonsoft.Json.Serialization; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Nest.Resolvers +{ + class SettingsContractResolver : IContractResolver + { + /// + /// ConnectionSettings can be requested by JsonConverter's. + /// + public IConnectionSettingsValues ConnectionSettings { get; private set; } + + public ElasticInferrer Infer { get; private set; } + + private IContractResolver _wrapped; + + /// + /// Signals to custom converter that it can get serialization state from one of the converters + /// Ugly but massive performance gain + /// + internal JsonConverterPiggyBackState PiggyBackState { get; set; } + + public SettingsContractResolver(IContractResolver wrapped, IConnectionSettingsValues connectionSettings) + { + this.ConnectionSettings = connectionSettings; + this.Infer = new ElasticInferrer(this.ConnectionSettings); + this._wrapped = wrapped; + } + + public JsonContract ResolveContract(Type type) + { + return this._wrapped.ResolveContract(type); + } + } +}