From 3d6244f076366bf6e06f1738ec1793bd09e198bc Mon Sep 17 00:00:00 2001 From: Steve Gordon Date: Thu, 4 Feb 2021 13:22:02 +0000 Subject: [PATCH] Implement URI parts ingest processor --- src/Nest/Ingest/ProcessorFormatter.cs | 7 ++ .../Ingest/Processors/UriPartsProcessor.cs | 97 +++++++++++++++++++ src/Nest/Ingest/ProcessorsDescriptor.cs | 4 + tests/Tests/Ingest/ProcessorAssertions.cs | 14 +++ 4 files changed, 122 insertions(+) create mode 100644 src/Nest/Ingest/Processors/UriPartsProcessor.cs diff --git a/src/Nest/Ingest/ProcessorFormatter.cs b/src/Nest/Ingest/ProcessorFormatter.cs index 62017dceda7..3ad481b1b55 100644 --- a/src/Nest/Ingest/ProcessorFormatter.cs +++ b/src/Nest/Ingest/ProcessorFormatter.cs @@ -46,6 +46,7 @@ internal class ProcessorFormatter : IJsonFormatter { "circle", 30 }, { "enrich", 31 }, { "csv", 32 }, + { "uri_parts", 33 } }; public IProcessor Deserialize(ref JsonReader reader, IJsonFormatterResolver formatterResolver) @@ -165,6 +166,9 @@ public IProcessor Deserialize(ref JsonReader reader, IJsonFormatterResolver form case 32: processor = Deserialize(ref reader, formatterResolver); break; + case 33: + processor = Deserialize(ref reader, formatterResolver); + break; } } else @@ -285,6 +289,9 @@ public void Serialize(ref JsonWriter writer, IProcessor value, IJsonFormatterRes case "circle": Serialize(ref writer, value, formatterResolver); break; + case "uri_parts": + Serialize(ref writer, value, formatterResolver); + break; default: var formatter = DynamicObjectResolver.ExcludeNullCamelCase.GetFormatter(); formatter.Serialize(ref writer, value, formatterResolver); diff --git a/src/Nest/Ingest/Processors/UriPartsProcessor.cs b/src/Nest/Ingest/Processors/UriPartsProcessor.cs new file mode 100644 index 00000000000..898056705ee --- /dev/null +++ b/src/Nest/Ingest/Processors/UriPartsProcessor.cs @@ -0,0 +1,97 @@ +// Licensed to Elasticsearch B.V under one or more agreements. +// Elasticsearch B.V licenses this file to you under the Apache 2.0 License. +// See the LICENSE file in the project root for more information + +using System; +using System.Linq.Expressions; +using System.Runtime.Serialization; +using Elasticsearch.Net.Utf8Json; + +namespace Nest +{ + [InterfaceDataContract] + public interface IUriPartsProcessor : IProcessor + { + /// + /// The field to decode + /// + [DataMember(Name = "field")] + Field Field { get; set; } + + /// + /// If true the processor copies the unparsed URI to .original. + /// + [DataMember(Name = "keep_original")] + bool? KeepOriginal { get; set; } + + /// + /// The field to assign the converted value to, by default is updated in-place + /// + [DataMember(Name = "target_field")] + Field TargetField { get; set; } + + /// + /// If true the processor removes the after parsing the URI string. + /// If parsing fails, the processor does not remove the . + /// + [DataMember(Name = "remove_if_successful")] + bool? RemoveIfSuccessful { get; set; } + } + + /// + public class UriPartsProcessor : ProcessorBase, IUriPartsProcessor + { + /// + [DataMember(Name = "field")] + public Field Field { get; set; } + + /// + [DataMember(Name = "keep_original")] + public bool? KeepOriginal { get; set; } + + /// + [DataMember(Name = "target_field")] + public Field TargetField { get; set; } + + /// + [DataMember(Name = "remove_if_successful")] + public bool? RemoveIfSuccessful { get; set; } + + protected override string Name => "uri_parts"; + } + + /// + public class UriPartsProcessorDescriptor + : ProcessorDescriptorBase, IUriPartsProcessor>, IUriPartsProcessor + where T : class + { + protected override string Name => "uri_parts"; + + Field IUriPartsProcessor.Field { get; set; } + bool? IUriPartsProcessor.KeepOriginal { get; set; } + Field IUriPartsProcessor.TargetField { get; set; } + bool? IUriPartsProcessor.RemoveIfSuccessful { get; set; } + + /// + public UriPartsProcessorDescriptor Field(Field field) => Assign(field, (a, v) => a.Field = v); + + /// + public UriPartsProcessorDescriptor Field(Expression> objectPath) => + Assign(objectPath, (a, v) => a.Field = v); + + /// + public UriPartsProcessorDescriptor TargetField(Field field) => Assign(field, (a, v) => a.TargetField = v); + + /// + public UriPartsProcessorDescriptor TargetField(Expression> objectPath) => + Assign(objectPath, (a, v) => a.TargetField = v); + + /// + public UriPartsProcessorDescriptor KeepOriginal(bool? keepOriginal = true) => + Assign(keepOriginal, (a, v) => a.KeepOriginal = v); + + /// + public UriPartsProcessorDescriptor RemoveIfSuccessful(bool? removeIfSuccessful = true) => + Assign(removeIfSuccessful, (a, v) => a.RemoveIfSuccessful = v); + } +} diff --git a/src/Nest/Ingest/ProcessorsDescriptor.cs b/src/Nest/Ingest/ProcessorsDescriptor.cs index 90b89f00c42..9793144d993 100644 --- a/src/Nest/Ingest/ProcessorsDescriptor.cs +++ b/src/Nest/Ingest/ProcessorsDescriptor.cs @@ -177,5 +177,9 @@ public ProcessorsDescriptor Pipeline(Func public ProcessorsDescriptor Circle(Func, ICircleProcessor> selector) where T : class => Assign(selector, (a, v) => a.AddIfNotNull(v?.Invoke(new CircleProcessorDescriptor()))); + + /// + public ProcessorsDescriptor UriParts(Func, IUriPartsProcessor> selector) where T : class => + Assign(selector, (a, v) => a.AddIfNotNull(v?.Invoke(new UriPartsProcessorDescriptor()))); } } diff --git a/tests/Tests/Ingest/ProcessorAssertions.cs b/tests/Tests/Ingest/ProcessorAssertions.cs index 2eddb6cec99..eab82b93620 100644 --- a/tests/Tests/Ingest/ProcessorAssertions.cs +++ b/tests/Tests/Ingest/ProcessorAssertions.cs @@ -702,5 +702,19 @@ public class Pipeline : ProcessorAssertion public override string Key => "pipeline"; } + + [SkipVersion("<7.11.0", "Uses URI parts which was introduced in 7.11.0")] + public class UriParts : ProcessorAssertion + { + public override Func>> Fluent => d => d + .UriParts(ud => ud + .Field(p => p.Description) + .KeepOriginal() + .RemoveIfSuccessful()); + + public override IProcessor Initializer => new UriPartsProcessor { Field = "description", KeepOriginal = true, RemoveIfSuccessful = true }; + public override object Json => new { field = "description", keep_original = true, remove_if_successful = true }; + public override string Key => "uri_parts"; + } } }