Skip to content

Commit c2990eb

Browse files
committed
2 parents 7e61593 + 554e811 commit c2990eb

File tree

2 files changed

+41
-11
lines changed

2 files changed

+41
-11
lines changed

src/odata.pegjs

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,20 @@
55
* - https://github.com/dmajda/pegjs
66
*/
77

8+
{
9+
function filterExprHelper(left, right){
10+
if (right) {
11+
return {
12+
type: right.type,
13+
left: left,
14+
right: right.value
15+
}
16+
} else {
17+
return left;
18+
}
19+
}
20+
}
21+
822
start = query
923

1024
/*
@@ -259,20 +273,15 @@ filter = "$filter=" list:filterExpr {
259273
/ "$filter=" .* { return {"error": 'invalid $filter parameter'}; }
260274

261275
filterExpr =
262-
"(" WSP? filterExpr WSP? ")" ( WSP ("and"/"or") WSP filterExpr)? /
276+
left:("(" WSP? filter:filterExpr WSP? ")"{return filter}) right:( WSP type:("and"/"or") WSP value:filterExpr{
277+
return { type: type, value: value}
278+
})? {
279+
return filterExprHelper(left, right);
280+
} /
263281
left:cond right:( WSP type:("and"/"or") WSP value:filterExpr{
264282
return { type: type, value: value}
265283
})? {
266-
267-
if (right) {
268-
return {
269-
type: right.type,
270-
left: left,
271-
right: right.value
272-
}
273-
} else {
274-
return left;
275-
}
284+
return filterExprHelper(left, right);
276285
}
277286

278287
booleanFunctions2Args = "substringof" / "endswith" / "startswith" / "IsOf"

test/parser.specs.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,27 @@ describe('odata.parser grammar', function () {
104104
assert.equal(ast.$filter.right.right.value, "Doe");
105105
});
106106

107+
it('should parse multiple complex conditions in a $filter', function () {
108+
109+
var ast = parser.parse("$filter=Name eq 'John' and (LastName lt 'Doe' or LastName gt 'Aro')");
110+
111+
assert.equal(ast.$filter.type, "and");
112+
assert.equal(ast.$filter.left.type, "eq");
113+
assert.equal(ast.$filter.left.left.type, "property");
114+
assert.equal(ast.$filter.left.left.name, "Name");
115+
assert.equal(ast.$filter.left.right.type, "literal");
116+
assert.equal(ast.$filter.left.right.value, "John");
117+
assert.equal(ast.$filter.right.type, "or");
118+
assert.equal(ast.$filter.right.left.type, "lt");
119+
assert.equal(ast.$filter.right.left.left.name, "LastName");
120+
assert.equal(ast.$filter.right.left.right.type, "literal");
121+
assert.equal(ast.$filter.right.left.right.value, "Doe");
122+
assert.equal(ast.$filter.right.right.type, "gt");
123+
assert.equal(ast.$filter.right.right.left.name, "LastName");
124+
assert.equal(ast.$filter.right.right.right.type, "literal");
125+
assert.equal(ast.$filter.right.right.right.value, "Aro");
126+
});
127+
107128
it('should parse substringof $filter', function () {
108129

109130
var ast = parser.parse("$filter=substringof('nginx', Data)");

0 commit comments

Comments
 (0)