|
12 | 12 |
|
13 | 13 | namespace Nest
|
14 | 14 | {
|
15 |
| - public class FieldResolver : ExpressionVisitor |
| 15 | + public class FieldResolver |
16 | 16 | {
|
17 | 17 | private readonly IConnectionSettingsValues _settings;
|
18 | 18 |
|
@@ -51,139 +51,24 @@ public string Resolve(PropertyName property)
|
51 | 51 | string f;
|
52 | 52 | if (this.Properties.TryGetValue(property, out f))
|
53 | 53 | return f;
|
54 |
| - f = this.ResolveToLastToken(property.Expression, property.Property); |
| 54 | + f = this.Resolve(property.Expression, property.Property, true); |
55 | 55 | this.Properties.TryAdd(property, f);
|
56 | 56 | return f;
|
57 | 57 | }
|
58 | 58 |
|
59 |
| - private string Resolve(Expression expression, MemberInfo member) |
| 59 | + private string Resolve(Expression expression, MemberInfo member, bool toLastToken = false) |
60 | 60 | {
|
| 61 | + var visitor = new FieldExpressionVisitor(_settings); |
61 | 62 | var name = expression != null
|
62 |
| - ? this.Resolve(expression) |
| 63 | + ? visitor.Resolve(expression, toLastToken) |
63 | 64 | : member != null
|
64 |
| - ? this.Resolve(member) |
| 65 | + ? visitor.Resolve(member) |
65 | 66 | : null;
|
66 | 67 |
|
67 | 68 | if (name == null)
|
68 | 69 | throw new ArgumentException("Could not resolve a name from the given Expression or MemberInfo.");
|
69 | 70 |
|
70 | 71 | return name;
|
71 | 72 | }
|
72 |
| - |
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) |
88 |
| - { |
89 |
| - if (info == null) |
90 |
| - return null; |
91 |
| - |
92 |
| - var name = info.Name; |
93 |
| - |
94 |
| - IPropertyMapping propertyMapping = null; |
95 |
| - if (this._settings.PropertyMappings.TryGetValue(info, out propertyMapping)) |
96 |
| - return propertyMapping.Name; |
97 |
| - |
98 |
| - var att = ElasticsearchPropertyAttribute.From(info); |
99 |
| - if (att != null && !att.Name.IsNullOrEmpty()) |
100 |
| - return att.Name; |
101 |
| - |
102 |
| - return _settings.Serializer?.CreatePropertyName(info) ?? _settings.DefaultFieldNameInferrer(name); |
103 |
| - } |
104 |
| - |
105 |
| - private string Resolve(Expression expression) |
106 |
| - { |
107 |
| - Stack = new Stack<string>(); |
108 |
| - Visit(expression); |
109 |
| - return Stack |
110 |
| - .Aggregate( |
111 |
| - new StringBuilder(), |
112 |
| - (sb, name) => |
113 |
| - (sb.Length > 0 ? sb.Append(".") : sb).Append(name)) |
114 |
| - .ToString(); |
115 |
| - } |
116 |
| - |
117 |
| - private string ResolveToLastToken(Expression expression) |
118 |
| - { |
119 |
| - Stack = new Stack<string>(); |
120 |
| - Visit(expression); |
121 |
| - return Stack.Last(); |
122 |
| - } |
123 |
| - |
124 |
| - protected override Expression VisitMember(MemberExpression expression) |
125 |
| - { |
126 |
| - if (Stack == null) return base.VisitMember(expression); |
127 |
| - var resolvedName = this.Resolve(expression.Member); |
128 |
| - Stack.Push(resolvedName); |
129 |
| - return base.VisitMember(expression); |
130 |
| - } |
131 |
| - |
132 |
| - protected override Expression VisitMethodCall(MethodCallExpression methodCall) |
133 |
| - { |
134 |
| - if (methodCall.Method.Name == "Suffix" && methodCall.Arguments.Any()) |
135 |
| - { |
136 |
| - VisitConstantOrVariable(methodCall, Stack); |
137 |
| - var callingMember = new ReadOnlyCollection<Expression>( |
138 |
| - new List<Expression> { { methodCall.Arguments.First() } } |
139 |
| - ); |
140 |
| - base.Visit(callingMember); |
141 |
| - return methodCall; |
142 |
| - } |
143 |
| - else if (methodCall.Method.Name == "get_Item" && methodCall.Arguments.Any()) |
144 |
| - { |
145 |
| - var t = methodCall.Object.Type; |
146 |
| - var isDict = |
147 |
| - typeof(IDictionary).IsAssignableFrom(t) |
148 |
| - || typeof(IDictionary<,>).IsAssignableFrom(t) |
149 |
| - || (t.IsGeneric() && t.GetGenericTypeDefinition() == typeof(IDictionary<,>)); |
150 |
| - |
151 |
| - if (!isDict) |
152 |
| - { |
153 |
| - return base.VisitMethodCall(methodCall); |
154 |
| - } |
155 |
| - VisitConstantOrVariable(methodCall, Stack); |
156 |
| - Visit(methodCall.Object); |
157 |
| - return methodCall; |
158 |
| - } |
159 |
| - else if (IsLinqOperator(methodCall.Method)) |
160 |
| - { |
161 |
| - for (int i = 1; i < methodCall.Arguments.Count; i++) |
162 |
| - { |
163 |
| - Visit(methodCall.Arguments[i]); |
164 |
| - } |
165 |
| - Visit(methodCall.Arguments[0]); |
166 |
| - return methodCall; |
167 |
| - } |
168 |
| - return base.VisitMethodCall(methodCall); |
169 |
| - } |
170 |
| - |
171 |
| - private static void VisitConstantOrVariable(MethodCallExpression methodCall, Stack<string> stack) |
172 |
| - { |
173 |
| - var lastArg = methodCall.Arguments.Last(); |
174 |
| - var constantExpression = lastArg as ConstantExpression; |
175 |
| - var value = constantExpression != null |
176 |
| - ? constantExpression.Value.ToString() |
177 |
| - : Expression.Lambda(lastArg).Compile().DynamicInvoke().ToString(); |
178 |
| - stack.Push(value); |
179 |
| - } |
180 |
| - |
181 |
| - private static bool IsLinqOperator(MethodInfo methodInfo) |
182 |
| - { |
183 |
| - if (methodInfo.DeclaringType != typeof(Queryable) && methodInfo.DeclaringType != typeof(Enumerable)) |
184 |
| - return false; |
185 |
| - |
186 |
| - return methodInfo.GetCustomAttribute<ExtensionAttribute>() != null; |
187 |
| - } |
188 | 73 | }
|
189 | 74 | }
|
0 commit comments