Skip to content

Commit 85bdd01

Browse files
authored
Merge pull request #1234 from json-api-dotnet/allow-single-constant-in-any-function
Allow at least one constant instead of two in any() filter function
2 parents 84d01c3 + faaba0b commit 85bdd01

File tree

5 files changed

+5
-13
lines changed

5 files changed

+5
-13
lines changed

docs/usage/reading/filtering.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ matchTextExpression:
196196
( 'contains' | 'startsWith' | 'endsWith' ) LPAREN fieldChain COMMA literalConstant RPAREN;
197197
198198
anyExpression:
199-
'any' LPAREN fieldChain COMMA literalConstant ( COMMA literalConstant )+ RPAREN;
199+
'any' LPAREN fieldChain ( COMMA literalConstant )+ RPAREN;
200200
201201
hasExpression:
202202
'has' LPAREN fieldChain ( COMMA filterExpression )? RPAREN;

src/JsonApiDotNetCore/Queries/Expressions/AnyExpression.cs

+1-6
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,7 @@ public class AnyExpression : FilterExpression
1717
public AnyExpression(ResourceFieldChainExpression targetAttribute, IImmutableSet<LiteralConstantExpression> constants)
1818
{
1919
ArgumentGuard.NotNull(targetAttribute);
20-
ArgumentGuard.NotNull(constants);
21-
22-
if (constants.Count < 2)
23-
{
24-
throw new ArgumentException("At least two constants are required.", nameof(constants));
25-
}
20+
ArgumentGuard.NotNullNorEmpty(constants);
2621

2722
TargetAttribute = targetAttribute;
2823
Constants = constants;

src/JsonApiDotNetCore/Queries/Internal/Parsing/FilterParser.cs

-5
Original file line numberDiff line numberDiff line change
@@ -199,11 +199,6 @@ protected AnyExpression ParseAny()
199199
LiteralConstantExpression constant = ParseConstant();
200200
constantsBuilder.Add(constant);
201201

202-
EatSingleCharacterToken(TokenKind.Comma);
203-
204-
constant = ParseConstant();
205-
constantsBuilder.Add(constant);
206-
207202
while (TokenStack.TryPeek(out Token? nextToken) && nextToken.Kind == TokenKind.Comma)
208203
{
209204
EatSingleCharacterToken(TokenKind.Comma);

test/JsonApiDotNetCoreTests/IntegrationTests/QueryStrings/Filtering/FilterOperatorTests.cs

+1
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
466466
}
467467

468468
[Theory]
469+
[InlineData("yes", "no", "'yes'")]
469470
[InlineData("two", "one two", "'one','two','three'")]
470471
[InlineData("two", "nine", "'one','two','three','four','five'")]
471472
public async Task Can_filter_in_set(string matchingText, string nonMatchingText, string filterText)

test/JsonApiDotNetCoreTests/UnitTests/QueryStringParameters/FilterParseTests.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public void Reader_Is_Enabled(JsonApiQueryStringParameters parametersDisabled, b
8686
[InlineData("filter", "any(null,'a','b')", "Attribute 'null' does not exist on resource type 'blogs'.")]
8787
[InlineData("filter", "any('a','b','c')", "Field name expected.")]
8888
[InlineData("filter", "any(title,'b','c',)", "Value between quotes expected.")]
89-
[InlineData("filter", "any(title,'b')", ", expected.")]
89+
[InlineData("filter", "any(title)", ", expected.")]
9090
[InlineData("filter[posts]", "any(author,'a','b')", "Attribute 'author' does not exist on resource type 'blogPosts'.")]
9191
[InlineData("filter", "and(", "Filter function expected.")]
9292
[InlineData("filter", "or(equals(title,'some'),equals(title,'other')", ") expected.")]
@@ -146,6 +146,7 @@ public void Reader_Read_Fails(string parameterName, string parameterValue, strin
146146
[InlineData("filter", "contains(title,'this')", null, "contains(title,'this')")]
147147
[InlineData("filter", "startsWith(title,'this')", null, "startsWith(title,'this')")]
148148
[InlineData("filter", "endsWith(title,'this')", null, "endsWith(title,'this')")]
149+
[InlineData("filter", "any(title,'this')", null, "any(title,'this')")]
149150
[InlineData("filter", "any(title,'this','that','there')", null, "any(title,'that','there','this')")]
150151
[InlineData("filter", "and(contains(title,'sales'),contains(title,'marketing'),contains(title,'advertising'))", null,
151152
"and(contains(title,'sales'),contains(title,'marketing'),contains(title,'advertising'))")]

0 commit comments

Comments
 (0)