Skip to content

Commit 7f08d67

Browse files
Mpdreamzrusscam
authored andcommitted
fix #2683 allow inline definitions in the Analyze API
1 parent 0c784f4 commit 7f08d67

File tree

10 files changed

+744
-37
lines changed

10 files changed

+744
-37
lines changed

src/Nest/CommonAbstractions/Fluent/DescriptorBase.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,17 @@ protected DescriptorBase()
2525
/// </summary>
2626
[Browsable(false)]
2727
[EditorBrowsable(EditorBrowsableState.Never)]
28+
// ReSharper disable once BaseObjectEqualsIsObjectEquals
29+
//only used to hide by default
2830
public override bool Equals(object obj) => base.Equals(obj);
2931

3032
/// <summary>
3133
/// Hides the <see cref="GetHashCode"/> method.
3234
/// </summary>
3335
[Browsable(false)]
3436
[EditorBrowsable(EditorBrowsableState.Never)]
37+
// ReSharper disable once BaseObjectGetHashCodeCallInGetHashCode
38+
//only used to hide by default
3539
public override int GetHashCode() => base.GetHashCode();
3640

3741
/// <summary>
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using System;
2+
using System.ComponentModel;
3+
4+
namespace Nest
5+
{
6+
public interface ISelector { }
7+
8+
public abstract class SelectorBase<TInterface> : ISelector where TInterface : class
9+
{
10+
/// <summary>
11+
/// Hides the <see cref="Equals"/> method.
12+
/// </summary>
13+
[Browsable(false)]
14+
[EditorBrowsable(EditorBrowsableState.Never)]
15+
// ReSharper disable once BaseObjectEqualsIsObjectEquals
16+
//only used to hide by default
17+
public override bool Equals(object obj) => base.Equals(obj);
18+
19+
/// <summary>
20+
/// Hides the <see cref="GetHashCode"/> method.
21+
/// </summary>
22+
[Browsable(false)]
23+
[EditorBrowsable(EditorBrowsableState.Never)]
24+
// ReSharper disable once BaseObjectGetHashCodeCallInGetHashCode
25+
//only used to hide by default
26+
public override int GetHashCode() => base.GetHashCode();
27+
28+
/// <summary>
29+
/// Hides the <see cref="ToString"/> method.
30+
/// </summary>
31+
[Browsable(false)]
32+
[EditorBrowsable(EditorBrowsableState.Never)]
33+
public override string ToString() => base.ToString();
34+
}
35+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
using System;
2+
using System.Collections.Generic;
3+
4+
namespace Nest
5+
{
6+
public class AnalyzeCharFilters : List<Union<string, ICharFilter>>
7+
{
8+
public AnalyzeCharFilters() { }
9+
public AnalyzeCharFilters(List<Union<string, ICharFilter>> tokenFilters)
10+
{
11+
if (tokenFilters == null) return;
12+
foreach (var v in tokenFilters) this.AddIfNotNull(v);
13+
}
14+
public AnalyzeCharFilters(string[] tokenFilters)
15+
{
16+
if (tokenFilters == null) return;
17+
foreach (var v in tokenFilters) this.AddIfNotNull(v);
18+
}
19+
20+
public void Add(ICharFilter filter) => this.Add(new Union<string, ICharFilter>(filter));
21+
22+
public static implicit operator AnalyzeCharFilters(CharFilterBase tokenFilter) => tokenFilter == null ? null : new AnalyzeCharFilters { tokenFilter };
23+
public static implicit operator AnalyzeCharFilters(string tokenFilter) => tokenFilter == null ? null : new AnalyzeCharFilters { tokenFilter };
24+
public static implicit operator AnalyzeCharFilters(string[] tokenFilters) => tokenFilters == null ? null : new AnalyzeCharFilters(tokenFilters);
25+
}
26+
27+
public class AnalyzeCharFiltersDescriptor : DescriptorPromiseBase<AnalyzeCharFiltersDescriptor, AnalyzeCharFilters>
28+
{
29+
public AnalyzeCharFiltersDescriptor() : base(new AnalyzeCharFilters()) { }
30+
31+
/// <summary>
32+
/// A reference to a token filter that is part of the mapping
33+
/// </summary>
34+
public AnalyzeCharFiltersDescriptor Name(string tokenFilter) => Assign(a => a.AddIfNotNull(tokenFilter));
35+
36+
private AnalyzeCharFiltersDescriptor AssignIfNotNull(ICharFilter filter) =>
37+
Assign(a =>
38+
{
39+
if (filter != null) a.Add(filter);
40+
});
41+
42+
/// <summary>
43+
/// The pattern_replace char filter allows the use of a regex to manipulate the characters in a string before analysis.
44+
/// </summary>
45+
public AnalyzeCharFiltersDescriptor PatternReplace(Func<PatternReplaceCharFilterDescriptor, IPatternReplaceCharFilter> selector) =>
46+
AssignIfNotNull(selector?.Invoke(new PatternReplaceCharFilterDescriptor()));
47+
48+
/// <summary>
49+
/// A char filter of type html_strip stripping out HTML elements from an analyzed text.
50+
/// </summary>
51+
public AnalyzeCharFiltersDescriptor HtmlStrip(Func<HtmlStripCharFilterDescriptor, IHtmlStripCharFilter> selector = null) =>
52+
AssignIfNotNull(selector.InvokeOrDefault(new HtmlStripCharFilterDescriptor()));
53+
54+
/// <summary>
55+
/// A char filter of type mapping replacing characters of an analyzed text with given mapping.
56+
/// </summary>
57+
public AnalyzeCharFiltersDescriptor Mapping(Func<MappingCharFilterDescriptor, IMappingCharFilter> selector) =>
58+
AssignIfNotNull(selector?.Invoke(new MappingCharFilterDescriptor()));
59+
60+
/// <summary>
61+
/// The kuromoji_iteration_mark normalizes Japanese horizontal iteration marks (odoriji) to their expanded form.
62+
/// Part of the `analysis-kuromoji` plugin: https://www.elastic.co/guide/en/elasticsearch/plugins/current/analysis-kuromoji.html
63+
/// </summary>
64+
public AnalyzeCharFiltersDescriptor KuromojiIterationMark(Func<KuromojiIterationMarkCharFilterDescriptor, IKuromojiIterationMarkCharFilter> selector = null) =>
65+
AssignIfNotNull(selector?.InvokeOrDefault(new KuromojiIterationMarkCharFilterDescriptor()));
66+
67+
/// <summary>
68+
/// Normalizes as defined here: http://userguide.icu-project.org/transforms/normalization
69+
/// Part of the `analysis-icu` plugin: https://www.elastic.co/guide/en/elasticsearch/plugins/current/analysis-icu.html
70+
/// </summary>
71+
public AnalyzeCharFiltersDescriptor IcuNormalization(Func<IcuNormalizationCharFilterDescriptor, IIcuNormalizationCharFilter> selector) =>
72+
AssignIfNotNull(selector?.Invoke(new IcuNormalizationCharFilterDescriptor()));
73+
}
74+
}

src/Nest/Indices/Analyze/AnalyzeRequest.cs

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,19 @@ public partial interface IAnalyzeRequest
1111
{
1212
///<summary>The name of the analyzer to use</summary>
1313
[JsonProperty("analyzer")]
14-
string Analyzer { get; set; }
14+
Union<string, IAnalyzer> Analyzer { get; set; }
1515

1616
///<summary>The name of the normalizer to use</summary>
1717
[JsonProperty("normalizer")]
1818
string Normalizer { get; set; }
1919

2020
///<summary>A collection of character filters to use for the analysis</summary>
2121
[JsonProperty("char_filter")]
22-
string[] CharFilter { get; set; }
22+
AnalyzeCharFilters CharFilter { get; set; }
2323

2424
///<summary>A collection of filters to use for the analysis</summary>
2525
[JsonProperty("filter")]
26-
string[] Filter { get; set; }
26+
AnalyzeTokenFilters Filter { get; set; }
2727

2828
///<summary>Use the analyzer configured for this field (instead of passing the analyzer name)</summary>
2929
[JsonProperty("field")]
@@ -35,7 +35,7 @@ public partial interface IAnalyzeRequest
3535

3636
///<summary>The name of the tokenizer to use for the analysis</summary>
3737
[JsonProperty("tokenizer")]
38-
string Tokenizer { get; set; }
38+
Union<string, ITokenizer> Tokenizer { get; set; }
3939
}
4040

4141
public partial class AnalyzeRequest
@@ -47,56 +47,84 @@ public AnalyzeRequest(IndexName indices, string textToAnalyze)
4747
}
4848

4949
/// <inheritdoc />
50-
public string Analyzer { get; set; }
50+
public Union<string, ITokenizer> Tokenizer { get; set; }
51+
52+
/// <inheritdoc />
53+
public Union<string, IAnalyzer> Analyzer { get; set; }
5154

5255
/// <inheritdoc />
5356
public string Normalizer { get; set; }
5457

5558
/// <inheritdoc />
56-
public string[] CharFilter { get; set; }
59+
public AnalyzeCharFilters CharFilter { get; set; }
5760

5861
/// <inheritdoc />
59-
public string[] Filter { get; set; }
62+
public AnalyzeTokenFilters Filter { get; set; }
6063

6164
/// <inheritdoc />
6265
public Field Field { get; set; }
6366

6467
/// <inheritdoc />
6568
public string[] Text { get; set; }
6669

67-
/// <inheritdoc />
68-
public string Tokenizer { get; set; }
6970
}
7071

7172
[DescriptorFor("IndicesAnalyze")]
7273
public partial class AnalyzeDescriptor
7374
{
74-
string IAnalyzeRequest.Analyzer { get; set; }
75+
Union<string, ITokenizer> IAnalyzeRequest.Tokenizer { get; set; }
76+
Union<string, IAnalyzer> IAnalyzeRequest.Analyzer { get; set; }
7577
string IAnalyzeRequest.Normalizer { get; set; }
76-
string[] IAnalyzeRequest.CharFilter { get; set; }
77-
string[] IAnalyzeRequest.Filter { get; set; }
78+
AnalyzeCharFilters IAnalyzeRequest.CharFilter { get; set; }
79+
AnalyzeTokenFilters IAnalyzeRequest.Filter { get; set; }
7880
Field IAnalyzeRequest.Field { get; set; }
7981
string[] IAnalyzeRequest.Text { get; set; }
80-
string IAnalyzeRequest.Tokenizer { get; set; }
82+
83+
///<summary>The name of the tokenizer to use for the analysis</summary>
84+
public AnalyzeDescriptor Tokenizer(string tokenizer) => Assign(a => a.Tokenizer = tokenizer);
85+
86+
///<summary>An inline definition of a tokenizer</summary>
87+
public AnalyzeDescriptor Tokenizer(Func<AnalyzeTokenizersSelector, ITokenizer> tokenizer) =>
88+
Assign(a =>
89+
{
90+
var v = tokenizer?.Invoke(new AnalyzeTokenizersSelector());
91+
if (v != null) a.Tokenizer = new Union<string, ITokenizer>(v);
92+
});
8193

8294
///<summary>The name of the analyzer to use</summary>
8395
public AnalyzeDescriptor Analyzer(string analyser) => Assign(a => a.Analyzer = analyser);
8496

8597
///<summary>The name of the normalizer to use</summary>
8698
public AnalyzeDescriptor Normalizer(string normalizer) => Assign(a => a.Normalizer = normalizer);
8799

100+
///<summary>An inline definition of an analyzer</summary>
101+
public AnalyzeDescriptor Analyzer(Func<AnalyzersDescriptor, IAnalyzer> analyzer) =>
102+
Assign(a =>
103+
{
104+
var v = analyzer?.Invoke(new AnalyzersDescriptor());
105+
if (v != null) a.Analyzer = new Union<string, IAnalyzer>(v);
106+
});
107+
88108
///<summary>A collection of character filters to use for the analysis</summary>
89109
public AnalyzeDescriptor CharFilter(params string[] charFilter) => Assign(a => a.CharFilter = charFilter);
90110

91111
///<summary>A collection of character filters to use for the analysis</summary>
92112
public AnalyzeDescriptor CharFilter(IEnumerable<string> charFilter) => Assign(a => a.CharFilter = charFilter.ToArray());
93113

114+
///<summary>A collection of character filters to use for the analysis</summary>
115+
public AnalyzeDescriptor CharFilter(Func<AnalyzeCharFiltersDescriptor, IPromise<AnalyzeCharFilters>> charFilters) =>
116+
Assign(a => a.CharFilter = charFilters?.Invoke(new AnalyzeCharFiltersDescriptor())?.Value);
117+
94118
///<summary>A collection of filters to use for the analysis</summary>
95119
public AnalyzeDescriptor Filter(params string[] filter) => Assign(a => a.Filter = filter);
96120

97121
///<summary>A collection of filters to use for the analysis</summary>
98122
public AnalyzeDescriptor Filter(IEnumerable<string> filter) => Assign(a => a.Filter = filter.ToArray());
99123

124+
///<summary>A collection of filters to use for the analysis</summary>
125+
public AnalyzeDescriptor Filter(Func<AnalyzeTokenFiltersDescriptor, IPromise<AnalyzeTokenFilters>> tokenFilters) =>
126+
Assign(a => a.Filter = tokenFilters?.Invoke(new AnalyzeTokenFiltersDescriptor())?.Value);
127+
100128
///<summary>Use the analyzer configured for this field (instead of passing the analyzer name)</summary>
101129
public AnalyzeDescriptor Field(Field field) => Assign(a => a.Field = field);
102130

@@ -109,7 +137,5 @@ public partial class AnalyzeDescriptor
109137
///<summary>The text on which the analysis should be performed</summary>
110138
public AnalyzeDescriptor Text(IEnumerable<string> text) => Assign(a => a.Text = text.ToArray());
111139

112-
///<summary>The name of the tokenizer to use for the analysis</summary>
113-
public AnalyzeDescriptor Tokenizer(string tokenizer) => Assign(a => a.Tokenizer = tokenizer);
114140
}
115141
}

0 commit comments

Comments
 (0)