diff --git a/src/CodeGeneration/ApiGenerator/Views/Enums.Generated.cshtml b/src/CodeGeneration/ApiGenerator/Views/Enums.Generated.cshtml index 5ec427bff10..fb0a2de8e2b 100644 --- a/src/CodeGeneration/ApiGenerator/Views/Enums.Generated.cshtml +++ b/src/CodeGeneration/ApiGenerator/Views/Enums.Generated.cshtml @@ -1,8 +1,8 @@ +@using System @using System.Collections.Generic @using System.Linq @using ApiGenerator.Domain @using ApiGenerator - @functions { private const string RawSize = "Raw"; private const string SizeEnum = "Size"; @@ -14,18 +14,33 @@ } private string CreateCase(string e, string o) { - var enumValue = (e == SizeEnum && o == string.Empty) ? RawSize : o.ToPascalCase(true); + var enumValue = GetEnumValue(e, o); return string.Format("case {0}.{1}: return \"{2}\";", e, enumValue, o); } private bool IsFlag(string name) { - return (name.EndsWith("Metric")) || name.EndsWith("Feature"); + return name.EndsWith("Metric") || name.EndsWith("Feature"); + } + + private string CreateEnumKeyValue(string enumName, string value, int index) + { + var enumValue = GetEnumValue(enumName, value); + return string.Format("{3}{{ {0}.{1}, \"{2}\" }},", enumName, enumValue, value, index == 0 ? "\t\t\t\t" : string.Empty); + } + + private string GetEnumValue(string enumName, string value) + { + return enumName == SizeEnum && value == string.Empty + ? RawSize + : value.ToPascalCase(true); } } using System; using System.Collections.Generic; +using System.Collections.Concurrent; using System.Linq; using System.Text; +using System.Reflection; using System.Runtime.Serialization; ///This file contains all the typed enums that the client rest api spec exposes. @@ -33,56 +48,115 @@ using System.Runtime.Serialization; ///Generated of commit @Model.Commit namespace Elasticsearch.Net { - @foreach (EnumDescription e in Model.EnumsInTheSpec) - { - var isFlag = IsFlag(e.Name); +@foreach (EnumDescription e in Model.EnumsInTheSpec) +{ + var isFlag = IsFlag(e.Name); - @(isFlag ? "[Flags]" : string.Empty)public enum @e.Name + @(isFlag ? "[Flags]" : string.Empty)public enum @e.Name { - @Raw(string.Join(",\r\n\t\t", e.Options.OrderBy(s=>s == "_all" ? 1 : 0).Select((s, i) => CreateEnum(e.Name, s, isFlag ? (int?)i : null )))) - } - - } + @Raw(string.Join(",\r\n\t\t", e.Options.OrderBy(s => s == "_all" ? 1 : 0).Select((s, i) => CreateEnum(e.Name, s, isFlag ? (int?)i : null)))) + } +} public static class KnownEnums + { + private class EnumDictionary : @(Raw("Dictionary")) + { + public EnumDictionary(int capacity) : base(capacity) {} + public @(Raw("Func")) Resolver { get; set; } + } + + @foreach (EnumDescription e in Model.EnumsInTheSpec) { - public static string UnknownEnum { get; } = "_UNKNOWN_ENUM_"; - public static string Resolve(Enum e) + var isFlag = IsFlag(e.Name); + + public static string GetStringValue(this @(e.Name) enumValue) + { + + if (isFlag) + { + var allOption = e.Options.FirstOrDefault(o => o == "_all"); + if (allOption != null) + { + if ((enumValue & @(e.Name).All) != 0) return "_all"; + } + var list = new @(Raw("List()")); + foreach (var option in e.Options.Where(o => o != "_all")) + { + if ((enumValue & @(e.Name).@(GetEnumValue(e.Name, option))) != 0) list.Add("@(option)"); + } + return string.Join(",", list); + } + } + else + { + switch (enumValue) + { + @Raw(string.Join("\r\n\t\t\t\t", e.Options.Select(o => CreateCase(e.Name, o)))) + } + throw new ArgumentException($"'{enumValue.ToString()}' is not a valid value for enum '@(e.Name)'"); + } + } + } + + private static readonly @(Raw("ConcurrentDictionary>")) EnumStringResolvers = + new @(Raw("ConcurrentDictionary>"))(); + + static KnownEnums() + { + @foreach (EnumDescription e in Model.EnumsInTheSpec) + { + EnumStringResolvers.TryAdd(typeof(@(e.Name)), (e) => GetStringValue((@(e.Name))e)); + } + } + + public static string GetStringValue(this Enum e) + { + var type = e.GetType(); + var resolver = EnumStringResolvers.GetOrAdd(type, GetEnumStringResolver); + return resolver(e); + } + + private static @Raw("Func") GetEnumStringResolver(Type type) { - @foreach (EnumDescription e in Model.EnumsInTheSpec) + var values = Enum.GetValues(type); + var dictionary = new EnumDictionary(values.Length); + + for (int index = 0; index < values.Length; index++) { - var isFlag = IsFlag(e.Name); - if (e is @e.Name) - { - if (isFlag) + var value = values.GetValue(index); +#if DOTNETCORE + var info = type.GetTypeInfo().GetDeclaredField(value.ToString()); +#else + var info = type.GetField(value.ToString()); +#endif + var da = (EnumMemberAttribute[])info.GetCustomAttributes(typeof(EnumMemberAttribute), false); + var stringValue = da.Length > 0 ? da[0].Value : Enum.GetName(type, value); + dictionary.Add((Enum)value, stringValue); + } + +#if DOTNETCORE + var isFlag = type.GetTypeInfo().GetCustomAttributes(typeof(FlagsAttribute), false).Any(); +#else + var isFlag = type.GetCustomAttributes(typeof(FlagsAttribute), false).Length > 0; +#endif + + return (e) => { - var list = new @(Raw("List()")); - foreach(var option in e.Options.OrderBy(s=>s == "_all" ? 1 : 0)) + if (isFlag) { - if (option != "_all") + var list = new @(Raw("List()")); + foreach(var kv in dictionary) { - if (e.HasFlag(@(e.Name).@(option.ToPascalCase(true)))) list.Add("@(option)"); - } - else - { - if (e.HasFlag(@(e.Name).@(option.ToPascalCase(true)))) return "@(option)"; + if (e.HasFlag(kv.Key)) list.Add(kv.Value); } + return string.Join(",", list); } - return string.Join(",", list); - } - else - { - switch((@e.Name)e) + else { - @Raw(string.Join("\r\n\t\t\t\t\t", e.Options.Select(o =>CreateCase(e.Name,o)))) - } - } - - } - - } - return UnknownEnum; + return dictionary[e]; + } + }; } } -} - \ No newline at end of file +} \ No newline at end of file diff --git a/src/Elasticsearch.Net/Connection/HttpConnection.cs b/src/Elasticsearch.Net/Connection/HttpConnection.cs index 0c7630a9f8f..8f7274c4506 100644 --- a/src/Elasticsearch.Net/Connection/HttpConnection.cs +++ b/src/Elasticsearch.Net/Connection/HttpConnection.cs @@ -66,7 +66,7 @@ protected virtual HttpWebRequest CreateWebRequest(RequestData requestData) //see: https://github.com/elasticsearch/elasticsearch-net/issues/562 var m = requestData.Method.GetStringValue(); request.Method = m; - if (m != "head" && m != "get" && (requestData.PostData == null)) + if (m != "HEAD" && m != "GET" && (requestData.PostData == null)) request.ContentLength = 0; return request; diff --git a/src/Elasticsearch.Net/Connection/HttpMethod.cs b/src/Elasticsearch.Net/Connection/HttpMethod.cs index db94cbbbc22..d13ee52a0c8 100644 --- a/src/Elasticsearch.Net/Connection/HttpMethod.cs +++ b/src/Elasticsearch.Net/Connection/HttpMethod.cs @@ -17,4 +17,4 @@ public enum HttpMethod [EnumMember(Value = "HEAD")] HEAD } -} \ No newline at end of file +} diff --git a/src/Elasticsearch.Net/Domain/Enums.Generated.cs b/src/Elasticsearch.Net/Domain/Enums.Generated.cs index fb1bf305964..e8726653d92 100644 --- a/src/Elasticsearch.Net/Domain/Enums.Generated.cs +++ b/src/Elasticsearch.Net/Domain/Enums.Generated.cs @@ -1,30 +1,30 @@ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Runtime.Serialization; - -///This file contains all the typed enums that the client rest api spec exposes. -///This file is automatically generated from https://github.com/elastic/elasticsearch/tree/v5.0.0/rest-api-spec -///Generated of commit v5.0.0 -namespace Elasticsearch.Net -{ - - public enum Refresh - { - [EnumMember(Value = "true")] +using System; +using System.Collections.Generic; +using System.Collections.Concurrent; +using System.Linq; +using System.Text; +using System.Reflection; +using System.Runtime.Serialization; + +///This file contains all the typed enums that the client rest api spec exposes. +///This file is automatically generated from https://github.com/elastic/elasticsearch/tree/v5.0.0/rest-api-spec +///Generated of commit v5.0.0 +namespace Elasticsearch.Net +{ + + public enum Refresh + { + [EnumMember(Value = "true")] True, [EnumMember(Value = "false")] False, [EnumMember(Value = "wait_for")] - WaitFor - } - - - public enum Bytes - { - [EnumMember(Value = "b")] + WaitFor + } + + public enum Bytes + { + [EnumMember(Value = "b")] B, [EnumMember(Value = "k")] K, @@ -45,24 +45,22 @@ public enum Bytes [EnumMember(Value = "p")] P, [EnumMember(Value = "pb")] - Pb - } - - - public enum Health - { - [EnumMember(Value = "green")] + Pb + } + + public enum Health + { + [EnumMember(Value = "green")] Green, [EnumMember(Value = "yellow")] Yellow, [EnumMember(Value = "red")] - Red - } - - - public enum Size - { - [EnumMember(Value = "")] + Red + } + + public enum Size + { + [EnumMember(Value = "")] Raw, [EnumMember(Value = "k")] K, @@ -73,24 +71,22 @@ public enum Size [EnumMember(Value = "t")] T, [EnumMember(Value = "p")] - P - } - - - public enum Level - { - [EnumMember(Value = "cluster")] + P + } + + public enum Level + { + [EnumMember(Value = "cluster")] Cluster, [EnumMember(Value = "indices")] Indices, [EnumMember(Value = "shards")] - Shards - } - - - public enum WaitForEvents - { - [EnumMember(Value = "immediate")] + Shards + } + + public enum WaitForEvents + { + [EnumMember(Value = "immediate")] Immediate, [EnumMember(Value = "urgent")] Urgent, @@ -101,133 +97,120 @@ public enum WaitForEvents [EnumMember(Value = "low")] Low, [EnumMember(Value = "languid")] - Languid - } - - - public enum WaitForStatus - { - [EnumMember(Value = "green")] + Languid + } + + public enum WaitForStatus + { + [EnumMember(Value = "green")] Green, [EnumMember(Value = "yellow")] Yellow, [EnumMember(Value = "red")] - Red - } - - - public enum ExpandWildcards - { - [EnumMember(Value = "open")] + Red + } + + public enum ExpandWildcards + { + [EnumMember(Value = "open")] Open, [EnumMember(Value = "closed")] Closed, [EnumMember(Value = "none")] None, [EnumMember(Value = "all")] - All - } - - - public enum DefaultOperator - { - [EnumMember(Value = "AND")] + All + } + + public enum DefaultOperator + { + [EnumMember(Value = "AND")] And, [EnumMember(Value = "OR")] - Or - } - - - public enum VersionType - { - [EnumMember(Value = "internal")] + Or + } + + public enum VersionType + { + [EnumMember(Value = "internal")] Internal, [EnumMember(Value = "external")] External, [EnumMember(Value = "external_gte")] ExternalGte, [EnumMember(Value = "force")] - Force - } - - - public enum Conflicts - { - [EnumMember(Value = "abort")] + Force + } + + public enum Conflicts + { + [EnumMember(Value = "abort")] Abort, [EnumMember(Value = "proceed")] - Proceed - } - - - public enum SearchType - { - [EnumMember(Value = "query_then_fetch")] + Proceed + } + + public enum SearchType + { + [EnumMember(Value = "query_then_fetch")] QueryThenFetch, [EnumMember(Value = "dfs_query_then_fetch")] - DfsQueryThenFetch - } - - - public enum SuggestMode - { - [EnumMember(Value = "missing")] + DfsQueryThenFetch + } + + public enum SuggestMode + { + [EnumMember(Value = "missing")] Missing, [EnumMember(Value = "popular")] Popular, [EnumMember(Value = "always")] - Always - } - - - public enum OpType - { - [EnumMember(Value = "index")] + Always + } + + public enum OpType + { + [EnumMember(Value = "index")] Index, [EnumMember(Value = "create")] - Create - } - - - public enum Format - { - [EnumMember(Value = "detailed")] + Create + } + + public enum Format + { + [EnumMember(Value = "detailed")] Detailed, [EnumMember(Value = "text")] - Text - } - - - public enum ThreadType - { - [EnumMember(Value = "cpu")] + Text + } + + public enum ThreadType + { + [EnumMember(Value = "cpu")] Cpu, [EnumMember(Value = "wait")] Wait, [EnumMember(Value = "block")] - Block - } - - - public enum PercolateFormat - { - [EnumMember(Value = "ids")] - Ids - } - - - public enum GroupBy - { - [EnumMember(Value = "nodes")] + Block + } + + public enum PercolateFormat + { + [EnumMember(Value = "ids")] + Ids + } + + public enum GroupBy + { + [EnumMember(Value = "nodes")] Nodes, [EnumMember(Value = "parents")] - Parents - } - - - [Flags]public enum ClusterStateMetric - { - [EnumMember(Value = "blocks")] + Parents + } + + [Flags]public enum ClusterStateMetric + { + [EnumMember(Value = "blocks")] Blocks = 1 << 0, [EnumMember(Value = "metadata")] Metadata = 1 << 1, @@ -242,24 +225,22 @@ [Flags]public enum ClusterStateMetric [EnumMember(Value = "version")] Version = 1 << 6, [EnumMember(Value = "_all")] - All = 1 << 7 - } - - - [Flags]public enum Feature - { - [EnumMember(Value = "_settings")] + All = 1 << 7 + } + + [Flags]public enum Feature + { + [EnumMember(Value = "_settings")] Settings = 1 << 0, [EnumMember(Value = "_mappings")] Mappings = 1 << 1, [EnumMember(Value = "_aliases")] - Aliases = 1 << 2 - } - - - [Flags]public enum IndicesStatsMetric - { - [EnumMember(Value = "completion")] + Aliases = 1 << 2 + } + + [Flags]public enum IndicesStatsMetric + { + [EnumMember(Value = "completion")] Completion = 1 << 0, [EnumMember(Value = "docs")] Docs = 1 << 1, @@ -292,13 +273,12 @@ [Flags]public enum IndicesStatsMetric [EnumMember(Value = "suggest")] Suggest = 1 << 15, [EnumMember(Value = "_all")] - All = 1 << 16 - } - - - [Flags]public enum NodesInfoMetric - { - [EnumMember(Value = "settings")] + All = 1 << 16 + } + + [Flags]public enum NodesInfoMetric + { + [EnumMember(Value = "settings")] Settings = 1 << 0, [EnumMember(Value = "os")] Os = 1 << 1, @@ -315,13 +295,12 @@ [Flags]public enum NodesInfoMetric [EnumMember(Value = "plugins")] Plugins = 1 << 7, [EnumMember(Value = "ingest")] - Ingest = 1 << 8 - } - - - [Flags]public enum NodesStatsMetric - { - [EnumMember(Value = "breaker")] + Ingest = 1 << 8 + } + + [Flags]public enum NodesStatsMetric + { + [EnumMember(Value = "breaker")] Breaker = 1 << 0, [EnumMember(Value = "fs")] Fs = 1 << 1, @@ -342,13 +321,12 @@ [Flags]public enum NodesStatsMetric [EnumMember(Value = "discovery")] Discovery = 1 << 9, [EnumMember(Value = "_all")] - All = 1 << 10 - } - - - [Flags]public enum NodesStatsIndexMetric - { - [EnumMember(Value = "completion")] + All = 1 << 10 + } + + [Flags]public enum NodesStatsIndexMetric + { + [EnumMember(Value = "completion")] Completion = 1 << 0, [EnumMember(Value = "docs")] Docs = 1 << 1, @@ -381,351 +359,448 @@ [Flags]public enum NodesStatsIndexMetric [EnumMember(Value = "suggest")] Suggest = 1 << 15, [EnumMember(Value = "_all")] - All = 1 << 16 - } - - - [Flags]public enum WatcherStatsMetric - { - [EnumMember(Value = "queued_watches")] + All = 1 << 16 + } + + [Flags]public enum WatcherStatsMetric + { + [EnumMember(Value = "queued_watches")] QueuedWatches = 1 << 0, [EnumMember(Value = "pending_watches")] PendingWatches = 1 << 1, [EnumMember(Value = "_all")] - All = 1 << 2 - } - - - public static class KnownEnums - { - public static string UnknownEnum { get; } = "_UNKNOWN_ENUM_"; - public static string Resolve(Enum e) - { - if (e is Refresh) - { - switch((Refresh)e) - { - case Refresh.True: return "true"; - case Refresh.False: return "false"; - case Refresh.WaitFor: return "wait_for"; - } - - } - - if (e is Bytes) - { - switch((Bytes)e) - { - case Bytes.B: return "b"; - case Bytes.K: return "k"; - case Bytes.Kb: return "kb"; - case Bytes.M: return "m"; - case Bytes.Mb: return "mb"; - case Bytes.G: return "g"; - case Bytes.Gb: return "gb"; - case Bytes.T: return "t"; - case Bytes.Tb: return "tb"; - case Bytes.P: return "p"; - case Bytes.Pb: return "pb"; - } - - } - - if (e is Health) - { - switch((Health)e) - { - case Health.Green: return "green"; - case Health.Yellow: return "yellow"; - case Health.Red: return "red"; - } - - } - - if (e is Size) - { - switch((Size)e) - { - case Size.Raw: return ""; - case Size.K: return "k"; - case Size.M: return "m"; - case Size.G: return "g"; - case Size.T: return "t"; - case Size.P: return "p"; - } - - } - - if (e is Level) - { - switch((Level)e) - { - case Level.Cluster: return "cluster"; - case Level.Indices: return "indices"; - case Level.Shards: return "shards"; - } - - } - - if (e is WaitForEvents) - { - switch((WaitForEvents)e) - { - case WaitForEvents.Immediate: return "immediate"; - case WaitForEvents.Urgent: return "urgent"; - case WaitForEvents.High: return "high"; - case WaitForEvents.Normal: return "normal"; - case WaitForEvents.Low: return "low"; - case WaitForEvents.Languid: return "languid"; - } - - } - - if (e is WaitForStatus) - { - switch((WaitForStatus)e) - { - case WaitForStatus.Green: return "green"; - case WaitForStatus.Yellow: return "yellow"; - case WaitForStatus.Red: return "red"; - } - - } - - if (e is ExpandWildcards) - { - switch((ExpandWildcards)e) - { - case ExpandWildcards.Open: return "open"; - case ExpandWildcards.Closed: return "closed"; - case ExpandWildcards.None: return "none"; - case ExpandWildcards.All: return "all"; - } - - } - - if (e is DefaultOperator) - { - switch((DefaultOperator)e) - { - case DefaultOperator.And: return "AND"; - case DefaultOperator.Or: return "OR"; - } - - } - - if (e is VersionType) - { - switch((VersionType)e) - { - case VersionType.Internal: return "internal"; - case VersionType.External: return "external"; - case VersionType.ExternalGte: return "external_gte"; - case VersionType.Force: return "force"; - } - - } - - if (e is Conflicts) - { - switch((Conflicts)e) - { - case Conflicts.Abort: return "abort"; - case Conflicts.Proceed: return "proceed"; - } - - } - - if (e is SearchType) - { - switch((SearchType)e) - { - case SearchType.QueryThenFetch: return "query_then_fetch"; - case SearchType.DfsQueryThenFetch: return "dfs_query_then_fetch"; - } - - } - - if (e is SuggestMode) - { - switch((SuggestMode)e) - { - case SuggestMode.Missing: return "missing"; - case SuggestMode.Popular: return "popular"; - case SuggestMode.Always: return "always"; - } - - } - - if (e is OpType) - { - switch((OpType)e) - { - case OpType.Index: return "index"; - case OpType.Create: return "create"; - } - - } - - if (e is Format) - { - switch((Format)e) - { - case Format.Detailed: return "detailed"; - case Format.Text: return "text"; - } - - } - - if (e is ThreadType) - { - switch((ThreadType)e) - { - case ThreadType.Cpu: return "cpu"; - case ThreadType.Wait: return "wait"; - case ThreadType.Block: return "block"; - } - - } - - if (e is PercolateFormat) - { - switch((PercolateFormat)e) - { - case PercolateFormat.Ids: return "ids"; - } - - } - - if (e is GroupBy) - { - switch((GroupBy)e) - { - case GroupBy.Nodes: return "nodes"; - case GroupBy.Parents: return "parents"; - } - - } - - if (e is ClusterStateMetric) - { - var list = new List(); - if (e.HasFlag(ClusterStateMetric.Blocks)) list.Add("blocks"); - if (e.HasFlag(ClusterStateMetric.Metadata)) list.Add("metadata"); - if (e.HasFlag(ClusterStateMetric.Nodes)) list.Add("nodes"); - if (e.HasFlag(ClusterStateMetric.RoutingTable)) list.Add("routing_table"); - if (e.HasFlag(ClusterStateMetric.RoutingNodes)) list.Add("routing_nodes"); - if (e.HasFlag(ClusterStateMetric.MasterNode)) list.Add("master_node"); - if (e.HasFlag(ClusterStateMetric.Version)) list.Add("version"); - if (e.HasFlag(ClusterStateMetric.All)) return "_all"; - return string.Join(",", list); - - } - - if (e is Feature) - { - var list = new List(); - if (e.HasFlag(Feature.Settings)) list.Add("_settings"); - if (e.HasFlag(Feature.Mappings)) list.Add("_mappings"); - if (e.HasFlag(Feature.Aliases)) list.Add("_aliases"); - return string.Join(",", list); - - } - - if (e is IndicesStatsMetric) - { - var list = new List(); - if (e.HasFlag(IndicesStatsMetric.Completion)) list.Add("completion"); - if (e.HasFlag(IndicesStatsMetric.Docs)) list.Add("docs"); - if (e.HasFlag(IndicesStatsMetric.Fielddata)) list.Add("fielddata"); - if (e.HasFlag(IndicesStatsMetric.QueryCache)) list.Add("query_cache"); - if (e.HasFlag(IndicesStatsMetric.Flush)) list.Add("flush"); - if (e.HasFlag(IndicesStatsMetric.Get)) list.Add("get"); - if (e.HasFlag(IndicesStatsMetric.Indexing)) list.Add("indexing"); - if (e.HasFlag(IndicesStatsMetric.Merge)) list.Add("merge"); - if (e.HasFlag(IndicesStatsMetric.Percolate)) list.Add("percolate"); - if (e.HasFlag(IndicesStatsMetric.RequestCache)) list.Add("request_cache"); - if (e.HasFlag(IndicesStatsMetric.Refresh)) list.Add("refresh"); - if (e.HasFlag(IndicesStatsMetric.Search)) list.Add("search"); - if (e.HasFlag(IndicesStatsMetric.Segments)) list.Add("segments"); - if (e.HasFlag(IndicesStatsMetric.Store)) list.Add("store"); - if (e.HasFlag(IndicesStatsMetric.Warmer)) list.Add("warmer"); - if (e.HasFlag(IndicesStatsMetric.Suggest)) list.Add("suggest"); - if (e.HasFlag(IndicesStatsMetric.All)) return "_all"; - return string.Join(",", list); - - } - - if (e is NodesInfoMetric) - { - var list = new List(); - if (e.HasFlag(NodesInfoMetric.Settings)) list.Add("settings"); - if (e.HasFlag(NodesInfoMetric.Os)) list.Add("os"); - if (e.HasFlag(NodesInfoMetric.Process)) list.Add("process"); - if (e.HasFlag(NodesInfoMetric.Jvm)) list.Add("jvm"); - if (e.HasFlag(NodesInfoMetric.ThreadPool)) list.Add("thread_pool"); - if (e.HasFlag(NodesInfoMetric.Transport)) list.Add("transport"); - if (e.HasFlag(NodesInfoMetric.Http)) list.Add("http"); - if (e.HasFlag(NodesInfoMetric.Plugins)) list.Add("plugins"); - if (e.HasFlag(NodesInfoMetric.Ingest)) list.Add("ingest"); - return string.Join(",", list); - - } - - if (e is NodesStatsMetric) - { - var list = new List(); - if (e.HasFlag(NodesStatsMetric.Breaker)) list.Add("breaker"); - if (e.HasFlag(NodesStatsMetric.Fs)) list.Add("fs"); - if (e.HasFlag(NodesStatsMetric.Http)) list.Add("http"); - if (e.HasFlag(NodesStatsMetric.Indices)) list.Add("indices"); - if (e.HasFlag(NodesStatsMetric.Jvm)) list.Add("jvm"); - if (e.HasFlag(NodesStatsMetric.Os)) list.Add("os"); - if (e.HasFlag(NodesStatsMetric.Process)) list.Add("process"); - if (e.HasFlag(NodesStatsMetric.ThreadPool)) list.Add("thread_pool"); - if (e.HasFlag(NodesStatsMetric.Transport)) list.Add("transport"); - if (e.HasFlag(NodesStatsMetric.Discovery)) list.Add("discovery"); - if (e.HasFlag(NodesStatsMetric.All)) return "_all"; - return string.Join(",", list); - - } - - if (e is NodesStatsIndexMetric) - { - var list = new List(); - if (e.HasFlag(NodesStatsIndexMetric.Completion)) list.Add("completion"); - if (e.HasFlag(NodesStatsIndexMetric.Docs)) list.Add("docs"); - if (e.HasFlag(NodesStatsIndexMetric.Fielddata)) list.Add("fielddata"); - if (e.HasFlag(NodesStatsIndexMetric.QueryCache)) list.Add("query_cache"); - if (e.HasFlag(NodesStatsIndexMetric.Flush)) list.Add("flush"); - if (e.HasFlag(NodesStatsIndexMetric.Get)) list.Add("get"); - if (e.HasFlag(NodesStatsIndexMetric.Indexing)) list.Add("indexing"); - if (e.HasFlag(NodesStatsIndexMetric.Merge)) list.Add("merge"); - if (e.HasFlag(NodesStatsIndexMetric.Percolate)) list.Add("percolate"); - if (e.HasFlag(NodesStatsIndexMetric.RequestCache)) list.Add("request_cache"); - if (e.HasFlag(NodesStatsIndexMetric.Refresh)) list.Add("refresh"); - if (e.HasFlag(NodesStatsIndexMetric.Search)) list.Add("search"); - if (e.HasFlag(NodesStatsIndexMetric.Segments)) list.Add("segments"); - if (e.HasFlag(NodesStatsIndexMetric.Store)) list.Add("store"); - if (e.HasFlag(NodesStatsIndexMetric.Warmer)) list.Add("warmer"); - if (e.HasFlag(NodesStatsIndexMetric.Suggest)) list.Add("suggest"); - if (e.HasFlag(NodesStatsIndexMetric.All)) return "_all"; - return string.Join(",", list); - - } - - if (e is WatcherStatsMetric) - { - var list = new List(); - if (e.HasFlag(WatcherStatsMetric.QueuedWatches)) list.Add("queued_watches"); - if (e.HasFlag(WatcherStatsMetric.PendingWatches)) list.Add("pending_watches"); - if (e.HasFlag(WatcherStatsMetric.All)) return "_all"; - return string.Join(",", list); - - } - - return UnknownEnum; - } - } -} - \ No newline at end of file + All = 1 << 2 + } + + public static class KnownEnums + { + private class EnumDictionary : Dictionary + { + public EnumDictionary(int capacity) : base(capacity) {} + public Func Resolver { get; set; } + } + + + public static string GetStringValue(this Refresh enumValue) + { + + switch (enumValue) + { + case Refresh.True: return "true"; + case Refresh.False: return "false"; + case Refresh.WaitFor: return "wait_for"; + } + throw new ArgumentException($"'{enumValue.ToString()}' is not a valid value for enum 'Refresh'"); + } + + public static string GetStringValue(this Bytes enumValue) + { + + switch (enumValue) + { + case Bytes.B: return "b"; + case Bytes.K: return "k"; + case Bytes.Kb: return "kb"; + case Bytes.M: return "m"; + case Bytes.Mb: return "mb"; + case Bytes.G: return "g"; + case Bytes.Gb: return "gb"; + case Bytes.T: return "t"; + case Bytes.Tb: return "tb"; + case Bytes.P: return "p"; + case Bytes.Pb: return "pb"; + } + throw new ArgumentException($"'{enumValue.ToString()}' is not a valid value for enum 'Bytes'"); + } + + public static string GetStringValue(this Health enumValue) + { + + switch (enumValue) + { + case Health.Green: return "green"; + case Health.Yellow: return "yellow"; + case Health.Red: return "red"; + } + throw new ArgumentException($"'{enumValue.ToString()}' is not a valid value for enum 'Health'"); + } + + public static string GetStringValue(this Size enumValue) + { + + switch (enumValue) + { + case Size.Raw: return ""; + case Size.K: return "k"; + case Size.M: return "m"; + case Size.G: return "g"; + case Size.T: return "t"; + case Size.P: return "p"; + } + throw new ArgumentException($"'{enumValue.ToString()}' is not a valid value for enum 'Size'"); + } + + public static string GetStringValue(this Level enumValue) + { + + switch (enumValue) + { + case Level.Cluster: return "cluster"; + case Level.Indices: return "indices"; + case Level.Shards: return "shards"; + } + throw new ArgumentException($"'{enumValue.ToString()}' is not a valid value for enum 'Level'"); + } + + public static string GetStringValue(this WaitForEvents enumValue) + { + + switch (enumValue) + { + case WaitForEvents.Immediate: return "immediate"; + case WaitForEvents.Urgent: return "urgent"; + case WaitForEvents.High: return "high"; + case WaitForEvents.Normal: return "normal"; + case WaitForEvents.Low: return "low"; + case WaitForEvents.Languid: return "languid"; + } + throw new ArgumentException($"'{enumValue.ToString()}' is not a valid value for enum 'WaitForEvents'"); + } + + public static string GetStringValue(this WaitForStatus enumValue) + { + + switch (enumValue) + { + case WaitForStatus.Green: return "green"; + case WaitForStatus.Yellow: return "yellow"; + case WaitForStatus.Red: return "red"; + } + throw new ArgumentException($"'{enumValue.ToString()}' is not a valid value for enum 'WaitForStatus'"); + } + + public static string GetStringValue(this ExpandWildcards enumValue) + { + + switch (enumValue) + { + case ExpandWildcards.Open: return "open"; + case ExpandWildcards.Closed: return "closed"; + case ExpandWildcards.None: return "none"; + case ExpandWildcards.All: return "all"; + } + throw new ArgumentException($"'{enumValue.ToString()}' is not a valid value for enum 'ExpandWildcards'"); + } + + public static string GetStringValue(this DefaultOperator enumValue) + { + + switch (enumValue) + { + case DefaultOperator.And: return "AND"; + case DefaultOperator.Or: return "OR"; + } + throw new ArgumentException($"'{enumValue.ToString()}' is not a valid value for enum 'DefaultOperator'"); + } + + public static string GetStringValue(this VersionType enumValue) + { + + switch (enumValue) + { + case VersionType.Internal: return "internal"; + case VersionType.External: return "external"; + case VersionType.ExternalGte: return "external_gte"; + case VersionType.Force: return "force"; + } + throw new ArgumentException($"'{enumValue.ToString()}' is not a valid value for enum 'VersionType'"); + } + + public static string GetStringValue(this Conflicts enumValue) + { + + switch (enumValue) + { + case Conflicts.Abort: return "abort"; + case Conflicts.Proceed: return "proceed"; + } + throw new ArgumentException($"'{enumValue.ToString()}' is not a valid value for enum 'Conflicts'"); + } + + public static string GetStringValue(this SearchType enumValue) + { + + switch (enumValue) + { + case SearchType.QueryThenFetch: return "query_then_fetch"; + case SearchType.DfsQueryThenFetch: return "dfs_query_then_fetch"; + } + throw new ArgumentException($"'{enumValue.ToString()}' is not a valid value for enum 'SearchType'"); + } + + public static string GetStringValue(this SuggestMode enumValue) + { + + switch (enumValue) + { + case SuggestMode.Missing: return "missing"; + case SuggestMode.Popular: return "popular"; + case SuggestMode.Always: return "always"; + } + throw new ArgumentException($"'{enumValue.ToString()}' is not a valid value for enum 'SuggestMode'"); + } + + public static string GetStringValue(this OpType enumValue) + { + + switch (enumValue) + { + case OpType.Index: return "index"; + case OpType.Create: return "create"; + } + throw new ArgumentException($"'{enumValue.ToString()}' is not a valid value for enum 'OpType'"); + } + + public static string GetStringValue(this Format enumValue) + { + + switch (enumValue) + { + case Format.Detailed: return "detailed"; + case Format.Text: return "text"; + } + throw new ArgumentException($"'{enumValue.ToString()}' is not a valid value for enum 'Format'"); + } + + public static string GetStringValue(this ThreadType enumValue) + { + + switch (enumValue) + { + case ThreadType.Cpu: return "cpu"; + case ThreadType.Wait: return "wait"; + case ThreadType.Block: return "block"; + } + throw new ArgumentException($"'{enumValue.ToString()}' is not a valid value for enum 'ThreadType'"); + } + + public static string GetStringValue(this PercolateFormat enumValue) + { + + switch (enumValue) + { + case PercolateFormat.Ids: return "ids"; + } + throw new ArgumentException($"'{enumValue.ToString()}' is not a valid value for enum 'PercolateFormat'"); + } + + public static string GetStringValue(this GroupBy enumValue) + { + + switch (enumValue) + { + case GroupBy.Nodes: return "nodes"; + case GroupBy.Parents: return "parents"; + } + throw new ArgumentException($"'{enumValue.ToString()}' is not a valid value for enum 'GroupBy'"); + } + + public static string GetStringValue(this ClusterStateMetric enumValue) + { + + if ((enumValue & ClusterStateMetric.All) != 0) return "_all"; + var list = new List(); + if ((enumValue & ClusterStateMetric.Blocks) != 0) list.Add("blocks"); + if ((enumValue & ClusterStateMetric.Metadata) != 0) list.Add("metadata"); + if ((enumValue & ClusterStateMetric.Nodes) != 0) list.Add("nodes"); + if ((enumValue & ClusterStateMetric.RoutingTable) != 0) list.Add("routing_table"); + if ((enumValue & ClusterStateMetric.RoutingNodes) != 0) list.Add("routing_nodes"); + if ((enumValue & ClusterStateMetric.MasterNode) != 0) list.Add("master_node"); + if ((enumValue & ClusterStateMetric.Version) != 0) list.Add("version"); + return string.Join(",", list); + } + + public static string GetStringValue(this Feature enumValue) + { + + var list = new List(); + if ((enumValue & Feature.Settings) != 0) list.Add("_settings"); + if ((enumValue & Feature.Mappings) != 0) list.Add("_mappings"); + if ((enumValue & Feature.Aliases) != 0) list.Add("_aliases"); + return string.Join(",", list); + } + + public static string GetStringValue(this IndicesStatsMetric enumValue) + { + + if ((enumValue & IndicesStatsMetric.All) != 0) return "_all"; + var list = new List(); + if ((enumValue & IndicesStatsMetric.Completion) != 0) list.Add("completion"); + if ((enumValue & IndicesStatsMetric.Docs) != 0) list.Add("docs"); + if ((enumValue & IndicesStatsMetric.Fielddata) != 0) list.Add("fielddata"); + if ((enumValue & IndicesStatsMetric.QueryCache) != 0) list.Add("query_cache"); + if ((enumValue & IndicesStatsMetric.Flush) != 0) list.Add("flush"); + if ((enumValue & IndicesStatsMetric.Get) != 0) list.Add("get"); + if ((enumValue & IndicesStatsMetric.Indexing) != 0) list.Add("indexing"); + if ((enumValue & IndicesStatsMetric.Merge) != 0) list.Add("merge"); + if ((enumValue & IndicesStatsMetric.Percolate) != 0) list.Add("percolate"); + if ((enumValue & IndicesStatsMetric.RequestCache) != 0) list.Add("request_cache"); + if ((enumValue & IndicesStatsMetric.Refresh) != 0) list.Add("refresh"); + if ((enumValue & IndicesStatsMetric.Search) != 0) list.Add("search"); + if ((enumValue & IndicesStatsMetric.Segments) != 0) list.Add("segments"); + if ((enumValue & IndicesStatsMetric.Store) != 0) list.Add("store"); + if ((enumValue & IndicesStatsMetric.Warmer) != 0) list.Add("warmer"); + if ((enumValue & IndicesStatsMetric.Suggest) != 0) list.Add("suggest"); + return string.Join(",", list); + } + + public static string GetStringValue(this NodesInfoMetric enumValue) + { + + var list = new List(); + if ((enumValue & NodesInfoMetric.Settings) != 0) list.Add("settings"); + if ((enumValue & NodesInfoMetric.Os) != 0) list.Add("os"); + if ((enumValue & NodesInfoMetric.Process) != 0) list.Add("process"); + if ((enumValue & NodesInfoMetric.Jvm) != 0) list.Add("jvm"); + if ((enumValue & NodesInfoMetric.ThreadPool) != 0) list.Add("thread_pool"); + if ((enumValue & NodesInfoMetric.Transport) != 0) list.Add("transport"); + if ((enumValue & NodesInfoMetric.Http) != 0) list.Add("http"); + if ((enumValue & NodesInfoMetric.Plugins) != 0) list.Add("plugins"); + if ((enumValue & NodesInfoMetric.Ingest) != 0) list.Add("ingest"); + return string.Join(",", list); + } + + public static string GetStringValue(this NodesStatsMetric enumValue) + { + + if ((enumValue & NodesStatsMetric.All) != 0) return "_all"; + var list = new List(); + if ((enumValue & NodesStatsMetric.Breaker) != 0) list.Add("breaker"); + if ((enumValue & NodesStatsMetric.Fs) != 0) list.Add("fs"); + if ((enumValue & NodesStatsMetric.Http) != 0) list.Add("http"); + if ((enumValue & NodesStatsMetric.Indices) != 0) list.Add("indices"); + if ((enumValue & NodesStatsMetric.Jvm) != 0) list.Add("jvm"); + if ((enumValue & NodesStatsMetric.Os) != 0) list.Add("os"); + if ((enumValue & NodesStatsMetric.Process) != 0) list.Add("process"); + if ((enumValue & NodesStatsMetric.ThreadPool) != 0) list.Add("thread_pool"); + if ((enumValue & NodesStatsMetric.Transport) != 0) list.Add("transport"); + if ((enumValue & NodesStatsMetric.Discovery) != 0) list.Add("discovery"); + return string.Join(",", list); + } + + public static string GetStringValue(this NodesStatsIndexMetric enumValue) + { + + if ((enumValue & NodesStatsIndexMetric.All) != 0) return "_all"; + var list = new List(); + if ((enumValue & NodesStatsIndexMetric.Completion) != 0) list.Add("completion"); + if ((enumValue & NodesStatsIndexMetric.Docs) != 0) list.Add("docs"); + if ((enumValue & NodesStatsIndexMetric.Fielddata) != 0) list.Add("fielddata"); + if ((enumValue & NodesStatsIndexMetric.QueryCache) != 0) list.Add("query_cache"); + if ((enumValue & NodesStatsIndexMetric.Flush) != 0) list.Add("flush"); + if ((enumValue & NodesStatsIndexMetric.Get) != 0) list.Add("get"); + if ((enumValue & NodesStatsIndexMetric.Indexing) != 0) list.Add("indexing"); + if ((enumValue & NodesStatsIndexMetric.Merge) != 0) list.Add("merge"); + if ((enumValue & NodesStatsIndexMetric.Percolate) != 0) list.Add("percolate"); + if ((enumValue & NodesStatsIndexMetric.RequestCache) != 0) list.Add("request_cache"); + if ((enumValue & NodesStatsIndexMetric.Refresh) != 0) list.Add("refresh"); + if ((enumValue & NodesStatsIndexMetric.Search) != 0) list.Add("search"); + if ((enumValue & NodesStatsIndexMetric.Segments) != 0) list.Add("segments"); + if ((enumValue & NodesStatsIndexMetric.Store) != 0) list.Add("store"); + if ((enumValue & NodesStatsIndexMetric.Warmer) != 0) list.Add("warmer"); + if ((enumValue & NodesStatsIndexMetric.Suggest) != 0) list.Add("suggest"); + return string.Join(",", list); + } + + public static string GetStringValue(this WatcherStatsMetric enumValue) + { + + if ((enumValue & WatcherStatsMetric.All) != 0) return "_all"; + var list = new List(); + if ((enumValue & WatcherStatsMetric.QueuedWatches) != 0) list.Add("queued_watches"); + if ((enumValue & WatcherStatsMetric.PendingWatches) != 0) list.Add("pending_watches"); + return string.Join(",", list); + } + + private static readonly ConcurrentDictionary> EnumStringResolvers = + new ConcurrentDictionary>(); + + static KnownEnums() + { + EnumStringResolvers.TryAdd(typeof(Refresh), (e) => GetStringValue((Refresh)e)); + EnumStringResolvers.TryAdd(typeof(Bytes), (e) => GetStringValue((Bytes)e)); + EnumStringResolvers.TryAdd(typeof(Health), (e) => GetStringValue((Health)e)); + EnumStringResolvers.TryAdd(typeof(Size), (e) => GetStringValue((Size)e)); + EnumStringResolvers.TryAdd(typeof(Level), (e) => GetStringValue((Level)e)); + EnumStringResolvers.TryAdd(typeof(WaitForEvents), (e) => GetStringValue((WaitForEvents)e)); + EnumStringResolvers.TryAdd(typeof(WaitForStatus), (e) => GetStringValue((WaitForStatus)e)); + EnumStringResolvers.TryAdd(typeof(ExpandWildcards), (e) => GetStringValue((ExpandWildcards)e)); + EnumStringResolvers.TryAdd(typeof(DefaultOperator), (e) => GetStringValue((DefaultOperator)e)); + EnumStringResolvers.TryAdd(typeof(VersionType), (e) => GetStringValue((VersionType)e)); + EnumStringResolvers.TryAdd(typeof(Conflicts), (e) => GetStringValue((Conflicts)e)); + EnumStringResolvers.TryAdd(typeof(SearchType), (e) => GetStringValue((SearchType)e)); + EnumStringResolvers.TryAdd(typeof(SuggestMode), (e) => GetStringValue((SuggestMode)e)); + EnumStringResolvers.TryAdd(typeof(OpType), (e) => GetStringValue((OpType)e)); + EnumStringResolvers.TryAdd(typeof(Format), (e) => GetStringValue((Format)e)); + EnumStringResolvers.TryAdd(typeof(ThreadType), (e) => GetStringValue((ThreadType)e)); + EnumStringResolvers.TryAdd(typeof(PercolateFormat), (e) => GetStringValue((PercolateFormat)e)); + EnumStringResolvers.TryAdd(typeof(GroupBy), (e) => GetStringValue((GroupBy)e)); + EnumStringResolvers.TryAdd(typeof(ClusterStateMetric), (e) => GetStringValue((ClusterStateMetric)e)); + EnumStringResolvers.TryAdd(typeof(Feature), (e) => GetStringValue((Feature)e)); + EnumStringResolvers.TryAdd(typeof(IndicesStatsMetric), (e) => GetStringValue((IndicesStatsMetric)e)); + EnumStringResolvers.TryAdd(typeof(NodesInfoMetric), (e) => GetStringValue((NodesInfoMetric)e)); + EnumStringResolvers.TryAdd(typeof(NodesStatsMetric), (e) => GetStringValue((NodesStatsMetric)e)); + EnumStringResolvers.TryAdd(typeof(NodesStatsIndexMetric), (e) => GetStringValue((NodesStatsIndexMetric)e)); + EnumStringResolvers.TryAdd(typeof(WatcherStatsMetric), (e) => GetStringValue((WatcherStatsMetric)e)); + } + + public static string GetStringValue(this Enum e) + { + var type = e.GetType(); + var resolver = EnumStringResolvers.GetOrAdd(type, GetEnumStringResolver); + return resolver(e); + } + + private static Func GetEnumStringResolver(Type type) + { + var values = Enum.GetValues(type); + var dictionary = new EnumDictionary(values.Length); + + for (int index = 0; index < values.Length; index++) + { + var value = values.GetValue(index); +#if DOTNETCORE + var info = type.GetTypeInfo().GetDeclaredField(value.ToString()); +#else + var info = type.GetField(value.ToString()); +#endif + var da = (EnumMemberAttribute[])info.GetCustomAttributes(typeof(EnumMemberAttribute), false); + var stringValue = da.Length > 0 ? da[0].Value : Enum.GetName(type, value); + dictionary.Add((Enum)value, stringValue); + } + +#if DOTNETCORE + var isFlag = type.GetTypeInfo().GetCustomAttributes(typeof(FlagsAttribute), false).Any(); +#else + var isFlag = type.GetCustomAttributes(typeof(FlagsAttribute), false).Length > 0; +#endif + + return (e) => + { + if (isFlag) + { + var list = new List(); + foreach(var kv in dictionary) + { + if (e.HasFlag(kv.Key)) list.Add(kv.Value); + } + return string.Join(",", list); + } + else + { + return dictionary[e]; + } + }; + } + } +} \ No newline at end of file diff --git a/src/Elasticsearch.Net/Elasticsearch.Net.csproj b/src/Elasticsearch.Net/Elasticsearch.Net.csproj index 67e6418ea54..a9ab0cb6201 100644 --- a/src/Elasticsearch.Net/Elasticsearch.Net.csproj +++ b/src/Elasticsearch.Net/Elasticsearch.Net.csproj @@ -84,6 +84,7 @@ + @@ -129,4 +130,4 @@ - + \ No newline at end of file diff --git a/src/Elasticsearch.Net/Extensions/EnumExtensions.cs b/src/Elasticsearch.Net/Extensions/EnumExtensions.cs new file mode 100644 index 00000000000..58cb4dec1aa --- /dev/null +++ b/src/Elasticsearch.Net/Extensions/EnumExtensions.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Elasticsearch.Net +{ + public static class EnumExtensions + { + public static string GetStringValue(this HttpMethod enumValue) + { + switch (enumValue) + { + case HttpMethod.GET: return "GET"; + case HttpMethod.POST: return "POST"; + case HttpMethod.PUT: return "PUT"; + case HttpMethod.DELETE: return "DELETE"; + case HttpMethod.HEAD: return "HEAD"; + default: + throw new ArgumentOutOfRangeException(nameof(enumValue), enumValue, null); + } + } + } +} diff --git a/src/Elasticsearch.Net/Extensions/Extensions.cs b/src/Elasticsearch.Net/Extensions/Extensions.cs index 9a585724d44..63ba3d02294 100644 --- a/src/Elasticsearch.Net/Extensions/Extensions.cs +++ b/src/Elasticsearch.Net/Extensions/Extensions.cs @@ -1,45 +1,27 @@ -using System; -using System.Collections.Generic; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; using System.Globalization; -using System.Linq; -using System.Runtime.Serialization; -using System.Text; -#if DOTNETCORE -using System.Reflection; -#endif - -namespace Elasticsearch.Net -{ - internal static class Extensions - { - internal static string GetStringValue(this Enum enumValue) - { - var knownEnum = KnownEnums.Resolve(enumValue); - if (knownEnum != KnownEnums.UnknownEnum) return knownEnum; - - //TODO measure performance and cache - var type = enumValue.GetType(); -#if DOTNETCORE - var info = type.GetTypeInfo().GetDeclaredField(enumValue.ToString()); -#else - var info = type.GetField(enumValue.ToString()); -#endif - var da = (EnumMemberAttribute[])(info.GetCustomAttributes(typeof(EnumMemberAttribute), false)); - - return da.Length > 0 ? da[0].Value : Enum.GetName(enumValue.GetType(), enumValue); - } - -#if !DOTNETCORE +using System.Linq; +using System.Reflection; +using System.Runtime.Serialization; +using System.Text; + +namespace Elasticsearch.Net +{ + internal static class Extensions + { +#if !DOTNETCORE internal static string Utf8String(this byte[] bytes) => bytes == null ? null : Encoding.UTF8.GetString(bytes); -#else - internal static string Utf8String(this byte[] bytes) => bytes == null ? null : Encoding.UTF8.GetString(bytes, 0, bytes.Length); -#endif +#else + internal static string Utf8String(this byte[] bytes) => bytes == null ? null : Encoding.UTF8.GetString(bytes, 0, bytes.Length); +#endif internal static byte[] Utf8Bytes(this string s) { return s.IsNullOrEmpty() ? null : Encoding.UTF8.GetBytes(s); } - + internal static string ToCamelCase(this string s) { if (string.IsNullOrEmpty(s)) @@ -55,90 +37,90 @@ internal static string ToCamelCase(this string s) return camelCase; } - internal static string NotNull(this string @object, string parameterName) - { - @object.ThrowIfNull(parameterName); - if (string.IsNullOrWhiteSpace(@object)) - throw new ArgumentException("String argument is empty", parameterName); - return @object; - } - + internal static string NotNull(this string @object, string parameterName) + { + @object.ThrowIfNull(parameterName); + if (string.IsNullOrWhiteSpace(@object)) + throw new ArgumentException("String argument is empty", parameterName); + return @object; + } + internal static string NotNull(this Enum @object, string parameterName) { @object.ThrowIfNull(parameterName); return @object.GetStringValue(); } - internal static void ThrowIfEmpty(this IEnumerable @object, string parameterName) - { - @object.ThrowIfNull(parameterName); - if (!@object.Any()) - throw new ArgumentException("Argument can not be an empty collection", parameterName); - } - internal static bool HasAny(this IEnumerable list) - { - return list != null && list.Any(); - } - - internal static void ThrowIfNull(this T value, string name) - { - if (value == null) - throw new ArgumentNullException(name); - } - internal static bool IsNullOrEmpty(this string value) - { - return string.IsNullOrEmpty(value); - } - - internal static IEnumerable DistinctBy(this IEnumerable items, Func property) - { - return items.GroupBy(property).Select(x => x.First()); - } - - private static readonly long _week = (long)TimeSpan.FromDays(7).TotalMilliseconds; - private static readonly long _day = (long)TimeSpan.FromDays(1).TotalMilliseconds; - private static readonly long _hour = (long)TimeSpan.FromHours(1).TotalMilliseconds; - private static readonly long _minute = (long)TimeSpan.FromMinutes(1).TotalMilliseconds; + internal static void ThrowIfEmpty(this IEnumerable @object, string parameterName) + { + @object.ThrowIfNull(parameterName); + if (!@object.Any()) + throw new ArgumentException("Argument can not be an empty collection", parameterName); + } + internal static bool HasAny(this IEnumerable list) + { + return list != null && list.Any(); + } + + internal static void ThrowIfNull(this T value, string name) + { + if (value == null) + throw new ArgumentNullException(name); + } + internal static bool IsNullOrEmpty(this string value) + { + return string.IsNullOrEmpty(value); + } + + internal static IEnumerable DistinctBy(this IEnumerable items, Func property) + { + return items.GroupBy(property).Select(x => x.First()); + } + + private static readonly long _week = (long)TimeSpan.FromDays(7).TotalMilliseconds; + private static readonly long _day = (long)TimeSpan.FromDays(1).TotalMilliseconds; + private static readonly long _hour = (long)TimeSpan.FromHours(1).TotalMilliseconds; + private static readonly long _minute = (long)TimeSpan.FromMinutes(1).TotalMilliseconds; private static readonly long _second = (long)TimeSpan.FromSeconds(1).TotalMilliseconds; - internal static string ToTimeUnit(this TimeSpan timeSpan) - { - var ms = timeSpan.TotalMilliseconds; - string interval; - double factor = 0; - - if (ms >= _week) - { - factor = ms / _week; - interval = "w"; - } - else if (ms >= _day) - { - factor = ms / _day; - interval = "d"; - } - else if (ms >= _hour) - { - factor = ms / _hour; - interval = "h"; - } - else if (ms >= _minute) - { - factor = ms / _minute; - interval = "m"; - } - else if (ms >= _second) - { - factor = ms / _second; - interval = "s"; - } - else - { - factor = ms; - interval = "ms"; - } - - return factor.ToString("0.##", CultureInfo.InvariantCulture) + interval; - } - } -} + internal static string ToTimeUnit(this TimeSpan timeSpan) + { + var ms = timeSpan.TotalMilliseconds; + string interval; + double factor = 0; + + if (ms >= _week) + { + factor = ms / _week; + interval = "w"; + } + else if (ms >= _day) + { + factor = ms / _day; + interval = "d"; + } + else if (ms >= _hour) + { + factor = ms / _hour; + interval = "h"; + } + else if (ms >= _minute) + { + factor = ms / _minute; + interval = "m"; + } + else if (ms >= _second) + { + factor = ms / _second; + interval = "s"; + } + else + { + factor = ms; + interval = "ms"; + } + + return factor.ToString("0.##", CultureInfo.InvariantCulture) + interval; + } + } +} diff --git a/src/Nest/Aggregations/Pipeline/MovingAverage/MovingAverageAggregationJsonConverter.cs b/src/Nest/Aggregations/Pipeline/MovingAverage/MovingAverageAggregationJsonConverter.cs index ba89e563a66..a588b1f0737 100644 --- a/src/Nest/Aggregations/Pipeline/MovingAverage/MovingAverageAggregationJsonConverter.cs +++ b/src/Nest/Aggregations/Pipeline/MovingAverage/MovingAverageAggregationJsonConverter.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Elasticsearch.Net; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -34,7 +35,7 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist { aggregation.BucketsPath = default(SingleBucketsPath); } - + #else aggregation.BucketsPath = GetOrDefault("buckets_path", ps); #endif diff --git a/src/Nest/Analysis/Analyzers/LanguageAnalyzer.cs b/src/Nest/Analysis/Analyzers/LanguageAnalyzer.cs index 390e172e214..0e1323e00a2 100644 --- a/src/Nest/Analysis/Analyzers/LanguageAnalyzer.cs +++ b/src/Nest/Analysis/Analyzers/LanguageAnalyzer.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using Elasticsearch.Net; using Newtonsoft.Json; namespace Nest diff --git a/src/Nest/CommonAbstractions/Extensions/Extensions.cs b/src/Nest/CommonAbstractions/Extensions/Extensions.cs index b152962ab1d..b3100e6b13b 100644 --- a/src/Nest/CommonAbstractions/Extensions/Extensions.cs +++ b/src/Nest/CommonAbstractions/Extensions/Extensions.cs @@ -37,18 +37,6 @@ internal static TReturn InvokeOrDefault(this Func func?.Invoke(@default, param2) ?? @default; - internal static string GetStringValue(this Enum enumValue) - { - var knownEnum = KnownEnums.Resolve(enumValue); - if (knownEnum != KnownEnums.UnknownEnum) return knownEnum; - - var type = enumValue.GetType(); - var info = type.GetField(enumValue.ToString()); - var da = info.GetCustomAttribute(); - - return da != null ? da.Value : Enum.GetName(enumValue.GetType(), enumValue); - } - internal static readonly JsonConverter dateConverter = new IsoDateTimeConverter { Culture = CultureInfo.InvariantCulture }; internal static readonly JsonSerializer serializer = new JsonSerializer(); internal static string ToJsonNetString(this DateTime date) diff --git a/src/Nest/CommonAbstractions/Infer/Features/Features.cs b/src/Nest/CommonAbstractions/Infer/Features/Features.cs index 4093c1eea89..ad5b5e822b1 100644 --- a/src/Nest/CommonAbstractions/Infer/Features/Features.cs +++ b/src/Nest/CommonAbstractions/Infer/Features/Features.cs @@ -7,15 +7,15 @@ namespace Nest [JsonConverter(typeof(FeaturesJsonConverter))] public class Features : IUrlParameter { - string IUrlParameter.GetString(IConnectionConfigurationValues settings) => KnownEnums.Resolve(_enumValue); + string IUrlParameter.GetString(IConnectionConfigurationValues settings) => _enumValue.GetStringValue(); - private readonly Enum _enumValue; + private readonly Feature _enumValue; internal Features(Feature feature) { _enumValue = feature; } public static implicit operator Features(Feature feature) => new Features(feature); public static implicit operator Features(string features) => FromString(features); - + public static Features FromString(string features) { var parts = features.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); diff --git a/src/Nest/CommonAbstractions/Infer/Metrics/IndexMetrics.cs b/src/Nest/CommonAbstractions/Infer/Metrics/IndexMetrics.cs index 7715ef8a073..3d4dc0262d6 100644 --- a/src/Nest/CommonAbstractions/Infer/Metrics/IndexMetrics.cs +++ b/src/Nest/CommonAbstractions/Infer/Metrics/IndexMetrics.cs @@ -5,9 +5,9 @@ namespace Nest { public class IndexMetrics : IUrlParameter { - private readonly Enum _enumValue; + private readonly NodesStatsIndexMetric _enumValue; - public string GetString(IConnectionConfigurationValues settings) => KnownEnums.Resolve(this._enumValue); + public string GetString(IConnectionConfigurationValues settings) => this._enumValue.GetStringValue(); internal IndexMetrics(NodesStatsIndexMetric metric) { _enumValue = metric; } public static implicit operator IndexMetrics(NodesStatsIndexMetric metric) => new IndexMetrics(metric); diff --git a/src/Nest/CommonAbstractions/Infer/Metrics/Metrics.cs b/src/Nest/CommonAbstractions/Infer/Metrics/Metrics.cs index a1d2b483e0a..3d0690de1cb 100644 --- a/src/Nest/CommonAbstractions/Infer/Metrics/Metrics.cs +++ b/src/Nest/CommonAbstractions/Infer/Metrics/Metrics.cs @@ -7,7 +7,7 @@ public class Metrics : IUrlParameter { private readonly Enum _enumValue; - public string GetString(IConnectionConfigurationValues settings) => KnownEnums.Resolve(this._enumValue); + public string GetString(IConnectionConfigurationValues settings) => this._enumValue.GetStringValue(); internal Metrics(IndicesStatsMetric metric) { _enumValue = metric; } internal Metrics(NodesStatsMetric metric){ _enumValue = metric; } internal Metrics(NodesInfoMetric metric){ _enumValue = metric; } diff --git a/src/Nest/CommonOptions/DateMath/DateMath.cs b/src/Nest/CommonOptions/DateMath/DateMath.cs index fa405047c98..bd42c3daef7 100644 --- a/src/Nest/CommonOptions/DateMath/DateMath.cs +++ b/src/Nest/CommonOptions/DateMath/DateMath.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Text; using System.Text.RegularExpressions; +using Elasticsearch.Net; using Newtonsoft.Json; namespace Nest diff --git a/src/Nest/CommonOptions/Geo/DistanceJsonConverter.cs b/src/Nest/CommonOptions/Geo/DistanceJsonConverter.cs index 5f320b21cf6..9aa43bb19e3 100644 --- a/src/Nest/CommonOptions/Geo/DistanceJsonConverter.cs +++ b/src/Nest/CommonOptions/Geo/DistanceJsonConverter.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using Elasticsearch.Net; using Newtonsoft.Json; namespace Nest diff --git a/src/Nest/CommonOptions/TimeUnit/Time.cs b/src/Nest/CommonOptions/TimeUnit/Time.cs index ae6d4d30c3c..6ec12b359eb 100644 --- a/src/Nest/CommonOptions/TimeUnit/Time.cs +++ b/src/Nest/CommonOptions/TimeUnit/Time.cs @@ -1,6 +1,7 @@ using System; using System.Globalization; using System.Text.RegularExpressions; +using Elasticsearch.Net; using Newtonsoft.Json; namespace Nest diff --git a/src/Nest/Mapping/AttributeBased/ElasticsearchCorePropertyAttributeBase.cs b/src/Nest/Mapping/AttributeBased/ElasticsearchCorePropertyAttributeBase.cs index 1937a6eb42f..df73c11462d 100644 --- a/src/Nest/Mapping/AttributeBased/ElasticsearchCorePropertyAttributeBase.cs +++ b/src/Nest/Mapping/AttributeBased/ElasticsearchCorePropertyAttributeBase.cs @@ -1,5 +1,6 @@ using System; using System.Reflection; +using Elasticsearch.Net; using Newtonsoft.Json; namespace Nest diff --git a/src/Nest/Mapping/Types/Core/Number/NumberAttribute.cs b/src/Nest/Mapping/Types/Core/Number/NumberAttribute.cs index 6ef1480dd77..822d3e47932 100644 --- a/src/Nest/Mapping/Types/Core/Number/NumberAttribute.cs +++ b/src/Nest/Mapping/Types/Core/Number/NumberAttribute.cs @@ -1,4 +1,6 @@ -namespace Nest +using Elasticsearch.Net; + +namespace Nest { /// /// Maps a property as a number type. If no type is specified, diff --git a/src/Nest/Mapping/Types/Core/Number/NumberProperty.cs b/src/Nest/Mapping/Types/Core/Number/NumberProperty.cs index 13e35870922..801cc94cce4 100644 --- a/src/Nest/Mapping/Types/Core/Number/NumberProperty.cs +++ b/src/Nest/Mapping/Types/Core/Number/NumberProperty.cs @@ -1,4 +1,5 @@ using System; +using Elasticsearch.Net; using Newtonsoft.Json; namespace Nest diff --git a/src/Nest/QueryDsl/Specialized/Script/ScriptQuery.cs b/src/Nest/QueryDsl/Specialized/Script/ScriptQuery.cs index 3c2d9ea5a66..b896f9163cb 100644 --- a/src/Nest/QueryDsl/Specialized/Script/ScriptQuery.cs +++ b/src/Nest/QueryDsl/Specialized/Script/ScriptQuery.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using Elasticsearch.Net; using Newtonsoft.Json; namespace Nest diff --git a/src/Nest/QueryDsl/Visitor/DslPrettyPrintVisitor.cs b/src/Nest/QueryDsl/Visitor/DslPrettyPrintVisitor.cs index 0754e99c915..d9db738638b 100644 --- a/src/Nest/QueryDsl/Visitor/DslPrettyPrintVisitor.cs +++ b/src/Nest/QueryDsl/Visitor/DslPrettyPrintVisitor.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using Elasticsearch.Net; namespace Nest { diff --git a/src/Nest/Search/Search/Sort/SortDescriptor.cs b/src/Nest/Search/Search/Sort/SortDescriptor.cs index 540408c38b8..7c6ee45e5f6 100644 --- a/src/Nest/Search/Search/Sort/SortDescriptor.cs +++ b/src/Nest/Search/Search/Sort/SortDescriptor.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; +using Elasticsearch.Net; namespace Nest { @@ -25,7 +26,7 @@ public SortDescriptor() : base(new List()) { } public SortDescriptor Field(Field field, SortOrder order) => AddSort(new SortField { Field = field, Order = order }); - public SortDescriptor Field(Expression> field, SortOrder order) => + public SortDescriptor Field(Expression> field, SortOrder order) => AddSort(new SortField { Field = field, Order = order }); public SortDescriptor GeoDistance(Func, IGeoDistanceSort> sortSelector) => AddSort(sortSelector?.Invoke(new SortGeoDistanceDescriptor())); @@ -34,4 +35,4 @@ public SortDescriptor Field(Expression> field, SortOrder orde private SortDescriptor AddSort(ISort sort) => sort == null ? this : this.Assign(a => a.Add(sort)); } -} \ No newline at end of file +} diff --git a/src/Nest/XPack/Watcher/Action/ActionBase.cs b/src/Nest/XPack/Watcher/Action/ActionBase.cs index 0c7599cbcd4..9612cf17fea 100644 --- a/src/Nest/XPack/Watcher/Action/ActionBase.cs +++ b/src/Nest/XPack/Watcher/Action/ActionBase.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Elasticsearch.Net; using Newtonsoft.Json; using Newtonsoft.Json.Linq; diff --git a/src/Nest/XPack/Watcher/Schedule/Interval.cs b/src/Nest/XPack/Watcher/Schedule/Interval.cs index b51d5a736cd..ec459189cd3 100644 --- a/src/Nest/XPack/Watcher/Schedule/Interval.cs +++ b/src/Nest/XPack/Watcher/Schedule/Interval.cs @@ -2,6 +2,7 @@ using System.Globalization; using System.Runtime.Serialization; using System.Text.RegularExpressions; +using Elasticsearch.Net; using Newtonsoft.Json; using Newtonsoft.Json.Converters;