Skip to content

Commit 7595ff3

Browse files
committed
Add support for condition token filter elastic/elasticseach#31958
1 parent 05ade62 commit 7595ff3

File tree

3 files changed

+96
-0
lines changed

3 files changed

+96
-0
lines changed
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using Newtonsoft.Json;
4+
5+
namespace Nest
6+
{
7+
/// <summary>
8+
/// The conditional token filter takes a predicate script and a list of subfilters, and
9+
/// only applies the subfilters to the current token if it matches the predicate.
10+
/// </summary>
11+
public interface IConditionTokenFilter : ITokenFilter
12+
{
13+
/// <summary>
14+
/// a predicate script that determines whether or not the filters will be applied
15+
/// to the current token. Note that only inline scripts are supported
16+
/// </summary>
17+
[JsonProperty("script")]
18+
IScript Script { get; set; }
19+
20+
/// <summary>
21+
///a chain of token filters to apply to the current token if the predicate
22+
/// matches. These can be any token filters defined elsewhere in the index mappings.
23+
/// </summary>
24+
[JsonProperty("filter")]
25+
IEnumerable<string> Filters { get; set; }
26+
}
27+
28+
/// <inheritdoc cref="IConditionTokenFilter" />
29+
public class ConditionTokenFilter : TokenFilterBase, IConditionTokenFilter
30+
{
31+
public ConditionTokenFilter() : base("condition") { }
32+
33+
/// <inheritdoc cref="IConditionTokenFilter.Script" />
34+
public IScript Script { get; set; }
35+
36+
/// <inheritdoc cref="IConditionTokenFilter.Filters" />
37+
public IEnumerable<string> Filters { get; set; }
38+
}
39+
40+
/// <inheritdoc cref="IConditionTokenFilter" />
41+
public class ConditionTokenFilterDescriptor
42+
: TokenFilterDescriptorBase<ConditionTokenFilterDescriptor, IConditionTokenFilter>, IConditionTokenFilter
43+
{
44+
protected override string Type => "condition";
45+
46+
IScript IConditionTokenFilter.Script { get; set; }
47+
IEnumerable<string> IConditionTokenFilter.Filters { get; set; }
48+
49+
/// <inheritdoc cref="IConditionTokenFilter.Script" />
50+
public ConditionTokenFilterDescriptor Script(Func<ScriptDescriptor, IScript> scriptSelector) =>
51+
Assign(a => a.Script = scriptSelector?.Invoke(new ScriptDescriptor()));
52+
53+
/// <inheritdoc cref="IConditionTokenFilter.Script" />
54+
public ConditionTokenFilterDescriptor Script(string predicate) =>
55+
Assign(a => a.Script = new InlineScript(predicate));
56+
57+
/// <inheritdoc cref="IConditionTokenFilter.Filters" />
58+
public ConditionTokenFilterDescriptor Filters(params string[] filters) =>
59+
Assign(a => a.Filters = filters);
60+
61+
/// <inheritdoc cref="IConditionTokenFilter.Filters" />
62+
public ConditionTokenFilterDescriptor Filters(IEnumerable<string> filters) =>
63+
Assign(a => a.Filters = filters);
64+
65+
}
66+
}

src/Nest/Analysis/TokenFilters/TokenFilters.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,10 @@ public TokenFiltersDescriptor Standard(string name, Func<StandardTokenFilterDesc
223223
public TokenFiltersDescriptor Stemmer(string name, Func<StemmerTokenFilterDescriptor, IStemmerTokenFilter> selector) =>
224224
Assign(name, selector?.Invoke(new StemmerTokenFilterDescriptor()));
225225

226+
/// <inheritdoc cref="IConditionTokenFilter" />
227+
public TokenFiltersDescriptor Condition(string name, Func<ConditionTokenFilterDescriptor, IConditionTokenFilter> selector) =>
228+
Assign(name, selector?.Invoke(new ConditionTokenFilterDescriptor()));
229+
226230
/// <summary>
227231
/// Overrides stemming algorithms, by applying a custom mapping, then protecting these terms from being modified by stemmers. Must be placed
228232
/// before any stemming filters.

src/Tests/Tests/Analysis/TokenFilters/TokenFilterTests.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -894,6 +894,32 @@ public class NoriPartOfSpeechTests : TokenFilterAssertionBase<NoriPartOfSpeechTe
894894
public override string Name => "nori_pos";
895895
}
896896

897+
[SkipVersion("<6.5.0", "Introduced in 6.5.0")]
898+
public class ConditionTests : TokenFilterAssertionBase<ConditionTests>
899+
{
900+
private readonly string _predicate = "token.getTerm().length() < 5";
901+
902+
public override FuncTokenFilters Fluent => (n, tf) => tf
903+
.Condition(n, t => t
904+
.Filters("lowercase", "lowercase, porter_stem")
905+
.Script(_predicate)
906+
);
907+
908+
public override ITokenFilter Initializer => new ConditionTokenFilter
909+
{
910+
Filters = new[] { "lowercase", "lowercase, porter_stem" },
911+
Script = new InlineScript(_predicate)
912+
};
913+
914+
public override object Json => new
915+
{
916+
filters = new[] { "lowercase", "lowercase, porter_stem" },
917+
script = new { source = _predicate }
918+
};
919+
920+
public override string Name => "multiplexer";
921+
}
922+
897923
[SkipVersion("<6.4.0", "Introduced in 6.4.0")]
898924
public class MultiplexerTests : TokenFilterAssertionBase<PhoneticTests>
899925
{

0 commit comments

Comments
 (0)