Skip to content

Commit d88ece1

Browse files
Add Fingerprint ingest processor (#5345) (#5346)
Co-authored-by: Steve Gordon <sgordon@hotmail.co.uk>
1 parent 0329ebb commit d88ece1

File tree

4 files changed

+115
-1
lines changed

4 files changed

+115
-1
lines changed

src/Nest/Ingest/ProcessorFormatter.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ internal class ProcessorFormatter : IJsonFormatter<IProcessor>
4646
{ "circle", 30 },
4747
{ "enrich", 31 },
4848
{ "csv", 32 },
49-
{ "uri_parts", 33 }
49+
{ "uri_parts", 33 },
50+
{ "fingerprint", 34 }
5051
};
5152

5253
public IProcessor Deserialize(ref JsonReader reader, IJsonFormatterResolver formatterResolver)
@@ -169,6 +170,9 @@ public IProcessor Deserialize(ref JsonReader reader, IJsonFormatterResolver form
169170
case 33:
170171
processor = Deserialize<UriPartsProcessor>(ref reader, formatterResolver);
171172
break;
173+
case 34:
174+
processor = Deserialize<FingerprintProcessor>(ref reader, formatterResolver);
175+
break;
172176
}
173177
}
174178
else
@@ -292,6 +296,9 @@ public void Serialize(ref JsonWriter writer, IProcessor value, IJsonFormatterRes
292296
case "uri_parts":
293297
Serialize<IUriPartsProcessor>(ref writer, value, formatterResolver);
294298
break;
299+
case "fingerprint":
300+
Serialize<IFingerprintProcessor>(ref writer, value, formatterResolver);
301+
break;
295302
default:
296303
var formatter = DynamicObjectResolver.ExcludeNullCamelCase.GetFormatter<IProcessor>();
297304
formatter.Serialize(ref writer, value, formatterResolver);
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
using System;
2+
using System.Linq.Expressions;
3+
using System.Runtime.Serialization;
4+
using Elasticsearch.Net.Utf8Json;
5+
6+
namespace Nest
7+
{
8+
[InterfaceDataContract]
9+
public interface IFingerprintProcessor : IProcessor
10+
{
11+
[DataMember(Name = "fields")]
12+
Fields Fields { get; set; }
13+
14+
[DataMember(Name = "ignore_missing")]
15+
bool? IgnoreMissing { get; set; }
16+
17+
[DataMember(Name = "method")]
18+
string Method { get; set; }
19+
20+
[DataMember(Name = "salt")]
21+
string Salt { get; set; }
22+
23+
[DataMember(Name = "target_field")]
24+
Field TargetField { get; set; }
25+
}
26+
27+
public class FingerprintProcessor : ProcessorBase, IFingerprintProcessor
28+
{
29+
protected override string Name => "fingerprint";
30+
31+
/// <inheritdoc />
32+
public Fields Fields { get; set; }
33+
34+
/// <inheritdoc />
35+
public bool? IgnoreMissing { get; set; }
36+
37+
/// <inheritdoc />
38+
public string Method { get; set; }
39+
40+
/// <inheritdoc />
41+
public string Salt { get; set; }
42+
43+
/// <inheritdoc />
44+
public Field TargetField { get; set; }
45+
}
46+
47+
/// <inheritdoc cref="IFingerprintProcessor" />
48+
public class FingerprintProcessorDescriptor<T>
49+
: ProcessorDescriptorBase<FingerprintProcessorDescriptor<T>, IFingerprintProcessor>, IFingerprintProcessor
50+
where T : class
51+
{
52+
protected override string Name => "fingerprint";
53+
54+
Fields IFingerprintProcessor.Fields { get; set; }
55+
56+
string IFingerprintProcessor.Method { get; set; }
57+
58+
string IFingerprintProcessor.Salt { get; set; }
59+
60+
Field IFingerprintProcessor.TargetField { get; set; }
61+
62+
bool? IFingerprintProcessor.IgnoreMissing { get; set; }
63+
64+
/// <inheritdoc cref="IFingerprintProcessor.Fields" />
65+
public FingerprintProcessorDescriptor<T> Fields(Fields fields) => Assign(fields, (a, v) => a.Fields = v);
66+
67+
/// <inheritdoc cref="IFingerprintProcessor.Fields" />
68+
public FingerprintProcessorDescriptor<T> Fields(Func<FieldsDescriptor<T>, IPromise<Fields>> selector) =>
69+
Assign(selector, (a, v) => a.Fields = v?.Invoke(new FieldsDescriptor<T>())?.Value);
70+
71+
/// <inheritdoc cref="IFingerprintProcessor.IgnoreMissing" />
72+
public FingerprintProcessorDescriptor<T> IgnoreMissing(bool? ignoreMissing = true) => Assign(ignoreMissing, (a, v) => a.IgnoreMissing = v);
73+
74+
/// <inheritdoc cref="IFingerprintProcessor.Method" />
75+
public FingerprintProcessorDescriptor<T> Method(string method) => Assign(method, (a, v) => a.Method = v);
76+
77+
/// <inheritdoc cref="IFingerprintProcessor.Salt" />
78+
public FingerprintProcessorDescriptor<T> Salt(string salt) => Assign(salt, (a, v) => a.Salt = v);
79+
80+
/// <inheritdoc cref="IFingerprintProcessor.TargetField" />
81+
public FingerprintProcessorDescriptor<T> TargetField(Field field) => Assign(field, (a, v) => a.TargetField = v);
82+
83+
/// <inheritdoc cref="IFingerprintProcessor.TargetField" />
84+
public FingerprintProcessorDescriptor<T> TargetField<TValue>(Expression<Func<T, TValue>> objectPath) =>
85+
Assign(objectPath, (a, v) => a.TargetField = v);
86+
}
87+
}

src/Nest/Ingest/ProcessorsDescriptor.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,5 +181,9 @@ public ProcessorsDescriptor Circle<T>(Func<CircleProcessorDescriptor<T>, ICircle
181181
/// <inheritdoc cref="IUriPartsProcessor"/>
182182
public ProcessorsDescriptor UriParts<T>(Func<UriPartsProcessorDescriptor<T>, IUriPartsProcessor> selector) where T : class =>
183183
Assign(selector, (a, v) => a.AddIfNotNull(v?.Invoke(new UriPartsProcessorDescriptor<T>())));
184+
185+
/// <inheritdoc cref="IFingerprintProcessor"/>
186+
public ProcessorsDescriptor Fingerprint<T>(Func<FingerprintProcessorDescriptor<T>, IFingerprintProcessor> selector) where T : class =>
187+
Assign(selector, (a, v) => a.AddIfNotNull(v?.Invoke(new FingerprintProcessorDescriptor<T>())));
184188
}
185189
}

tests/Tests/Ingest/ProcessorAssertions.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -716,5 +716,21 @@ public class UriParts : ProcessorAssertion
716716
public override object Json => new { field = "description", keep_original = true, remove_if_successful = true };
717717
public override string Key => "uri_parts";
718718
}
719+
720+
[SkipVersion("<7.12.0", "Uses fingerprint processor which was introduced in 7.12.0")]
721+
public class Fingerprint : ProcessorAssertion
722+
{
723+
public override Func<ProcessorsDescriptor, IPromise<IList<IProcessor>>> Fluent => d => d
724+
.Fingerprint<Project>(ud => ud
725+
.Fields(p => p.Fields(f => f.Labels))
726+
.Method("MD5")
727+
.Salt("ThisIsASalt!")
728+
.TargetField(p => p.Description)
729+
.IgnoreMissing());
730+
731+
public override IProcessor Initializer => new FingerprintProcessor { Fields = "labels", Method = "MD5", Salt = "ThisIsASalt!", TargetField = "description", IgnoreMissing = true };
732+
public override object Json => new { fields = new[] { "labels" }, method = "MD5", salt = "ThisIsASalt!", target_field = "description", ignore_missing = true };
733+
public override string Key => "fingerprint";
734+
}
719735
}
720736
}

0 commit comments

Comments
 (0)