Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion src/Nest/Ingest/ProcessorFormatter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@ internal class ProcessorFormatter : IJsonFormatter<IProcessor>
{ "circle", 30 },
{ "enrich", 31 },
{ "csv", 32 },
{ "uri_parts", 33 }
{ "uri_parts", 33 },
{ "fingerprint", 34 }
};

public IProcessor Deserialize(ref JsonReader reader, IJsonFormatterResolver formatterResolver)
Expand Down Expand Up @@ -169,6 +170,9 @@ public IProcessor Deserialize(ref JsonReader reader, IJsonFormatterResolver form
case 33:
processor = Deserialize<UriPartsProcessor>(ref reader, formatterResolver);
break;
case 34:
processor = Deserialize<FingerprintProcessor>(ref reader, formatterResolver);
break;
}
}
else
Expand Down Expand Up @@ -292,6 +296,9 @@ public void Serialize(ref JsonWriter writer, IProcessor value, IJsonFormatterRes
case "uri_parts":
Serialize<IUriPartsProcessor>(ref writer, value, formatterResolver);
break;
case "fingerprint":
Serialize<IFingerprintProcessor>(ref writer, value, formatterResolver);
break;
default:
var formatter = DynamicObjectResolver.ExcludeNullCamelCase.GetFormatter<IProcessor>();
formatter.Serialize(ref writer, value, formatterResolver);
Expand Down
87 changes: 87 additions & 0 deletions src/Nest/Ingest/Processors/FingerprintProcessor.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
using System;
using System.Linq.Expressions;
using System.Runtime.Serialization;
using Elasticsearch.Net.Utf8Json;

namespace Nest
{
[InterfaceDataContract]
public interface IFingerprintProcessor : IProcessor
{
[DataMember(Name = "fields")]
Fields Fields { get; set; }

[DataMember(Name = "ignore_missing")]
bool? IgnoreMissing { get; set; }

[DataMember(Name = "method")]
string Method { get; set; }

[DataMember(Name = "salt")]
string Salt { get; set; }

[DataMember(Name = "target_field")]
Field TargetField { get; set; }
}

public class FingerprintProcessor : ProcessorBase, IFingerprintProcessor
{
protected override string Name => "fingerprint";

/// <inheritdoc />
public Fields Fields { get; set; }

/// <inheritdoc />
public bool? IgnoreMissing { get; set; }

/// <inheritdoc />
public string Method { get; set; }

/// <inheritdoc />
public string Salt { get; set; }

/// <inheritdoc />
public Field TargetField { get; set; }
}

/// <inheritdoc cref="IFingerprintProcessor" />
public class FingerprintProcessorDescriptor<T>
: ProcessorDescriptorBase<FingerprintProcessorDescriptor<T>, IFingerprintProcessor>, IFingerprintProcessor
where T : class
{
protected override string Name => "fingerprint";

Fields IFingerprintProcessor.Fields { get; set; }

string IFingerprintProcessor.Method { get; set; }

string IFingerprintProcessor.Salt { get; set; }

Field IFingerprintProcessor.TargetField { get; set; }

bool? IFingerprintProcessor.IgnoreMissing { get; set; }

/// <inheritdoc cref="IFingerprintProcessor.Fields" />
public FingerprintProcessorDescriptor<T> Fields(Fields fields) => Assign(fields, (a, v) => a.Fields = v);

/// <inheritdoc cref="IFingerprintProcessor.Fields" />
public FingerprintProcessorDescriptor<T> Fields(Func<FieldsDescriptor<T>, IPromise<Fields>> selector) =>
Assign(selector, (a, v) => a.Fields = v?.Invoke(new FieldsDescriptor<T>())?.Value);

/// <inheritdoc cref="IFingerprintProcessor.IgnoreMissing" />
public FingerprintProcessorDescriptor<T> IgnoreMissing(bool? ignoreMissing = true) => Assign(ignoreMissing, (a, v) => a.IgnoreMissing = v);

/// <inheritdoc cref="IFingerprintProcessor.Method" />
public FingerprintProcessorDescriptor<T> Method(string method) => Assign(method, (a, v) => a.Method = v);

/// <inheritdoc cref="IFingerprintProcessor.Salt" />
public FingerprintProcessorDescriptor<T> Salt(string salt) => Assign(salt, (a, v) => a.Salt = v);

/// <inheritdoc cref="IFingerprintProcessor.TargetField" />
public FingerprintProcessorDescriptor<T> TargetField(Field field) => Assign(field, (a, v) => a.TargetField = v);

/// <inheritdoc cref="IFingerprintProcessor.TargetField" />
public FingerprintProcessorDescriptor<T> TargetField<TValue>(Expression<Func<T, TValue>> objectPath) =>
Assign(objectPath, (a, v) => a.TargetField = v);
}
}
4 changes: 4 additions & 0 deletions src/Nest/Ingest/ProcessorsDescriptor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -181,5 +181,9 @@ public ProcessorsDescriptor Circle<T>(Func<CircleProcessorDescriptor<T>, ICircle
/// <inheritdoc cref="IUriPartsProcessor"/>
public ProcessorsDescriptor UriParts<T>(Func<UriPartsProcessorDescriptor<T>, IUriPartsProcessor> selector) where T : class =>
Assign(selector, (a, v) => a.AddIfNotNull(v?.Invoke(new UriPartsProcessorDescriptor<T>())));

/// <inheritdoc cref="IFingerprintProcessor"/>
public ProcessorsDescriptor Fingerprint<T>(Func<FingerprintProcessorDescriptor<T>, IFingerprintProcessor> selector) where T : class =>
Assign(selector, (a, v) => a.AddIfNotNull(v?.Invoke(new FingerprintProcessorDescriptor<T>())));
}
}
16 changes: 16 additions & 0 deletions tests/Tests/Ingest/ProcessorAssertions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -716,5 +716,21 @@ public class UriParts : ProcessorAssertion
public override object Json => new { field = "description", keep_original = true, remove_if_successful = true };
public override string Key => "uri_parts";
}

[SkipVersion("<7.12.0", "Uses fingerprint processor which was introduced in 7.12.0")]
public class Fingerprint : ProcessorAssertion
{
public override Func<ProcessorsDescriptor, IPromise<IList<IProcessor>>> Fluent => d => d
.Fingerprint<Project>(ud => ud
.Fields(p => p.Fields(f => f.Labels))
.Method("MD5")
.Salt("ThisIsASalt!")
.TargetField(p => p.Description)
.IgnoreMissing());

public override IProcessor Initializer => new FingerprintProcessor { Fields = "labels", Method = "MD5", Salt = "ThisIsASalt!", TargetField = "description", IgnoreMissing = true };
public override object Json => new { fields = new[] { "labels" }, method = "MD5", salt = "ThisIsASalt!", target_field = "description", ignore_missing = true };
public override string Key => "fingerprint";
}
}
}