Skip to content

Commit 35d80a8

Browse files
codebrainrusscam
authored andcommitted
Add Circle processor (#4161)
* Implement circle processor. * Make parameters nullable. (cherry picked from commit a1b5c7e)
1 parent aaa3138 commit 35d80a8

File tree

5 files changed

+157
-0
lines changed

5 files changed

+157
-0
lines changed

src/Nest/Ingest/ProcessorFormatter.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ internal class ProcessorFormatter : IJsonFormatter<IProcessor>
3939
{ "set_security_user", 27 },
4040
{ "pipeline", 28 },
4141
{ "drop", 29 },
42+
{ "circle", 30 },
4243
};
4344

4445
public IProcessor Deserialize(ref JsonReader reader, IJsonFormatterResolver formatterResolver)
@@ -149,6 +150,9 @@ public IProcessor Deserialize(ref JsonReader reader, IJsonFormatterResolver form
149150
case 29:
150151
processor = Deserialize<DropProcessor>(ref reader, formatterResolver);
151152
break;
153+
case 30:
154+
processor = Deserialize<CircleProcessor>(ref reader, formatterResolver);
155+
break;
152156
}
153157
}
154158
else
@@ -260,6 +264,9 @@ public void Serialize(ref JsonWriter writer, IProcessor value, IJsonFormatterRes
260264
case "drop":
261265
Serialize<IDropProcessor>(ref writer, value, formatterResolver);
262266
break;
267+
case "circle":
268+
Serialize<ICircleProcessor>(ref writer, value, formatterResolver);
269+
break;
263270
default:
264271
var formatter = DynamicObjectResolver.ExcludeNullCamelCase.GetFormatter<IProcessor>();
265272
formatter.Serialize(ref writer, value, formatterResolver);
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq.Expressions;
4+
using System.Runtime.Serialization;
5+
using Elasticsearch.Net;
6+
using Elasticsearch.Net.Utf8Json;
7+
8+
namespace Nest
9+
{
10+
[StringEnum]
11+
public enum ShapeType
12+
{
13+
[EnumMember(Value = "geo_shape")]
14+
GeoShape,
15+
16+
[EnumMember(Value = "shape")]
17+
Shape
18+
}
19+
20+
[InterfaceDataContract]
21+
public interface ICircleProcessor : IProcessor
22+
{
23+
/// <summary>
24+
/// The string-valued field to trim whitespace from.
25+
/// </summary>
26+
[DataMember(Name ="field")]
27+
Field Field { get; set; }
28+
29+
/// <summary>
30+
/// The field to assign the polygon shape to, by default field is updated in-place.
31+
/// </summary>
32+
[DataMember(Name ="target_field")]
33+
Field TargetField { get; set; }
34+
35+
/// <summary>
36+
/// If true and field does not exist, the processor quietly exits without modifying the document.
37+
/// </summary>
38+
[DataMember(Name = "ignore_missing")]
39+
bool? IgnoreMissing { get; set; }
40+
41+
/// <summary>
42+
/// The difference between the resulting inscribed distance from center to side and the circle’s radius
43+
/// (measured in meters for geo_shape, unit-less for shape)
44+
/// </summary>
45+
[DataMember(Name = "error_distance")]
46+
double? ErrorDistance { get; set; }
47+
48+
/// <summary>
49+
/// Which field mapping type is to be used when processing the circle.
50+
/// </summary>
51+
[DataMember(Name = "shape_type")]
52+
ShapeType? ShapeType { get; set; }
53+
}
54+
55+
public class CircleProcessor : ProcessorBase, ICircleProcessor
56+
{
57+
/// <inheritdoc />
58+
public Field Field { get; set; }
59+
60+
/// <inheritdoc />
61+
public Field TargetField { get; set; }
62+
63+
/// <inheritdoc />
64+
public bool? IgnoreMissing { get; set; }
65+
66+
/// <inheritdoc />
67+
public double? ErrorDistance { get; set; }
68+
69+
/// <inheritdoc />
70+
public ShapeType? ShapeType { get; set; }
71+
72+
/// <inheritdoc />
73+
protected override string Name => "circle";
74+
}
75+
76+
public class CircleProcessorDescriptor<T>
77+
: ProcessorDescriptorBase<CircleProcessorDescriptor<T>, ICircleProcessor>, ICircleProcessor
78+
where T : class
79+
{
80+
protected override string Name => "circle";
81+
82+
Field ICircleProcessor.Field { get; set; }
83+
Field ICircleProcessor.TargetField { get; set; }
84+
bool? ICircleProcessor.IgnoreMissing { get; set; }
85+
double? ICircleProcessor.ErrorDistance { get; set; }
86+
ShapeType? ICircleProcessor.ShapeType { get; set; }
87+
88+
/// <inheritdoc cref="ICircleProcessor.Field" />
89+
public CircleProcessorDescriptor<T> Field(Field field) => Assign(field, (a, v) => a.Field = v);
90+
91+
/// <inheritdoc cref="ICircleProcessor.Field" />
92+
public CircleProcessorDescriptor<T> Field<TValue>(Expression<Func<T, TValue>> objectPath) =>
93+
Assign(objectPath, (a, v) => a.Field = v);
94+
95+
/// <inheritdoc cref="ICircleProcessor.TargetField" />
96+
public CircleProcessorDescriptor<T> TargetField(Field field) => Assign(field, (a, v) => a.TargetField = v);
97+
98+
/// <inheritdoc cref="ICircleProcessor.TargetField" />
99+
public CircleProcessorDescriptor<T> TargetField<TValue>(Expression<Func<T, TValue>> objectPath) =>
100+
Assign(objectPath, (a, v) => a.TargetField = v);
101+
102+
/// <inheritdoc cref="ICircleProcessor.IgnoreMissing">
103+
public CircleProcessorDescriptor<T> IgnoreMissing(bool? ignoreMissing = true) =>
104+
Assign(ignoreMissing, (a, v) => a.IgnoreMissing = v);
105+
106+
/// <inheritdoc cref="ICircleProcessor.IgnoreMissing">
107+
public CircleProcessorDescriptor<T> ErrorDistance(double? errorDistance) =>
108+
Assign(errorDistance, (a, v) => a.ErrorDistance = v);
109+
110+
/// <inheritdoc cref="ICircleProcessor.ShapeType">
111+
public CircleProcessorDescriptor<T> ShapeType(ShapeType? shapeType) =>
112+
Assign(shapeType, (a, v) => a.ShapeType = v);
113+
}
114+
}

src/Nest/Ingest/Processors/DissectProcessor.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ public DissectProcessorDescriptor<T> Field<TValue>(Expression<Func<T, TValue>> o
7373
public DissectProcessorDescriptor<T> Pattern(string pattern) =>
7474
Assign(pattern, (a, v) => a.Pattern = v);
7575

76+
// TODO! rename the parameter in 8.0
7677
/// <inheritdoc cref="IDissectProcessor.IgnoreMissing">
7778
public DissectProcessorDescriptor<T> IgnoreMissing(bool? traceMatch = true) =>
7879
Assign(traceMatch, (a, v) => a.IgnoreMissing = v);

src/Nest/Ingest/ProcessorsDescriptor.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,5 +154,8 @@ public ProcessorsDescriptor SetSecurityUser<T>(Func<SetSecurityUserProcessorDesc
154154
public ProcessorsDescriptor Pipeline(Func<PipelineProcessorDescriptor, IPipelineProcessor> selector) =>
155155
Assign(selector, (a, v) => a.AddIfNotNull(v?.Invoke(new PipelineProcessorDescriptor())));
156156

157+
/// <inheritdoc cref="IPipelineProcessor" />
158+
public ProcessorsDescriptor Circle<T>(Func<CircleProcessorDescriptor<T>, ICircleProcessor> selector) where T : class =>
159+
Assign(selector, (a, v) => a.AddIfNotNull(v?.Invoke(new CircleProcessorDescriptor<T>())));
157160
}
158161
}

src/Tests/Tests/Ingest/ProcessorAssertions.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,38 @@ public class Attachment : ProcessorAssertion
386386
public override string Key => "attachment";
387387
}
388388

389+
[SkipVersion("<7.4.0", "Circle processor added in 7.4.0")]
390+
public class Circle : ProcessorAssertion
391+
{
392+
public override Func<ProcessorsDescriptor, IPromise<IList<IProcessor>>> Fluent => d => d
393+
.Circle<Project>(ud => ud
394+
.Field(p => p.Description)
395+
.TargetField(p => p.ArbitraryShape)
396+
.ShapeType(ShapeType.Shape)
397+
.ErrorDistance(10d)
398+
.IgnoreMissing()
399+
);
400+
401+
public override IProcessor Initializer => new CircleProcessor
402+
{
403+
Field = "description",
404+
TargetField = "arbitraryShape",
405+
ShapeType = ShapeType.Shape,
406+
ErrorDistance = 10d,
407+
IgnoreMissing = true
408+
};
409+
410+
public override object Json => new
411+
{
412+
field = "description",
413+
target_field = "arbitraryShape",
414+
shape_type = "shape",
415+
error_distance = 10.0,
416+
ignore_missing = true,
417+
};
418+
419+
public override string Key => "circle";
420+
}
389421

390422
[SkipVersion("<6.4.0", "")]
391423
public class Bytes : ProcessorAssertion

0 commit comments

Comments
 (0)