Skip to content

Commit 8d8ecf9

Browse files
authored
Add more PredefinedOperatorAliases (#299)
* Add 'equals' * .
1 parent e628c2a commit 8d8ecf9

File tree

3 files changed

+96
-16
lines changed

3 files changed

+96
-16
lines changed

src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ Expression ParseLambdaOperator()
261261
Expression ParseOrOperator()
262262
{
263263
Expression left = ParseAndOperator();
264-
while (_textParser.CurrentToken.Id == TokenId.DoubleBar || TokenIdentifierIs("Or") || TokenIdentifierIs("OrElse"))
264+
while (_textParser.CurrentToken.Id == TokenId.DoubleBar)
265265
{
266266
Token op = _textParser.CurrentToken;
267267
_textParser.NextToken();
@@ -279,7 +279,7 @@ Expression ParseOrOperator()
279279
Expression ParseAndOperator()
280280
{
281281
Expression left = ParseIn();
282-
while (_textParser.CurrentToken.Id == TokenId.DoubleAmphersand || TokenIdentifierIs("And") || TokenIdentifierIs("AndAlso"))
282+
while (_textParser.CurrentToken.Id == TokenId.DoubleAmphersand)
283283
{
284284
Token op = _textParser.CurrentToken;
285285
_textParser.NextToken();

src/System.Linq.Dynamic.Core/Tokenizer/TextParser.cs

+21-14
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,27 @@ internal class TextParser
1111
private static char[] EscapeCharacters = new[] { '\\', 'a', 'b', 'f', 'n', 'r', 't', 'v' };
1212

1313
// These aliases are supposed to simply the where clause and make it more human readable
14-
// As an addition it is compatible with the OData.Filter specification
15-
private static readonly Dictionary<string, TokenId> _predefinedAliases = new Dictionary<string, TokenId>
14+
private static readonly Dictionary<string, TokenId> _predefinedOperatorAliases = new Dictionary<string, TokenId>(StringComparer.OrdinalIgnoreCase)
1615
{
17-
{"eq", TokenId.Equal},
18-
{"ne", TokenId.ExclamationEqual},
19-
{"neq", TokenId.ExclamationEqual},
20-
{"lt", TokenId.LessThan},
21-
{"le", TokenId.LessThanEqual},
22-
{"gt", TokenId.GreaterThan},
23-
{"ge", TokenId.GreaterThanEqual},
24-
{"and", TokenId.DoubleAmphersand},
25-
{"or", TokenId.DoubleBar},
26-
{"not", TokenId.Exclamation},
27-
{"mod", TokenId.Percent}
16+
{ "eq", TokenId.Equal },
17+
{ "equal", TokenId.Equal },
18+
{ "ne", TokenId.ExclamationEqual },
19+
{ "notequal", TokenId.ExclamationEqual },
20+
{ "neq", TokenId.ExclamationEqual },
21+
{ "lt", TokenId.LessThan },
22+
{ "LessThan", TokenId.LessThan },
23+
{ "le", TokenId.LessThanEqual },
24+
{ "LessThanEqual", TokenId.LessThanEqual },
25+
{ "gt", TokenId.GreaterThan },
26+
{ "GreaterThan", TokenId.GreaterThan },
27+
{ "ge", TokenId.GreaterThanEqual },
28+
{ "GreaterThanEqual", TokenId.GreaterThanEqual },
29+
{ "and", TokenId.DoubleAmphersand },
30+
{ "AndAlso", TokenId.DoubleAmphersand },
31+
{ "or", TokenId.DoubleBar },
32+
{ "OrElse", TokenId.DoubleBar },
33+
{ "not", TokenId.Exclamation },
34+
{ "mod", TokenId.Percent }
2835
};
2936

3037
private readonly string _text;
@@ -451,7 +458,7 @@ private static Exception ParseError(int pos, string format, params object[] args
451458

452459
private static TokenId GetAliasedTokenId(TokenId tokenId, string alias)
453460
{
454-
return tokenId == TokenId.Identifier && _predefinedAliases.TryGetValue(alias, out TokenId id) ? id : tokenId;
461+
return tokenId == TokenId.Identifier && _predefinedOperatorAliases.TryGetValue(alias, out TokenId id) ? id : tokenId;
455462
}
456463

457464
private static bool IsHexChar(char c)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
using System.Linq.Dynamic.Core.Parser;
2+
using System.Linq.Expressions;
3+
using NFluent;
4+
using Xunit;
5+
6+
namespace System.Linq.Dynamic.Core.Tests.Parser
7+
{
8+
public class ExpressionParserTests
9+
{
10+
[Theory]
11+
[InlineData("it == 1", "(x == 1)")]
12+
[InlineData("it eq 1", "(x == 1)")]
13+
[InlineData("it equal 1", "(x == 1)")]
14+
[InlineData("it != 1", "(x != 1)")]
15+
[InlineData("it ne 1", "(x != 1)")]
16+
[InlineData("it neq 1", "(x != 1)")]
17+
[InlineData("it notequal 1", "(x != 1)")]
18+
[InlineData("it lt 1", "(x < 1)")]
19+
[InlineData("it LessThan 1", "(x < 1)")]
20+
[InlineData("it le 1", "(x <= 1)")]
21+
[InlineData("it LessThanEqual 1", "(x <= 1)")]
22+
[InlineData("it gt 1", "(x > 1)")]
23+
[InlineData("it GreaterThan 1", "(x > 1)")]
24+
[InlineData("it ge 1", "(x >= 1)")]
25+
[InlineData("it GreaterThanEqual 1", "(x >= 1)")]
26+
public void Parse_ParseComparisonOperator(string expression, string result)
27+
{
28+
// Arrange
29+
ParameterExpression[] parameters = { ParameterExpressionHelper.CreateParameterExpression(typeof(int), "x") };
30+
var sut = new ExpressionParser(parameters, expression, null, null);
31+
32+
// Act
33+
var parsedExpression = sut.Parse(null).ToString();
34+
35+
// Assert
36+
Check.That(parsedExpression).Equals(result);
37+
}
38+
39+
[Theory]
40+
[InlineData("it || true", "(x OrElse True)")]
41+
[InlineData("it or true", "(x OrElse True)")]
42+
[InlineData("it OrElse true", "(x OrElse True)")]
43+
public void Parse_ParseOrOperator(string expression, string result)
44+
{
45+
// Arrange
46+
ParameterExpression[] parameters = { ParameterExpressionHelper.CreateParameterExpression(typeof(bool), "x") };
47+
var sut = new ExpressionParser(parameters, expression, null, null);
48+
49+
// Act
50+
var parsedExpression = sut.Parse(null).ToString();
51+
52+
// Assert
53+
Check.That(parsedExpression).Equals(result);
54+
}
55+
56+
[Theory]
57+
[InlineData("it && true", "(x AndAlso True)")]
58+
[InlineData("it and true", "(x AndAlso True)")]
59+
[InlineData("it AndAlso true", "(x AndAlso True)")]
60+
public void Parse_ParseAndOperator(string expression, string result)
61+
{
62+
// Arrange
63+
ParameterExpression[] parameters = { ParameterExpressionHelper.CreateParameterExpression(typeof(bool), "x") };
64+
var sut = new ExpressionParser(parameters, expression, null, null);
65+
66+
// Act
67+
var parsedExpression = sut.Parse(null).ToString();
68+
69+
// Assert
70+
Check.That(parsedExpression).Equals(result);
71+
}
72+
}
73+
}

0 commit comments

Comments
 (0)