Skip to content

Commit

Permalink
PropertyName expressions now resolve to last token
Browse files Browse the repository at this point in the history
i.e. .Name(p => p.MyProperty.Suffix("raw")) -> "raw"

.Name("myProperty.raw") -> ArgumentException

Closes #1708
  • Loading branch information
gmarz committed Jan 27, 2016
1 parent bcef82d commit 4ede4c6
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 12 deletions.
43 changes: 34 additions & 9 deletions src/Nest/CommonAbstractions/Infer/Field/FieldResolver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,35 +39,52 @@ public string Resolve(Field field)
return f;
}

internal string Resolve(PropertyName property)
public string Resolve(PropertyName property)
{

if (property.IsConditionless()) return null;
if (!property.Name.IsNullOrEmpty())
{
if (property.Name.Contains("."))
throw new ArgumentException("Property names cannot contain dots.");
return property.Name;
}
string f;
if (this.Properties.TryGetValue(property, out f))
return f;
f = this.Resolve(property.Expression, property.Property);
f = this.ResolveToLastToken(property.Expression, property.Property);
this.Properties.TryAdd(property, f);
return f;
}

private string Resolve(Expression expression, MemberInfo member)
{
var name = expression != null
? this.ResolveExpression(expression)
? this.Resolve(expression)
: member != null
? this.ResolveMemberInfo(member)
? this.Resolve(member)
: null;

if (name == null)
throw new ArgumentException("Could not resolve a property name");
throw new ArgumentException("Could not resolve a name from the given Expression or MemberInfo.");

return name;
}

private string ResolveMemberInfo(MemberInfo info)
private string ResolveToLastToken(Expression expression, MemberInfo member)
{
var name = expression != null
? this.ResolveToLastToken(expression)
: member != null
? this.Resolve(member)
: null;

if (name == null)
throw new ArgumentException("Could not resolve a name from the given Expression or MemberInfo.");

return name;
}

private string Resolve(MemberInfo info)
{
if (info == null)
return null;
Expand All @@ -85,7 +102,7 @@ private string ResolveMemberInfo(MemberInfo info)
return _settings.Serializer?.CreatePropertyName(info) ?? _settings.DefaultFieldNameInferrer(name);
}

private string ResolveExpression(Expression expression)
private string Resolve(Expression expression)
{
var stack = new Stack<string>();
var properties = new Stack<ElasticsearchPropertyAttribute>();
Expand All @@ -98,10 +115,18 @@ private string ResolveExpression(Expression expression)
.ToString();
}

private string ResolveToLastToken(Expression expression)
{
var stack = new Stack<string>();
var properties = new Stack<ElasticsearchPropertyAttribute>();
Visit(expression, stack, properties);
return stack.Last();
}

protected override Expression VisitMemberAccess(MemberExpression expression, Stack<string> stack, Stack<ElasticsearchPropertyAttribute> properties)
{
if (stack == null) return base.VisitMemberAccess(expression, stack, properties);
var resolvedName = this.ResolveMemberInfo(expression.Member);
var resolvedName = this.Resolve(expression.Member);
stack.Push(resolvedName);
return base.VisitMemberAccess(expression, stack, properties);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
using static Tests.Framework.RoundTripper;
using static Nest.Infer;
using Field = Nest.Field;
using Xunit;

namespace Tests.ClientConcepts.HighLevel.Inferrence.FieldNames
{
Expand Down Expand Up @@ -332,8 +333,19 @@ public void PrecedenceIsAsExpected()
});

}
/**
*
*/

public class PropertyNames
{
[U] public void PropertyNamesAreResolvedToLastToken()
{
Expression<Func<Project, object>> expression = p => p.Name.Suffix("raw");
Expect("raw").WhenSerializing<PropertyName>(expression);
}

[U] public void StringsContainingDotsIsAnException()
{
Assert.Throws<ArgumentException>(() => Expect("exception!").WhenSerializing<PropertyName>("name.raw"));
}
}
}
}

0 comments on commit 4ede4c6

Please sign in to comment.