Skip to content

Commit 57bb293

Browse files
committed
Merge branch 'fix/1708'
2 parents 37a5d2a + 3cc83af commit 57bb293

File tree

4 files changed

+62
-14
lines changed

4 files changed

+62
-14
lines changed

Diff for: src/CodeGeneration/Nest.Litterateur/project.lock.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -4130,7 +4130,7 @@
41304130
"System.Reflection.Metadata/1.1.0": {
41314131
"type": "package",
41324132
"serviceable": true,
4133-
"sha512": "RLIE4sSt2zngMLuqM6YmxBH99mTumtT4DNZE4+msfEaInUP5iCLQT+BHPl+2cjSAP1pdALyAjLB8RtCB+WGGWQ==",
4133+
"sha512": "a8VsRm/B0Ik1o5FumSMWmpwbG7cvIIajAYhzTTy9VB9XItByJDQHGZkQTIAdsvVJ6MI5O3uH/lb0izgQDlDIWA==",
41344134
"files": [
41354135
"lib/dotnet5.2/System.Reflection.Metadata.dll",
41364136
"lib/dotnet5.2/System.Reflection.Metadata.xml",

Diff for: src/Nest/CommonAbstractions/Infer/Field/FieldResolver.cs

+34-9
Original file line numberDiff line numberDiff line change
@@ -39,35 +39,52 @@ public string Resolve(Field field)
3939
return f;
4040
}
4141

42-
internal string Resolve(PropertyName property)
42+
public string Resolve(PropertyName property)
4343
{
44-
4544
if (property.IsConditionless()) return null;
4645
if (!property.Name.IsNullOrEmpty())
46+
{
47+
if (property.Name.Contains("."))
48+
throw new ArgumentException("Property names cannot contain dots.");
4749
return property.Name;
50+
}
4851
string f;
4952
if (this.Properties.TryGetValue(property, out f))
5053
return f;
51-
f = this.Resolve(property.Expression, property.Property);
54+
f = this.ResolveToLastToken(property.Expression, property.Property);
5255
this.Properties.TryAdd(property, f);
5356
return f;
5457
}
5558

5659
private string Resolve(Expression expression, MemberInfo member)
5760
{
5861
var name = expression != null
59-
? this.ResolveExpression(expression)
62+
? this.Resolve(expression)
6063
: member != null
61-
? this.ResolveMemberInfo(member)
64+
? this.Resolve(member)
6265
: null;
6366

6467
if (name == null)
65-
throw new ArgumentException("Could not resolve a property name");
68+
throw new ArgumentException("Could not resolve a name from the given Expression or MemberInfo.");
6669

6770
return name;
6871
}
6972

70-
private string ResolveMemberInfo(MemberInfo info)
73+
private string ResolveToLastToken(Expression expression, MemberInfo member)
74+
{
75+
var name = expression != null
76+
? this.ResolveToLastToken(expression)
77+
: member != null
78+
? this.Resolve(member)
79+
: null;
80+
81+
if (name == null)
82+
throw new ArgumentException("Could not resolve a name from the given Expression or MemberInfo.");
83+
84+
return name;
85+
}
86+
87+
private string Resolve(MemberInfo info)
7188
{
7289
if (info == null)
7390
return null;
@@ -85,7 +102,7 @@ private string ResolveMemberInfo(MemberInfo info)
85102
return _settings.Serializer?.CreatePropertyName(info) ?? _settings.DefaultFieldNameInferrer(name);
86103
}
87104

88-
private string ResolveExpression(Expression expression)
105+
private string Resolve(Expression expression)
89106
{
90107
var stack = new Stack<string>();
91108
var properties = new Stack<ElasticsearchPropertyAttribute>();
@@ -98,10 +115,18 @@ private string ResolveExpression(Expression expression)
98115
.ToString();
99116
}
100117

118+
private string ResolveToLastToken(Expression expression)
119+
{
120+
var stack = new Stack<string>();
121+
var properties = new Stack<ElasticsearchPropertyAttribute>();
122+
Visit(expression, stack, properties);
123+
return stack.Last();
124+
}
125+
101126
protected override Expression VisitMemberAccess(MemberExpression expression, Stack<string> stack, Stack<ElasticsearchPropertyAttribute> properties)
102127
{
103128
if (stack == null) return base.VisitMemberAccess(expression, stack, properties);
104-
var resolvedName = this.ResolveMemberInfo(expression.Member);
129+
var resolvedName = this.Resolve(expression.Member);
105130
stack.Push(resolvedName);
106131
return base.VisitMemberAccess(expression, stack, properties);
107132
}

Diff for: src/Tests/ClientConcepts/HighLevel/Inferrence/FieldNames/FieldInference.doc.cs

+2-4
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
using static Tests.Framework.RoundTripper;
1313
using static Nest.Infer;
1414
using Field = Nest.Field;
15+
using Xunit;
1516

1617
namespace Tests.ClientConcepts.HighLevel.Inferrence.FieldNames
1718
{
@@ -331,9 +332,6 @@ public void PrecedenceIsAsExpected()
331332
DefaultFieldNameInferrer = "shouting much?"
332333
});
333334

334-
}
335-
/**
336-
*
337-
*/
335+
}
338336
}
339337
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using System;
2+
using System.Linq.Expressions;
3+
using Nest;
4+
using Tests.Framework;
5+
using Tests.Framework.MockData;
6+
using static Tests.Framework.RoundTripper;
7+
using Xunit;
8+
9+
namespace Tests.ClientConcepts.HighLevel.Inferrence.PropertyNames
10+
{
11+
12+
public class PropertyNames
13+
{
14+
[U] public void PropertyNamesAreResolvedToLastToken()
15+
{
16+
Expression<Func<Project, object>> expression = p => p.Name.Suffix("raw");
17+
Expect("raw").WhenSerializing<PropertyName>(expression);
18+
}
19+
20+
[U] public void StringsContainingDotsIsAnException()
21+
{
22+
Assert.Throws<ArgumentException>(() => Expect("exception!").WhenSerializing<PropertyName>("name.raw"));
23+
}
24+
}
25+
}

0 commit comments

Comments
 (0)