Skip to content

Commit 75f4b26

Browse files
committed
added strict as option for dynamic when mapping fix #379
1 parent 282f121 commit 75f4b26

File tree

8 files changed

+156
-4
lines changed

8 files changed

+156
-4
lines changed

Diff for: src/Nest.Tests.Integration/Core/Map/RootProperties/MapRootObjectPropertiesTests.cs

+59
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,64 @@ public void RootPropertiesShouldSerialize()
3030
);
3131
this.DefaultResponseAssertations(result);
3232
}
33+
34+
[Test]
35+
public void DynamicAllowSetAndGet()
36+
{
37+
var result = this._client.MapFluent<ElasticSearchProject>(m => m
38+
.TypeName("elasticsearchprojects_allow")
39+
.IndexNames(ElasticsearchConfiguration.DefaultIndex, ElasticsearchConfiguration.DefaultIndex)
40+
.Dynamic(DynamicMappingOption.allow)
41+
);
42+
this.DefaultResponseAssertations(result);
43+
var getResult = this._client.GetMapping(ElasticsearchConfiguration.DefaultIndex, "elasticsearchprojects_allow");
44+
Assert.AreEqual(getResult.Dynamic, DynamicMappingOption.allow);
45+
46+
result = this._client.MapFluent<ElasticSearchProject>(m => m
47+
.TypeName("elasticsearchprojects_allow2")
48+
.IndexNames(ElasticsearchConfiguration.DefaultIndex, ElasticsearchConfiguration.DefaultIndex)
49+
.Dynamic(true)
50+
);
51+
this.DefaultResponseAssertations(result);
52+
getResult = this._client.GetMapping(ElasticsearchConfiguration.DefaultIndex, "elasticsearchprojects_allow2");
53+
Assert.AreEqual(getResult.Dynamic, DynamicMappingOption.allow);
54+
55+
}
56+
57+
[Test]
58+
public void DynamicIgnoreSetAndGet()
59+
{
60+
var result = this._client.MapFluent<ElasticSearchProject>(m => m
61+
.TypeName("elasticsearchprojects_ignore")
62+
.IndexNames(ElasticsearchConfiguration.DefaultIndex, ElasticsearchConfiguration.DefaultIndex)
63+
.Dynamic(DynamicMappingOption.ignore)
64+
);
65+
this.DefaultResponseAssertations(result);
66+
var getResult = this._client.GetMapping(ElasticsearchConfiguration.DefaultIndex, "elasticsearchprojects_ignore");
67+
Assert.AreEqual(getResult.Dynamic, DynamicMappingOption.ignore);
68+
69+
result = this._client.MapFluent<ElasticSearchProject>(m => m
70+
.TypeName("elasticsearchprojects_ignore2")
71+
.IndexNames(ElasticsearchConfiguration.DefaultIndex, ElasticsearchConfiguration.DefaultIndex)
72+
.Dynamic(false)
73+
);
74+
this.DefaultResponseAssertations(result);
75+
getResult = this._client.GetMapping(ElasticsearchConfiguration.DefaultIndex, "elasticsearchprojects_ignore2");
76+
Assert.AreEqual(getResult.Dynamic, DynamicMappingOption.ignore);
77+
78+
}
79+
[Test]
80+
public void DynamicStrictSetAndGet()
81+
{
82+
var result = this._client.MapFluent<ElasticSearchProject>(m => m
83+
.TypeName("elasticsearchprojects_strict")
84+
.IndexNames(ElasticsearchConfiguration.DefaultIndex, ElasticsearchConfiguration.DefaultIndex)
85+
.Dynamic(DynamicMappingOption.strict)
86+
);
87+
this.DefaultResponseAssertations(result);
88+
var getResult = this._client.GetMapping(ElasticsearchConfiguration.DefaultIndex, "elasticsearchprojects_strict");
89+
Assert.AreEqual(getResult.Dynamic, DynamicMappingOption.strict);
90+
91+
}
3392
}
3493
}

Diff for: src/Nest/Domain/Mapping/Descriptors/NestedObjectMappingDescriptor.cs

+5-1
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,15 @@ public NestedObjectMappingDescriptor<TParent, TChild> MapFromAttributes(int maxR
5858
return this;
5959
}
6060

61-
public NestedObjectMappingDescriptor<TParent, TChild> Dynamic(bool dynamic = true)
61+
public NestedObjectMappingDescriptor<TParent, TChild> Dynamic(DynamicMappingOption dynamic)
6262
{
6363
this._Mapping.Dynamic = dynamic;
6464
return this;
6565
}
66+
public NestedObjectMappingDescriptor<TParent, TChild> Dynamic(bool dynamic = true)
67+
{
68+
return this.Dynamic(dynamic ? DynamicMappingOption.allow : DynamicMappingOption.ignore);
69+
}
6670
public NestedObjectMappingDescriptor<TParent, TChild> Enabled(bool enabled = true)
6771
{
6872
this._Mapping.Enabled = enabled;

Diff for: src/Nest/Domain/Mapping/Descriptors/ObjectMappingDescriptor.cs

+5-1
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,15 @@ public ObjectMappingDescriptor<TParent, TChild> MapFromAttributes(int maxRecursi
5959
return this;
6060
}
6161

62-
public ObjectMappingDescriptor<TParent, TChild> Dynamic(bool dynamic = true)
62+
public ObjectMappingDescriptor<TParent, TChild> Dynamic(DynamicMappingOption dynamic)
6363
{
6464
this._Mapping.Dynamic = dynamic;
6565
return this;
6666
}
67+
public ObjectMappingDescriptor<TParent, TChild> Dynamic(bool dynamic = true)
68+
{
69+
return this.Dynamic(dynamic ? DynamicMappingOption.allow : DynamicMappingOption.ignore);
70+
}
6771
public ObjectMappingDescriptor<TParent, TChild> Enabled(bool enabled = true)
6872
{
6973
this._Mapping.Enabled = enabled;

Diff for: src/Nest/Domain/Mapping/Descriptors/RootObjectMappingDescriptor.cs

+5-1
Original file line numberDiff line numberDiff line change
@@ -100,11 +100,15 @@ public RootObjectMappingDescriptor<T> IgnoreConflicts(bool ignore = true)
100100
return this;
101101
}
102102

103-
public RootObjectMappingDescriptor<T> Dynamic(bool dynamic = true)
103+
public RootObjectMappingDescriptor<T> Dynamic(DynamicMappingOption dynamic)
104104
{
105105
this._Mapping.Dynamic = dynamic;
106106
return this;
107107
}
108+
public RootObjectMappingDescriptor<T> Dynamic(bool dynamic = true)
109+
{
110+
return this.Dynamic(dynamic ? DynamicMappingOption.allow : DynamicMappingOption.ignore);
111+
}
108112
public RootObjectMappingDescriptor<T> Enabled(bool enabled = true)
109113
{
110114
this._Mapping.Enabled = enabled;

Diff for: src/Nest/Domain/Mapping/Types/ObjectMapping.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ public virtual TypeNameMarker Type
2424
public string Similarity { get; set; }
2525

2626
[JsonProperty("dynamic")]
27-
public bool? Dynamic { get; set; }
27+
[JsonConverter(typeof(DynamicMappingOptionConverter))]
28+
public DynamicMappingOption? Dynamic { get; set; }
2829

2930
[JsonProperty("enabled")]
3031
public bool? Enabled { get; set; }

Diff for: src/Nest/Enums/DynamicMappingOption.cs

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
namespace Nest
2+
{
3+
/// <summary>
4+
/// Controls how elasticsearch handles dynamic mapping changes when a new document present new fields
5+
/// </summary>
6+
public enum DynamicMappingOption
7+
{
8+
/// <summary>
9+
/// Default value, allows unmapped fields to be cause a mapping update
10+
/// </summary>
11+
allow,
12+
/// <summary>
13+
/// New unmapped fields will be silently ignored
14+
/// </summary>
15+
ignore,
16+
/// <summary>
17+
/// If new unmapped fields are passed, the whole document WON'T be added/updated
18+
/// </summary>
19+
strict
20+
}
21+
}

Diff for: src/Nest/Nest.csproj

+2
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@
7171
<ItemGroup>
7272
<Compile Include="Domain\Connection\AsyncRequestOperation.cs" />
7373
<Compile Include="Domain\Responses\RootVersionInfoResponse.cs" />
74+
<Compile Include="Enums\DynamicMappingOption.cs" />
7475
<Compile Include="Enums\Enums.Generated.cs" />
7576
<Compile Include="ExposedInternals\ElasticInferrer.cs" />
7677
<Compile Include="ExposedInternals\ElasticSerializer.cs" />
@@ -504,6 +505,7 @@
504505
<Compile Include="IElasticClient.cs" />
505506
<Compile Include="Properties\InternalsVisibleTo.cs" />
506507
<Compile Include="Resolvers\Converters\BulkOperationResponseItemConverter.cs" />
508+
<Compile Include="Resolvers\Converters\DynamicMappingOptionConverter.cs" />
507509
<Compile Include="Resolvers\Converters\DictionaryKeysAreNotPropertyNamesJsonConverter.cs" />
508510
<Compile Include="Resolvers\Converters\IndexNameMarkerConverter.cs" />
509511
<Compile Include="Resolvers\Converters\TypeNameMarkerConverter.cs" />
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using Newtonsoft.Json;
6+
7+
namespace Nest.Resolvers.Converters
8+
{
9+
public class DynamicMappingOptionConverter : JsonConverter
10+
{
11+
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
12+
{
13+
var v = value as DynamicMappingOption?;
14+
if (!v.HasValue)
15+
{
16+
writer.WriteValue(true);
17+
return;
18+
}
19+
switch (v.Value)
20+
{
21+
case DynamicMappingOption.strict:
22+
writer.WriteValue("strict");
23+
break;
24+
case DynamicMappingOption.ignore:
25+
writer.WriteValue(false);
26+
break;
27+
default:
28+
writer.WriteValue(true);
29+
break;
30+
}
31+
}
32+
33+
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
34+
{
35+
var v = reader.Value;
36+
if (v == null)
37+
return null;
38+
39+
var sv = v.ToString().ToLower();
40+
switch (sv)
41+
{
42+
case "false":
43+
return DynamicMappingOption.ignore;
44+
case "strict":
45+
return DynamicMappingOption.strict;
46+
default:
47+
return DynamicMappingOption.allow;
48+
49+
}
50+
}
51+
52+
public override bool CanConvert(Type objectType)
53+
{
54+
return objectType == typeof(DynamicMappingOption?);
55+
}
56+
}
57+
}

0 commit comments

Comments
 (0)