From 427ff365b90980445dbe7b14cc512e0d5f4cb05c Mon Sep 17 00:00:00 2001 From: Martijn Laarman Date: Sun, 29 Nov 2015 23:50:26 +0100 Subject: [PATCH 1/6] moving contract converters over to attribute --- src/Nest/Aggregations/Aggregation.cs | 1 + .../Aggregations/AggregationJsonConverter.cs | 6 ++ .../Bucket/Children/ChildrenAggregation.cs | 2 +- .../DateHistogram/DateHistogramAggregation.cs | 2 +- .../Bucket/DateRange/DateRangeAggregation.cs | 2 +- .../Bucket/Filter/FilterAggregation.cs | 2 +- .../Bucket/Filters/FiltersAggregation.cs | 2 +- .../GeoDistance/GeoDistanceAggregation.cs | 2 +- .../GeoHashGrid/GeoHashGridAggregation.cs | 2 +- .../Bucket/Global/GlobalAggregation.cs | 2 +- .../Bucket/Histogram/HistogramAggregation.cs | 2 +- .../Bucket/IpRange/IpRangeAggregation.cs | 2 +- .../Bucket/Missing/MissingAggregation.cs | 2 +- .../Bucket/Nested/NestedAggregation.cs | 2 +- .../Bucket/Range/RangeAggregation.cs | 2 +- .../ReverseNested/ReverseNestedAggregation.cs | 2 +- .../Bucket/Sampler/SamplerAggregation.cs | 2 +- .../SignificantTermsAggregation.cs | 2 +- .../Bucket/Terms/TermsAggregation.cs | 2 +- .../Metric/Average/AverageAggregation.cs | 2 +- .../Cardinality/CardinalityAggregation.cs | 2 +- .../ExtendedStats/ExtendedStatsAggregation.cs | 2 +- .../Metric/GeoBounds/GeoBoundsAggregation.cs | 2 +- .../Aggregations/Metric/Max/MaxAggregation.cs | 2 +- .../Aggregations/Metric/Min/MinAggregation.cs | 2 +- .../PercentileRanksAggregation.cs | 2 +- .../Percentiles/PercentilesAggregation.cs | 2 +- .../ScriptedMetricAggregation.cs | 2 +- .../Metric/Stats/StatsAggregation.cs | 2 +- .../Aggregations/Metric/Sum/SumAggregation.cs | 2 +- .../Metric/TopHits/TopHitsAggregation.cs | 2 +- .../ValueCount/ValueCountAggregation.cs | 2 +- .../AverageBucket/AverageBucketAggregation.cs | 2 +- .../BucketScript/BucketScriptAggregation.cs | 2 +- .../BucketSelectorAggregation.cs | 2 +- .../CumulativeSum/CumulativeSumAggregation.cs | 2 +- .../Derivative/DerivativeAggregation.cs | 2 +- .../MaxBucket/MaxBucketAggregation.cs | 2 +- .../MinBucket/MinBucketAggregation.cs | 2 +- .../MovingAverage/MovingAverageAggregation.cs | 2 +- .../SerialDifferencingAggregation.cs | 2 +- .../SumBucket/SumBucketAggregation.cs | 2 +- src/Nest/Analysis/Analyzers/AnalyzerBase.cs | 1 + .../Analysis/CharFilters/CharFilterBase.cs | 1 + .../Analysis/TokenFilters/TokenFilterBase.cs | 1 + src/Nest/Analysis/Tokenizers/TokenizerBase.cs | 1 + .../Commands/IClusterRerouteCommand.cs | 1 + .../ContractJsonConverterAttribute.cs | 33 ++++++++ .../ElasticContractResolver.cs | 82 ++++++++++--------- .../Settings/DynamicIndexSettings.cs | 2 +- .../IndexSettings/Settings/IndexSettings.cs | 2 +- .../IndexModules/Similarity/Similarity.cs | 1 + .../Snapshot/Snapshot/SnapshotRequest.cs | 2 +- src/Nest/Nest.csproj | 1 + .../SimpleQueryStringFlags.cs | 68 +++++++++++---- .../MultiSearch/MultiSearchJsonConverter.cs | 8 +- .../Restore/RestoreApiTests.cs | 4 +- .../SimpleQueryStringUsageTests.cs | 1 - 58 files changed, 192 insertions(+), 104 deletions(-) create mode 100644 src/Nest/CommonAbstractions/SerializationBehavior/ContractJsonConverterAttribute.cs diff --git a/src/Nest/Aggregations/Aggregation.cs b/src/Nest/Aggregations/Aggregation.cs index 7ab65ca1cd1..dbe9a16d507 100644 --- a/src/Nest/Aggregations/Aggregation.cs +++ b/src/Nest/Aggregations/Aggregation.cs @@ -6,6 +6,7 @@ namespace Nest /// /// Describes an aggregation at request time when its being build /// + [ExactContractJsonConverter(typeof(AggregationJsonConverter))] public interface IAggregation { } diff --git a/src/Nest/Aggregations/AggregationJsonConverter.cs b/src/Nest/Aggregations/AggregationJsonConverter.cs index 6ddda2439d2..e67502128f6 100644 --- a/src/Nest/Aggregations/AggregationJsonConverter.cs +++ b/src/Nest/Aggregations/AggregationJsonConverter.cs @@ -8,6 +8,12 @@ namespace Nest { + internal class AggregationJsonConverter : ReadAsTypeJsonConverter + where TReadAs : class + { + + } + internal class AggregationJsonConverter : JsonConverter { private static Regex _numeric = new Regex(@"^[\d.]+(\.[\d.]+)?$"); diff --git a/src/Nest/Aggregations/Bucket/Children/ChildrenAggregation.cs b/src/Nest/Aggregations/Bucket/Children/ChildrenAggregation.cs index 82309996d58..a151d11e675 100644 --- a/src/Nest/Aggregations/Bucket/Children/ChildrenAggregation.cs +++ b/src/Nest/Aggregations/Bucket/Children/ChildrenAggregation.cs @@ -8,7 +8,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface IChildrenAggregation : IBucketAggregation { [JsonProperty("type")] diff --git a/src/Nest/Aggregations/Bucket/DateHistogram/DateHistogramAggregation.cs b/src/Nest/Aggregations/Bucket/DateHistogram/DateHistogramAggregation.cs index b843e89de61..4c7500943d6 100644 --- a/src/Nest/Aggregations/Bucket/DateHistogram/DateHistogramAggregation.cs +++ b/src/Nest/Aggregations/Bucket/DateHistogram/DateHistogramAggregation.cs @@ -6,7 +6,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface IDateHistogramAggregation : IBucketAggregation { [JsonProperty("field")] diff --git a/src/Nest/Aggregations/Bucket/DateRange/DateRangeAggregation.cs b/src/Nest/Aggregations/Bucket/DateRange/DateRangeAggregation.cs index b419be7ff97..ec536eddc38 100644 --- a/src/Nest/Aggregations/Bucket/DateRange/DateRangeAggregation.cs +++ b/src/Nest/Aggregations/Bucket/DateRange/DateRangeAggregation.cs @@ -7,7 +7,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface IDateRangeAggregation : IBucketAggregation { [JsonProperty("field")] diff --git a/src/Nest/Aggregations/Bucket/Filter/FilterAggregation.cs b/src/Nest/Aggregations/Bucket/Filter/FilterAggregation.cs index e33b1a64908..ab94210a49e 100644 --- a/src/Nest/Aggregations/Bucket/Filter/FilterAggregation.cs +++ b/src/Nest/Aggregations/Bucket/Filter/FilterAggregation.cs @@ -4,7 +4,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(FilterAggregationJsonConverter))] + [ContractJsonConverter(typeof(FilterAggregationJsonConverter))] public interface IFilterAggregation : IBucketAggregation { QueryContainer Filter { get; set; } diff --git a/src/Nest/Aggregations/Bucket/Filters/FiltersAggregation.cs b/src/Nest/Aggregations/Bucket/Filters/FiltersAggregation.cs index 9f567c720ae..2cbf5f3c183 100644 --- a/src/Nest/Aggregations/Bucket/Filters/FiltersAggregation.cs +++ b/src/Nest/Aggregations/Bucket/Filters/FiltersAggregation.cs @@ -6,7 +6,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface IFiltersAggregation : IBucketAggregation { [JsonProperty("filters")] diff --git a/src/Nest/Aggregations/Bucket/GeoDistance/GeoDistanceAggregation.cs b/src/Nest/Aggregations/Bucket/GeoDistance/GeoDistanceAggregation.cs index 74007f9f014..dfed35170ec 100644 --- a/src/Nest/Aggregations/Bucket/GeoDistance/GeoDistanceAggregation.cs +++ b/src/Nest/Aggregations/Bucket/GeoDistance/GeoDistanceAggregation.cs @@ -8,7 +8,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface IGeoDistanceAggregation : IBucketAggregation { [JsonProperty("field")] diff --git a/src/Nest/Aggregations/Bucket/GeoHashGrid/GeoHashGridAggregation.cs b/src/Nest/Aggregations/Bucket/GeoHashGrid/GeoHashGridAggregation.cs index 19fa27f57ef..04658495ea3 100644 --- a/src/Nest/Aggregations/Bucket/GeoHashGrid/GeoHashGridAggregation.cs +++ b/src/Nest/Aggregations/Bucket/GeoHashGrid/GeoHashGridAggregation.cs @@ -7,7 +7,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface IGeoHashGridAggregation : IBucketAggregation { [JsonProperty("field")] diff --git a/src/Nest/Aggregations/Bucket/Global/GlobalAggregation.cs b/src/Nest/Aggregations/Bucket/Global/GlobalAggregation.cs index bb27b04be8b..4a2f080e1dc 100644 --- a/src/Nest/Aggregations/Bucket/Global/GlobalAggregation.cs +++ b/src/Nest/Aggregations/Bucket/Global/GlobalAggregation.cs @@ -4,7 +4,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface IGlobalAggregation : IBucketAggregation { } public class GlobalAggregation : BucketAggregationBase, IGlobalAggregation diff --git a/src/Nest/Aggregations/Bucket/Histogram/HistogramAggregation.cs b/src/Nest/Aggregations/Bucket/Histogram/HistogramAggregation.cs index a80f26d10fb..5ef88c8a4dd 100644 --- a/src/Nest/Aggregations/Bucket/Histogram/HistogramAggregation.cs +++ b/src/Nest/Aggregations/Bucket/Histogram/HistogramAggregation.cs @@ -6,7 +6,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface IHistogramAggregation : IBucketAggregation { [JsonProperty("field")] diff --git a/src/Nest/Aggregations/Bucket/IpRange/IpRangeAggregation.cs b/src/Nest/Aggregations/Bucket/IpRange/IpRangeAggregation.cs index 61195c59e01..3d63b43e92f 100644 --- a/src/Nest/Aggregations/Bucket/IpRange/IpRangeAggregation.cs +++ b/src/Nest/Aggregations/Bucket/IpRange/IpRangeAggregation.cs @@ -7,7 +7,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface IIpRangeAggregation : IBucketAggregation { [JsonProperty("field")] diff --git a/src/Nest/Aggregations/Bucket/Missing/MissingAggregation.cs b/src/Nest/Aggregations/Bucket/Missing/MissingAggregation.cs index fad1ee95aab..994188483d0 100644 --- a/src/Nest/Aggregations/Bucket/Missing/MissingAggregation.cs +++ b/src/Nest/Aggregations/Bucket/Missing/MissingAggregation.cs @@ -6,7 +6,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface IMissingAggregation : IBucketAggregation { [JsonProperty("field")] diff --git a/src/Nest/Aggregations/Bucket/Nested/NestedAggregation.cs b/src/Nest/Aggregations/Bucket/Nested/NestedAggregation.cs index 14d8f710ff4..be9c4c6a2e6 100644 --- a/src/Nest/Aggregations/Bucket/Nested/NestedAggregation.cs +++ b/src/Nest/Aggregations/Bucket/Nested/NestedAggregation.cs @@ -5,7 +5,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface INestedAggregation : IBucketAggregation { [JsonProperty("path")] diff --git a/src/Nest/Aggregations/Bucket/Range/RangeAggregation.cs b/src/Nest/Aggregations/Bucket/Range/RangeAggregation.cs index 97812b5b5b0..a5b8d1609a2 100644 --- a/src/Nest/Aggregations/Bucket/Range/RangeAggregation.cs +++ b/src/Nest/Aggregations/Bucket/Range/RangeAggregation.cs @@ -7,7 +7,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface IRangeAggregation : IBucketAggregation { [JsonProperty("field")] diff --git a/src/Nest/Aggregations/Bucket/ReverseNested/ReverseNestedAggregation.cs b/src/Nest/Aggregations/Bucket/ReverseNested/ReverseNestedAggregation.cs index 5cea9a3789b..97dab48c7af 100644 --- a/src/Nest/Aggregations/Bucket/ReverseNested/ReverseNestedAggregation.cs +++ b/src/Nest/Aggregations/Bucket/ReverseNested/ReverseNestedAggregation.cs @@ -8,7 +8,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface IReverseNestedAggregation : IBucketAggregation { [JsonProperty("path")] diff --git a/src/Nest/Aggregations/Bucket/Sampler/SamplerAggregation.cs b/src/Nest/Aggregations/Bucket/Sampler/SamplerAggregation.cs index 6cad22dc771..89aeebc696d 100644 --- a/src/Nest/Aggregations/Bucket/Sampler/SamplerAggregation.cs +++ b/src/Nest/Aggregations/Bucket/Sampler/SamplerAggregation.cs @@ -7,7 +7,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface ISamplerAggregation : IBucketAggregation { [JsonProperty("shard_size")] diff --git a/src/Nest/Aggregations/Bucket/SignificantTerms/SignificantTermsAggregation.cs b/src/Nest/Aggregations/Bucket/SignificantTerms/SignificantTermsAggregation.cs index f3f23ffc044..77f4e9c14e7 100644 --- a/src/Nest/Aggregations/Bucket/SignificantTerms/SignificantTermsAggregation.cs +++ b/src/Nest/Aggregations/Bucket/SignificantTerms/SignificantTermsAggregation.cs @@ -6,7 +6,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface ISignificantTermsAggregation : IBucketAggregation { [JsonProperty("field")] diff --git a/src/Nest/Aggregations/Bucket/Terms/TermsAggregation.cs b/src/Nest/Aggregations/Bucket/Terms/TermsAggregation.cs index 301e340cf6c..1956d13d345 100644 --- a/src/Nest/Aggregations/Bucket/Terms/TermsAggregation.cs +++ b/src/Nest/Aggregations/Bucket/Terms/TermsAggregation.cs @@ -7,7 +7,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface ITermsAggregation : IBucketAggregation { [JsonProperty("field")] diff --git a/src/Nest/Aggregations/Metric/Average/AverageAggregation.cs b/src/Nest/Aggregations/Metric/Average/AverageAggregation.cs index c6c2ba5f842..174b1a958c9 100644 --- a/src/Nest/Aggregations/Metric/Average/AverageAggregation.cs +++ b/src/Nest/Aggregations/Metric/Average/AverageAggregation.cs @@ -6,7 +6,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface IAverageAggregation : IMetricAggregation { } public class AverageAggregation : MetricAggregationBase, IAverageAggregation diff --git a/src/Nest/Aggregations/Metric/Cardinality/CardinalityAggregation.cs b/src/Nest/Aggregations/Metric/Cardinality/CardinalityAggregation.cs index 1f813ed130d..4153edd1af9 100644 --- a/src/Nest/Aggregations/Metric/Cardinality/CardinalityAggregation.cs +++ b/src/Nest/Aggregations/Metric/Cardinality/CardinalityAggregation.cs @@ -6,7 +6,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface ICardinalityAggregation : IMetricAggregation { [JsonProperty("precision_threshold")] diff --git a/src/Nest/Aggregations/Metric/ExtendedStats/ExtendedStatsAggregation.cs b/src/Nest/Aggregations/Metric/ExtendedStats/ExtendedStatsAggregation.cs index 255b1bc48d1..73faa5ddb6b 100644 --- a/src/Nest/Aggregations/Metric/ExtendedStats/ExtendedStatsAggregation.cs +++ b/src/Nest/Aggregations/Metric/ExtendedStats/ExtendedStatsAggregation.cs @@ -3,7 +3,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface IExtendedStatsAggregation : IMetricAggregation { } public class ExtendedStatsAggregation : MetricAggregationBase, IExtendedStatsAggregation diff --git a/src/Nest/Aggregations/Metric/GeoBounds/GeoBoundsAggregation.cs b/src/Nest/Aggregations/Metric/GeoBounds/GeoBoundsAggregation.cs index c2454307773..af3746680ee 100644 --- a/src/Nest/Aggregations/Metric/GeoBounds/GeoBoundsAggregation.cs +++ b/src/Nest/Aggregations/Metric/GeoBounds/GeoBoundsAggregation.cs @@ -7,7 +7,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface IGeoBoundsAggregation : IMetricAggregation { [JsonProperty("wrap_longitude")] diff --git a/src/Nest/Aggregations/Metric/Max/MaxAggregation.cs b/src/Nest/Aggregations/Metric/Max/MaxAggregation.cs index 07bd4d270db..c2ae6dc71cf 100644 --- a/src/Nest/Aggregations/Metric/Max/MaxAggregation.cs +++ b/src/Nest/Aggregations/Metric/Max/MaxAggregation.cs @@ -6,7 +6,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface IMaxAggregation : IMetricAggregation { } public class MaxAggregation : MetricAggregationBase, IMaxAggregation diff --git a/src/Nest/Aggregations/Metric/Min/MinAggregation.cs b/src/Nest/Aggregations/Metric/Min/MinAggregation.cs index 0779990fc30..7cd2c160b9a 100644 --- a/src/Nest/Aggregations/Metric/Min/MinAggregation.cs +++ b/src/Nest/Aggregations/Metric/Min/MinAggregation.cs @@ -6,7 +6,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface IMinAggregation : IMetricAggregation { } public class MinAggregation : MetricAggregationBase, IMinAggregation diff --git a/src/Nest/Aggregations/Metric/PercentileRanks/PercentileRanksAggregation.cs b/src/Nest/Aggregations/Metric/PercentileRanks/PercentileRanksAggregation.cs index cb09961f2a1..b504495035b 100644 --- a/src/Nest/Aggregations/Metric/PercentileRanks/PercentileRanksAggregation.cs +++ b/src/Nest/Aggregations/Metric/PercentileRanks/PercentileRanksAggregation.cs @@ -6,7 +6,7 @@ namespace Nest { - [JsonConverter(typeof(PercentileRanksAggregationJsonConverter))] + [ContractJsonConverter(typeof(PercentileRanksAggregationJsonConverter))] public interface IPercentileRanksAggregation : IMetricAggregation { IEnumerable Values { get; set; } diff --git a/src/Nest/Aggregations/Metric/Percentiles/PercentilesAggregation.cs b/src/Nest/Aggregations/Metric/Percentiles/PercentilesAggregation.cs index b8c1745b79f..38bc816292a 100644 --- a/src/Nest/Aggregations/Metric/Percentiles/PercentilesAggregation.cs +++ b/src/Nest/Aggregations/Metric/Percentiles/PercentilesAggregation.cs @@ -6,7 +6,7 @@ namespace Nest { - [JsonConverter(typeof(PercentilesAggregationJsonConverter))] + [ContractJsonConverter(typeof(PercentilesAggregationJsonConverter))] public interface IPercentilesAggregation : IMetricAggregation { IEnumerable Percents { get; set; } diff --git a/src/Nest/Aggregations/Metric/ScriptedMetric/ScriptedMetricAggregation.cs b/src/Nest/Aggregations/Metric/ScriptedMetric/ScriptedMetricAggregation.cs index aac26810152..dcfbfe56ba1 100644 --- a/src/Nest/Aggregations/Metric/ScriptedMetric/ScriptedMetricAggregation.cs +++ b/src/Nest/Aggregations/Metric/ScriptedMetric/ScriptedMetricAggregation.cs @@ -7,7 +7,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface IScriptedMetricAggregation : IMetricAggregation { [JsonProperty("init_script")] diff --git a/src/Nest/Aggregations/Metric/Stats/StatsAggregation.cs b/src/Nest/Aggregations/Metric/Stats/StatsAggregation.cs index b118edcff2b..a4102427b14 100644 --- a/src/Nest/Aggregations/Metric/Stats/StatsAggregation.cs +++ b/src/Nest/Aggregations/Metric/Stats/StatsAggregation.cs @@ -6,7 +6,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface IStatsAggregator : IMetricAggregation { } public class StatsAggregation : MetricAggregationBase, IStatsAggregator diff --git a/src/Nest/Aggregations/Metric/Sum/SumAggregation.cs b/src/Nest/Aggregations/Metric/Sum/SumAggregation.cs index c8894e56fd0..b604893e93d 100644 --- a/src/Nest/Aggregations/Metric/Sum/SumAggregation.cs +++ b/src/Nest/Aggregations/Metric/Sum/SumAggregation.cs @@ -6,7 +6,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface ISumAggregation : IMetricAggregation { } public class SumAggregation : MetricAggregationBase, ISumAggregation diff --git a/src/Nest/Aggregations/Metric/TopHits/TopHitsAggregation.cs b/src/Nest/Aggregations/Metric/TopHits/TopHitsAggregation.cs index e7c0cce174c..6c2f130932b 100644 --- a/src/Nest/Aggregations/Metric/TopHits/TopHitsAggregation.cs +++ b/src/Nest/Aggregations/Metric/TopHits/TopHitsAggregation.cs @@ -8,7 +8,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface ITopHitsAggregation : IMetricAggregation { [JsonProperty("from")] diff --git a/src/Nest/Aggregations/Metric/ValueCount/ValueCountAggregation.cs b/src/Nest/Aggregations/Metric/ValueCount/ValueCountAggregation.cs index 9d258954098..5a2955134f1 100644 --- a/src/Nest/Aggregations/Metric/ValueCount/ValueCountAggregation.cs +++ b/src/Nest/Aggregations/Metric/ValueCount/ValueCountAggregation.cs @@ -5,7 +5,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface IValueCountAggregation : IMetricAggregation { } public class ValueCountAggregation : MetricAggregationBase, IValueCountAggregation diff --git a/src/Nest/Aggregations/Pipeline/AverageBucket/AverageBucketAggregation.cs b/src/Nest/Aggregations/Pipeline/AverageBucket/AverageBucketAggregation.cs index 12509d38227..2e69c7afdc1 100644 --- a/src/Nest/Aggregations/Pipeline/AverageBucket/AverageBucketAggregation.cs +++ b/src/Nest/Aggregations/Pipeline/AverageBucket/AverageBucketAggregation.cs @@ -8,7 +8,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface IAverageBucketAggregation : IPipelineAggregation { } public class AverageBucketAggregation diff --git a/src/Nest/Aggregations/Pipeline/BucketScript/BucketScriptAggregation.cs b/src/Nest/Aggregations/Pipeline/BucketScript/BucketScriptAggregation.cs index 2b13c8dd3dc..c66d5dd608d 100644 --- a/src/Nest/Aggregations/Pipeline/BucketScript/BucketScriptAggregation.cs +++ b/src/Nest/Aggregations/Pipeline/BucketScript/BucketScriptAggregation.cs @@ -8,7 +8,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface IBucketScriptAggregation : IPipelineAggregation { [JsonProperty("script")] diff --git a/src/Nest/Aggregations/Pipeline/BucketSelector/BucketSelectorAggregation.cs b/src/Nest/Aggregations/Pipeline/BucketSelector/BucketSelectorAggregation.cs index d068e1a6237..6895c3c2bfd 100644 --- a/src/Nest/Aggregations/Pipeline/BucketSelector/BucketSelectorAggregation.cs +++ b/src/Nest/Aggregations/Pipeline/BucketSelector/BucketSelectorAggregation.cs @@ -8,7 +8,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface IBucketSelectorAggregation : IPipelineAggregation { [JsonProperty("script")] diff --git a/src/Nest/Aggregations/Pipeline/CumulativeSum/CumulativeSumAggregation.cs b/src/Nest/Aggregations/Pipeline/CumulativeSum/CumulativeSumAggregation.cs index bbb569167f2..7eddc3f31b9 100644 --- a/src/Nest/Aggregations/Pipeline/CumulativeSum/CumulativeSumAggregation.cs +++ b/src/Nest/Aggregations/Pipeline/CumulativeSum/CumulativeSumAggregation.cs @@ -8,7 +8,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface ICumulativeSumAggregation : IPipelineAggregation { } public class CumulativeSumAggregation diff --git a/src/Nest/Aggregations/Pipeline/Derivative/DerivativeAggregation.cs b/src/Nest/Aggregations/Pipeline/Derivative/DerivativeAggregation.cs index cdfdff58f2a..b97bd7db948 100644 --- a/src/Nest/Aggregations/Pipeline/Derivative/DerivativeAggregation.cs +++ b/src/Nest/Aggregations/Pipeline/Derivative/DerivativeAggregation.cs @@ -8,7 +8,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface IDerivativeAggregation : IPipelineAggregation { } public class DerivativeAggregation : PipelineAggregationBase, IDerivativeAggregation diff --git a/src/Nest/Aggregations/Pipeline/MaxBucket/MaxBucketAggregation.cs b/src/Nest/Aggregations/Pipeline/MaxBucket/MaxBucketAggregation.cs index c4367a02cd0..b2fe842a5cc 100644 --- a/src/Nest/Aggregations/Pipeline/MaxBucket/MaxBucketAggregation.cs +++ b/src/Nest/Aggregations/Pipeline/MaxBucket/MaxBucketAggregation.cs @@ -8,7 +8,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface IMaxBucketAggregation : IPipelineAggregation { } public class MaxBucketAggregation diff --git a/src/Nest/Aggregations/Pipeline/MinBucket/MinBucketAggregation.cs b/src/Nest/Aggregations/Pipeline/MinBucket/MinBucketAggregation.cs index 741e4d68d24..92ac4afd76a 100644 --- a/src/Nest/Aggregations/Pipeline/MinBucket/MinBucketAggregation.cs +++ b/src/Nest/Aggregations/Pipeline/MinBucket/MinBucketAggregation.cs @@ -8,7 +8,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface IMinBucketAggregation : IPipelineAggregation { } public class MinBucketAggregation diff --git a/src/Nest/Aggregations/Pipeline/MovingAverage/MovingAverageAggregation.cs b/src/Nest/Aggregations/Pipeline/MovingAverage/MovingAverageAggregation.cs index 1d7bbc7f7d4..5cc826c8dd8 100644 --- a/src/Nest/Aggregations/Pipeline/MovingAverage/MovingAverageAggregation.cs +++ b/src/Nest/Aggregations/Pipeline/MovingAverage/MovingAverageAggregation.cs @@ -8,7 +8,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(MovingAverageAggregationJsonConverter))] + [ContractJsonConverter(typeof(MovingAverageAggregationJsonConverter))] public interface IMovingAverageAggregation : IPipelineAggregation { IMovingAverageModel Model { get; set; } diff --git a/src/Nest/Aggregations/Pipeline/SerialDifferencing/SerialDifferencingAggregation.cs b/src/Nest/Aggregations/Pipeline/SerialDifferencing/SerialDifferencingAggregation.cs index d306591a6dd..75aedd58a83 100644 --- a/src/Nest/Aggregations/Pipeline/SerialDifferencing/SerialDifferencingAggregation.cs +++ b/src/Nest/Aggregations/Pipeline/SerialDifferencing/SerialDifferencingAggregation.cs @@ -8,7 +8,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface ISerialDifferencingAggregation : IPipelineAggregation { [JsonProperty("lag")] diff --git a/src/Nest/Aggregations/Pipeline/SumBucket/SumBucketAggregation.cs b/src/Nest/Aggregations/Pipeline/SumBucket/SumBucketAggregation.cs index a4c9829a030..9f5e6952a71 100644 --- a/src/Nest/Aggregations/Pipeline/SumBucket/SumBucketAggregation.cs +++ b/src/Nest/Aggregations/Pipeline/SumBucket/SumBucketAggregation.cs @@ -8,7 +8,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] + [ContractJsonConverter(typeof(AggregationJsonConverter))] public interface ISumBucketAggregation : IPipelineAggregation { } public class SumBucketAggregation diff --git a/src/Nest/Analysis/Analyzers/AnalyzerBase.cs b/src/Nest/Analysis/Analyzers/AnalyzerBase.cs index bc64ed4bb20..7467eda7fc3 100644 --- a/src/Nest/Analysis/Analyzers/AnalyzerBase.cs +++ b/src/Nest/Analysis/Analyzers/AnalyzerBase.cs @@ -5,6 +5,7 @@ namespace Nest { + [ContractJsonConverter(typeof(AnalyzerJsonConverter))] public interface IAnalyzer { [JsonProperty(PropertyName = "version")] diff --git a/src/Nest/Analysis/CharFilters/CharFilterBase.cs b/src/Nest/Analysis/CharFilters/CharFilterBase.cs index d3630f25909..7722fbe878b 100644 --- a/src/Nest/Analysis/CharFilters/CharFilterBase.cs +++ b/src/Nest/Analysis/CharFilters/CharFilterBase.cs @@ -3,6 +3,7 @@ namespace Nest { + [ContractJsonConverter(typeof(CharFilterJsonConverter))] public interface ICharFilter { [JsonProperty("version")] diff --git a/src/Nest/Analysis/TokenFilters/TokenFilterBase.cs b/src/Nest/Analysis/TokenFilters/TokenFilterBase.cs index 13e7968fc63..3fe5f5ccd52 100644 --- a/src/Nest/Analysis/TokenFilters/TokenFilterBase.cs +++ b/src/Nest/Analysis/TokenFilters/TokenFilterBase.cs @@ -4,6 +4,7 @@ namespace Nest { + [ContractJsonConverter(typeof(TokenFilterJsonConverter))] public interface ITokenFilter { [JsonProperty("version")] diff --git a/src/Nest/Analysis/Tokenizers/TokenizerBase.cs b/src/Nest/Analysis/Tokenizers/TokenizerBase.cs index 203a5afb033..8cb1e6c6448 100644 --- a/src/Nest/Analysis/Tokenizers/TokenizerBase.cs +++ b/src/Nest/Analysis/Tokenizers/TokenizerBase.cs @@ -5,6 +5,7 @@ namespace Nest { + [ContractJsonConverter(typeof(TokenizerJsonConverter))] public interface ITokenizer { [JsonProperty(PropertyName = "version")] diff --git a/src/Nest/Cluster/ClusterReroute/Commands/IClusterRerouteCommand.cs b/src/Nest/Cluster/ClusterReroute/Commands/IClusterRerouteCommand.cs index 8d9374fbcfa..9721142fa66 100644 --- a/src/Nest/Cluster/ClusterReroute/Commands/IClusterRerouteCommand.cs +++ b/src/Nest/Cluster/ClusterReroute/Commands/IClusterRerouteCommand.cs @@ -6,6 +6,7 @@ namespace Nest { + [ContractJsonConverter(typeof(ClusterRerouteCommandJsonConverter))] public interface IClusterRerouteCommand { [JsonIgnore] diff --git a/src/Nest/CommonAbstractions/SerializationBehavior/ContractJsonConverterAttribute.cs b/src/Nest/CommonAbstractions/SerializationBehavior/ContractJsonConverterAttribute.cs new file mode 100644 index 00000000000..0a17493de64 --- /dev/null +++ b/src/Nest/CommonAbstractions/SerializationBehavior/ContractJsonConverterAttribute.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json; + +namespace Nest +{ + + public class ContractJsonConverterAttribute : Attribute + { + public JsonConverter Converter { get; } + + public ContractJsonConverterAttribute(Type jsonConverter) + { + if (typeof(JsonConverter).IsAssignableFrom(jsonConverter)) + { + Converter = jsonConverter.CreateInstance(); + } + } + } + public class ExactContractJsonConverterAttribute : Attribute + { + public JsonConverter Converter { get; } + + public ExactContractJsonConverterAttribute(Type jsonConverter) + { + if (typeof(JsonConverter).IsAssignableFrom(jsonConverter)) + { + Converter = jsonConverter.CreateInstance(); + } + } + } +} \ No newline at end of file diff --git a/src/Nest/CommonAbstractions/SerializationBehavior/ElasticContractResolver.cs b/src/Nest/CommonAbstractions/SerializationBehavior/ElasticContractResolver.cs index 62eac823b8a..df55cbe2407 100644 --- a/src/Nest/CommonAbstractions/SerializationBehavior/ElasticContractResolver.cs +++ b/src/Nest/CommonAbstractions/SerializationBehavior/ElasticContractResolver.cs @@ -9,13 +9,6 @@ namespace Nest.Resolvers { - - internal static class IsPromiseExtension - { - public static bool IsAssignableFrom(this Type objectType) where T : class => - typeof (T).IsAssignableFrom(objectType); - } - public class ElasticContractResolver : DefaultContractResolver { public static JsonSerializer Empty { get; } = new JsonSerializer(); @@ -38,33 +31,14 @@ protected override JsonContract CreateContract(Type objectType) // this will only be called once and then cached - if (typeof(IDictionary).IsAssignableFrom(objectType) - - && !objectType.IsAssignableFrom() - && !objectType.IsAssignableFrom() - && !objectType.IsAssignableFrom() - && !objectType.IsAssignableFrom() - && !objectType.IsAssignableFrom() - && !objectType.IsAssignableFrom() - && !objectType.IsAssignableFrom() - && !objectType.IsAssignableFrom() - ) + if (typeof(IDictionary).IsAssignableFrom(objectType) && !typeof(IIsADictionary).IsAssignableFrom(objectType)) contract.Converter = new VerbatimDictionaryKeysJsonConverter(); - - else if (objectType == typeof(IAggregation)) contract.Converter = new AggregationJsonConverter(); - else if (objectType == typeof(ISimilarity)) contract.Converter = new SimilarityJsonConverter(); - else if (objectType == typeof(ICharFilter)) contract.Converter = new CharFilterJsonConverter(); - else if (objectType == typeof(IAnalyzer)) contract.Converter = new AnalyzerJsonConverter(); - else if (objectType == typeof(ITokenizer)) contract.Converter = new TokenizerJsonConverter(); - else if (objectType == typeof(ITokenFilter)) contract.Converter = new TokenFilterJsonConverter(); - - - - else if (typeof(IClusterRerouteCommand).IsAssignableFrom(objectType)) - contract.Converter = new ClusterRerouteCommandJsonConverter(); - else if (objectType == typeof(DateTime) || objectType == typeof(DateTime?)) contract.Converter = new IsoDateTimeConverter(); + else if (!objectType.FullName.StartsWith("Nest.", StringComparison.OrdinalIgnoreCase)) return contract; + + else if (ApplyExactContractJsonAttribute(objectType, contract)) return contract; + else if (ApplyContractJsonAttribute(objectType, contract)) return contract; else if (objectType == typeof(TypeName)) contract.Converter = new TypeNameJsonConverter(); else if (objectType == typeof(IndexName)) contract.Converter = new IndexNameJsonConverter(); @@ -88,13 +62,44 @@ protected override JsonContract CreateContract(Type objectType) break; } } - return contract; } + private bool ApplyExactContractJsonAttribute(Type objectType, JsonContract contract) + { + var attribute = objectType.GetCustomAttributes(typeof(ExactContractJsonConverterAttribute)).FirstOrDefault() as ExactContractJsonConverterAttribute; + if (attribute?.Converter == null) return false; + contract.Converter = attribute.Converter; + return true; + } + private bool ApplyContractJsonAttribute(Type objectType, JsonContract contract) + { + foreach (var t in this.TypeWithInterfaces(objectType)) + { + var attribute = t.GetCustomAttributes(typeof(ContractJsonConverterAttribute), true).FirstOrDefault() as ContractJsonConverterAttribute; + if (attribute?.Converter == null) continue; + contract.Converter = attribute.Converter; + return true; + } + return false; + } + + private IEnumerable TypeWithInterfaces(Type objectType) + { + yield return objectType; + foreach (var i in objectType.GetInterfaces()) yield return i; + } + + + protected override IList CreateProperties(Type type, MemberSerialization memberSerialization) { var defaultProperties = base.CreateProperties(type, memberSerialization); + + + + + var lookup = defaultProperties.ToLookup(p => p.PropertyName); defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); @@ -159,7 +164,7 @@ from i in t.GetInterfaces() select base.CreateProperties(i, memberSerialization) ) .SelectMany(interfaceProps => interfaceProps) - .DistinctBy(p=>p.PropertyName) + .DistinctBy(p => p.PropertyName) .ToList(); } @@ -168,13 +173,14 @@ public IList PropertiesOfAll(Type t, MemberSerialization memberSer { return base.CreateProperties(t, memberSerialization) .Concat(PropertiesOfAllInterfaces(t, memberSerialization)) - .DistinctBy(p=>p.PropertyName) + .DistinctBy(p => p.PropertyName) .ToList(); } + private IList PropertiesOf(Type type, MemberSerialization memberSerialization, IList defaultProperties, ILookup lookup, bool append = false) { - if (!typeof (T).IsAssignableFrom(type)) return defaultProperties; + if (!typeof(T).IsAssignableFrom(type)) return defaultProperties; var jsonProperties = ( from i in type.GetInterfaces() select base.CreateProperties(i, memberSerialization) @@ -205,9 +211,9 @@ protected override JsonProperty CreateProperty(MemberInfo member, MemberSerializ var property = base.CreateProperty(member, memberSerialization); // Skip serialization of empty collections that has DefaultValueHandling set to Ignore. - if (property.DefaultValueHandling.HasValue - && property.DefaultValueHandling.Value == DefaultValueHandling.Ignore - && !typeof(string).IsAssignableFrom(property.PropertyType) + if (property.DefaultValueHandling.HasValue + && property.DefaultValueHandling.Value == DefaultValueHandling.Ignore + && !typeof(string).IsAssignableFrom(property.PropertyType) && typeof(IEnumerable).IsAssignableFrom(property.PropertyType)) { Predicate shouldSerialize = obj => diff --git a/src/Nest/IndexModules/IndexSettings/Settings/DynamicIndexSettings.cs b/src/Nest/IndexModules/IndexSettings/Settings/DynamicIndexSettings.cs index 90ce95901bd..02e47bec738 100644 --- a/src/Nest/IndexModules/IndexSettings/Settings/DynamicIndexSettings.cs +++ b/src/Nest/IndexModules/IndexSettings/Settings/DynamicIndexSettings.cs @@ -5,7 +5,7 @@ namespace Nest { - [JsonConverter(typeof(IndexSettingsConverter))] + [ContractJsonConverter(typeof(IndexSettingsConverter))] public interface IDynamicIndexSettings : IIsADictionary { /// diff --git a/src/Nest/IndexModules/IndexSettings/Settings/IndexSettings.cs b/src/Nest/IndexModules/IndexSettings/Settings/IndexSettings.cs index 8f789b6d327..7d0a4bb96d4 100644 --- a/src/Nest/IndexModules/IndexSettings/Settings/IndexSettings.cs +++ b/src/Nest/IndexModules/IndexSettings/Settings/IndexSettings.cs @@ -6,7 +6,7 @@ namespace Nest { - [JsonConverter(typeof(IndexSettingsConverter))] + [ContractJsonConverter(typeof(IndexSettingsConverter))] public interface IIndexSettings : IDynamicIndexSettings { /// diff --git a/src/Nest/IndexModules/Similarity/Similarity.cs b/src/Nest/IndexModules/Similarity/Similarity.cs index 559d997a778..50f279cbcb6 100644 --- a/src/Nest/IndexModules/Similarity/Similarity.cs +++ b/src/Nest/IndexModules/Similarity/Similarity.cs @@ -5,6 +5,7 @@ namespace Nest { + [ContractJsonConverter(typeof(SimilarityJsonConverter))] public interface ISimilarity { [JsonProperty("type")] diff --git a/src/Nest/Modules/SnapshotAndRestore/Snapshot/Snapshot/SnapshotRequest.cs b/src/Nest/Modules/SnapshotAndRestore/Snapshot/Snapshot/SnapshotRequest.cs index 8047fde2eee..507445fe2ec 100644 --- a/src/Nest/Modules/SnapshotAndRestore/Snapshot/Snapshot/SnapshotRequest.cs +++ b/src/Nest/Modules/SnapshotAndRestore/Snapshot/Snapshot/SnapshotRequest.cs @@ -9,7 +9,7 @@ namespace Nest public partial interface ISnapshotRequest { [JsonProperty("indices")] - [JsonConverter(typeof(TypesJsonConverter))] + [JsonConverter(typeof(IndicesMultiSyntaxJsonConverter))] Indices Indices { get; set; } [JsonProperty("ignore_unavailable")] diff --git a/src/Nest/Nest.csproj b/src/Nest/Nest.csproj index e9c799fa2f5..42feaad9c80 100644 --- a/src/Nest/Nest.csproj +++ b/src/Nest/Nest.csproj @@ -166,6 +166,7 @@ + diff --git a/src/Nest/QueryDsl/FullText/SimpleQueryString/SimpleQueryStringFlags.cs b/src/Nest/QueryDsl/FullText/SimpleQueryString/SimpleQueryStringFlags.cs index 203c7ae1b9c..a6981c2c36e 100644 --- a/src/Nest/QueryDsl/FullText/SimpleQueryString/SimpleQueryStringFlags.cs +++ b/src/Nest/QueryDsl/FullText/SimpleQueryString/SimpleQueryStringFlags.cs @@ -7,36 +7,72 @@ namespace Nest { - //TODO make a dedicated string enum flags converter - [JsonConverter(typeof(StringEnumConverter))] + [JsonConverter(typeof(SimpleQueryStringFlagsJsonConverter))] [Flags] public enum SimpleQueryStringFlags { - [EnumMember(Value = "ALL")] - All, [EnumMember(Value = "NONE")] - None, + None = 1 << 0, [EnumMember(Value = "AND")] - And, + And = 1 << 1, [EnumMember(Value = "OR")] - Or, + Or = 1 << 2, [EnumMember(Value = "NOT")] - Not, + Not = 1 << 3, [EnumMember(Value = "PREFIX")] - Prefix, + Prefix = 1 << 4, [EnumMember(Value = "PHRASE")] - Phrase, + Phrase = 1 << 5, [EnumMember(Value = "PRECEDENCE")] - Precedence, + Precedence = 1 << 6, [EnumMember(Value = "ESCAPE")] - Escape, + Escape = 1 << 7, [EnumMember(Value = "WHITESPACE")] - Whitespace, + Whitespace = 1 << 8, [EnumMember(Value = "FUZZY")] - Fuzzy, + Fuzzy = 1 << 9, [EnumMember(Value = "NEAR")] - Near, + Near = 1 << 10, [EnumMember(Value = "SLOP")] - Slop, + Slop = 1 << 11, + [EnumMember(Value = "ALL")] + All = 1 << 12, + } + + public class SimpleQueryStringFlagsJsonConverter : JsonConverter + { + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + var em = value as SimpleQueryStringFlags?; + if (!em.HasValue) return; ; + var e = em.Value; + var list = new List(); + if (e.HasFlag(SimpleQueryStringFlags.All)) list.Add("ALL"); + if (e.HasFlag(SimpleQueryStringFlags.None)) list.Add("NONE"); + if (e.HasFlag(SimpleQueryStringFlags.And)) list.Add("AND"); + if (e.HasFlag(SimpleQueryStringFlags.Or)) list.Add("OR"); + if (e.HasFlag(SimpleQueryStringFlags.Not)) list.Add("NOT"); + if (e.HasFlag(SimpleQueryStringFlags.Prefix)) list.Add("PREFIX"); + if (e.HasFlag(SimpleQueryStringFlags.Phrase)) list.Add("PHRASE"); + if (e.HasFlag(SimpleQueryStringFlags.Precedence)) list.Add("PRECEDENCE"); + if (e.HasFlag(SimpleQueryStringFlags.Escape)) list.Add("ESCAPE"); + if (e.HasFlag(SimpleQueryStringFlags.Whitespace)) list.Add("WHITESPACE"); + if (e.HasFlag(SimpleQueryStringFlags.Fuzzy)) list.Add("FUZZY"); + if (e.HasFlag(SimpleQueryStringFlags.Near)) list.Add("NEAR"); + if (e.HasFlag(SimpleQueryStringFlags.Slop)) list.Add("SLOP"); + var flags = string.Join("|", list); + writer.WriteValue(flags); + } + + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + var flags = reader.Value as string; + return flags?.Split('|') + .Select(flag => flag.ToEnum()) + .Where(s => s.HasValue) + .Aggregate(default(SimpleQueryStringFlags), (current, s) => current | s.Value); + } + + public override bool CanConvert(Type objectType) => true; } } \ No newline at end of file diff --git a/src/Nest/Search/MultiSearch/MultiSearchJsonConverter.cs b/src/Nest/Search/MultiSearch/MultiSearchJsonConverter.cs index a8462c344d2..e7ca4d51302 100644 --- a/src/Nest/Search/MultiSearch/MultiSearchJsonConverter.cs +++ b/src/Nest/Search/MultiSearch/MultiSearchJsonConverter.cs @@ -28,11 +28,11 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s foreach (var operation in request.Operations.Values) { - var index = (request.Index != null && !request.Index.Equals(operation.Index)) + var indices = (request.Index != null && !request.Index.Equals(operation.Index)) ? operation.Index : null; - var type = (request.Type != null && !request.Type.Equals(operation.Type)) + var types = (request.Type != null && !request.Type.Equals(operation.Type)) ? operation.Type : null; @@ -42,8 +42,8 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s var header = new { - index = index, - type = type, + index = (indices as IUrlParameter)?.GetString(contract.ConnectionSettings), + type = (types as IUrlParameter)?.GetString(contract.ConnectionSettings), search_type = searchType, preference = operation.Preference, routing = operation.Routing, diff --git a/src/Tests/Modules/SnapshotAndRestore/Restore/RestoreApiTests.cs b/src/Tests/Modules/SnapshotAndRestore/Restore/RestoreApiTests.cs index 5841cf20435..bc70bd85e3f 100644 --- a/src/Tests/Modules/SnapshotAndRestore/Restore/RestoreApiTests.cs +++ b/src/Tests/Modules/SnapshotAndRestore/Restore/RestoreApiTests.cs @@ -16,10 +16,10 @@ public class RestoreApiTests { public RestoreApiTests(IndexingCluster cluster, EndpointUsage usage) : base(cluster, usage) { - if (!TestClient.RunIntegrationTests) return; - _repositoryName = RandomString(); _snapshotName = RandomString(); + if (!TestClient.RunIntegrationTests) return; + var createRepository = this.Client.CreateRepository(_repositoryName, r => r .FileSystem(fs => fs .Settings(Path.Combine(cluster.Node.RepositoryPath, _repositoryName)) diff --git a/src/Tests/QueryDsl/FullText/SimpleQueryString/SimpleQueryStringUsageTests.cs b/src/Tests/QueryDsl/FullText/SimpleQueryString/SimpleQueryStringUsageTests.cs index 5203e4a7cc5..95ca00807a5 100644 --- a/src/Tests/QueryDsl/FullText/SimpleQueryString/SimpleQueryStringUsageTests.cs +++ b/src/Tests/QueryDsl/FullText/SimpleQueryString/SimpleQueryStringUsageTests.cs @@ -30,7 +30,6 @@ public SimpleQueryStringUsageTests(ReadOnlyCluster i, EndpointUsage usage) : bas analyze_wildcard = true, minimum_should_match = "30%" } - }; protected override QueryContainer QueryInitializer => new SimpleQueryStringQuery From d5b2635fdc6ca6446c1b81fb876a16897939c4d4 Mon Sep 17 00:00:00 2001 From: Martijn Laarman Date: Mon, 30 Nov 2015 11:24:53 +0100 Subject: [PATCH 2/6] cleaned up getting settings, stateful converter --- .../PercentilesAggregationJsonConverter.cs | 4 +-- .../Extensions/JsonExtensions.cs | 32 +++++++++++++++++++ .../Infer/Features/FeaturesJsonConverter.cs | 6 ++-- .../CommonAbstractions/Infer/Field/Field.cs | 1 + .../CommonAbstractions/Infer/Fields/Fields.cs | 1 + .../Infer/Id/IdJsonConverter.cs | 12 +++---- .../Infer/IndexName/IndexName.cs | 2 +- .../Infer/IndexName/IndexNameJsonConverter.cs | 10 ++---- .../Infer/Indices/IndicesJsonConverter.cs | 6 ++-- .../IndicesMultiSyntaxJsonConverter.cs | 5 +-- .../Infer/PropertyName/PropertyName.cs | 1 + .../Infer/TypeName/TypeName.cs | 2 +- .../Infer/TypeName/TypeNameJsonConverter.cs | 11 +++---- .../Infer/Types/TypesJsonConverter.cs | 6 ++-- .../Types/TypesMultiSyntaxJsonConverter.cs | 5 +-- .../ElasticContractResolver.cs | 8 ----- .../VerbatimDictionaryKeysConverter.cs | 13 ++++---- .../ConcreteTypeConverter.cs | 25 ++++++--------- .../Sorting/SortCollectionJsonConverter.cs | 8 ++--- .../Multiple/Bulk/BulkRequestJsonConverter.cs | 7 ++-- .../Response/MultiGetHitJsonConverter.cs | 20 ++++-------- src/Nest/Nest.csproj | 3 +- .../QueryDsl/FieldNameQueryJsonConverter.cs | 9 ++---- .../Terms/TermsQueryJsonConverter.cs | 8 ++--- .../VariableFieldNameQueryJsonConverter.cs | 7 ++-- .../MultiSearch/ElasticClient-MultiSearch.cs | 2 +- .../MultiSearch/MultiSearchJsonConverter.cs | 8 ++--- .../Search/MultiSearch/MultiSearchResponse.cs | 1 + ...cs => MultiSearchResponseJsonConverter.cs} | 12 ++----- .../MultiPercolateJsonConverter.cs | 5 +-- src/Nest/Search/Search/Hits/Hit.cs | 2 +- 31 files changed, 110 insertions(+), 132 deletions(-) create mode 100644 src/Nest/CommonAbstractions/Extensions/JsonExtensions.cs rename src/Nest/Search/MultiSearch/{MultiSearchResponsJsonConverter.cs => MultiSearchResponseJsonConverter.cs} (89%) diff --git a/src/Nest/Aggregations/Metric/Percentiles/PercentilesAggregationJsonConverter.cs b/src/Nest/Aggregations/Metric/Percentiles/PercentilesAggregationJsonConverter.cs index 26344609c50..0fe99082f1e 100644 --- a/src/Nest/Aggregations/Metric/Percentiles/PercentilesAggregationJsonConverter.cs +++ b/src/Nest/Aggregations/Metric/Percentiles/PercentilesAggregationJsonConverter.cs @@ -103,12 +103,12 @@ protected void WriteMethodProperty(IPercentilesMethod method, JsonWriter writer, protected void WriteMetricProperties(IMetricAggregation metric, JsonWriter writer, JsonSerializer serializer) { - var contract = serializer.ContractResolver as SettingsContractResolver; if (metric.Field != null) { + var settings = serializer.GetConnectionSettings(); writer.WritePropertyName("field"); - writer.WriteValue(contract.Infer.Field(metric.Field)); + writer.WriteValue(settings.Inferrer.Field(metric.Field)); } if (metric.Script != null) diff --git a/src/Nest/CommonAbstractions/Extensions/JsonExtensions.cs b/src/Nest/CommonAbstractions/Extensions/JsonExtensions.cs new file mode 100644 index 00000000000..9b561e72d93 --- /dev/null +++ b/src/Nest/CommonAbstractions/Extensions/JsonExtensions.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Nest.Resolvers; +using Newtonsoft.Json; + +namespace Nest +{ + internal static class JsonExtensions + { + public static IConnectionSettingsValues GetConnectionSettings(this JsonSerializer serializer) + { + var contract = serializer.ContractResolver as SettingsContractResolver; + if (contract?.ConnectionSettings == null) + throw new Exception("If you use a custom contract resolver be sure to subclass from ElasticResolver"); + return contract.ConnectionSettings; + } + + public static TConverter GetStatefulConverter(this JsonSerializer serializer) + where TConverter : JsonConverter + { + var resolver = serializer.ContractResolver as SettingsContractResolver; + var realConverter = resolver?.PiggyBackState?.ActualJsonConverter as TConverter; + if (realConverter == null) + throw new DslException($"could not find a stateful {typeof(TConverter).Name} converter"); + + return realConverter; + } + } +} diff --git a/src/Nest/CommonAbstractions/Infer/Features/FeaturesJsonConverter.cs b/src/Nest/CommonAbstractions/Infer/Features/FeaturesJsonConverter.cs index 96bf6045a02..a744bd8b418 100644 --- a/src/Nest/CommonAbstractions/Infer/Features/FeaturesJsonConverter.cs +++ b/src/Nest/CommonAbstractions/Infer/Features/FeaturesJsonConverter.cs @@ -19,10 +19,8 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s writer.WriteNull(); return; } - var contract = serializer.ContractResolver as SettingsContractResolver; - if (contract?.ConnectionSettings == null) - throw new Exception("If you use a custom contract resolver be sure to subclass from ElasticResolver"); - var s = ((IUrlParameter)marker).GetString(contract.ConnectionSettings); + var settings = serializer.GetConnectionSettings(); + var s = ((IUrlParameter)marker).GetString(settings); writer.WriteValue(s); } diff --git a/src/Nest/CommonAbstractions/Infer/Field/Field.cs b/src/Nest/CommonAbstractions/Infer/Field/Field.cs index cbd8e6f148d..e153535dac3 100644 --- a/src/Nest/CommonAbstractions/Infer/Field/Field.cs +++ b/src/Nest/CommonAbstractions/Infer/Field/Field.cs @@ -9,6 +9,7 @@ namespace Nest { + [ContractJsonConverter(typeof(FieldJsonConverter))] public class Field : IEquatable, IUrlParameter { public string Name { get; set; } diff --git a/src/Nest/CommonAbstractions/Infer/Fields/Fields.cs b/src/Nest/CommonAbstractions/Infer/Fields/Fields.cs index 191761bbda4..8ba3fe563db 100644 --- a/src/Nest/CommonAbstractions/Infer/Fields/Fields.cs +++ b/src/Nest/CommonAbstractions/Infer/Fields/Fields.cs @@ -9,6 +9,7 @@ namespace Nest { + [ContractJsonConverter(typeof(FieldsJsonConverter))] public class Fields : IUrlParameter { internal readonly List ListOfFields; diff --git a/src/Nest/CommonAbstractions/Infer/Id/IdJsonConverter.cs b/src/Nest/CommonAbstractions/Infer/Id/IdJsonConverter.cs index ca3317501b1..863880cd57d 100644 --- a/src/Nest/CommonAbstractions/Infer/Id/IdJsonConverter.cs +++ b/src/Nest/CommonAbstractions/Infer/Id/IdJsonConverter.cs @@ -31,14 +31,10 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s } if (id.Document != null) { - var contract = serializer.ContractResolver as SettingsContractResolver; - if (contract != null && contract.ConnectionSettings != null) - { - var indexName = contract.Infer.Id(id.Document.GetType(), id.Document); - writer.WriteValue(indexName); - } - else throw new Exception("If you use a custom contract resolver be sure to subclass from ElasticResolver"); - } + var settings = serializer.GetConnectionSettings(); + var indexName = settings.Inferrer.Id(id.Document.GetType(), id.Document); + writer.WriteValue(indexName); + } else writer.WriteValue(id.Value); } } diff --git a/src/Nest/CommonAbstractions/Infer/IndexName/IndexName.cs b/src/Nest/CommonAbstractions/Infer/IndexName/IndexName.cs index ff5abdd330c..be94b46df44 100644 --- a/src/Nest/CommonAbstractions/Infer/IndexName/IndexName.cs +++ b/src/Nest/CommonAbstractions/Infer/IndexName/IndexName.cs @@ -7,7 +7,7 @@ namespace Nest { - [JsonConverter(typeof(IndexNameJsonConverter))] + [ContractJsonConverter(typeof(IndexNameJsonConverter))] public class IndexName : IEquatable, IUrlParameter { public string Name { get; set; } diff --git a/src/Nest/CommonAbstractions/Infer/IndexName/IndexNameJsonConverter.cs b/src/Nest/CommonAbstractions/Infer/IndexName/IndexNameJsonConverter.cs index 28cdf494d58..c956092e545 100644 --- a/src/Nest/CommonAbstractions/Infer/IndexName/IndexNameJsonConverter.cs +++ b/src/Nest/CommonAbstractions/Infer/IndexName/IndexNameJsonConverter.cs @@ -19,13 +19,9 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s return; } - var contract = serializer.ContractResolver as SettingsContractResolver; - if (contract != null && contract.ConnectionSettings != null) - { - var indexName = contract.Infer.IndexName(marker); - writer.WriteValue(indexName); - } - else throw new Exception("If you use a custom contract resolver be sure to subclass from ElasticResolver"); + var settings = serializer.GetConnectionSettings(); + var indexName = settings.Inferrer.IndexName(marker); + writer.WriteValue(indexName); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) diff --git a/src/Nest/CommonAbstractions/Infer/Indices/IndicesJsonConverter.cs b/src/Nest/CommonAbstractions/Infer/Indices/IndicesJsonConverter.cs index 1e918d0e992..ca8db61c35b 100644 --- a/src/Nest/CommonAbstractions/Infer/Indices/IndicesJsonConverter.cs +++ b/src/Nest/CommonAbstractions/Infer/Indices/IndicesJsonConverter.cs @@ -19,16 +19,14 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s writer.WriteNull(); return; } - var contract = serializer.ContractResolver as SettingsContractResolver; - if (contract == null || contract.ConnectionSettings == null) - throw new Exception("If you use a custom contract resolver be sure to subclass from ElasticResolver"); marker.Match( all=> writer.WriteNull(), many => { + var settings = serializer.GetConnectionSettings(); writer.WriteStartArray(); foreach(var m in many.Indices.Cast()) - writer.WriteValue(m.GetString(contract.ConnectionSettings)); + writer.WriteValue(m.GetString(settings)); writer.WriteEndArray(); } ); diff --git a/src/Nest/CommonAbstractions/Infer/Indices/IndicesMultiSyntaxJsonConverter.cs b/src/Nest/CommonAbstractions/Infer/Indices/IndicesMultiSyntaxJsonConverter.cs index a40ec2a36f6..aa5f11708ff 100644 --- a/src/Nest/CommonAbstractions/Infer/Indices/IndicesMultiSyntaxJsonConverter.cs +++ b/src/Nest/CommonAbstractions/Infer/Indices/IndicesMultiSyntaxJsonConverter.cs @@ -19,12 +19,9 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s writer.WriteNull(); return; } - var contract = serializer.ContractResolver as SettingsContractResolver; - if (contract == null || contract.ConnectionSettings == null) - throw new Exception("If you use a custom contract resolver be sure to subclass from ElasticResolver"); marker.Match( all=> writer.WriteValue("_all"), - many => writer.WriteValue(((IUrlParameter)marker).GetString(contract.ConnectionSettings)) + many => writer.WriteValue(((IUrlParameter)marker).GetString(serializer.GetConnectionSettings())) ); } diff --git a/src/Nest/CommonAbstractions/Infer/PropertyName/PropertyName.cs b/src/Nest/CommonAbstractions/Infer/PropertyName/PropertyName.cs index 30a8cb1b3e9..d9bad64823b 100644 --- a/src/Nest/CommonAbstractions/Infer/PropertyName/PropertyName.cs +++ b/src/Nest/CommonAbstractions/Infer/PropertyName/PropertyName.cs @@ -9,6 +9,7 @@ namespace Nest { + [ContractJsonConverter(typeof(PropertyNameJsonConverter))] public class PropertyName : IEquatable, IUrlParameter { public string Name { get; set; } diff --git a/src/Nest/CommonAbstractions/Infer/TypeName/TypeName.cs b/src/Nest/CommonAbstractions/Infer/TypeName/TypeName.cs index c87912163e9..b3a9b9e4d6f 100644 --- a/src/Nest/CommonAbstractions/Infer/TypeName/TypeName.cs +++ b/src/Nest/CommonAbstractions/Infer/TypeName/TypeName.cs @@ -5,7 +5,7 @@ namespace Nest { - [JsonConverter(typeof(TypeNameJsonConverter))] + [ContractJsonConverter(typeof(TypeNameJsonConverter))] public class TypeName : IEquatable , IUrlParameter { public string Name { get; set; } diff --git a/src/Nest/CommonAbstractions/Infer/TypeName/TypeNameJsonConverter.cs b/src/Nest/CommonAbstractions/Infer/TypeName/TypeNameJsonConverter.cs index f145ca78752..302a6c44655 100644 --- a/src/Nest/CommonAbstractions/Infer/TypeName/TypeNameJsonConverter.cs +++ b/src/Nest/CommonAbstractions/Infer/TypeName/TypeNameJsonConverter.cs @@ -21,13 +21,10 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s writer.WriteNull(); return; } - var contract = serializer.ContractResolver as SettingsContractResolver; - if (contract != null && contract.ConnectionSettings != null) - { - var typeName = contract.Infer.TypeName(marker); - writer.WriteValue(typeName); - } - else throw new Exception("If you use a custom contract resolver be sure to subclass from ElasticResolver"); + var settings = serializer.GetConnectionSettings(); + + var typeName = settings.Inferrer.TypeName(marker); + writer.WriteValue(typeName); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) diff --git a/src/Nest/CommonAbstractions/Infer/Types/TypesJsonConverter.cs b/src/Nest/CommonAbstractions/Infer/Types/TypesJsonConverter.cs index 137c6c5dcf8..497c25c71ba 100644 --- a/src/Nest/CommonAbstractions/Infer/Types/TypesJsonConverter.cs +++ b/src/Nest/CommonAbstractions/Infer/Types/TypesJsonConverter.cs @@ -19,16 +19,14 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s writer.WriteNull(); return; } - var contract = serializer.ContractResolver as SettingsContractResolver; - if (contract == null || contract.ConnectionSettings == null) - throw new Exception("If you use a custom contract resolver be sure to subclass from ElasticResolver"); marker.Match( all=> writer.WriteNull(), many => { + var settings = serializer.GetConnectionSettings(); writer.WriteStartArray(); foreach(var m in many.Types.Cast()) - writer.WriteValue(m.GetString(contract.ConnectionSettings)); + writer.WriteValue(m.GetString(settings)); writer.WriteEndArray(); } ); diff --git a/src/Nest/CommonAbstractions/Infer/Types/TypesMultiSyntaxJsonConverter.cs b/src/Nest/CommonAbstractions/Infer/Types/TypesMultiSyntaxJsonConverter.cs index a7cc303badd..c293d9b7c2a 100644 --- a/src/Nest/CommonAbstractions/Infer/Types/TypesMultiSyntaxJsonConverter.cs +++ b/src/Nest/CommonAbstractions/Infer/Types/TypesMultiSyntaxJsonConverter.cs @@ -19,12 +19,9 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s writer.WriteNull(); return; } - var contract = serializer.ContractResolver as SettingsContractResolver; - if (contract == null || contract.ConnectionSettings == null) - throw new Exception("If you use a custom contract resolver be sure to subclass from ElasticResolver"); marker.Match( all=> writer.WriteNull(), - many => writer.WriteValue(((IUrlParameter)marker).GetString(contract.ConnectionSettings)) + many => writer.WriteValue(((IUrlParameter)marker).GetString(serializer.GetConnectionSettings())) ); } diff --git a/src/Nest/CommonAbstractions/SerializationBehavior/ElasticContractResolver.cs b/src/Nest/CommonAbstractions/SerializationBehavior/ElasticContractResolver.cs index df55cbe2407..6d3eb9ea268 100644 --- a/src/Nest/CommonAbstractions/SerializationBehavior/ElasticContractResolver.cs +++ b/src/Nest/CommonAbstractions/SerializationBehavior/ElasticContractResolver.cs @@ -40,16 +40,8 @@ protected override JsonContract CreateContract(Type objectType) else if (ApplyExactContractJsonAttribute(objectType, contract)) return contract; else if (ApplyContractJsonAttribute(objectType, contract)) return contract; - else if (objectType == typeof(TypeName)) contract.Converter = new TypeNameJsonConverter(); - else if (objectType == typeof(IndexName)) contract.Converter = new IndexNameJsonConverter(); - else if (objectType == typeof(Fields)) contract.Converter = new FieldsJsonConverter(this.ConnectionSettings); - else if (objectType == typeof(Field)) contract.Converter = new FieldJsonConverter(this.ConnectionSettings); - else if (objectType == typeof(PropertyName)) contract.Converter = new PropertyNameJsonConverter(this.ConnectionSettings); - //TODO these should not be necessary here - else if (objectType == typeof(MultiSearchResponse)) contract.Converter = new MultiSearchJsonConverter(); else if (objectType == typeof(MultiGetResponse)) contract.Converter = new MultiGetHitJsonConverter(); - else if (typeof(IHit).IsAssignableFrom(objectType)) contract.Converter = new DefaultHitJsonConverter(); if (this.ConnectionSettings.ContractConverters.HasAny()) { diff --git a/src/Nest/CommonAbstractions/SerializationBehavior/GenericJsonConverters/VerbatimDictionaryKeysConverter.cs b/src/Nest/CommonAbstractions/SerializationBehavior/GenericJsonConverters/VerbatimDictionaryKeysConverter.cs index ad7ee3899b9..4b0e49c7710 100644 --- a/src/Nest/CommonAbstractions/SerializationBehavior/GenericJsonConverters/VerbatimDictionaryKeysConverter.cs +++ b/src/Nest/CommonAbstractions/SerializationBehavior/GenericJsonConverters/VerbatimDictionaryKeysConverter.cs @@ -24,11 +24,12 @@ 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 SettingsContractResolver; var dictionary = value as IDictionary; if (dictionary == null) return; + var settings = serializer.GetConnectionSettings(); + writer.WriteStartObject(); foreach (DictionaryEntry entry in dictionary) { @@ -39,16 +40,16 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s var propertyName = entry.Key as PropertyName; var indexName = entry.Key as IndexName; var typeName = entry.Key as TypeName; - if (contract == null) + if (settings == null) key = Convert.ToString(entry.Key, CultureInfo.InvariantCulture); else if (fieldName != null) - key = contract.Infer.Field(fieldName); + key = settings.Inferrer.Field(fieldName); else if (propertyName != null) - key = contract.Infer.PropertyName(propertyName); + key = settings.Inferrer.PropertyName(propertyName); else if (indexName != null) - key = contract.Infer.IndexName(indexName); + key = settings.Inferrer.IndexName(indexName); else if (typeName != null) - key = contract.Infer.TypeName(typeName); + key = settings.Inferrer.TypeName(typeName); else key = Convert.ToString(entry.Key, CultureInfo.InvariantCulture); writer.WritePropertyName(key); diff --git a/src/Nest/CommonAbstractions/SerializationBehavior/StatefulDeserialization/ConcreteTypeConverter.cs b/src/Nest/CommonAbstractions/SerializationBehavior/StatefulDeserialization/ConcreteTypeConverter.cs index be209421952..c2a628c7d28 100644 --- a/src/Nest/CommonAbstractions/SerializationBehavior/StatefulDeserialization/ConcreteTypeConverter.cs +++ b/src/Nest/CommonAbstractions/SerializationBehavior/StatefulDeserialization/ConcreteTypeConverter.cs @@ -62,8 +62,8 @@ internal class ConcreteTypeConverter : JsonConverter where T : class internal readonly Type _baseType; internal readonly Func, Type> _concreteTypeSelector; - public override bool CanWrite { get { return false; } } - public override bool CanRead { get { return true; } } + public override bool CanWrite => false; + public override bool CanRead => true; public ConcreteTypeConverter() {} @@ -78,18 +78,13 @@ public ConcreteTypeConverter(Func, Type> concreteTypeSelec public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { - var elasticContractResolver = serializer.ContractResolver as SettingsContractResolver; - if (elasticContractResolver != null && elasticContractResolver.PiggyBackState != null - && elasticContractResolver.PiggyBackState.ActualJsonConverter != null) - { - var realConcreteConverter = elasticContractResolver.PiggyBackState.ActualJsonConverter as ConcreteTypeConverter; - if (realConcreteConverter != null) - return ConcreteTypeConverter.GetUsingConcreteTypeConverter(reader, serializer, realConcreteConverter); - } + var realConverter = serializer.GetStatefulConverter>(); + if (realConverter != null) + return ConcreteTypeConverter.GetUsingConcreteTypeConverter(reader, serializer, realConverter); var instance = (Hit)(typeof(Hit).CreateInstance()); serializer.Populate(reader, instance); - instance.Fields = new FieldSelection(elasticContractResolver.ConnectionSettings, instance._fields); + instance.Fields = new FieldSelection(serializer.GetConnectionSettings(), instance._fields); return instance; } @@ -161,15 +156,15 @@ internal static Type GetConcreteTypeUsingSelector( JObject jObject, out object selection) where T: class { - var elasticContractResolver = serializer.ContractResolver as SettingsContractResolver; + var settings = serializer.GetConnectionSettings(); var baseType = realConcreteConverter._baseType; var selector = realConcreteConverter._concreteTypeSelector; //Hit hitDynamic = new Hit(); dynamic d = jObject; var fields = jObject["fields"]; - var fieldSelectionData = fields != null ? fields.ToObject>() : null; - var sel = new FieldSelection(elasticContractResolver.ConnectionSettings, fieldSelectionData); + var fieldSelectionData = fields?.ToObject>(); + var sel = new FieldSelection(settings, fieldSelectionData); var hitDynamic = new Hit(); //favor manual mapping over doing Populate twice. hitDynamic._fields = fieldSelectionData; @@ -192,7 +187,7 @@ internal static Type GetConcreteTypeUsingSelector( fieldSelectionType = typeof(FieldSelection<>).MakeGenericType(concreteType); ConcreteTypeConverter.TypeToFieldTypes.TryAdd(concreteType, fieldSelectionType); } - selection = fieldSelectionType.CreateInstance(elasticContractResolver.ConnectionSettings, fieldSelectionData); + selection = fieldSelectionType.CreateInstance(settings, fieldSelectionData); return concreteType; } } diff --git a/src/Nest/CommonOptions/Sorting/SortCollectionJsonConverter.cs b/src/Nest/CommonOptions/Sorting/SortCollectionJsonConverter.cs index 2cb13b24574..229798b6809 100644 --- a/src/Nest/CommonOptions/Sorting/SortCollectionJsonConverter.cs +++ b/src/Nest/CommonOptions/Sorting/SortCollectionJsonConverter.cs @@ -72,16 +72,13 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s var sorts = value as IList; if (sorts == null) return; - var contract = serializer.ContractResolver as SettingsContractResolver; - if (contract == null) - throw new Exception("Can not serialize sort because the current json contract does not extend SettingsContractResolver"); - + var settings = serializer.GetConnectionSettings(); writer.WriteStartArray(); foreach (var sort in sorts) { writer.WriteStartObject(); - var fieldName = contract.Infer.Field(sort.SortKey); + var fieldName = settings.Inferrer.Field(sort.SortKey); writer.WritePropertyName(fieldName); serializer.Serialize(writer, sort); writer.WriteEndObject(); @@ -96,6 +93,7 @@ private void LoadGeoDistanceSortLocation(GeoDistanceSort sort, JObject j) if (field != null) { sort.Field = field.Name; + // TODO use field.Value.Type instead of try catch try { diff --git a/src/Nest/Document/Multiple/Bulk/BulkRequestJsonConverter.cs b/src/Nest/Document/Multiple/Bulk/BulkRequestJsonConverter.cs index 55aa019849a..846889fc17d 100644 --- a/src/Nest/Document/Multiple/Bulk/BulkRequestJsonConverter.cs +++ b/src/Nest/Document/Multiple/Bulk/BulkRequestJsonConverter.cs @@ -17,8 +17,9 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s { var bulk = value as IBulkRequest; if (value == null) return; - var contract = serializer.ContractResolver as SettingsContractResolver; - var elasticsearchSerializer = contract?.ConnectionSettings.Serializer; + + var settings = serializer?.GetConnectionSettings(); + var elasticsearchSerializer = settings?.Serializer; if (elasticsearchSerializer == null) return ; foreach(var op in bulk.Operations) @@ -27,7 +28,7 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s if (op.Index.EqualsMarker(bulk.Index)) op.Index = null; op.Type = op.Type ?? bulk.Type ?? op.ClrType; if (op.Type.EqualsMarker(bulk.Type)) op.Type = null; - op.Id = op.GetIdForOperation(contract.Infer); + op.Id = op.GetIdForOperation(settings.Inferrer); var opJson = elasticsearchSerializer.SerializeToBytes(op, SerializationFormatting.None); writer.WriteRaw($"{{\"{op.Operation}\":" + opJson.Utf8String() + "}\n"); diff --git a/src/Nest/Document/Multiple/MultiGet/Response/MultiGetHitJsonConverter.cs b/src/Nest/Document/Multiple/MultiGet/Response/MultiGetHitJsonConverter.cs index 2f3020bd474..4c249ea55c8 100644 --- a/src/Nest/Document/Multiple/MultiGet/Response/MultiGetHitJsonConverter.cs +++ b/src/Nest/Document/Multiple/MultiGet/Response/MultiGetHitJsonConverter.cs @@ -20,10 +20,10 @@ private class MultiHitTuple private readonly IMultiGetRequest _request; private static MethodInfo MakeDelegateMethodInfo = typeof(MultiGetHitJsonConverter).GetMethod("CreateMultiHit", BindingFlags.Static | BindingFlags.NonPublic); - + internal MultiGetHitJsonConverter() { - + } public MultiGetHitJsonConverter(IMultiGetRequest request) @@ -39,16 +39,15 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s private static void CreateMultiHit(MultiHitTuple tuple, JsonSerializer serializer, ICollection> collection) where T : class { var hit = new MultiGetHit(); - var reader = tuple.Hit.CreateReader(); + var reader = tuple.Hit.CreateReader(); serializer.Populate(reader, hit); - var contract = serializer.ContractResolver as SettingsContractResolver; - var settings = contract.ConnectionSettings; + var settings = serializer.GetConnectionSettings(); var f = new FieldSelection(settings); var source = tuple.Hit["fields"]; if (source != null) { - ((IFieldSelection)f).FieldValuesDictionary = serializer.Deserialize>( source.CreateReader()); + ((IFieldSelection)f).FieldValuesDictionary = serializer.Deserialize>(source.CreateReader()); hit.FieldSelection = f; } @@ -60,13 +59,7 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist { if (this._request == null) { - var realConverter = ( - (serializer.ContractResolver as SettingsContractResolver) - ?.PiggyBackState?.ActualJsonConverter as MultiGetHitJsonConverter - ); - if (realConverter == null) - throw new DslException("could not find a stateful multigethit converter"); - + var realConverter = serializer.GetStatefulConverter(); return realConverter.ReadJson(reader, objectType, existingValue, serializer); } @@ -74,7 +67,6 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist var jsonObject = JObject.Load(reader); var docsJarray = (JArray)jsonObject["docs"]; - var multiGetDescriptor = this._request; if (this._request == null || docsJarray == null) return response; diff --git a/src/Nest/Nest.csproj b/src/Nest/Nest.csproj index 42feaad9c80..6652f693af7 100644 --- a/src/Nest/Nest.csproj +++ b/src/Nest/Nest.csproj @@ -115,6 +115,7 @@ + @@ -384,7 +385,7 @@ - + diff --git a/src/Nest/QueryDsl/FieldNameQueryJsonConverter.cs b/src/Nest/QueryDsl/FieldNameQueryJsonConverter.cs index 878474fe134..fbdbd9836a3 100644 --- a/src/Nest/QueryDsl/FieldNameQueryJsonConverter.cs +++ b/src/Nest/QueryDsl/FieldNameQueryJsonConverter.cs @@ -27,13 +27,10 @@ protected override void SerializeJson(JsonWriter writer, object value, IFieldNam if (fieldName == null) return; - var contract = serializer.ContractResolver as SettingsContractResolver; - if (contract == null) - return; + var settings = serializer.GetConnectionSettings(); - var field = contract.Infer.Field(fieldName); - if (field.IsNullOrEmpty()) - return; + var field = settings?.Inferrer.Field(fieldName); + if (field.IsNullOrEmpty()) return; writer.WriteStartObject(); { diff --git a/src/Nest/QueryDsl/TermLevel/Terms/TermsQueryJsonConverter.cs b/src/Nest/QueryDsl/TermLevel/Terms/TermsQueryJsonConverter.cs index dcab4f243b2..5d4c66e97e0 100644 --- a/src/Nest/QueryDsl/TermLevel/Terms/TermsQueryJsonConverter.cs +++ b/src/Nest/QueryDsl/TermLevel/Terms/TermsQueryJsonConverter.cs @@ -20,11 +20,8 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s var t = value as ITermsQuery; if (t == null) return; - string field = null; - - var contract = serializer.ContractResolver as SettingsContractResolver; - if (contract != null && contract.ConnectionSettings != null) - field = contract.Infer.Field(t.Field); + var settings = serializer.GetConnectionSettings(); + var field = settings.Inferrer.Field(t.Field); writer.WriteStartObject(); { @@ -58,7 +55,6 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s writer.WritePropertyName("_name"); writer.WriteValue(t.Name); } - } writer.WriteEndObject(); } diff --git a/src/Nest/QueryDsl/VariableFieldNameQueryJsonConverter.cs b/src/Nest/QueryDsl/VariableFieldNameQueryJsonConverter.cs index d4574e76e4e..77ebe6b0b6b 100644 --- a/src/Nest/QueryDsl/VariableFieldNameQueryJsonConverter.cs +++ b/src/Nest/QueryDsl/VariableFieldNameQueryJsonConverter.cs @@ -65,11 +65,8 @@ protected override void SerializeJson(JsonWriter writer, object value, IFieldNam if (fieldName == null) return; - var contract = serializer.ContractResolver as SettingsContractResolver; - if (contract == null) - return; - - var field = contract.Infer.Field(fieldName); + var settings = serializer.GetConnectionSettings(); + var field = settings.Inferrer.Field(fieldName); if (field.IsNullOrEmpty()) return; diff --git a/src/Nest/Search/MultiSearch/ElasticClient-MultiSearch.cs b/src/Nest/Search/MultiSearch/ElasticClient-MultiSearch.cs index b8550822ffe..58c97a86784 100644 --- a/src/Nest/Search/MultiSearch/ElasticClient-MultiSearch.cs +++ b/src/Nest/Search/MultiSearch/ElasticClient-MultiSearch.cs @@ -83,7 +83,7 @@ private JsonConverter CreateMultiSearchDeserializer(IMultiSearchRequest request) CovariantSearch.CloseOverAutomagicCovariantResultSelector(this.Infer, operation); } - return new MultiSearchResponsJsonConverter(this.ConnectionSettings, request); + return new MultiSearchResponseJsonConverter(this.ConnectionSettings, request); } } } \ No newline at end of file diff --git a/src/Nest/Search/MultiSearch/MultiSearchJsonConverter.cs b/src/Nest/Search/MultiSearch/MultiSearchJsonConverter.cs index e7ca4d51302..ebf4f22f898 100644 --- a/src/Nest/Search/MultiSearch/MultiSearchJsonConverter.cs +++ b/src/Nest/Search/MultiSearch/MultiSearchJsonConverter.cs @@ -20,8 +20,8 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s { var request = value as IMultiSearchRequest; if (request == null) return; - var contract = serializer.ContractResolver as SettingsContractResolver; - var elasticsearchSerializer = contract?.ConnectionSettings.Serializer; + var settings = serializer.GetConnectionSettings(); + var elasticsearchSerializer = settings.Serializer; if (elasticsearchSerializer == null) return; if (request.Operations == null) return; @@ -42,8 +42,8 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s var header = new { - index = (indices as IUrlParameter)?.GetString(contract.ConnectionSettings), - type = (types as IUrlParameter)?.GetString(contract.ConnectionSettings), + index = (indices as IUrlParameter)?.GetString(settings), + type = (types as IUrlParameter)?.GetString(settings), search_type = searchType, preference = operation.Preference, routing = operation.Routing, diff --git a/src/Nest/Search/MultiSearch/MultiSearchResponse.cs b/src/Nest/Search/MultiSearch/MultiSearchResponse.cs index 48fe1acd658..95e30e8f1db 100644 --- a/src/Nest/Search/MultiSearch/MultiSearchResponse.cs +++ b/src/Nest/Search/MultiSearch/MultiSearchResponse.cs @@ -6,6 +6,7 @@ namespace Nest { [JsonObject] + [ContractJsonConverter(typeof(MultiSearchResponseJsonConverter))] public class MultiSearchResponse : BaseResponse, IMultiSearchResponse { public MultiSearchResponse() diff --git a/src/Nest/Search/MultiSearch/MultiSearchResponsJsonConverter.cs b/src/Nest/Search/MultiSearch/MultiSearchResponseJsonConverter.cs similarity index 89% rename from src/Nest/Search/MultiSearch/MultiSearchResponsJsonConverter.cs rename to src/Nest/Search/MultiSearch/MultiSearchResponseJsonConverter.cs index f33f424b972..02ca430622c 100644 --- a/src/Nest/Search/MultiSearch/MultiSearchResponsJsonConverter.cs +++ b/src/Nest/Search/MultiSearch/MultiSearchResponseJsonConverter.cs @@ -11,7 +11,7 @@ namespace Nest { - internal class MultiSearchResponsJsonConverter : JsonConverter + internal class MultiSearchResponseJsonConverter : JsonConverter { public override bool CanConvert(Type objectType) => true; public override bool CanWrite => false; @@ -22,7 +22,7 @@ internal class MultiSearchResponsJsonConverter : JsonConverter private static MethodInfo MakeDelegateMethodInfo = typeof(MultiSearchJsonConverter).GetMethod("CreateMultiHit", BindingFlags.Static | BindingFlags.NonPublic); private readonly IConnectionSettingsValues _settings; - public MultiSearchResponsJsonConverter(IConnectionSettingsValues settings, IMultiSearchRequest request) + public MultiSearchResponseJsonConverter(IConnectionSettingsValues settings, IMultiSearchRequest request) { this._settings = settings; _request = request; @@ -32,13 +32,7 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist { if (this._settings == null) { - var realConverter = ( - (serializer.ContractResolver as SettingsContractResolver) - ?.PiggyBackState?.ActualJsonConverter as MultiSearchJsonConverter - ); - if (realConverter == null) - throw new DslException("could not find a stateful multi search converter"); - + var realConverter = serializer.GetStatefulConverter(); var mr = realConverter.ReadJson(reader, objectType, existingValue, serializer) as MultiSearchResponse; return mr; } diff --git a/src/Nest/Search/Percolator/MultiPercolate/MultiPercolateJsonConverter.cs b/src/Nest/Search/Percolator/MultiPercolate/MultiPercolateJsonConverter.cs index 39787492a3a..130b3529c2b 100644 --- a/src/Nest/Search/Percolator/MultiPercolate/MultiPercolateJsonConverter.cs +++ b/src/Nest/Search/Percolator/MultiPercolate/MultiPercolateJsonConverter.cs @@ -20,8 +20,9 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s { var request = value as IMultiPercolateRequest; if (request == null) return; - var contract = serializer.ContractResolver as SettingsContractResolver; - var elasticsearchSerializer = contract?.ConnectionSettings.Serializer; + + var settings = serializer.GetConnectionSettings(); + var elasticsearchSerializer = settings.Serializer; if (elasticsearchSerializer == null) return; foreach (var percolation in request.Percolations) { diff --git a/src/Nest/Search/Search/Hits/Hit.cs b/src/Nest/Search/Search/Hits/Hit.cs index da33f0bbb1c..58607a5e361 100644 --- a/src/Nest/Search/Search/Hits/Hit.cs +++ b/src/Nest/Search/Search/Hits/Hit.cs @@ -6,7 +6,7 @@ namespace Nest { - //[JsonConverter(typeof(ConcreteTypeConverter))] + [ContractJsonConverter(typeof(DefaultHitJsonConverter))] public interface IHit where T : class { IFieldSelection Fields { get; } From e74d90560dd9335167de6f9de7063db4b3942cb2 Mon Sep 17 00:00:00 2001 From: Martijn Laarman Date: Mon, 30 Nov 2015 17:18:20 +0100 Subject: [PATCH 3/6] moved several oldschool descriptors over to descriptorbase --- .../Serialization/IElasticsearchSerializer.cs | 5 + .../Bucket/BucketAggregationBase.cs | 2 +- .../Bucket/DateRange/DateRangeExpression.cs | 2 +- .../Bucket/Filters/FiltersAggregation.cs | 4 +- .../Bucket/Filters/NamedFiltersContainer.cs | 41 +++++ .../Filters/NamedFiltersContainerBase.cs | 66 -------- .../Aggregations/Bucket/IpRange/IpRange.cs | 2 +- .../Heuristics/ChiSquareHeuristic.cs | 2 +- .../GoogleNormalizedDistanceHeuristic.cs | 2 +- .../Heuristics/MutualInformationHeuristic.cs | 2 +- .../Heuristics/PercentageScoreHeuristic.cs | 2 +- .../Heuristics/ScriptedHeuristic.cs | 2 +- .../Metric/MetricAggregationBase.cs | 2 +- .../Percentiles/Methods/IPercentilesMethod.cs | 6 +- .../Models/IMovingAverageModel.cs | 4 +- .../MovingAverage/MovingAverageAggregation.cs | 1 + .../Pipeline/PipelineAggregationBase.cs | 7 +- .../Infer/Field/FieldJsonConverter.cs | 9 +- .../Infer/Fields/FieldsJsonConverter.cs | 9 +- .../CommonAbstractions/RawJson/ICustomJson.cs | 6 - .../ElasticContractResolver.cs | 70 +------- src/Nest/CommonOptions/Range/Range.cs | 2 +- src/Nest/CommonOptions/Scripting/Script.cs | 7 +- .../MultiGet/Response/MultiGetResponse.cs | 2 + src/Nest/Indices/AliasManagement/Aliases.cs | 2 +- .../AttributeBased/CompletionAttribute.cs | 2 +- src/Nest/Mapping/CodeBased/PropertyMapping.cs | 3 +- .../Completion/CompletionProperty.cs | 35 ++-- src/Nest/Nest.csproj | 12 +- .../Functions/FunctionScoreDecayField.cs | 66 ++++---- src/Nest/QueryDsl/QueryContainer.cs | 2 +- src/Nest/Search/Search/SearchRequest.cs | 12 +- src/Nest/Search/Suggesters/BaseSuggest.cs | 22 ++- .../CompletionSuggester/CompletionSuggest.cs | 75 --------- .../CompletionSuggester.cs | 39 +++++ .../CompletionSuggester/FuzzySuggest.cs | 65 ++------ .../ContextSuggester/CategorySuggest.cs | 47 ------ .../CategorySuggestContext.cs | 33 ++++ .../ContextSuggester/GeoLocationSuggest.cs | 78 --------- .../GeoLocationSuggestContext.cs | 50 ++++++ .../ContextSuggester/ISuggestContext.cs | 22 +++ .../PhraseSuggester/DirectGenerator.cs | 109 +++---------- .../PhraseSuggester/PhraseSuggest.cs | 150 ------------------ .../PhraseSuggester/PhraseSuggestCollate.cs | 45 ++---- .../PhraseSuggester/PhraseSuggestHighlight.cs | 18 +-- .../PhraseSuggester/PhraseSuggester.cs | 79 +++++++++ .../Suggesters/Suggest/SuggestRequest.cs | 12 +- src/Nest/Search/Suggesters/SuggestBucket.cs | 4 +- .../Suggesters/SuggestContextMapping.cs | 51 +++--- src/Nest/Search/Suggesters/SuggestOption.cs | 4 +- .../Suggesters/TermSuggester/TermSuggest.cs | 144 ----------------- .../Suggesters/TermSuggester/TermSuggester.cs | 79 +++++++++ src/Tests/CodeStandards/Descriptors.doc.cs | 8 +- src/Tests/CodeStandards/ElasticClient.doc.cs | 2 +- .../Serialization/Properties.doc.cs | 41 +++++ src/Tests/Tests.csproj | 1 + 56 files changed, 603 insertions(+), 966 deletions(-) create mode 100644 src/Nest/Aggregations/Bucket/Filters/NamedFiltersContainer.cs delete mode 100644 src/Nest/Aggregations/Bucket/Filters/NamedFiltersContainerBase.cs delete mode 100644 src/Nest/Search/Suggesters/CompletionSuggester/CompletionSuggest.cs create mode 100644 src/Nest/Search/Suggesters/CompletionSuggester/CompletionSuggester.cs delete mode 100644 src/Nest/Search/Suggesters/ContextSuggester/CategorySuggest.cs create mode 100644 src/Nest/Search/Suggesters/ContextSuggester/CategorySuggestContext.cs delete mode 100644 src/Nest/Search/Suggesters/ContextSuggester/GeoLocationSuggest.cs create mode 100644 src/Nest/Search/Suggesters/ContextSuggester/GeoLocationSuggestContext.cs delete mode 100644 src/Nest/Search/Suggesters/PhraseSuggester/PhraseSuggest.cs create mode 100644 src/Nest/Search/Suggesters/PhraseSuggester/PhraseSuggester.cs delete mode 100644 src/Nest/Search/Suggesters/TermSuggester/TermSuggest.cs create mode 100644 src/Nest/Search/Suggesters/TermSuggester/TermSuggester.cs create mode 100644 src/Tests/CodeStandards/Serialization/Properties.doc.cs diff --git a/src/Elasticsearch.Net/Serialization/IElasticsearchSerializer.cs b/src/Elasticsearch.Net/Serialization/IElasticsearchSerializer.cs index 0321ca8377d..bdc76fe5c77 100644 --- a/src/Elasticsearch.Net/Serialization/IElasticsearchSerializer.cs +++ b/src/Elasticsearch.Net/Serialization/IElasticsearchSerializer.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; +using Elasticsearch.Net.Extensions; namespace Elasticsearch.Net.Serialization { @@ -25,6 +26,10 @@ public static byte[] SerializeToBytes(this IElasticsearchSerializer serializer, return ms.ToArray(); } } + public static string SerializeToString(this IElasticsearchSerializer serializer, object data, SerializationFormatting formatting = SerializationFormatting.Indented) + { + return serializer.SerializeToBytes(data, formatting).Utf8String(); + } } diff --git a/src/Nest/Aggregations/Bucket/BucketAggregationBase.cs b/src/Nest/Aggregations/Bucket/BucketAggregationBase.cs index 5199663295d..c72f59705c0 100644 --- a/src/Nest/Aggregations/Bucket/BucketAggregationBase.cs +++ b/src/Nest/Aggregations/Bucket/BucketAggregationBase.cs @@ -19,7 +19,7 @@ protected BucketAggregationBase(string name) : base(name) { } } public abstract class BucketAggregationDescriptorBase - : IBucketAggregation + : IBucketAggregation, IDescriptor where TBucketAggregation : BucketAggregationDescriptorBase , TBucketAggregationInterface, IBucketAggregation where T : class diff --git a/src/Nest/Aggregations/Bucket/DateRange/DateRangeExpression.cs b/src/Nest/Aggregations/Bucket/DateRange/DateRangeExpression.cs index 2e8241df60e..892f5b9e035 100644 --- a/src/Nest/Aggregations/Bucket/DateRange/DateRangeExpression.cs +++ b/src/Nest/Aggregations/Bucket/DateRange/DateRangeExpression.cs @@ -4,7 +4,7 @@ namespace Nest { [JsonConverter(typeof(ReadAsTypeJsonConverter))] - public interface IDateRangeExpression : INestSerializable + public interface IDateRangeExpression { [JsonProperty(PropertyName = "from")] DateMath From { get; set; } diff --git a/src/Nest/Aggregations/Bucket/Filters/FiltersAggregation.cs b/src/Nest/Aggregations/Bucket/Filters/FiltersAggregation.cs index 2cbf5f3c183..5c03ba1d5b2 100644 --- a/src/Nest/Aggregations/Bucket/Filters/FiltersAggregation.cs +++ b/src/Nest/Aggregations/Bucket/Filters/FiltersAggregation.cs @@ -31,8 +31,8 @@ public class FiltersAggregationDescriptor { Union> IFiltersAggregation.Filters { get; set; } - public FiltersAggregationDescriptor NamedFilters(Func, NamedFiltersContainerBase> selector) => - Assign(a => a.Filters = selector?.Invoke(new NamedFiltersContainerDescriptor())); + public FiltersAggregationDescriptor NamedFilters(Func, IPromise> selector) => + Assign(a => a.Filters = new Union>(selector?.Invoke(new NamedFiltersContainerDescriptor())?.Value)); public FiltersAggregationDescriptor AnonymousFilters(params Func, IQueryContainer>[] selectors) => Assign(a => a.Filters = selectors.Select(s=>s?.Invoke(new QueryContainerDescriptor())).ToListOrNullIfEmpty()); diff --git a/src/Nest/Aggregations/Bucket/Filters/NamedFiltersContainer.cs b/src/Nest/Aggregations/Bucket/Filters/NamedFiltersContainer.cs new file mode 100644 index 00000000000..b7453e5d831 --- /dev/null +++ b/src/Nest/Aggregations/Bucket/Filters/NamedFiltersContainer.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json; + +namespace Nest +{ + [JsonConverter(typeof(VerbatimDictionaryKeysJsonConverter))] + public interface INamedFiltersContainer : IIsADictionary + { + } + + public class NamedFiltersContainer: IsADictionary, INamedFiltersContainer + { + public NamedFiltersContainer() : base() { } + public NamedFiltersContainer(IDictionary container) : base(container) { } + public NamedFiltersContainer(Dictionary container) + : base(container.Select(kv => kv).ToDictionary(kv => kv.Key, kv => (IQueryContainer)kv.Value)) + { } + + public void Add(string name, IQueryContainer filter) => BackingDictionary.Add(name, filter); + public void Add(string name, QueryContainer filter) => BackingDictionary.Add(name, filter); + } + + public class NamedFiltersContainerDescriptor : IsADictionaryDescriptor, INamedFiltersContainer, string, IQueryContainer> + where T : class + { + public NamedFiltersContainerDescriptor() : base(new NamedFiltersContainer()) { } + + public NamedFiltersContainerDescriptor Filter(string name, IQueryContainer filter) => Assign(name, filter); + + public NamedFiltersContainerDescriptor Filter(string name, Func, IQueryContainer> selector) => + Assign(name, selector?.Invoke(new QueryContainerDescriptor())); + + public NamedFiltersContainerDescriptor Filter(string name, Func, IQueryContainer> selector) + where TOther : class => + Assign(name, selector?.Invoke(new QueryContainerDescriptor())); + + } + +} diff --git a/src/Nest/Aggregations/Bucket/Filters/NamedFiltersContainerBase.cs b/src/Nest/Aggregations/Bucket/Filters/NamedFiltersContainerBase.cs deleted file mode 100644 index 1bd4391a11e..00000000000 --- a/src/Nest/Aggregations/Bucket/Filters/NamedFiltersContainerBase.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Newtonsoft.Json; - -namespace Nest -{ - [JsonConverter(typeof(CompositeJsonConverter, VerbatimDictionaryKeysJsonConverter>))] - public interface INamedFiltersContainer - { - } - - [JsonConverter(typeof(CompositeJsonConverter, VerbatimDictionaryKeysJsonConverter>))] - public abstract class NamedFiltersContainerBase : IsADictionary, INamedFiltersContainer - { - protected NamedFiltersContainerBase () : base() { } - protected NamedFiltersContainerBase(IDictionary container) : base(container) { } - - public static implicit operator NamedFiltersContainerBase(Dictionary container) => - new NamedFiltersContainer(container); - - public static implicit operator NamedFiltersContainerBase(Dictionary container) => - new NamedFiltersContainer(container); - } - - public class NamedFiltersContainer: NamedFiltersContainerBase - { - public NamedFiltersContainer() : base() { } - public NamedFiltersContainer(IDictionary container) : base(container) { } - public NamedFiltersContainer(Dictionary container) - : base(container.Select(kv => kv).ToDictionary(kv => kv.Key, kv => (IQueryContainer)kv.Value)) - { } - - public void Add(string name, IQueryContainer filter) => BackingDictionary.Add(name, filter); - public void Add(string name, QueryContainer filter) => BackingDictionary.Add(name, filter); - } - - public class NamedFiltersContainerDescriptor: NamedFiltersContainerBase - where T : class - { - public NamedFiltersContainerDescriptor() : base() { } - protected NamedFiltersContainerDescriptor(IDictionary container) : base(container) { } - - public NamedFiltersContainerDescriptor Filter(string name, IQueryContainer filter) - { - BackingDictionary.Add(name, filter); - return this; - } - - public NamedFiltersContainerDescriptor Filter(string name, Func, IQueryContainer> selector) - { - var filter = selector?.Invoke(new QueryContainerDescriptor()); - if (filter != null) BackingDictionary.Add(name, filter); - return this; - } - - public NamedFiltersContainerDescriptor Filter(string name, Func, IQueryContainer> selector) - where TOther : class - { - var filter = selector?.Invoke(new QueryContainerDescriptor()); - if (filter != null) BackingDictionary.Add(name, filter); - return this; - } - } - -} diff --git a/src/Nest/Aggregations/Bucket/IpRange/IpRange.cs b/src/Nest/Aggregations/Bucket/IpRange/IpRange.cs index 33c2c3ec121..1cd95364f52 100644 --- a/src/Nest/Aggregations/Bucket/IpRange/IpRange.cs +++ b/src/Nest/Aggregations/Bucket/IpRange/IpRange.cs @@ -5,7 +5,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] [JsonConverter(typeof(ReadAsTypeJsonConverter))] - public interface IIpRange : INestSerializable + public interface IIpRange { [JsonProperty(PropertyName = "from")] string From { get; set; } diff --git a/src/Nest/Aggregations/Bucket/SignificantTerms/Heuristics/ChiSquareHeuristic.cs b/src/Nest/Aggregations/Bucket/SignificantTerms/Heuristics/ChiSquareHeuristic.cs index fd7da433a68..2ae3033eeab 100644 --- a/src/Nest/Aggregations/Bucket/SignificantTerms/Heuristics/ChiSquareHeuristic.cs +++ b/src/Nest/Aggregations/Bucket/SignificantTerms/Heuristics/ChiSquareHeuristic.cs @@ -5,7 +5,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] [JsonConverter(typeof(ReadAsTypeJsonConverter))] - public interface IChiSquareHeuristic : INestSerializable + public interface IChiSquareHeuristic { [JsonProperty("include_negatives")] bool? IncludeNegatives { get; set; } diff --git a/src/Nest/Aggregations/Bucket/SignificantTerms/Heuristics/GoogleNormalizedDistanceHeuristic.cs b/src/Nest/Aggregations/Bucket/SignificantTerms/Heuristics/GoogleNormalizedDistanceHeuristic.cs index cd93bf13dcb..51a1a1c8996 100644 --- a/src/Nest/Aggregations/Bucket/SignificantTerms/Heuristics/GoogleNormalizedDistanceHeuristic.cs +++ b/src/Nest/Aggregations/Bucket/SignificantTerms/Heuristics/GoogleNormalizedDistanceHeuristic.cs @@ -4,7 +4,7 @@ namespace Nest { [JsonObject] [JsonConverter(typeof(ReadAsTypeJsonConverter))] - public interface IGoogleNormalizedDistanceHeuristic : INestSerializable + public interface IGoogleNormalizedDistanceHeuristic { [JsonProperty("background_is_superset")] bool? BackgroundIsSuperSet { get; set; } diff --git a/src/Nest/Aggregations/Bucket/SignificantTerms/Heuristics/MutualInformationHeuristic.cs b/src/Nest/Aggregations/Bucket/SignificantTerms/Heuristics/MutualInformationHeuristic.cs index 9221ae4c492..fcd76090a12 100644 --- a/src/Nest/Aggregations/Bucket/SignificantTerms/Heuristics/MutualInformationHeuristic.cs +++ b/src/Nest/Aggregations/Bucket/SignificantTerms/Heuristics/MutualInformationHeuristic.cs @@ -4,7 +4,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] [JsonConverter(typeof(ReadAsTypeJsonConverter))] - public interface IMutualInformationHeuristic : INestSerializable + public interface IMutualInformationHeuristic { [JsonProperty("include_negatives")] bool? IncludeNegatives { get; set; } diff --git a/src/Nest/Aggregations/Bucket/SignificantTerms/Heuristics/PercentageScoreHeuristic.cs b/src/Nest/Aggregations/Bucket/SignificantTerms/Heuristics/PercentageScoreHeuristic.cs index 71bdac28dd1..16782ff88dc 100644 --- a/src/Nest/Aggregations/Bucket/SignificantTerms/Heuristics/PercentageScoreHeuristic.cs +++ b/src/Nest/Aggregations/Bucket/SignificantTerms/Heuristics/PercentageScoreHeuristic.cs @@ -4,7 +4,7 @@ namespace Nest { [JsonObject] [JsonConverter(typeof(ReadAsTypeJsonConverter))] - public interface IPercentageScoreHeuristic : INestSerializable { } + public interface IPercentageScoreHeuristic { } public class PercentageScoreHeuristic { } diff --git a/src/Nest/Aggregations/Bucket/SignificantTerms/Heuristics/ScriptedHeuristic.cs b/src/Nest/Aggregations/Bucket/SignificantTerms/Heuristics/ScriptedHeuristic.cs index 6a721fc2393..823830fb373 100644 --- a/src/Nest/Aggregations/Bucket/SignificantTerms/Heuristics/ScriptedHeuristic.cs +++ b/src/Nest/Aggregations/Bucket/SignificantTerms/Heuristics/ScriptedHeuristic.cs @@ -6,7 +6,7 @@ namespace Nest { [JsonObject] [JsonConverter(typeof(ReadAsTypeJsonConverter))] - public interface IScriptedHeuristic : INestSerializable + public interface IScriptedHeuristic { [JsonProperty("script")] IScript Script { get; set; } diff --git a/src/Nest/Aggregations/Metric/MetricAggregationBase.cs b/src/Nest/Aggregations/Metric/MetricAggregationBase.cs index d50bab1e702..b14942983dc 100644 --- a/src/Nest/Aggregations/Metric/MetricAggregationBase.cs +++ b/src/Nest/Aggregations/Metric/MetricAggregationBase.cs @@ -33,7 +33,7 @@ protected MetricAggregationBase(string name, Field field) : base(name) } public abstract class MetricAggregationDescriptorBase - : IMetricAggregation + : IMetricAggregation, IDescriptor where TMetricAggregation : MetricAggregationDescriptorBase , TMetricAggregationInterface, IMetricAggregation where T : class diff --git a/src/Nest/Aggregations/Metric/Percentiles/Methods/IPercentilesMethod.cs b/src/Nest/Aggregations/Metric/Percentiles/Methods/IPercentilesMethod.cs index af4534aeadb..199087fd0dc 100644 --- a/src/Nest/Aggregations/Metric/Percentiles/Methods/IPercentilesMethod.cs +++ b/src/Nest/Aggregations/Metric/Percentiles/Methods/IPercentilesMethod.cs @@ -9,11 +9,9 @@ namespace Nest { - public interface IPercentilesMethod - { - } + public interface IPercentilesMethod { } - public class PercentilesMethodDescriptor + public class PercentilesMethodDescriptor : DescriptorBase, IPercentilesMethod { public IPercentilesMethod HDRHistogram(Func hdrSelector = null) => hdrSelector?.InvokeOrDefault(new HDRHistogramMethodDescriptor()); diff --git a/src/Nest/Aggregations/Pipeline/MovingAverage/Models/IMovingAverageModel.cs b/src/Nest/Aggregations/Pipeline/MovingAverage/Models/IMovingAverageModel.cs index eb2bbc87ed7..30e24dc4c2b 100644 --- a/src/Nest/Aggregations/Pipeline/MovingAverage/Models/IMovingAverageModel.cs +++ b/src/Nest/Aggregations/Pipeline/MovingAverage/Models/IMovingAverageModel.cs @@ -6,12 +6,12 @@ namespace Nest { - public interface IMovingAverageModel : INestSerializable + public interface IMovingAverageModel { string Name { get; } } - public class MovingAverageModelDescriptor + public class MovingAverageModelDescriptor : DescriptorBase { public IEwmaModel Ewma(Func ewmaSelector = null) => ewmaSelector.InvokeOrDefault(new EwmaModelDescriptor()); diff --git a/src/Nest/Aggregations/Pipeline/MovingAverage/MovingAverageAggregation.cs b/src/Nest/Aggregations/Pipeline/MovingAverage/MovingAverageAggregation.cs index 5cc826c8dd8..4abde3269d5 100644 --- a/src/Nest/Aggregations/Pipeline/MovingAverage/MovingAverageAggregation.cs +++ b/src/Nest/Aggregations/Pipeline/MovingAverage/MovingAverageAggregation.cs @@ -56,5 +56,6 @@ public class MovingAverageAggregationDescriptor public MovingAverageAggregationDescriptor Model(Func modelSelector) => Assign(a => a.Model = modelSelector?.Invoke(new MovingAverageModelDescriptor())); + } } diff --git a/src/Nest/Aggregations/Pipeline/PipelineAggregationBase.cs b/src/Nest/Aggregations/Pipeline/PipelineAggregationBase.cs index c2c71c0e2b4..d2f8617d760 100644 --- a/src/Nest/Aggregations/Pipeline/PipelineAggregationBase.cs +++ b/src/Nest/Aggregations/Pipeline/PipelineAggregationBase.cs @@ -34,8 +34,8 @@ public PipelineAggregationBase(string name, IBucketsPath bucketsPath) : base(nam public GapPolicy? GapPolicy { get; set; } } - public abstract class PipelineAggregationDescriptorBase - : IPipelineAggregation + public abstract class PipelineAggregationDescriptorBase + : DescriptorBase, IPipelineAggregation where TPipelineAggregation : PipelineAggregationDescriptorBase , TPipelineAggregationInterface, IPipelineAggregation where TPipelineAggregationInterface : class, IPipelineAggregation @@ -45,9 +45,6 @@ public abstract class PipelineAggregationDescriptorBase assigner) => - Fluent.Assign(((TPipelineAggregation)this), assigner); - public TPipelineAggregation Format(string format) => Assign(a => a.Format = format); public TPipelineAggregation GapPolicy(GapPolicy gapPolicy) => Assign(a => a.GapPolicy = gapPolicy); diff --git a/src/Nest/CommonAbstractions/Infer/Field/FieldJsonConverter.cs b/src/Nest/CommonAbstractions/Infer/Field/FieldJsonConverter.cs index 0cf8d72b6fc..35554881cbc 100644 --- a/src/Nest/CommonAbstractions/Infer/Field/FieldJsonConverter.cs +++ b/src/Nest/CommonAbstractions/Infer/Field/FieldJsonConverter.cs @@ -7,12 +7,6 @@ namespace Nest { internal class FieldJsonConverter : JsonConverter { - private readonly ElasticInferrer _infer; - public FieldJsonConverter(IConnectionSettingsValues connectionSettings) - { - _infer = new ElasticInferrer(connectionSettings); - } - public override bool CanRead => false; public override bool CanWrite => true; @@ -27,7 +21,8 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s writer.WriteNull(); return; } - writer.WriteValue(this._infer.Field(field)); + var settings = serializer.GetConnectionSettings(); + writer.WriteValue(settings.Inferrer.Field(field)); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { diff --git a/src/Nest/CommonAbstractions/Infer/Fields/FieldsJsonConverter.cs b/src/Nest/CommonAbstractions/Infer/Fields/FieldsJsonConverter.cs index ede0a59f688..9e292e7bbbc 100644 --- a/src/Nest/CommonAbstractions/Infer/Fields/FieldsJsonConverter.cs +++ b/src/Nest/CommonAbstractions/Infer/Fields/FieldsJsonConverter.cs @@ -7,12 +7,6 @@ namespace Nest { internal class FieldsJsonConverter : JsonConverter { - private readonly ElasticInferrer _infer; - public FieldsJsonConverter(IConnectionSettingsValues connectionSettings) - { - _infer = new ElasticInferrer(connectionSettings); - } - public override bool CanRead => true; public override bool CanWrite => true; @@ -23,9 +17,10 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s { var fields = value as Fields; writer.WriteStartArray(); + var infer = serializer.GetConnectionSettings().Inferrer; foreach (var f in fields?.ListOfFields ?? Enumerable.Empty()) { - writer.WriteValue(this._infer.Field(f)); + writer.WriteValue(infer.Field(f)); } writer.WriteEndArray(); } diff --git a/src/Nest/CommonAbstractions/RawJson/ICustomJson.cs b/src/Nest/CommonAbstractions/RawJson/ICustomJson.cs index b41a43e2d0b..6be6600987a 100644 --- a/src/Nest/CommonAbstractions/RawJson/ICustomJson.cs +++ b/src/Nest/CommonAbstractions/RawJson/ICustomJson.cs @@ -10,10 +10,4 @@ public interface ICustomJson { object GetCustomJson(); } - - /// - /// Any object that implements this interface will automatically have all - /// JsonProperties of all of its implementing interfaces discovered. - /// - public interface INestSerializable { } } \ No newline at end of file diff --git a/src/Nest/CommonAbstractions/SerializationBehavior/ElasticContractResolver.cs b/src/Nest/CommonAbstractions/SerializationBehavior/ElasticContractResolver.cs index 6d3eb9ea268..14fb2a24ec0 100644 --- a/src/Nest/CommonAbstractions/SerializationBehavior/ElasticContractResolver.cs +++ b/src/Nest/CommonAbstractions/SerializationBehavior/ElasticContractResolver.cs @@ -40,9 +40,6 @@ protected override JsonContract CreateContract(Type objectType) else if (ApplyExactContractJsonAttribute(objectType, contract)) return contract; else if (ApplyContractJsonAttribute(objectType, contract)) return contract; - //TODO these should not be necessary here - else if (objectType == typeof(MultiGetResponse)) contract.Converter = new MultiGetHitJsonConverter(); - if (this.ConnectionSettings.ContractConverters.HasAny()) { foreach (var c in this.ConnectionSettings.ContractConverters) @@ -82,71 +79,12 @@ private IEnumerable TypeWithInterfaces(Type objectType) foreach (var i in objectType.GetInterfaces()) yield return i; } - - protected override IList CreateProperties(Type type, MemberSerialization memberSerialization) { - var defaultProperties = base.CreateProperties(type, memberSerialization); - - - - - - var lookup = defaultProperties.ToLookup(p => p.PropertyName); - - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - - defaultProperties = PropertiesOf(type, memberSerialization, defaultProperties, lookup); - - return defaultProperties.GroupBy(p => p.PropertyName).Select(p => p.First()).ToList(); + //descriptors implement properties explicitly these are not picked up by default + return !typeof(IDescriptor).IsAssignableFrom(type) + ? base.CreateProperties(type, memberSerialization) : + PropertiesOfAll(type, memberSerialization); } public IList PropertiesOfAllInterfaces(Type t, MemberSerialization memberSerialization) diff --git a/src/Nest/CommonOptions/Range/Range.cs b/src/Nest/CommonOptions/Range/Range.cs index d2cb991dc81..86f5e93eeb2 100644 --- a/src/Nest/CommonOptions/Range/Range.cs +++ b/src/Nest/CommonOptions/Range/Range.cs @@ -7,7 +7,7 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] [JsonConverter(typeof(ReadAsTypeJsonConverter))] - public interface IRange : INestSerializable + public interface IRange { [JsonProperty(PropertyName = "from")] double? From { get; set; } diff --git a/src/Nest/CommonOptions/Scripting/Script.cs b/src/Nest/CommonOptions/Scripting/Script.cs index f0089568fa6..2ac1f56e4eb 100644 --- a/src/Nest/CommonOptions/Scripting/Script.cs +++ b/src/Nest/CommonOptions/Scripting/Script.cs @@ -29,16 +29,13 @@ public abstract class Script : IScript public static implicit operator Script(string inline) => new InlineScript(inline); } - public class ScriptDescriptorBase : IScript + public class ScriptDescriptorBase : DescriptorBase, IScript where TDescriptor : ScriptDescriptorBase, TInterface, IScript where TInterface : class, IScript { Dictionary IScript.Params { get; set; } string IScript.Lang { get; set; } - protected TDescriptor Assign(Action assigner) => - Fluent.Assign(((TDescriptor)this), assigner); - public TDescriptor Params(Dictionary scriptParams) => Assign(a => a.Params = scriptParams); public TDescriptor Params(Func, FluentDictionary> paramsSelector) => @@ -47,7 +44,7 @@ public TDescriptor Params(Func, FluentDictionar public TDescriptor Lang(string lang) => Assign(a => a.Lang = lang); } - public class ScriptDescriptor + public class ScriptDescriptor : DescriptorBase { public IFileScript File(string file, Func fileScript = null) => fileScript.InvokeOrDefault(new FileScriptDescriptor().File(file)); diff --git a/src/Nest/Document/Multiple/MultiGet/Response/MultiGetResponse.cs b/src/Nest/Document/Multiple/MultiGet/Response/MultiGetResponse.cs index f3ea35fb77b..775a9f3046d 100644 --- a/src/Nest/Document/Multiple/MultiGet/Response/MultiGetResponse.cs +++ b/src/Nest/Document/Multiple/MultiGet/Response/MultiGetResponse.cs @@ -22,6 +22,8 @@ public interface IMultiGetResponse : IResponse } [JsonObject] + //TODO validate this, ported over from ElasticContractResolver but it seems out of place + [ContractJsonConverter(typeof(MultiGetHitJsonConverter))] public class MultiGetResponse : BaseResponse, IMultiGetResponse { public MultiGetResponse() diff --git a/src/Nest/Indices/AliasManagement/Aliases.cs b/src/Nest/Indices/AliasManagement/Aliases.cs index 129a5863101..95ad9ed72cd 100644 --- a/src/Nest/Indices/AliasManagement/Aliases.cs +++ b/src/Nest/Indices/AliasManagement/Aliases.cs @@ -5,7 +5,7 @@ namespace Nest { - [JsonConverter(typeof(VerbatimDictionaryKeysJsonConverter))] + [JsonConverter(typeof(VerbatimDictionaryKeysJsonConverter))] public interface IAliases : IIsADictionary { } public class Aliases : IsADictionary, IAliases { diff --git a/src/Nest/Mapping/AttributeBased/CompletionAttribute.cs b/src/Nest/Mapping/AttributeBased/CompletionAttribute.cs index 71fb5751e6d..af41a4e49b6 100644 --- a/src/Nest/Mapping/AttributeBased/CompletionAttribute.cs +++ b/src/Nest/Mapping/AttributeBased/CompletionAttribute.cs @@ -13,7 +13,7 @@ public class CompletionAttribute : ElasticsearchPropertyAttribute, ICompletionPr bool? ICompletionProperty.PreserveSeparators { get; set; } bool? ICompletionProperty.PreservePositionIncrements { get; set; } int? ICompletionProperty.MaxInputLength { get; set; } - IDictionary ICompletionProperty.Context { get; set; } + ISuggestContextMapping ICompletionProperty.Context { get; set; } public string SearchAnalyzer { get { return Self.SearchAnalyzer; } set { Self.SearchAnalyzer = value; } } public string Analyzer { get { return Self.Analyzer; } set { Self.Analyzer = value; } } diff --git a/src/Nest/Mapping/CodeBased/PropertyMapping.cs b/src/Nest/Mapping/CodeBased/PropertyMapping.cs index 34d00549de1..a4cbb57ee42 100644 --- a/src/Nest/Mapping/CodeBased/PropertyMapping.cs +++ b/src/Nest/Mapping/CodeBased/PropertyMapping.cs @@ -9,7 +9,8 @@ namespace Nest { - public class PropertyMappingDescriptor where TDocument : class + public class PropertyMappingDescriptor : DescriptorBase, IDescriptor> + where TDocument : class { internal IList> Mappings { get; } = new List>(); diff --git a/src/Nest/Mapping/Types/Specialized/Completion/CompletionProperty.cs b/src/Nest/Mapping/Types/Specialized/Completion/CompletionProperty.cs index 87406ae0f0d..5d80e2b78ff 100644 --- a/src/Nest/Mapping/Types/Specialized/Completion/CompletionProperty.cs +++ b/src/Nest/Mapping/Types/Specialized/Completion/CompletionProperty.cs @@ -28,7 +28,7 @@ public interface ICompletionProperty : IProperty int? MaxInputLength { get; set; } [JsonProperty("context")] - IDictionary Context { get ;set;} + ISuggestContextMapping Context { get; set; } } [JsonObject(MemberSerialization.OptIn)] @@ -42,51 +42,40 @@ public CompletionProperty() : base("completion") { } public bool? PreserveSeparators { get; set; } public bool? PreservePositionIncrements { get; set; } public int? MaxInputLength { get; set; } - public IDictionary Context { get ;set;} + public ISuggestContextMapping Context { get; set; } } - public class CompletionPropertyDescriptor + public class CompletionPropertyDescriptor : PropertyDescriptorBase, ICompletionProperty, T>, ICompletionProperty where T : class - { + { string ICompletionProperty.SearchAnalyzer { get; set; } string ICompletionProperty.Analyzer { get; set; } bool? ICompletionProperty.Payloads { get; set; } bool? ICompletionProperty.PreserveSeparators { get; set; } bool? ICompletionProperty.PreservePositionIncrements { get; set; } int? ICompletionProperty.MaxInputLength { get; set; } - IDictionary ICompletionProperty.Context { get; set; } + ISuggestContextMapping ICompletionProperty.Context { get; set; } public CompletionPropertyDescriptor() : base("completion") { } - public CompletionPropertyDescriptor SearchAnalyzer(string searchAnalyzer) => + public CompletionPropertyDescriptor SearchAnalyzer(string searchAnalyzer) => Assign(a => a.SearchAnalyzer = searchAnalyzer); public CompletionPropertyDescriptor Analyzer(string analyzer) => Assign(a => a.Analyzer = analyzer); public CompletionPropertyDescriptor Payloads(bool payloads = true) => Assign(a => a.Payloads = payloads); - public CompletionPropertyDescriptor PreserveSeparators(bool preserveSeparators = true) => + public CompletionPropertyDescriptor PreserveSeparators(bool preserveSeparators = true) => Assign(a => a.PreserveSeparators = preserveSeparators); - public CompletionPropertyDescriptor PreservePositionIncrements(bool preservePositionIncrements = true) => + public CompletionPropertyDescriptor PreservePositionIncrements(bool preservePositionIncrements = true) => Assign(a => a.PreservePositionIncrements = preservePositionIncrements); public CompletionPropertyDescriptor MaxInputLength(int maxInputLength) => Assign(a => a.MaxInputLength = maxInputLength); - public CompletionPropertyDescriptor Context(Func, SuggestContextMappingDescriptor> contextDescriptor) => Assign(a => - { - a.Context = a.Context ?? new Dictionary(); - - var selector = contextDescriptor(new SuggestContextMappingDescriptor()); - - foreach (var context in selector._Contexts) - { - if (a.Context.ContainsKey(context.Key)) - a.Context[context.Key] = context.Value; - else - a.Context.Add(context.Key, context.Value); - } - }); - } + public CompletionPropertyDescriptor Context(Func, IPromise> selector) => + Assign(a => a.Context = selector?.Invoke(new SuggestContextMappingDescriptor())?.Value); + + } } \ No newline at end of file diff --git a/src/Nest/Nest.csproj b/src/Nest/Nest.csproj index 6652f693af7..6a44d76de98 100644 --- a/src/Nest/Nest.csproj +++ b/src/Nest/Nest.csproj @@ -61,7 +61,7 @@ - + @@ -578,8 +578,8 @@ - - + + @@ -812,7 +812,7 @@ - + @@ -821,9 +821,9 @@ - + - + diff --git a/src/Nest/QueryDsl/Compound/FunctionScore/Functions/FunctionScoreDecayField.cs b/src/Nest/QueryDsl/Compound/FunctionScore/Functions/FunctionScoreDecayField.cs index 34c3f35697e..698aa1d3634 100644 --- a/src/Nest/QueryDsl/Compound/FunctionScore/Functions/FunctionScoreDecayField.cs +++ b/src/Nest/QueryDsl/Compound/FunctionScore/Functions/FunctionScoreDecayField.cs @@ -2,42 +2,50 @@ namespace Nest { - public class FunctionScoreDecayFieldDescriptor + + public interface IFunctionScoreDecayField { [JsonProperty(PropertyName = "origin")] - internal string _Origin { get; set; } + string Origin { get; set; } [JsonProperty(PropertyName = "scale")] - internal string _Scale { get; set; } + string Scale { get; set; } [JsonProperty(PropertyName = "offset")] - internal string _Offset { get; set; } + string Offset { get; set; } [JsonProperty(PropertyName = "decay")] - internal double? _Decay { get; set; } - - public FunctionScoreDecayFieldDescriptor Origin(string origin) - { - this._Origin = origin; - return this; - } - - public FunctionScoreDecayFieldDescriptor Scale(string scale) - { - this._Scale = scale; - return this; - } - - public FunctionScoreDecayFieldDescriptor Offset(string offset) - { - this._Offset = offset; - return this; - } - - public FunctionScoreDecayFieldDescriptor Decay(double? decay) - { - this._Decay = decay; - return this; - } + double? Decay { get; set; } + } + + + public class FunctionScoreDecayField : IFunctionScoreDecayField + { + public string Origin { get; set; } + + public string Scale { get; set; } + + public string Offset { get; set; } + + public double? Decay { get; set; } + } + + public class FunctionScoreDecayFieldDescriptor : DescriptorBase, IFunctionScoreDecayField + { + string IFunctionScoreDecayField.Origin { get; set; } + + string IFunctionScoreDecayField.Scale { get; set; } + + string IFunctionScoreDecayField.Offset { get; set; } + + double? IFunctionScoreDecayField.Decay { get; set; } + + public FunctionScoreDecayFieldDescriptor Origin(string origin) => Assign(a => a.Origin = origin); + + public FunctionScoreDecayFieldDescriptor Scale(string scale) => Assign(a => a.Scale = scale); + + public FunctionScoreDecayFieldDescriptor Offset(string offset) => Assign(a => a.Offset = offset); + + public FunctionScoreDecayFieldDescriptor Decay(double? decay) => Assign(a => a.Decay = decay); } } \ No newline at end of file diff --git a/src/Nest/QueryDsl/QueryContainer.cs b/src/Nest/QueryDsl/QueryContainer.cs index 8af37c8f8ad..8399a289eca 100644 --- a/src/Nest/QueryDsl/QueryContainer.cs +++ b/src/Nest/QueryDsl/QueryContainer.cs @@ -160,7 +160,7 @@ public interface IQueryContainer : ICustomJson } [JsonObject(MemberSerialization.OptIn)] - public class QueryContainer : IQueryContainer + public class QueryContainer : IQueryContainer, IDescriptor { private IQueryContainer Self => this; diff --git a/src/Nest/Search/Search/SearchRequest.cs b/src/Nest/Search/Search/SearchRequest.cs index c1d32abeebc..c8d0941ea51 100644 --- a/src/Nest/Search/Search/SearchRequest.cs +++ b/src/Nest/Search/Search/SearchRequest.cs @@ -591,12 +591,12 @@ public SearchDescriptor SortScript(Func, IScriptSort> /// The term suggester suggests terms based on edit distance. The provided suggest text is analyzed before terms are suggested. /// The suggested terms are provided per analyzed suggest text token. The term suggester doesn’t take the query into account that is part of request. /// - public SearchDescriptor SuggestTerm(string name, Func, TermSuggestDescriptor> suggest) => Assign(a => + public SearchDescriptor SuggestTerm(string name, Func, TermSuggesterDescriptor> suggest) => Assign(a => { name.ThrowIfNullOrEmpty("name"); suggest.ThrowIfNull("suggest"); if (a.Suggest == null) a.Suggest = new Dictionary(); - var desc = new TermSuggestDescriptor(); + var desc = new TermSuggesterDescriptor(); var item = suggest(desc); ITermSuggester i = item; var bucket = new SuggestBucket { Text = i.Text, Term = item }; @@ -607,14 +607,14 @@ public SearchDescriptor SuggestTerm(string name, Func - public SearchDescriptor SuggestPhrase(string name, Func, PhraseSuggestDescriptor> suggest) => Assign(a => + public SearchDescriptor SuggestPhrase(string name, Func, PhraseSuggesterDescriptor> suggest) => Assign(a => { name.ThrowIfNullOrEmpty("name"); suggest.ThrowIfNull("suggest"); if (a.Suggest == null) a.Suggest = new Dictionary(); - var desc = new PhraseSuggestDescriptor(); + var desc = new PhraseSuggesterDescriptor(); var item = suggest(desc); IPhraseSuggester i = item; var bucket = new SuggestBucket { Text = i.Text, Phrase = item }; @@ -625,13 +625,13 @@ public SearchDescriptor SuggestPhrase(string name, Func - public SearchDescriptor SuggestCompletion(string name, Func, CompletionSuggestDescriptor> suggest) => Assign(a => { + public SearchDescriptor SuggestCompletion(string name, Func, CompletionSuggesterDescriptor> suggest) => Assign(a => { name.ThrowIfNullOrEmpty("name"); suggest.ThrowIfNull("suggest"); if (a.Suggest == null) a.Suggest = new Dictionary(); - var desc = new CompletionSuggestDescriptor(); + var desc = new CompletionSuggesterDescriptor(); var item = suggest(desc); ICompletionSuggester i = item; var bucket = new SuggestBucket { Text = i.Text, Completion = item }; diff --git a/src/Nest/Search/Suggesters/BaseSuggest.cs b/src/Nest/Search/Suggesters/BaseSuggest.cs index c2696ba8b3b..7c91d1182d7 100644 --- a/src/Nest/Search/Suggesters/BaseSuggest.cs +++ b/src/Nest/Search/Suggesters/BaseSuggest.cs @@ -1,4 +1,6 @@ -using Newtonsoft.Json; +using System; +using System.Linq.Expressions; +using Newtonsoft.Json; namespace Nest { @@ -19,7 +21,7 @@ public interface ISuggester int? ShardSize { get; set; } } - public abstract class Suggester : ISuggester + public abstract class SuggesterBase : ISuggester { public string Text { get; set; } public Field Field { get; set; } @@ -29,7 +31,9 @@ public abstract class Suggester : ISuggester } [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - public abstract class BaseSuggestDescriptor : ISuggester where T : class + public abstract class SuggesterBaseDescriptor : DescriptorBase, ISuggester + where TDescriptor : SuggesterBaseDescriptor, TInterface, ISuggester + where TInterface : class, ISuggester { string ISuggester.Text { get; set; } @@ -40,5 +44,17 @@ public abstract class BaseSuggestDescriptor : ISuggester where T : class int? ISuggester.Size { get; set; } int? ISuggester.ShardSize { get; set; } + + public TDescriptor Size(int? size) => Assign(a => a.Size = size); + + public TDescriptor ShardSize(int? size) => Assign(a => a.ShardSize = size); + + public TDescriptor Text(string text) => Assign(a => a.Text = text); + + public TDescriptor Analyzer(string analyzer) => Assign(a => a.Analyzer = analyzer); + + public TDescriptor Field(Field field) => Assign(a => a.Field = field); + + public TDescriptor Field(Expression> objectPath) => Assign(a => a.Field = objectPath); } } diff --git a/src/Nest/Search/Suggesters/CompletionSuggester/CompletionSuggest.cs b/src/Nest/Search/Suggesters/CompletionSuggester/CompletionSuggest.cs deleted file mode 100644 index e7dba398c70..00000000000 --- a/src/Nest/Search/Suggesters/CompletionSuggester/CompletionSuggest.cs +++ /dev/null @@ -1,75 +0,0 @@ -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; - -namespace Nest -{ - [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - public interface ICompletionSuggester : ISuggester - { - [JsonProperty(PropertyName = "fuzzy")] - IFuzzySuggester Fuzzy { get; set; } - - [JsonProperty("context")] - IDictionary Context { get; set; } - } - - public class CompletionSuggester : Suggester, ICompletionSuggester - { - public IFuzzySuggester Fuzzy { get; set; } - public IDictionary Context { get; set; } - } - - public class CompletionSuggestDescriptor : BaseSuggestDescriptor, ICompletionSuggester where T : class - { - public ICompletionSuggester Self => this; - - IFuzzySuggester ICompletionSuggester.Fuzzy { get; set; } - - IDictionary ICompletionSuggester.Context { get; set; } - - public CompletionSuggestDescriptor Size(int size) - { - Self.Size = size; - return this; - } - - public CompletionSuggestDescriptor Text(string text) - { - Self.Text = text; - return this; - } - - public CompletionSuggestDescriptor Field(string field) - { - Self.Field = field; - return this; - } - - public CompletionSuggestDescriptor Field(Expression> objectPath) - { - Self.Field = objectPath; - return this; - } - - public CompletionSuggestDescriptor Fuzzy(Func, FuzzySuggestDescriptor> fuzzyDescriptor = null) - { - if (fuzzyDescriptor == null) - { - Self.Fuzzy = new FuzzySuggester(); - return this; - } - Self.Fuzzy = fuzzyDescriptor(new FuzzySuggestDescriptor()); - return this; - } - - public CompletionSuggestDescriptor Context(Func, FluentDictionary> contextDictionary) - { - Self.Context = contextDictionary(new FluentDictionary()); - return this; - } - - } -} diff --git a/src/Nest/Search/Suggesters/CompletionSuggester/CompletionSuggester.cs b/src/Nest/Search/Suggesters/CompletionSuggester/CompletionSuggester.cs new file mode 100644 index 00000000000..9b51523c673 --- /dev/null +++ b/src/Nest/Search/Suggesters/CompletionSuggester/CompletionSuggester.cs @@ -0,0 +1,39 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; + +namespace Nest +{ + [JsonObject(MemberSerialization = MemberSerialization.OptIn)] + public interface ICompletionSuggester : ISuggester + { + [JsonProperty(PropertyName = "fuzzy")] + IFuzzySuggester Fuzzy { get; set; } + + [JsonProperty("context")] + IDictionary Context { get; set; } + } + + public class CompletionSuggester : SuggesterBase, ICompletionSuggester + { + public IFuzzySuggester Fuzzy { get; set; } + public IDictionary Context { get; set; } + } + + public class CompletionSuggesterDescriptor : SuggesterBaseDescriptor, ICompletionSuggester, T>, ICompletionSuggester + where T : class + { + IFuzzySuggester ICompletionSuggester.Fuzzy { get; set; } + + IDictionary ICompletionSuggester.Context { get; set; } + + public CompletionSuggesterDescriptor Fuzzy(Func, IFuzzySuggester> selector = null) => + Assign(a => a.Fuzzy = selector.InvokeOrDefault(new FuzzySuggestDescriptor())); + + public CompletionSuggesterDescriptor Context(Func, FluentDictionary> selector) => + Assign(a => a.Context = selector?.Invoke(new FluentDictionary())); + + } +} diff --git a/src/Nest/Search/Suggesters/CompletionSuggester/FuzzySuggest.cs b/src/Nest/Search/Suggesters/CompletionSuggester/FuzzySuggest.cs index 42e9e7ec674..754486cb6f6 100644 --- a/src/Nest/Search/Suggesters/CompletionSuggester/FuzzySuggest.cs +++ b/src/Nest/Search/Suggesters/CompletionSuggester/FuzzySuggest.cs @@ -17,7 +17,7 @@ public interface IFuzzySuggester [JsonProperty(PropertyName = "prefix_length")] int? PrefixLength { get; set; } - + [JsonProperty(PropertyName = "fuzziness")] IFuzziness Fuzziness { get; set; } @@ -34,58 +34,23 @@ public class FuzzySuggester : IFuzzySuggester public bool? UnicodeAware { get; set; } } - public class FuzzySuggestDescriptor : IFuzzySuggester where T : class - { - protected IFuzzySuggester Self => this; - - bool? IFuzzySuggester.Transpositions { get; set; } - - int? IFuzzySuggester.MinLength { get; set; } - - int? IFuzzySuggester.PrefixLength { get; set; } - - IFuzziness IFuzzySuggester.Fuzziness { get; set; } + public class FuzzySuggestDescriptor : DescriptorBase, IFuzzySuggester>, IFuzzySuggester + where T : class + { + bool? IFuzzySuggester.Transpositions { get; set; } + int? IFuzzySuggester.MinLength { get; set; } + int? IFuzzySuggester.PrefixLength { get; set; } + IFuzziness IFuzzySuggester.Fuzziness { get; set; } + bool? IFuzzySuggester.UnicodeAware { get; set; } - bool? IFuzzySuggester.UnicodeAware { get; set; } - - public FuzzySuggestDescriptor Fuzziness() - { - Self.Fuzziness = Nest.Fuzziness.Auto; - return this; - } - public FuzzySuggestDescriptor Fuzziness(int editDistance) - { - Self.Fuzziness = Nest.Fuzziness.EditDistance(editDistance); - return this; - } - public FuzzySuggestDescriptor Fuzziness(double ratio) - { - Self.Fuzziness = Nest.Fuzziness.Ratio(ratio); - return this; - } + public FuzzySuggestDescriptor Fuzziness(Fuzziness fuzziness) => Assign(a => a.Fuzziness = fuzziness); - public FuzzySuggestDescriptor UnicodeAware(bool aware = true) - { - Self.UnicodeAware = aware; - return this; - } + public FuzzySuggestDescriptor UnicodeAware(bool? aware = true) => Assign(a => a.UnicodeAware = aware); - public FuzzySuggestDescriptor Transpositions(bool transpositions) - { - Self.Transpositions = transpositions; - return this; - } + public FuzzySuggestDescriptor Transpositions(bool? transpositions = true) => Assign(a => a.Transpositions = transpositions); - public FuzzySuggestDescriptor MinLength(int length) - { - Self.MinLength = length; - return this; - } + public FuzzySuggestDescriptor MinLength(int? length) => Assign(a => a.MinLength = length); - public FuzzySuggestDescriptor PrefixLength(int length) - { - Self.PrefixLength = length; - return this; - } - } + public FuzzySuggestDescriptor PrefixLength(int length) => Assign(a => a.PrefixLength = length); + } } diff --git a/src/Nest/Search/Suggesters/ContextSuggester/CategorySuggest.cs b/src/Nest/Search/Suggesters/ContextSuggester/CategorySuggest.cs deleted file mode 100644 index b72becbfc06..00000000000 --- a/src/Nest/Search/Suggesters/ContextSuggester/CategorySuggest.cs +++ /dev/null @@ -1,47 +0,0 @@ -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using System.Text; - -namespace Nest -{ - public interface ICategorySuggestContext : ISuggestContext - { - [JsonProperty("default")] - IEnumerable Default { get; set; } - } - - [JsonObject] - public class CategorySuggestContext : ICategorySuggestContext - { - public string Type { get { return "category"; } } - public Field Path { get; set; } - public IEnumerable Default { get; set; } - } - - public class CategorySuggestDescriptor - where T : class - { - internal CategorySuggestContext _Context = new CategorySuggestContext(); - - public CategorySuggestDescriptor Path(string path) - { - this._Context.Path = path; - return this; - } - - public CategorySuggestDescriptor Path(Expression> objectPath) - { - this._Context.Path = objectPath; - return this; - } - - public CategorySuggestDescriptor Default(params string[] defaults) - { - this._Context.Default = defaults; - return this; - } - } -} diff --git a/src/Nest/Search/Suggesters/ContextSuggester/CategorySuggestContext.cs b/src/Nest/Search/Suggesters/ContextSuggester/CategorySuggestContext.cs new file mode 100644 index 00000000000..d7acd80d89c --- /dev/null +++ b/src/Nest/Search/Suggesters/ContextSuggester/CategorySuggestContext.cs @@ -0,0 +1,33 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; + +namespace Nest +{ + public interface ICategorySuggestContext : ISuggestContext + { + [JsonProperty("default")] + IEnumerable Default { get; set; } + } + + [JsonObject] + public class CategorySuggestContext : SuggestContextBase, ICategorySuggestContext + { + public override string Type => "category"; + public IEnumerable Default { get; set; } + } + + public class CategorySuggestContextDescriptor : SuggestContextBaseDescriptor, ICategorySuggestContext, T>, ICategorySuggestContext + where T : class + { + protected override string Type => "category"; + IEnumerable ICategorySuggestContext.Default { get; set; } + + public CategorySuggestContextDescriptor Default(params string[] defaults) => Assign(a => a.Default = defaults); + + public CategorySuggestContextDescriptor Default(IEnumerable defaults) => Assign(a => a.Default = defaults); + } +} diff --git a/src/Nest/Search/Suggesters/ContextSuggester/GeoLocationSuggest.cs b/src/Nest/Search/Suggesters/ContextSuggester/GeoLocationSuggest.cs deleted file mode 100644 index c96d17892e7..00000000000 --- a/src/Nest/Search/Suggesters/ContextSuggester/GeoLocationSuggest.cs +++ /dev/null @@ -1,78 +0,0 @@ -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using System.Text; - -namespace Nest -{ - [JsonObject] - public interface IGeoLocationSuggestContext : ISuggestContext - { - [JsonProperty("precision")] - IEnumerable Precision { get; set; } - - [JsonProperty("neighbors")] - bool Neighbors { get; set; } - - [JsonProperty("default")] - object Default { get; set; } - } - - [JsonObject] - public class GeoLocationSuggestContext : IGeoLocationSuggestContext - { - public string Type { get { return "geo"; } } - - public IEnumerable Precision { get; set; } - - public bool Neighbors { get; set; } - - public Field Path { get; set; } - - public object Default { get; set; } - } - - public class GeoLocationSuggestDescriptor - where T : class - { - internal GeoLocationSuggestContext _Context = new GeoLocationSuggestContext(); - - public GeoLocationSuggestDescriptor Precision(params string[] precisions) - { - this._Context.Precision = precisions; - return this; - } - - public GeoLocationSuggestDescriptor Neighbors(bool neighbors = true) - { - this._Context.Neighbors = neighbors; - return this; - } - - public GeoLocationSuggestDescriptor Path(string path) - { - this._Context.Path = path; - return this; - } - - public GeoLocationSuggestDescriptor Path(Expression> objectPath) - { - this._Context.Path = objectPath; - return this; - } - - public GeoLocationSuggestDescriptor Default(LatLon geoPoint) - { - this._Context.Default = geoPoint; - return this; - } - - public GeoLocationSuggestDescriptor Default(string geoHash) - { - this._Context.Default = geoHash; - return this; - } - } -} diff --git a/src/Nest/Search/Suggesters/ContextSuggester/GeoLocationSuggestContext.cs b/src/Nest/Search/Suggesters/ContextSuggester/GeoLocationSuggestContext.cs new file mode 100644 index 00000000000..a992da0efdf --- /dev/null +++ b/src/Nest/Search/Suggesters/ContextSuggester/GeoLocationSuggestContext.cs @@ -0,0 +1,50 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; + +namespace Nest +{ + [JsonObject] + public interface IGeoLocationSuggestContext : ISuggestContext + { + [JsonProperty("precision")] + IEnumerable Precision { get; set; } + + [JsonProperty("neighbors")] + bool Neighbors { get; set; } + + [JsonProperty("default")] + GeoLocation Default { get; set; } + } + + [JsonObject] + public class GeoLocationSuggestContext : SuggestContextBase, IGeoLocationSuggestContext + { + public override string Type => "geo"; + + public IEnumerable Precision { get; set; } + + public bool Neighbors { get; set; } + + public GeoLocation Default { get; set; } + } + + public class GeoLocationSuggestContextDescriptor : SuggestContextBaseDescriptor, IGeoLocationSuggestContext, T>, IGeoLocationSuggestContext + where T : class + { + protected override string Type => "geo"; + IEnumerable IGeoLocationSuggestContext.Precision { get; set; } + bool IGeoLocationSuggestContext.Neighbors { get; set; } + GeoLocation IGeoLocationSuggestContext.Default { get; set; } + + public GeoLocationSuggestContextDescriptor Precision(params string[] precisions) => Assign(a => a.Precision = precisions); + + public GeoLocationSuggestContextDescriptor Neighbors(bool neighbors = true) => Assign(a => a.Neighbors = neighbors); + + public GeoLocationSuggestContextDescriptor Default(GeoLocation geoPoint) => Assign(a => a.Default = geoPoint); + + } +} diff --git a/src/Nest/Search/Suggesters/ContextSuggester/ISuggestContext.cs b/src/Nest/Search/Suggesters/ContextSuggester/ISuggestContext.cs index c0ee9c7cfd4..418a23d1067 100644 --- a/src/Nest/Search/Suggesters/ContextSuggester/ISuggestContext.cs +++ b/src/Nest/Search/Suggesters/ContextSuggester/ISuggestContext.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Linq.Expressions; using System.Text; namespace Nest @@ -15,4 +16,25 @@ public interface ISuggestContext [JsonProperty("path")] Field Path { get; set; } } + + public abstract class SuggestContextBase : ISuggestContext + { + public abstract string Type { get; } + public Field Path { get; set; } + } + + public abstract class SuggestContextBaseDescriptor : DescriptorBase, ISuggestContext + where TDescriptor : SuggestContextBaseDescriptor, TInterface, ISuggestContext + where TInterface : class, ISuggestContext + { + protected abstract string Type { get; } + string ISuggestContext.Type => this.Type; + Field ISuggestContext.Path { get; set; } + + public TDescriptor Field(Field field) => Assign(a => a.Path = field); + + public TDescriptor Field(Expression> objectPath) => Assign(a => a.Path = objectPath); + } + + } diff --git a/src/Nest/Search/Suggesters/PhraseSuggester/DirectGenerator.cs b/src/Nest/Search/Suggesters/PhraseSuggester/DirectGenerator.cs index 8dc7ec22823..d1af62feb8d 100644 --- a/src/Nest/Search/Suggesters/PhraseSuggester/DirectGenerator.cs +++ b/src/Nest/Search/Suggesters/PhraseSuggester/DirectGenerator.cs @@ -60,103 +60,44 @@ public class DirectGenerator : IDirectGenerator public string PostFilter { get; set; } } - public class DirectGeneratorDescriptor : IDirectGenerator where T : class + public class DirectGeneratorDescriptor : DescriptorBase, IDirectGenerator>, IDirectGenerator + where T : class { - private IDirectGenerator Self => this; - Field IDirectGenerator.Field { get; set; } - int? IDirectGenerator.Size { get; set; } - int? IDirectGenerator.PrefixLen { get; set; } - SuggestMode? IDirectGenerator.SuggestMode { get; set; } - int? IDirectGenerator.MinWordLen { get; set; } - int? IDirectGenerator.MaxEdits { get; set; } - decimal? IDirectGenerator.MaxInspections { get; set; } - decimal? IDirectGenerator.MinDocFrequency { get; set; } - decimal? IDirectGenerator.MaxTermFrequency { get; set; } - string IDirectGenerator.PreFilter { get; set; } - string IDirectGenerator.PostFilter { get; set; } - public DirectGeneratorDescriptor Field(string field) - { - Self.Field = field; - return this; - } - - public DirectGeneratorDescriptor Field(Expression> objectPath) - { - Self.Field = objectPath; - return this; - } - - public DirectGeneratorDescriptor Size(int size) - { - Self.Size = size; - return this; - } - - public DirectGeneratorDescriptor SuggestMode(SuggestMode mode) - { - Self.SuggestMode = mode; - return this; - } - - public DirectGeneratorDescriptor MinWordLength(int length) - { - Self.MinWordLen = length; - return this; - } - - public DirectGeneratorDescriptor PrefixLength(int length) - { - Self.PrefixLen = length; - return this; - } - - public DirectGeneratorDescriptor MaxEdits(int maxEdits) - { - Self.MaxEdits = maxEdits; - return this; - } - - public DirectGeneratorDescriptor MaxInspections(decimal maxInspections) - { - Self.MaxInspections = maxInspections; - return this; - } - - public DirectGeneratorDescriptor MinDocFrequency(decimal frequency) - { - Self.MinDocFrequency = frequency; - return this; - } - - public DirectGeneratorDescriptor MaxTermFrequency(decimal frequency) - { - Self.MaxTermFrequency = frequency; - return this; - } - - public DirectGeneratorDescriptor PreFilter(string analyzer) - { - Self.PreFilter = analyzer; - return this; - } - - public DirectGeneratorDescriptor PostFilter(string analyzer) - { - Self.PostFilter = analyzer; - return this; - } + public DirectGeneratorDescriptor Field(Field field) => Assign(a => a.Field = field); + + public DirectGeneratorDescriptor Field(Expression> objectPath) => Assign(a => a.Field = objectPath); + + public DirectGeneratorDescriptor Size(int? size) => Assign(a => a.Size = size); + + public DirectGeneratorDescriptor SuggestMode(SuggestMode? mode) => Assign(a => a.SuggestMode = mode); + + public DirectGeneratorDescriptor MinWordLength(int? length) => Assign(a => a.MinWordLen = length); + + public DirectGeneratorDescriptor PrefixLength(int? length) => Assign(a => a.PrefixLen = length); + + public DirectGeneratorDescriptor MaxEdits(int? maxEdits) => Assign(a => a.MaxEdits = maxEdits); + + public DirectGeneratorDescriptor MaxInspections(decimal? maxInspections) => Assign(a => a.MaxInspections = maxInspections); + + public DirectGeneratorDescriptor MinDocFrequency(decimal? frequency) => Assign(a => a.MinDocFrequency = frequency); + + public DirectGeneratorDescriptor MaxTermFrequency(decimal? frequency) => Assign(a => a.MaxTermFrequency = frequency); + + public DirectGeneratorDescriptor PreFilter(string preFilter) => Assign(a => a.PreFilter = preFilter); + + public DirectGeneratorDescriptor PostFilter(string postFilter) => Assign(a => a.PostFilter = postFilter); } } diff --git a/src/Nest/Search/Suggesters/PhraseSuggester/PhraseSuggest.cs b/src/Nest/Search/Suggesters/PhraseSuggester/PhraseSuggest.cs deleted file mode 100644 index 3c500832f7c..00000000000 --- a/src/Nest/Search/Suggesters/PhraseSuggester/PhraseSuggest.cs +++ /dev/null @@ -1,150 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using Newtonsoft.Json; - -namespace Nest -{ - [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] - public interface IPhraseSuggester : ISuggester - { - [JsonProperty(PropertyName = "gram_size")] - int? GramSize { get; set; } - - [JsonProperty(PropertyName = "real_word_error_likelihood")] - decimal? RealWordErrorLikelihood { get; set; } - - [JsonProperty(PropertyName = "confidence")] - decimal? Confidence { get; set; } - - [JsonProperty(PropertyName = "max_errors")] - decimal? MaxErrors { get; set; } - - [JsonProperty(PropertyName = "separator")] - char? Separator { get; set; } - - [JsonProperty(PropertyName = "direct_generator")] - IEnumerable DirectGenerator { get; set; } - - [JsonProperty(PropertyName = "highlight")] - IPhraseSuggestHighlight Highlight { get; set; } - - [JsonProperty(PropertyName = "collate")] - IPhraseSuggestCollate Collate { get; set; } - } - - public class PhraseSuggester : Suggester, IPhraseSuggester - { - public int? GramSize { get; set; } - public decimal? RealWordErrorLikelihood { get; set; } - public decimal? Confidence { get; set; } - public decimal? MaxErrors { get; set; } - public char? Separator { get; set; } - public IEnumerable DirectGenerator { get; set; } - public IPhraseSuggestHighlight Highlight { get; set; } - public IPhraseSuggestCollate Collate { get; set; } - } - - public class PhraseSuggestDescriptor : BaseSuggestDescriptor, IPhraseSuggester where T : class - { - protected IPhraseSuggester Self => this; - - int? IPhraseSuggester.GramSize { get; set; } - - decimal? IPhraseSuggester.RealWordErrorLikelihood { get; set; } - - decimal? IPhraseSuggester.Confidence { get; set; } - - decimal? IPhraseSuggester.MaxErrors { get; set; } - - char? IPhraseSuggester.Separator { get; set; } - - IEnumerable IPhraseSuggester.DirectGenerator { get; set; } - - IPhraseSuggestHighlight IPhraseSuggester.Highlight { get; set; } - - IPhraseSuggestCollate IPhraseSuggester.Collate { get; set; } - - public PhraseSuggestDescriptor Text(string text) - { - Self.Text = text; - return this; - } - - public PhraseSuggestDescriptor Field(string field) - { - Self.Field = field; - return this; - } - - public PhraseSuggestDescriptor Field(Expression> objectPath) - { - Self.Field = objectPath; - return this; - } - - public PhraseSuggestDescriptor Analyzer(string analyzer) - { - Self.Analyzer = analyzer; - return this; - } - - public PhraseSuggestDescriptor Size(int size) - { - Self.Size = size; - return this; - } - - public PhraseSuggestDescriptor ShardSize(int size) - { - Self.ShardSize = size; - return this; - } - - public PhraseSuggestDescriptor GramSize(int gramSize) - { - Self.GramSize = gramSize; - return this; - } - - public PhraseSuggestDescriptor Confidence(decimal confidence) - { - Self.Confidence = confidence; - return this; - } - - public PhraseSuggestDescriptor MaxErrors(decimal maxErrors) - { - Self.MaxErrors = maxErrors; - return this; - } - - public PhraseSuggestDescriptor Separator(char separator) - { - Self.Separator = separator; - return this; - } - - public PhraseSuggestDescriptor DirectGenerator(params Func, DirectGeneratorDescriptor>[] generators) - { - Self.DirectGenerator = generators.Select(g => g(new DirectGeneratorDescriptor())).ToList(); - return this; - } - - public PhraseSuggestDescriptor Highlight(Func highlightDescriptor) - { - var selector = highlightDescriptor(new PhraseSuggestHighlightDescriptor()); - Self.Highlight = selector.Highlight; - return this; - } - - public PhraseSuggestDescriptor Collate(Func, PhraseSuggestCollateDescriptor> collateDescriptor) - { - var selector = collateDescriptor(new PhraseSuggestCollateDescriptor()); - Self.Collate = selector.Collate; - return this; - } - } -} diff --git a/src/Nest/Search/Suggesters/PhraseSuggester/PhraseSuggestCollate.cs b/src/Nest/Search/Suggesters/PhraseSuggester/PhraseSuggestCollate.cs index 75987eaf541..fc8ae18251d 100644 --- a/src/Nest/Search/Suggesters/PhraseSuggester/PhraseSuggestCollate.cs +++ b/src/Nest/Search/Suggesters/PhraseSuggester/PhraseSuggestCollate.cs @@ -34,11 +34,9 @@ public class PhraseSuggestCollate : IPhraseSuggestCollate public string Preference { get; set; } } - public class PhraseSuggestCollateDescriptor : IPhraseSuggestCollate + public class PhraseSuggestCollateDescriptor : DescriptorBase, IPhraseSuggestCollate>, IPhraseSuggestCollate where T : class { - internal IPhraseSuggestCollate Collate = new PhraseSuggestCollate(); - QueryContainer IPhraseSuggestCollate.Query { get; set; } QueryContainer IPhraseSuggestCollate.Filter { get; set; } @@ -47,35 +45,18 @@ public class PhraseSuggestCollateDescriptor : IPhraseSuggestCollate string IPhraseSuggestCollate.Preference { get; set; } - public PhraseSuggestCollateDescriptor Query(Func, QueryContainer> query) - { - this.Collate.Query = query(new QueryContainerDescriptor()); - return this; - } - - public PhraseSuggestCollateDescriptor Filter(Func, QueryContainer> filter) - { - this.Collate.Filter = filter(new QueryContainerDescriptor()); - return this; - } - - public PhraseSuggestCollateDescriptor Params(IDictionary paramsDictionary) - { - this.Collate.Params = paramsDictionary; - return this; - } - - public PhraseSuggestCollateDescriptor Params(Func, FluentDictionary> paramsDictionary) - { - this.Collate.Params = paramsDictionary(new FluentDictionary()); - return this; - } - - public PhraseSuggestCollateDescriptor Preference(string preference) - { - this.Collate.Preference = preference; - return this; - } + public PhraseSuggestCollateDescriptor Query(Func, QueryContainer> query) => + Assign(a => a.Query = query?.Invoke(new QueryContainerDescriptor())); + + public PhraseSuggestCollateDescriptor Filter(Func, QueryContainer> filter) => + Assign(a => a.Filter = filter?.Invoke(new QueryContainerDescriptor())); + + public PhraseSuggestCollateDescriptor Params(IDictionary paramsDictionary) => Assign(a => a.Params = paramsDictionary); + + public PhraseSuggestCollateDescriptor Params(Func, FluentDictionary> paramsDictionary) => + Assign(a => a.Params = paramsDictionary(new FluentDictionary())); + + public PhraseSuggestCollateDescriptor Preference(string preference) => Assign(a => a.Preference = preference); } } diff --git a/src/Nest/Search/Suggesters/PhraseSuggester/PhraseSuggestHighlight.cs b/src/Nest/Search/Suggesters/PhraseSuggester/PhraseSuggestHighlight.cs index d0ca7558e39..f72538d13f1 100644 --- a/src/Nest/Search/Suggesters/PhraseSuggester/PhraseSuggestHighlight.cs +++ b/src/Nest/Search/Suggesters/PhraseSuggester/PhraseSuggestHighlight.cs @@ -23,24 +23,14 @@ public class PhraseSuggestHighlight : IPhraseSuggestHighlight public string PostTag { get; set; } } - public class PhraseSuggestHighlightDescriptor : IPhraseSuggestHighlight + public class PhraseSuggestHighlightDescriptor : DescriptorBase, IPhraseSuggestHighlight { - internal IPhraseSuggestHighlight Highlight = new PhraseSuggestHighlight(); - string IPhraseSuggestHighlight.PreTag { get; set; } string IPhraseSuggestHighlight.PostTag { get; set; } - public PhraseSuggestHighlightDescriptor PreTag(string preTag) - { - this.Highlight.PreTag = preTag; - return this; - } - - public PhraseSuggestHighlightDescriptor PostTag(string postTag) - { - this.Highlight.PostTag = postTag; - return this; - } + public PhraseSuggestHighlightDescriptor PreTag(string preTag) => Assign(a => a.PreTag = preTag); + + public PhraseSuggestHighlightDescriptor PostTag(string postTag) => Assign(a => a.PostTag = postTag); } } diff --git a/src/Nest/Search/Suggesters/PhraseSuggester/PhraseSuggester.cs b/src/Nest/Search/Suggesters/PhraseSuggester/PhraseSuggester.cs new file mode 100644 index 00000000000..8e31c2d3760 --- /dev/null +++ b/src/Nest/Search/Suggesters/PhraseSuggester/PhraseSuggester.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using Newtonsoft.Json; + +namespace Nest +{ + [JsonObject(MemberSerialization = MemberSerialization.OptIn)] + [JsonConverter(typeof(ReadAsTypeJsonConverter))] + public interface IPhraseSuggester : ISuggester + { + [JsonProperty(PropertyName = "gram_size")] + int? GramSize { get; set; } + + [JsonProperty(PropertyName = "real_word_error_likelihood")] + decimal? RealWordErrorLikelihood { get; set; } + + [JsonProperty(PropertyName = "confidence")] + decimal? Confidence { get; set; } + + [JsonProperty(PropertyName = "max_errors")] + decimal? MaxErrors { get; set; } + + [JsonProperty(PropertyName = "separator")] + char? Separator { get; set; } + + [JsonProperty(PropertyName = "direct_generator")] + IEnumerable DirectGenerator { get; set; } + + [JsonProperty(PropertyName = "highlight")] + IPhraseSuggestHighlight Highlight { get; set; } + + [JsonProperty(PropertyName = "collate")] + IPhraseSuggestCollate Collate { get; set; } + } + + public class PhraseSuggester : SuggesterBase, IPhraseSuggester + { + public int? GramSize { get; set; } + public decimal? RealWordErrorLikelihood { get; set; } + public decimal? Confidence { get; set; } + public decimal? MaxErrors { get; set; } + public char? Separator { get; set; } + public IEnumerable DirectGenerator { get; set; } + public IPhraseSuggestHighlight Highlight { get; set; } + public IPhraseSuggestCollate Collate { get; set; } + } + + public class PhraseSuggesterDescriptor : SuggesterBaseDescriptor, IPhraseSuggester, T>, IPhraseSuggester + where T : class + { + int? IPhraseSuggester.GramSize { get; set; } + decimal? IPhraseSuggester.RealWordErrorLikelihood { get; set; } + decimal? IPhraseSuggester.Confidence { get; set; } + decimal? IPhraseSuggester.MaxErrors { get; set; } + char? IPhraseSuggester.Separator { get; set; } + IEnumerable IPhraseSuggester.DirectGenerator { get; set; } + IPhraseSuggestHighlight IPhraseSuggester.Highlight { get; set; } + IPhraseSuggestCollate IPhraseSuggester.Collate { get; set; } + + public PhraseSuggesterDescriptor GramSize(int? gramSize) => Assign(a => a.GramSize = gramSize); + + public PhraseSuggesterDescriptor Confidence(decimal? confidence) => Assign(a => a.Confidence = confidence); + + public PhraseSuggesterDescriptor MaxErrors(decimal? maxErrors) => Assign(a => a.MaxErrors = maxErrors); + + public PhraseSuggesterDescriptor Separator(char? separator) => Assign(a => a.Separator = separator); + + public PhraseSuggesterDescriptor DirectGenerator(params Func, DirectGeneratorDescriptor>[] generators) => + Assign(a=>a.DirectGenerator = generators.Select(g => g(new DirectGeneratorDescriptor())).ToList()); + + public PhraseSuggesterDescriptor Highlight(Func selector) => + Assign(a=> a.Highlight = selector?.Invoke(new PhraseSuggestHighlightDescriptor())); + + public PhraseSuggesterDescriptor Collate(Func, IPhraseSuggestCollate> selector) => + Assign(a => a.Collate = selector?.Invoke(new PhraseSuggestCollateDescriptor())); + } +} diff --git a/src/Nest/Search/Suggesters/Suggest/SuggestRequest.cs b/src/Nest/Search/Suggesters/Suggest/SuggestRequest.cs index 5e139214b86..55a0675a778 100644 --- a/src/Nest/Search/Suggesters/Suggest/SuggestRequest.cs +++ b/src/Nest/Search/Suggesters/Suggest/SuggestRequest.cs @@ -78,11 +78,11 @@ public SuggestDescriptor GlobalText(string globalSuggestText) /// The term suggester suggests terms based on edit distance. The provided suggest text is analyzed before terms are suggested. /// The suggested terms are provided per analyzed suggest text token. The term suggester doesn’t take the query into account that is part of request. /// - public SuggestDescriptor Term(string name, Func, TermSuggestDescriptor> suggest) + public SuggestDescriptor Term(string name, Func, TermSuggesterDescriptor> suggest) { name.ThrowIfNullOrEmpty("name"); suggest.ThrowIfNull("suggest"); - var desc = new TermSuggestDescriptor(); + var desc = new TermSuggesterDescriptor(); var item = suggest(desc); Self.Suggest.Add(name, item); return this; @@ -92,12 +92,12 @@ public SuggestDescriptor Term(string name, Func, Ter /// The phrase suggester adds additional logic on top of the term suggester to select entire corrected phrases /// instead of individual tokens weighted based on ngram-langugage models. /// - public SuggestDescriptor Phrase(string name, Func, PhraseSuggestDescriptor> suggest) + public SuggestDescriptor Phrase(string name, Func, PhraseSuggesterDescriptor> suggest) { name.ThrowIfNullOrEmpty("name"); suggest.ThrowIfNull("suggest"); - var desc = new PhraseSuggestDescriptor(); + var desc = new PhraseSuggesterDescriptor(); var item = suggest(desc); Self.Suggest.Add(name, item); return this; @@ -107,12 +107,12 @@ public SuggestDescriptor Phrase(string name, Func, /// The completion suggester is a so-called prefix suggester. /// It does not do spell correction like the term or phrase suggesters but allows basic auto-complete functionality. /// - public SuggestDescriptor Completion(string name, Func, CompletionSuggestDescriptor> suggest) + public SuggestDescriptor Completion(string name, Func, CompletionSuggesterDescriptor> suggest) { name.ThrowIfNullOrEmpty("name"); suggest.ThrowIfNull("suggest"); - var desc = new CompletionSuggestDescriptor(); + var desc = new CompletionSuggesterDescriptor(); var item = suggest(desc); Self.Suggest.Add(name, item); return this; diff --git a/src/Nest/Search/Suggesters/SuggestBucket.cs b/src/Nest/Search/Suggesters/SuggestBucket.cs index 78b74cd9ed4..2df74c3ebca 100644 --- a/src/Nest/Search/Suggesters/SuggestBucket.cs +++ b/src/Nest/Search/Suggesters/SuggestBucket.cs @@ -15,7 +15,7 @@ public interface ISuggestBucket ICompletionSuggester Completion { get; set; } } - public class SuggestBucket : ISuggestBucket + public class SuggestBucket : ISuggestBucket { public string Text { get; set; } @@ -23,6 +23,6 @@ public class SuggestBucket : ISuggestBucket public IPhraseSuggester Phrase { get; set; } - public ICompletionSuggester Completion { get; set; } + public ICompletionSuggester Completion { get; set; } } } diff --git a/src/Nest/Search/Suggesters/SuggestContextMapping.cs b/src/Nest/Search/Suggesters/SuggestContextMapping.cs index b246b6d547e..58cddbe6904 100644 --- a/src/Nest/Search/Suggesters/SuggestContextMapping.cs +++ b/src/Nest/Search/Suggesters/SuggestContextMapping.cs @@ -2,36 +2,35 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using Newtonsoft.Json; namespace Nest { - public class SuggestContextMappingDescriptor + + [JsonConverter(typeof(VerbatimDictionaryKeysJsonConverter))] + public interface ISuggestContextMapping : IIsADictionary + { + } + + public class SuggestContextMapping: IsADictionary, ISuggestContextMapping + { + public SuggestContextMapping() : base() { } + public SuggestContextMapping(IDictionary container) : base(container) { } + + public void Add(string name, ISuggestContext filter) => BackingDictionary.Add(name, filter); + } + + + public class SuggestContextMappingDescriptor : IsADictionaryDescriptor, ISuggestContextMapping, string, ISuggestContext> where T : class { - internal IDictionary _Contexts = new Dictionary(); - - public SuggestContextMappingDescriptor Category(string name, Func, CategorySuggestDescriptor> categoryDescriptor) - { - var selector = categoryDescriptor(new CategorySuggestDescriptor()); - var context = selector._Context; - AddContext(name, context); - return this; - } - - public SuggestContextMappingDescriptor GeoLocation(string name, Func, GeoLocationSuggestDescriptor> geoLocationDescriptor) - { - var selector = geoLocationDescriptor(new GeoLocationSuggestDescriptor()); - var context = selector._Context; - AddContext(name, context); - return this; - } - - private void AddContext(string key, ISuggestContext context) - { - if (_Contexts.ContainsKey(key)) - _Contexts[key] = context; - else - _Contexts.Add(key, context); - } + public SuggestContextMappingDescriptor() : base(new SuggestContextMapping()) { } + + public SuggestContextMappingDescriptor Category(string name, Func, ICategorySuggestContext> categoryDescriptor) => + Assign(name ,categoryDescriptor(new CategorySuggestContextDescriptor())); + + public SuggestContextMappingDescriptor GeoLocation(string name, Func, IGeoLocationSuggestContext> geoLocationDescriptor) => + Assign(name, geoLocationDescriptor(new GeoLocationSuggestContextDescriptor())); + } } diff --git a/src/Nest/Search/Suggesters/SuggestOption.cs b/src/Nest/Search/Suggesters/SuggestOption.cs index f905cff8d40..15eedf0a0c7 100644 --- a/src/Nest/Search/Suggesters/SuggestOption.cs +++ b/src/Nest/Search/Suggesters/SuggestOption.cs @@ -15,7 +15,7 @@ public class SuggestOption [JsonProperty("text")] public string Text { get; internal set; } - [JsonProperty("payload")] - public object Payload { get; internal set; } + [JsonProperty("payload")] + public object Payload { get; internal set; } } } diff --git a/src/Nest/Search/Suggesters/TermSuggester/TermSuggest.cs b/src/Nest/Search/Suggesters/TermSuggester/TermSuggest.cs deleted file mode 100644 index 5641b233244..00000000000 --- a/src/Nest/Search/Suggesters/TermSuggester/TermSuggest.cs +++ /dev/null @@ -1,144 +0,0 @@ -using System; -using System.Linq.Expressions; -using Elasticsearch.Net; -using Newtonsoft.Json; -using Newtonsoft.Json.Converters; - -namespace Nest -{ - [JsonObject(MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter))] - public interface ITermSuggester : ISuggester - { - [JsonProperty(PropertyName = "prefix_len")] - int? PrefixLen { get; set; } - - [JsonProperty(PropertyName = "suggest_mode")] - [JsonConverter(typeof(StringEnumConverter))] - SuggestMode? SuggestMode { get; set; } - - [JsonProperty(PropertyName = "min_word_len")] - int? MinWordLen { get; set; } - - [JsonProperty(PropertyName = "max_edits")] - int? MaxEdits { get; set; } - - [JsonProperty(PropertyName = "max_inspections")] - int? MaxInspections { get; set; } - - [JsonProperty(PropertyName = "min_doc_freq")] - decimal? MinDocFrequency { get; set; } - - [JsonProperty(PropertyName = "max_term_freq")] - decimal? MaxTermFrequency { get; set; } - } - - public class TermSuggester : Suggester, ITermSuggester - { - public int? PrefixLen { get; set; } - public SuggestMode? SuggestMode { get; set; } - public int? MinWordLen { get; set; } - public int? MaxEdits { get; set; } - public int? MaxInspections { get; set; } - public decimal? MinDocFrequency { get; set; } - public decimal? MaxTermFrequency { get; set; } - } - - public class TermSuggestDescriptor : BaseSuggestDescriptor, ITermSuggester where T : class - { - private ITermSuggester Self => this; - - int? ITermSuggester.PrefixLen { get; set; } - - SuggestMode? ITermSuggester.SuggestMode { get; set; } - - int? ITermSuggester.MinWordLen { get; set; } - - int? ITermSuggester.MaxEdits { get; set; } - - int? ITermSuggester.MaxInspections { get; set; } - - decimal? ITermSuggester.MinDocFrequency { get; set; } - - decimal? ITermSuggester.MaxTermFrequency { get; set; } - - public TermSuggestDescriptor Text(string text) - { - Self.Text = text; - return this; - } - - public TermSuggestDescriptor Field(string field) - { - Self.Field = field; - return this; - } - - public TermSuggestDescriptor Field(Expression> objectPath) - { - Self.Field = objectPath; - return this; - } - - public TermSuggestDescriptor Analyzer(string analyzer) - { - Self.Analyzer = analyzer; - return this; - } - - public TermSuggestDescriptor Size(int size) - { - Self.Size = size; - return this; - } - - public TermSuggestDescriptor ShardSize(int size) - { - Self.ShardSize = size; - return this; - } - - public TermSuggestDescriptor SuggestMode(SuggestMode mode) - { - Self.SuggestMode = mode; - return this; - } - - public TermSuggestDescriptor MinWordLength(int length) - { - Self.MinWordLen = length; - return this; - } - - public TermSuggestDescriptor PrefixLength(int length) - { - Self.PrefixLen = length; - return this; - } - - public TermSuggestDescriptor MaxEdits(int maxEdits) - { - Self.MaxEdits = maxEdits; - return this; - } - - public TermSuggestDescriptor MaxInspections(int maxInspections) - { - Self.MaxInspections = maxInspections; - return this; - } - - public TermSuggestDescriptor MinDocFrequency(decimal frequency) - { - Self.MinDocFrequency = frequency; - return this; - } - - public TermSuggestDescriptor MaxTermFrequency(decimal frequency) - { - Self.MaxTermFrequency = frequency; - return this; - } - - } -} diff --git a/src/Nest/Search/Suggesters/TermSuggester/TermSuggester.cs b/src/Nest/Search/Suggesters/TermSuggester/TermSuggester.cs new file mode 100644 index 00000000000..e6f1288e7b8 --- /dev/null +++ b/src/Nest/Search/Suggesters/TermSuggester/TermSuggester.cs @@ -0,0 +1,79 @@ +using System; +using System.Linq.Expressions; +using Elasticsearch.Net; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace Nest +{ + [JsonObject(MemberSerialization.OptIn)] + [JsonConverter(typeof(ReadAsTypeJsonConverter))] + public interface ITermSuggester : ISuggester + { + [JsonProperty(PropertyName = "prefix_len")] + int? PrefixLen { get; set; } + + [JsonProperty(PropertyName = "suggest_mode")] + [JsonConverter(typeof(StringEnumConverter))] + SuggestMode? SuggestMode { get; set; } + + [JsonProperty(PropertyName = "min_word_len")] + int? MinWordLen { get; set; } + + [JsonProperty(PropertyName = "max_edits")] + int? MaxEdits { get; set; } + + [JsonProperty(PropertyName = "max_inspections")] + int? MaxInspections { get; set; } + + [JsonProperty(PropertyName = "min_doc_freq")] + decimal? MinDocFrequency { get; set; } + + [JsonProperty(PropertyName = "max_term_freq")] + decimal? MaxTermFrequency { get; set; } + } + + public class TermSuggester : SuggesterBase, ITermSuggester + { + public int? PrefixLen { get; set; } + public SuggestMode? SuggestMode { get; set; } + public int? MinWordLen { get; set; } + public int? MaxEdits { get; set; } + public int? MaxInspections { get; set; } + public decimal? MinDocFrequency { get; set; } + public decimal? MaxTermFrequency { get; set; } + } + + public class TermSuggesterDescriptor : SuggesterBaseDescriptor, ITermSuggester, T>, ITermSuggester + where T : class + { + int? ITermSuggester.PrefixLen { get; set; } + + SuggestMode? ITermSuggester.SuggestMode { get; set; } + + int? ITermSuggester.MinWordLen { get; set; } + + int? ITermSuggester.MaxEdits { get; set; } + + int? ITermSuggester.MaxInspections { get; set; } + + decimal? ITermSuggester.MinDocFrequency { get; set; } + + decimal? ITermSuggester.MaxTermFrequency { get; set; } + + public TermSuggesterDescriptor SuggestMode(SuggestMode mode) => Assign(a => a.SuggestMode = mode); + + public TermSuggesterDescriptor MinWordLength(int length) => Assign(a => a.MinWordLen = length); + + public TermSuggesterDescriptor PrefixLength(int length) => Assign(a => a.PrefixLen = length); + + public TermSuggesterDescriptor MaxEdits(int maxEdits) => Assign(a => a.MaxEdits = maxEdits); + + public TermSuggesterDescriptor MaxInspections(int maxInspections) => Assign(a => a.MaxInspections = maxInspections); + + public TermSuggesterDescriptor MinDocFrequency(decimal frequency) => Assign(a => a.MinDocFrequency = frequency); + + public TermSuggesterDescriptor MaxTermFrequency(decimal frequency) => Assign(a => a.MaxTermFrequency = frequency); + + } +} diff --git a/src/Tests/CodeStandards/Descriptors.doc.cs b/src/Tests/CodeStandards/Descriptors.doc.cs index ccdbda1b864..90496a7d697 100644 --- a/src/Tests/CodeStandards/Descriptors.doc.cs +++ b/src/Tests/CodeStandards/Descriptors.doc.cs @@ -15,12 +15,12 @@ public class Descriptors /** * Every descriptor should inherit from `DescriptorBase`, this hides object members from the fluent interface */ - //[U] - public void ShouldInheritFromDescriptorBase() + [U] + public void DescriptorsHaveToBeMarkedWithIDescriptor() { var descriptors = from t in typeof(DescriptorBase<,>).Assembly.Types() - where t.Name.EndsWith("Descriptor", StringComparison.Ordinal) && t.IsClass - && (!t.GetInterfaces().Any(i => i == typeof(IDescriptor))) + where t.Name.Contains("Descriptor") && t.IsClass + && !t.GetInterfaces().Any(i => i == typeof(IDescriptor)) select t.FullName; descriptors.Should().BeEmpty(); } diff --git a/src/Tests/CodeStandards/ElasticClient.doc.cs b/src/Tests/CodeStandards/ElasticClient.doc.cs index 7714795c123..3b220c3055e 100644 --- a/src/Tests/CodeStandards/ElasticClient.doc.cs +++ b/src/Tests/CodeStandards/ElasticClient.doc.cs @@ -9,7 +9,7 @@ namespace Tests.CodeStandards { - public class ElasticClient + public class ElasticClientStandards { /* * Fluent methods on IElasticClient (Func) should be named `selector`. diff --git a/src/Tests/CodeStandards/Serialization/Properties.doc.cs b/src/Tests/CodeStandards/Serialization/Properties.doc.cs new file mode 100644 index 00000000000..5091a2d1dfe --- /dev/null +++ b/src/Tests/CodeStandards/Serialization/Properties.doc.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using Elasticsearch.Net.Connection; +using Elasticsearch.Net.ConnectionPool; +using Elasticsearch.Net.Serialization; +using FluentAssertions; +using Nest; +using Tests.Framework; + +namespace Tests.CodeStandards.Serialization +{ + public class JsonProperties + { + + /** + * Our Json.NET contract resolver picks up attributes set on the interface + */ + [U] + public void SeesInterfaceProperties() + { + var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200")); + var settings = new ConnectionSettings(pool, new InMemoryConnection()); + var c = new ElasticClient(settings); + + + var serialized = c.Serializer.SerializeToString(new Nest.Analysis { CharFilters = new CharFilters() }); + serialized.Should().NotContain("char_filters").And.NotContain("charFilters"); + serialized.Should().Contain("char_filter"); + + serialized = c.Serializer.SerializeToString(new AnalysisDescriptor().CharFilters(cf=>cf)); + serialized.Should().NotContain("char_filters").And.NotContain("charFilters"); + serialized.Should().Contain("char_filter"); + + + } + } +} diff --git a/src/Tests/Tests.csproj b/src/Tests/Tests.csproj index 41dbd5cf162..5aa3c02e263 100644 --- a/src/Tests/Tests.csproj +++ b/src/Tests/Tests.csproj @@ -166,6 +166,7 @@ + From 7d04fb712f25015df63fd81e52e8f76bb5cb7db5 Mon Sep 17 00:00:00 2001 From: Martijn Laarman Date: Tue, 1 Dec 2015 14:06:48 +0100 Subject: [PATCH 4/6] all descriptors are now implementing descriptorbase --- src/Nest/Aggregations/AggregationContainer.cs | 2 +- .../ConnectionSettings/ClrTypeMapping.cs | 25 +- .../Sorting/SortCollectionJsonConverter.cs | 103 +++--- .../Bulk/BulkOperation/BulkOperationBase.cs | 8 +- .../MultiGet/Request/IMultiGetOperation.cs | 14 +- .../MultiGet/Request/MultiGetOperation.cs | 78 +---- src/Nest/Document/Multiple/Reindex/Reindex.cs | 4 +- .../PutMapping/PutMappingRequest.cs | 37 +-- .../DynamicTemplate/DynamicTemplate.cs | 129 +++----- .../DynamicTemplateContainer.cs | 32 ++ .../DynamicTemplatesJsonConverter.cs | 59 ---- .../Mapping/DynamicTemplate/SingleMapping.cs | 4 +- .../Mapping/Transform/MappingTransform.cs | 10 + .../MappingTransformJsonConverter.cs | 2 +- src/Nest/Mapping/TypeMapping.cs | 38 +-- src/Nest/Mapping/Types/Property.cs | 1 + src/Nest/Nest.csproj | 33 +- .../FunctionScore/FunctionScoreQuery.cs | 42 +-- .../BoostFactor/BoostFactorFunction.cs | 27 ++ .../Functions/BoostFactorFunction.cs | 16 - .../Functions/Decay/ExpFunction.cs | 30 ++ .../{ => Decay}/FunctionScoreDecayField.cs | 0 .../Functions/Decay/GaussFunction.cs | 30 ++ .../Functions/Decay/LinearFunction.cs | 28 ++ .../FunctionScore/Functions/ExpFunction.cs | 36 -- .../Functions/FieldValue/FieldValueFactor.cs | 64 ++++ .../FieldValue/FieldValueFactorFunction.cs | 32 ++ .../FieldValueFactorModifier.cs | 0 .../Functions/FieldValueFactor.cs | 74 ----- .../Functions/FunctionScoreDecayFunction.cs | 10 - .../Functions/FunctionScoreFunctions.cs | 108 +----- .../FunctionScore/Functions/GaussFunction.cs | 38 --- .../Functions/IFunctionScoreFunction.cs | 61 ---- .../FunctionScore/Functions/LinearFunction.cs | 38 --- .../Functions/Random/RandomScoreFunction.cs | 29 ++ .../Functions/RandomScoreFunction.cs | 29 -- .../ScriptScore/ScriptScoreFunction.cs | 27 ++ .../Functions/ScriptScoreFunction.cs | 17 - .../Functions/Weight/WeightFunction.cs | 20 ++ .../FunctionScore/Functions/WeightFunction.cs | 20 -- .../FunctionScore/IFunctionScoreFunction.cs | 42 +++ src/Nest/QueryDsl/FieldLookup.cs | 38 +-- .../MultiPercolate/IPercolateOperation.cs | 3 +- .../Percolator/Percolate/PercolateRequest.cs | 113 +------ .../PercolateCount/PercolateCountRequest.cs | 125 +------ .../Search/Search/Highlighting/Highlight.cs | 43 +-- .../Search/InnerHits/IGlobalInnerHit.cs | 34 +- .../Search/InnerHits/IInnerHitsContainer.cs | 5 +- src/Nest/Search/Search/InnerHits/InnerHits.cs | 50 ++- src/Nest/Search/Search/Rescoring/Rescore.cs | 21 +- .../Search/Search/Rescoring/RescoreQuery.cs | 56 +--- src/Nest/Search/Search/SearchRequest.cs | 141 +------- src/Nest/Search/Search/Sort/Sort.cs | 103 ++++++ src/Nest/Search/Search/Sort/SortField.cs | 313 +----------------- .../Search/Search/Sort/SortGeoDistance.cs | 133 ++------ src/Nest/Search/Search/Sort/SortMode.cs | 22 ++ src/Nest/Search/Search/Sort/SortOrder.cs | 18 + src/Nest/Search/Search/Sort/SortScript.cs | 95 ++---- .../Search/Search/Sort/SortSpecialField.cs | 18 + .../TopHits/TopHitsAggregationUsageTests.cs | 2 +- src/Tests/CodeStandards/Descriptors.doc.cs | 6 +- .../Integration/Bootstrappers/Seeder.cs | 3 +- src/Tests/Search/Request/SortUsageTests.cs | 24 +- 63 files changed, 900 insertions(+), 1863 deletions(-) create mode 100644 src/Nest/Mapping/DynamicTemplate/DynamicTemplateContainer.cs delete mode 100644 src/Nest/Mapping/DynamicTemplate/DynamicTemplatesJsonConverter.cs create mode 100644 src/Nest/QueryDsl/Compound/FunctionScore/Functions/BoostFactor/BoostFactorFunction.cs delete mode 100644 src/Nest/QueryDsl/Compound/FunctionScore/Functions/BoostFactorFunction.cs create mode 100644 src/Nest/QueryDsl/Compound/FunctionScore/Functions/Decay/ExpFunction.cs rename src/Nest/QueryDsl/Compound/FunctionScore/Functions/{ => Decay}/FunctionScoreDecayField.cs (100%) create mode 100644 src/Nest/QueryDsl/Compound/FunctionScore/Functions/Decay/GaussFunction.cs create mode 100644 src/Nest/QueryDsl/Compound/FunctionScore/Functions/Decay/LinearFunction.cs delete mode 100644 src/Nest/QueryDsl/Compound/FunctionScore/Functions/ExpFunction.cs create mode 100644 src/Nest/QueryDsl/Compound/FunctionScore/Functions/FieldValue/FieldValueFactor.cs create mode 100644 src/Nest/QueryDsl/Compound/FunctionScore/Functions/FieldValue/FieldValueFactorFunction.cs rename src/Nest/QueryDsl/Compound/FunctionScore/Functions/{ => FieldValue}/FieldValueFactorModifier.cs (100%) delete mode 100644 src/Nest/QueryDsl/Compound/FunctionScore/Functions/FieldValueFactor.cs delete mode 100644 src/Nest/QueryDsl/Compound/FunctionScore/Functions/FunctionScoreDecayFunction.cs delete mode 100644 src/Nest/QueryDsl/Compound/FunctionScore/Functions/GaussFunction.cs delete mode 100644 src/Nest/QueryDsl/Compound/FunctionScore/Functions/IFunctionScoreFunction.cs delete mode 100644 src/Nest/QueryDsl/Compound/FunctionScore/Functions/LinearFunction.cs create mode 100644 src/Nest/QueryDsl/Compound/FunctionScore/Functions/Random/RandomScoreFunction.cs delete mode 100644 src/Nest/QueryDsl/Compound/FunctionScore/Functions/RandomScoreFunction.cs create mode 100644 src/Nest/QueryDsl/Compound/FunctionScore/Functions/ScriptScore/ScriptScoreFunction.cs delete mode 100644 src/Nest/QueryDsl/Compound/FunctionScore/Functions/ScriptScoreFunction.cs create mode 100644 src/Nest/QueryDsl/Compound/FunctionScore/Functions/Weight/WeightFunction.cs delete mode 100644 src/Nest/QueryDsl/Compound/FunctionScore/Functions/WeightFunction.cs create mode 100644 src/Nest/QueryDsl/Compound/FunctionScore/IFunctionScoreFunction.cs create mode 100644 src/Nest/Search/Search/Sort/Sort.cs create mode 100644 src/Nest/Search/Search/Sort/SortMode.cs create mode 100644 src/Nest/Search/Search/Sort/SortOrder.cs create mode 100644 src/Nest/Search/Search/Sort/SortSpecialField.cs diff --git a/src/Nest/Aggregations/AggregationContainer.cs b/src/Nest/Aggregations/AggregationContainer.cs index 68bdb86bc12..96619eaa225 100644 --- a/src/Nest/Aggregations/AggregationContainer.cs +++ b/src/Nest/Aggregations/AggregationContainer.cs @@ -261,7 +261,7 @@ public static implicit operator AggregationContainer(AggregationBase aggregator) } } - public class AggregationContainerDescriptor : IAggregationContainer + public class AggregationContainerDescriptor : DescriptorBase, IAggregationContainer>, IAggregationContainer where T : class { AggregationDictionary IAggregationContainer.Aggregations { get; set; } diff --git a/src/Nest/CommonAbstractions/ConnectionSettings/ClrTypeMapping.cs b/src/Nest/CommonAbstractions/ConnectionSettings/ClrTypeMapping.cs index 1d1b5f2baa9..4db9922a9a9 100644 --- a/src/Nest/CommonAbstractions/ConnectionSettings/ClrTypeMapping.cs +++ b/src/Nest/CommonAbstractions/ConnectionSettings/ClrTypeMapping.cs @@ -54,46 +54,41 @@ public class ClrTypeMapping : IClrTypeMapping where T : class public IList> Properties { get; set; } } - public class ClrTypeMappingDescriptor : IClrTypeMapping where T : class + public class ClrTypeMappingDescriptor : DescriptorBase,IClrTypeMapping> , IClrTypeMapping + where T : class { - ClrTypeMappingDescriptor _assign(Action> assigner) => Fluent.Assign(this, assigner); - Type IClrTypeMapping.Type { get; } = typeof (T); - string IClrTypeMapping.IndexName { get; set; } - string IClrTypeMapping.TypeName { get; set; } - Expression> IClrTypeMapping.IdProperty { get; set; } - IList> IClrTypeMapping.Properties { get; set; } = new List>(); /// /// When specified dictates the default Elasticsearch index name for /// - public ClrTypeMappingDescriptor IndexName(string indexName) => _assign(a => a.IndexName = indexName); + public ClrTypeMappingDescriptor IndexName(string indexName) => Assign(a => a.IndexName = indexName); /// /// When specified dictates the default Elasticsearch type name for /// - public ClrTypeMappingDescriptor TypeName(string typeName) => _assign(a => a.TypeName = typeName); + public ClrTypeMappingDescriptor TypeName(string typeName) => Assign(a => a.TypeName = typeName); /// /// Allows you to set a default Id property on that NEST will evaluate /// - public ClrTypeMappingDescriptor IdProperty(Expression> property) => _assign(a => a.IdProperty = property); + public ClrTypeMappingDescriptor IdProperty(Expression> property) => Assign(a => a.IdProperty = property); /// /// When specified allows you to ignore on clr type /// public ClrTypeMappingDescriptor Ignore(Expression> property) => - _assign(a => a.Properties.Add(new IgnorePropertyMapping(property))); + Assign(a => a.Properties.Add(new IgnorePropertyMapping(property))); /// /// When specified allows you to rename on clr type /// public ClrTypeMappingDescriptor Rename(Expression> property, string newName) => - _assign(a => a.Properties.Add(new RenamePropertyMapping(property, newName))); + Assign(a => a.Properties.Add(new RenamePropertyMapping(property, newName))); } @@ -121,11 +116,7 @@ protected ClrPropertyMappingBase(Expression> property) Self.Property = property; } - IPropertyMapping IClrTypePropertyMapping.ToPropertyMapping() - { - if (Self.Ignore) return PropertyMapping.Ignored; - return new PropertyMapping {Name = Self.NewName}; - } + IPropertyMapping IClrTypePropertyMapping.ToPropertyMapping() => Self.Ignore ? PropertyMapping.Ignored : new PropertyMapping {Name = Self.NewName}; } public class IgnorePropertyMapping : ClrPropertyMappingBase where T : class diff --git a/src/Nest/CommonOptions/Sorting/SortCollectionJsonConverter.cs b/src/Nest/CommonOptions/Sorting/SortCollectionJsonConverter.cs index 229798b6809..0b3f26d0e32 100644 --- a/src/Nest/CommonOptions/Sorting/SortCollectionJsonConverter.cs +++ b/src/Nest/CommonOptions/Sorting/SortCollectionJsonConverter.cs @@ -10,61 +10,48 @@ namespace Nest { internal class SortCollectionJsonConverter : JsonConverter { - public override bool CanConvert(Type objectType) => typeof(IList).IsAssignableFrom(objectType); + public override bool CanConvert(Type objectType) => typeof(ISort).IsAssignableFrom(objectType); public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { - var sorts = new List(); - while (reader.TokenType != JsonToken.EndArray) - { - reader.Read(); - if (reader.TokenType == JsonToken.EndArray) - break; - reader.Read(); - var field = reader.Value as string; - reader.Read(); + ISort sort = null; + reader.Read(); + var field = reader.Value as string; + reader.Read(); - if (field == "_geo_distance") + if (field == "_geo_distance") + { + var j = JObject.Load(reader); + if (j != null) { - var j = JObject.Load(reader); - if (j != null) + var s = j.ToObject(serializer); + if (s != null) { - var sort = j.ToObject(serializer); - if (sort != null) - { - LoadGeoDistanceSortLocation(sort, j); - sorts.Add(sort); - } + LoadGeoDistanceSortLocation(s, j); + sort = s; } } - else if (field == "_script") + } + else if (field == "_script") + { + var j = JObject.Load(reader); + if (j != null) { - var j = JObject.Load(reader); - if (j != null) - { - var sort = j.ToObject(serializer); - if (sort != null) - { - sorts.Add(sort); - } - } + sort = j.ToObject(serializer); } - else + } + else + { + var j = JObject.Load(reader); + if (j != null) { - var j = JObject.Load(reader); - if (j != null) - { - var sort = j.ToObject(serializer); - if (sort != null) - { - sort.Field = field; - sorts.Add(sort); - } - } + var s = j.ToObject(serializer); + s.Field = field; + sort = s; } - reader.Read(); } - return sorts; + reader.Read(); + return sort; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) @@ -88,25 +75,25 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s private void LoadGeoDistanceSortLocation(GeoDistanceSort sort, JObject j) { - var field = j.Properties().FirstOrDefault(p => !GeoDistanceSort.Params.Contains(p.Name)); + //var field = j.Properties().FirstOrDefault(p => !GeoDistanceSort.Params.Contains(p.Name)); - if (field != null) - { - sort.Field = field.Name; - // TODO use field.Value.Type instead of try catch + //if (field != null) + //{ + // sort.Field = field.Name; + // // TODO use field.Value.Type instead of try catch - try - { - sort.PinLocation = field.Value.Value(); - } - catch { } + // try + // { + // sort.PinLocation = field.Value.Value(); + // } + // catch { } - try - { - sort.Points = field.Value.Value>(); - } - catch { } - } + // try + // { + // sort.Points = field.Value.Value>(); + // } + // catch { } + //} } } } diff --git a/src/Nest/Document/Multiple/Bulk/BulkOperation/BulkOperationBase.cs b/src/Nest/Document/Multiple/Bulk/BulkOperation/BulkOperationBase.cs index 3e24c42a325..07275d5162e 100644 --- a/src/Nest/Document/Multiple/Bulk/BulkOperation/BulkOperationBase.cs +++ b/src/Nest/Document/Multiple/Bulk/BulkOperation/BulkOperationBase.cs @@ -25,15 +25,13 @@ public virtual string GetIdForOperation(ElasticInferrer inferrer) } } - public abstract class BulkOperationDescriptorBase : IBulkOperation + public abstract class BulkOperationDescriptorBase : DescriptorBase, IBulkOperation { - private IBulkOperation Self => this; - protected abstract string BulkOperationType { get; } - string IBulkOperation.Operation { get { return this.BulkOperationType; } } + string IBulkOperation.Operation => this.BulkOperationType; protected abstract Type BulkOperationClrType { get; } - Type IBulkOperation.ClrType { get { return this.BulkOperationClrType; } } + Type IBulkOperation.ClrType => this.BulkOperationClrType; IndexName IBulkOperation.Index { get; set; } diff --git a/src/Nest/Document/Multiple/MultiGet/Request/IMultiGetOperation.cs b/src/Nest/Document/Multiple/MultiGet/Request/IMultiGetOperation.cs index c6c2673fc22..a1395d3093b 100644 --- a/src/Nest/Document/Multiple/MultiGet/Request/IMultiGetOperation.cs +++ b/src/Nest/Document/Multiple/MultiGet/Request/IMultiGetOperation.cs @@ -5,24 +5,24 @@ namespace Nest { [JsonObject(MemberSerialization = MemberSerialization.OptIn)] - [JsonConverter(typeof(ReadAsTypeJsonConverter>))] + [JsonConverter(typeof(ReadAsTypeJsonConverter>))] public interface IMultiGetOperation { [JsonProperty(PropertyName = "_index")] IndexName Index { get; set; } - + [JsonProperty(PropertyName = "_type")] TypeName Type { get; set; } - + [JsonProperty(PropertyName = "_id")] Id Id { get; set; } - + [JsonProperty(PropertyName = "fields")] - IList Fields { get; set; } - + Fields Fields { get; set; } + [JsonProperty(PropertyName = "_routing")] string Routing { get; set; } - + [JsonProperty(PropertyName = "_source")] Union Source { get; set; } diff --git a/src/Nest/Document/Multiple/MultiGet/Request/MultiGetOperation.cs b/src/Nest/Document/Multiple/MultiGet/Request/MultiGetOperation.cs index ed46c295c6d..38ac6aa8a18 100644 --- a/src/Nest/Document/Multiple/MultiGet/Request/MultiGetOperation.cs +++ b/src/Nest/Document/Multiple/MultiGet/Request/MultiGetOperation.cs @@ -16,7 +16,6 @@ public MultiGetOperation(Id id) this.Type = typeof(T); } - Type IMultiGetOperation.ClrType => typeof(T); public IndexName Index { get; set; } @@ -25,7 +24,7 @@ public MultiGetOperation(Id id) public Id Id { get; set; } - public IList Fields { get; set; } + public Fields Fields { get; set; } public Union Source { get; set; } @@ -42,17 +41,15 @@ public MultiGetOperation(Id id) public object Document { get; set; } } - public class MultiGetOperationDescriptor : IMultiGetOperation + public class MultiGetOperationDescriptor : DescriptorBase, IMultiGetOperation>, IMultiGetOperation where T : class { - private IMultiGetOperation Self => this; - IndexName IMultiGetOperation.Index { get; set; } TypeName IMultiGetOperation.Type { get; set; } Id IMultiGetOperation.Id { get; set; } string IMultiGetOperation.Routing { get; set; } Union IMultiGetOperation.Source { get; set; } - IList IMultiGetOperation.Fields { get; set; } + Fields IMultiGetOperation.Fields { get; set; } Type IMultiGetOperation.ClrType => typeof(T); bool IMultiGetOperation.CanBeFlattened => @@ -86,87 +83,38 @@ public MultiGetOperationDescriptor(bool allowExplicitIndex) /// /// Manually set the index, default to the default index or the index set for the type on the connectionsettings. /// - public MultiGetOperationDescriptor Index(string index) - { - if (index.IsNullOrEmpty()) return this; - Self.Index = index; - return this; - } + public MultiGetOperationDescriptor Index(IndexName index) => Assign(a => a.Index = index); + /// /// Manualy set the type to get the object from, default to whatever /// T will be inferred to if not passed. /// - public MultiGetOperationDescriptor Type(string type) - { - if (type.IsNullOrEmpty()) return this; - Self.Type = type; - return this; - } - + public MultiGetOperationDescriptor Type(TypeName type) => Assign(a=> a.Type = type); - /// - /// Manually set the type of which a typename will be inferred - /// - public MultiGetOperationDescriptor Type(Type type) - { - if (type == null) return this; - Self.Type = type; - return this; - } - - public MultiGetOperationDescriptor Id(Id id) - { - Self.Id = id; - return this; - } + public MultiGetOperationDescriptor Id(Id id) => Assign(a => a.Id = id); /// /// Control how the document's source is loaded /// - public MultiGetOperationDescriptor Source(bool? sourceEnabled = true) - { - Self.Source = sourceEnabled; - return this; - } + public MultiGetOperationDescriptor Source(bool? sourceEnabled = true) => Assign(a => a.Source = sourceEnabled); /// /// Control how the document's source is loaded /// - public MultiGetOperationDescriptor Source(Func, ISourceFilter> source) - { - Self.Source = new Union(source(new SourceFilterDescriptor())); - return this; - } + public MultiGetOperationDescriptor Source(Func, ISourceFilter> source) => + Assign(a => a.Source = new Union(source(new SourceFilterDescriptor()))); /// /// Set the routing for the get operation /// - public MultiGetOperationDescriptor Routing(string routing) - { - routing.ThrowIfNullOrEmpty("routing"); - Self.Routing = routing; - return this; - } + public MultiGetOperationDescriptor Routing(string routing) => Assign(a => a.Routing = routing); /// /// Allows to selectively load specific fields for each document /// represented by a search hit. Defaults to load the internal _source field. /// - public MultiGetOperationDescriptor Fields(params Expression>[] expressions) - { - Self.Fields = expressions.Select(e => (Field)e).ToList(); - return this; - } - - /// - /// Allows to selectively load specific fields for each document - /// represented by a search hit. Defaults to load the internal _source field. - /// - public MultiGetOperationDescriptor Fields(params string[] fields) - { - Self.Fields = fields.Select(f => (Field)f).ToList(); - return this; - } + public MultiGetOperationDescriptor Fields(Func, IPromise> fields) => + Assign(a => a.Fields = fields?.Invoke(new FieldsDescriptor())?.Value); } } \ No newline at end of file diff --git a/src/Nest/Document/Multiple/Reindex/Reindex.cs b/src/Nest/Document/Multiple/Reindex/Reindex.cs index a15b9f6e0aa..6a9e2587f31 100644 --- a/src/Nest/Document/Multiple/Reindex/Reindex.cs +++ b/src/Nest/Document/Multiple/Reindex/Reindex.cs @@ -33,10 +33,8 @@ public ReindexRequest(IndexName from, IndexName to) } } - public class ReindexDescriptor : IReindexRequest where T : class + public class ReindexDescriptor : DescriptorBase, IReindexRequest>, IReindexRequest where T : class { - ReindexDescriptor Assign(Action assign) => Fluent.Assign(this, assign); - IndexName IReindexRequest.To { get; set; } IndexName IReindexRequest.From { get; set; } string IReindexRequest.Scroll { get; set; } diff --git a/src/Nest/Indices/MappingManagement/PutMapping/PutMappingRequest.cs b/src/Nest/Indices/MappingManagement/PutMapping/PutMappingRequest.cs index 5cd7b313d49..b670fa90753 100644 --- a/src/Nest/Indices/MappingManagement/PutMapping/PutMappingRequest.cs +++ b/src/Nest/Indices/MappingManagement/PutMapping/PutMappingRequest.cs @@ -12,7 +12,7 @@ public partial interface IPutMappingRequest : ITypeMapping public interface IPutMappingRequest : IPutMappingRequest where T : class { } - public partial class PutMappingRequest : RequestBase, IPutMappingRequest + public partial class PutMappingRequest { // Needed for ReadAsType internal PutMappingRequest() { } @@ -26,7 +26,7 @@ internal PutMappingRequest() { } /// public IEnumerable DynamicDateFormats { get; set; } /// - public IDictionary DynamicTemplates { get; set; } + public IDynamicTemplateContainer DynamicTemplates { get; set; } /// public DynamicMapping? Dynamic { get; set; } /// @@ -77,7 +77,7 @@ public PutMappingRequest() : this(typeof(T), typeof(T)) { } /// public IEnumerable DynamicDateFormats { get; set; } /// - public IDictionary DynamicTemplates { get; set; } + public IDynamicTemplateContainer DynamicTemplates { get; set; } /// public DynamicMapping? Dynamic { get; set; } /// @@ -130,7 +130,7 @@ public PutMappingDescriptor(IndexName index, TypeName type) : base(r=>r.Required IEnumerable ITypeMapping.DynamicDateFormats { get; set; } string ITypeMapping.Analyzer { get; set; } string ITypeMapping.SearchAnalyzer { get; set; } - IDictionary ITypeMapping.DynamicTemplates { get; set; } + IDynamicTemplateContainer ITypeMapping.DynamicTemplates { get; set; } DynamicMapping? ITypeMapping.Dynamic { get; set; } IFieldNamesField ITypeMapping.FieldNamesField { get; set; } IIdField ITypeMapping.IdField { get; set; } @@ -204,15 +204,11 @@ public PutMappingDescriptor AutoMap(IPropertyVisitor visitor = null) => Assig public PutMappingDescriptor NumericDetection(bool detect = true) => Assign(a => a.NumericDetection = detect); /// - public PutMappingDescriptor Transform(Func mappingTransformSelector) - { - //TODO MappingTransform needs a descriptor so we no longer make this call mutate state - var t = mappingTransformSelector?.Invoke(new MappingTransformDescriptor()); - if (t == null) return this; - if (((IPutMappingRequest)this).Transform == null) ((IPutMappingRequest)this).Transform = new List(); - ((IPutMappingRequest)this).Transform.Add(t); - return this; - } + public PutMappingDescriptor Transform(IEnumerable transforms) => Assign(a => a.Transform = transforms.ToListOrNullIfEmpty()); + + /// + public PutMappingDescriptor Transform(Func>> selector) => + Assign(a => a.Transform = selector?.Invoke(new MappingTransformsDescriptor())?.Value); /// public PutMappingDescriptor IdField(Func idMapper) => Assign(a => a.IdField = idMapper?.Invoke(new IdFieldDescriptor())); @@ -245,18 +241,7 @@ public PutMappingDescriptor Properties(Func, IPromise Assign(a => a.Properties = propertiesSelector?.Invoke(new PropertiesDescriptor(a.Properties))?.Value); /// - public PutMappingDescriptor DynamicTemplates(Func, DynamicTemplatesDescriptor> dynamicTemplatesSelector) - { - //TODO _DELETES concept is wrong? - dynamicTemplatesSelector.ThrowIfNull("dynamicTemplatesSelector"); - var templates = dynamicTemplatesSelector(new DynamicTemplatesDescriptor()); - if (((IPutMappingRequest)this).DynamicTemplates == null) - ((IPutMappingRequest)this).DynamicTemplates = new Dictionary(); - foreach (var t in templates._Deletes) - ((IPutMappingRequest)this).DynamicTemplates.Remove(t); - foreach (var t in templates.Templates) - ((IPutMappingRequest)this).DynamicTemplates[t.Key] = t.Value; - return this; - } + public PutMappingDescriptor DynamicTemplates(Func, IPromise> dynamicTemplatesSelector) => + Assign(a => a.DynamicTemplates = dynamicTemplatesSelector?.Invoke(new DynamicTemplateContainerDescriptor())?.Value); } } \ No newline at end of file diff --git a/src/Nest/Mapping/DynamicTemplate/DynamicTemplate.cs b/src/Nest/Mapping/DynamicTemplate/DynamicTemplate.cs index 4ca56f1db70..ec6e5fc2bfd 100644 --- a/src/Nest/Mapping/DynamicTemplate/DynamicTemplate.cs +++ b/src/Nest/Mapping/DynamicTemplate/DynamicTemplate.cs @@ -4,103 +4,64 @@ namespace Nest { - public class DynamicTemplate - { + [JsonObject(MemberSerialization = MemberSerialization.OptIn)] + [JsonConverter(typeof(ReadAsTypeJsonConverter))] + public interface IDynamicTemplate + { [JsonProperty("match")] - public string Match { get; set; } + string Match { get; set; } [JsonProperty("unmatch")] - public string Unmatch { get; set; } + string Unmatch { get; set; } [JsonProperty("match_mapping_type")] - public string MatchMappingType { get; set; } + string MatchMappingType { get; set; } [JsonProperty("path_match")] - public string PathMatch { get; set; } + string PathMatch { get; set; } [JsonProperty("path_unmatch")] - public string PathUnmatch { get; set; } - - [JsonProperty("mapping"), JsonConverter(typeof(PropertyJsonConverter))] - public IProperty Mapping { get; set; } + string PathUnmatch { get; set; } - } + [JsonProperty("mapping")] + IProperty Mapping { get; set; } + } - public class DynamicTemplatesDescriptor where T : class + public class DynamicTemplate { - internal IDictionary Templates = new Dictionary(); - internal IList _Deletes = new List(); - - public DynamicTemplatesDescriptor Add( - Func, DynamicTemplateDescriptor> templateSelector) - { - templateSelector.ThrowIfNull("templateSelector"); - var d = templateSelector(new DynamicTemplateDescriptor()); - if (d == null || d._Name.IsNullOrEmpty()) - throw new Exception("Could not get name for dynamic template"); - - this.Templates[d._Name] = d._Template; - return this; - } - public DynamicTemplatesDescriptor Remove(string name) - { - this._Deletes.Add(name); - return this; - } + public string Match { get; set; } + + public string Unmatch { get; set; } + + public string MatchMappingType { get; set; } + + public string PathMatch { get; set; } + + public string PathUnmatch { get; set; } + + public IProperty Mapping { get; set; } } - public class DynamicTemplateDescriptor where T : class + + public class DynamicTemplateDescriptor : DescriptorBase, IDynamicTemplate>, IDynamicTemplate + where T : class { - internal string _Name { get; private set; } - internal DynamicTemplate _Template { get; private set; } - - public DynamicTemplateDescriptor() - { - this._Template = new DynamicTemplate(); - } - - public DynamicTemplateDescriptor Name(string name) - { - this._Name = name; - return this; - } - - public DynamicTemplateDescriptor Match(string match) - { - this._Template.Match = match; - return this; - } - - public DynamicTemplateDescriptor Unmatch(string unMatch) - { - this._Template.Unmatch = unMatch; - return this; - } - - public DynamicTemplateDescriptor MatchMappingType(string matchMappingType) - { - this._Template.MatchMappingType = matchMappingType; - return this; - } - - public DynamicTemplateDescriptor PathMatch(string pathMatch) - { - this._Template.PathMatch = pathMatch; - return this; - } - - public DynamicTemplateDescriptor PathUnmatch(string pathUnmatch) - { - this._Template.PathUnmatch = pathUnmatch; - return this; - } - - public DynamicTemplateDescriptor Mapping(Func, IProperty> mappingSelector) - { - mappingSelector.ThrowIfNull("mappingSelector"); - var mapping = mappingSelector(new SingleMappingDescriptor()); - - this._Template.Mapping = mapping; - return this; - } + string IDynamicTemplate.Match { get; set; } + string IDynamicTemplate.Unmatch { get; set; } + string IDynamicTemplate.MatchMappingType { get; set; } + string IDynamicTemplate.PathMatch { get; set; } + string IDynamicTemplate.PathUnmatch { get; set; } + IProperty IDynamicTemplate.Mapping { get; set; } + + public DynamicTemplateDescriptor Match(string match) => Assign(a => a.Match = match); + + public DynamicTemplateDescriptor Unmatch(string unMatch) => Assign(a => a.Unmatch = unMatch); + + public DynamicTemplateDescriptor MatchMappingType(string matchMappingType) => Assign(a => a.MatchMappingType = matchMappingType); + + public DynamicTemplateDescriptor PathMatch(string pathMatch) => Assign(a => a.PathMatch = pathMatch); + + public DynamicTemplateDescriptor PathUnmatch(string pathUnmatch) => Assign(a => a.PathUnmatch = pathUnmatch); + + public DynamicTemplateDescriptor Mapping(Func, IProperty> mappingSelector) => Assign(a => a.Mapping = mappingSelector?.Invoke(new SingleMappingDescriptor())); } } \ No newline at end of file diff --git a/src/Nest/Mapping/DynamicTemplate/DynamicTemplateContainer.cs b/src/Nest/Mapping/DynamicTemplate/DynamicTemplateContainer.cs new file mode 100644 index 00000000000..16077506358 --- /dev/null +++ b/src/Nest/Mapping/DynamicTemplate/DynamicTemplateContainer.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json; + +namespace Nest +{ + + [JsonConverter(typeof(VerbatimDictionaryKeysJsonConverter))] + public interface IDynamicTemplateContainer : IIsADictionary { } + public class DynamicTemplateContainer : IsADictionary, IDynamicTemplateContainer + { + public DynamicTemplateContainer() : base() { } + public DynamicTemplateContainer(IDictionary container) : base(container) { } + public DynamicTemplateContainer(Dictionary container) + : base(container.Select(kv => kv).ToDictionary(kv => kv.Key, kv => kv.Value)) + { } + + /// + /// Add any setting to the index + /// + public void Add(string name, IDynamicTemplate dynamicTemplate) => BackingDictionary.Add(name, dynamicTemplate); + } + + public class DynamicTemplateContainerDescriptor : IsADictionaryDescriptor, IDynamicTemplateContainer, string, IDynamicTemplate> + where T : class + { + public DynamicTemplateContainerDescriptor() : base(new DynamicTemplateContainer()) { } + + public DynamicTemplateContainerDescriptor DynamicTemplate(string name, Func, IDynamicTemplate> selector) => Assign(name, selector?.Invoke(new DynamicTemplateDescriptor())); + } +} diff --git a/src/Nest/Mapping/DynamicTemplate/DynamicTemplatesJsonConverter.cs b/src/Nest/Mapping/DynamicTemplate/DynamicTemplatesJsonConverter.cs deleted file mode 100644 index 1422721e1d8..00000000000 --- a/src/Nest/Mapping/DynamicTemplate/DynamicTemplatesJsonConverter.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; - -namespace Nest -{ - internal class DynamicTemplatesJsonConverter : JsonConverter - { - public override bool CanWrite => true; - - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) - { - var dict = value as Dictionary; - if (dict == null || !dict.HasAny()) - return; - - writer.WriteStartArray(); - foreach (var p in dict) - { - writer.WriteStartObject(); - { - writer.WritePropertyName(p.Key); - serializer.Serialize(writer, p.Value); - } - writer.WriteEndObject(); - } - - writer.WriteEndArray(); - } - - public override object ReadJson(JsonReader reader, Type objectType, object existingValue, - JsonSerializer serializer) - { - var dict = new Dictionary(); - - JArray o = JArray.Load(reader); - - foreach (JObject p in o) - { - var prop = p.Properties().First(); - var po = prop.Value as JObject; - var name = prop.Name; - if (po ==null) - continue; - - var template = serializer.Deserialize(po.CreateReader(), typeof(DynamicTemplate)) as DynamicTemplate; - if (template == null) - continue; - - dict.Add(name, template); - } - return dict; - } - - public override bool CanConvert(Type objectType) => objectType == typeof(IDictionary); - } -} \ No newline at end of file diff --git a/src/Nest/Mapping/DynamicTemplate/SingleMapping.cs b/src/Nest/Mapping/DynamicTemplate/SingleMapping.cs index a5981b3e13a..8db54294dab 100644 --- a/src/Nest/Mapping/DynamicTemplate/SingleMapping.cs +++ b/src/Nest/Mapping/DynamicTemplate/SingleMapping.cs @@ -3,8 +3,8 @@ namespace Nest { - public class SingleMappingDescriptor - : IPropertiesDescriptor + public class SingleMappingDescriptor : + DescriptorBase, IPropertiesDescriptor>, IPropertiesDescriptor where T : class { public IProperty String(Func, IStringProperty> selector) => diff --git a/src/Nest/Mapping/Transform/MappingTransform.cs b/src/Nest/Mapping/Transform/MappingTransform.cs index 157014c5045..abed2c83ad5 100644 --- a/src/Nest/Mapping/Transform/MappingTransform.cs +++ b/src/Nest/Mapping/Transform/MappingTransform.cs @@ -52,5 +52,15 @@ public class MappingTransformDescriptor : DescriptorBase Assign(a => a.Language = language); public MappingTransformDescriptor Language(ScriptLang language) => Assign(a => a.Language = language.GetStringValue()); + + } + + public class MappingTransformsDescriptor: DescriptorPromiseBase> + { + public MappingTransformsDescriptor() : base(new List()) { } + + public MappingTransformsDescriptor Add(Func selector) => + Assign(a => a.AddIfNotNull(selector?.Invoke(new MappingTransformDescriptor()))); + } } diff --git a/src/Nest/Mapping/Transform/MappingTransformJsonConverter.cs b/src/Nest/Mapping/Transform/MappingTransformJsonConverter.cs index a6c77bafa83..e6e0c0c4b59 100644 --- a/src/Nest/Mapping/Transform/MappingTransformJsonConverter.cs +++ b/src/Nest/Mapping/Transform/MappingTransformJsonConverter.cs @@ -9,7 +9,7 @@ namespace Nest { internal class MappingTransformCollectionJsonConverter : JsonConverter { - public override bool CanWrite { get { return false; } } + public override bool CanWrite => false; public override bool CanConvert(Type objectType) => objectType == typeof(IMappingTransform); diff --git a/src/Nest/Mapping/TypeMapping.cs b/src/Nest/Mapping/TypeMapping.cs index 5c529aa6c10..47d4f8b50f2 100644 --- a/src/Nest/Mapping/TypeMapping.cs +++ b/src/Nest/Mapping/TypeMapping.cs @@ -70,9 +70,8 @@ public interface ITypeMapping [JsonConverter(typeof(VerbatimDictionaryKeysJsonConverter))] FluentDictionary Meta { get; set; } - [JsonProperty("dynamic_templates", TypeNameHandling = TypeNameHandling.None)] - [JsonConverter(typeof(DynamicTemplatesJsonConverter))] - IDictionary DynamicTemplates { get; set; } + [JsonProperty("dynamic_templates")] + IDynamicTemplateContainer DynamicTemplates { get; set; } [JsonProperty("dynamic")] DynamicMapping? Dynamic { get; set; } @@ -96,7 +95,7 @@ public class TypeMapping : ITypeMapping /// public IEnumerable DynamicDateFormats { get; set; } /// - public IDictionary DynamicTemplates { get; set; } + public IDynamicTemplateContainer DynamicTemplates { get; set; } /// public IFieldNamesField FieldNamesField { get; set; } /// @@ -139,7 +138,7 @@ public class TypeMappingDescriptor : DescriptorBase, bool? ITypeMapping.DateDetection { get; set; } DynamicMapping? ITypeMapping.Dynamic { get; set; } IEnumerable ITypeMapping.DynamicDateFormats { get; set; } - IDictionary ITypeMapping.DynamicTemplates { get; set; } + IDynamicTemplateContainer ITypeMapping.DynamicTemplates { get; set; } IFieldNamesField ITypeMapping.FieldNamesField { get; set; } IIdField ITypeMapping.IdField { get; set; } IIndexField ITypeMapping.IndexField { get; set; } @@ -207,15 +206,11 @@ public class TypeMappingDescriptor : DescriptorBase, public TypeMappingDescriptor NumericDetection(bool detect = true) => Assign(a => a.NumericDetection = detect); /// - public TypeMappingDescriptor Transform(Func mappingTransformSelector) - { - //TODO MappingTransform needs a descriptor so we no longer make this call mutate state - var t = mappingTransformSelector?.Invoke(new MappingTransformDescriptor()); - if (t == null) return this; - if (Self.Transform == null) Self.Transform = new List(); - Self.Transform.Add(t); - return this; - } + public TypeMappingDescriptor Transform(IEnumerable transforms) => Assign(a => a.Transform = transforms.ToListOrNullIfEmpty()); + + /// + public TypeMappingDescriptor Transform(Func>> selector) => + Assign(a => a.Transform = selector?.Invoke(new MappingTransformsDescriptor())?.Value); /// public TypeMappingDescriptor IdField(Func idMapper) => Assign(a => a.IdField = idMapper?.Invoke(new IdFieldDescriptor())); @@ -248,19 +243,8 @@ public TypeMappingDescriptor Properties(Func, Propert Assign(a => a.Properties = propertiesSelector?.Invoke(new PropertiesDescriptor(Self.Properties))?.PromisedValue); /// - public TypeMappingDescriptor DynamicTemplates(Func, DynamicTemplatesDescriptor> dynamicTemplatesSelector) - { - //TODO _DELETES concept is wrong? - dynamicTemplatesSelector.ThrowIfNull("dynamicTemplatesSelector"); - var templates = dynamicTemplatesSelector(new DynamicTemplatesDescriptor()); - if (Self.DynamicTemplates == null) - Self.DynamicTemplates = new Dictionary(); - foreach (var t in templates._Deletes) - Self.DynamicTemplates.Remove(t); - foreach (var t in templates.Templates) - Self.DynamicTemplates[t.Key] = t.Value; - return this; - } + public TypeMappingDescriptor DynamicTemplates(Func, IPromise> dynamicTemplatesSelector) => + Assign(a => a.DynamicTemplates = dynamicTemplatesSelector?.Invoke(new DynamicTemplateContainerDescriptor())?.Value); } } diff --git a/src/Nest/Mapping/Types/Property.cs b/src/Nest/Mapping/Types/Property.cs index dd82a1e32ae..e08deabdc85 100644 --- a/src/Nest/Mapping/Types/Property.cs +++ b/src/Nest/Mapping/Types/Property.cs @@ -6,6 +6,7 @@ namespace Nest { [JsonObject(MemberSerialization.OptIn)] + [ContractJsonConverter(typeof(PropertyJsonConverter))] public interface IProperty : IFieldMapping { PropertyName Name { get; set; } diff --git a/src/Nest/Nest.csproj b/src/Nest/Nest.csproj index 6a44d76de98..91137e7707c 100644 --- a/src/Nest/Nest.csproj +++ b/src/Nest/Nest.csproj @@ -253,6 +253,7 @@ + @@ -290,6 +291,7 @@ + @@ -425,6 +427,10 @@ + + + + @@ -516,7 +522,7 @@ - + @@ -597,7 +603,7 @@ - + @@ -631,7 +637,7 @@ - + @@ -685,18 +691,17 @@ - - + + - - + - - - - - + + + + + @@ -1041,7 +1046,6 @@ - @@ -1107,6 +1111,9 @@ + + +