diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/filter/FilterCompiler.java b/json-path/src/main/java/com/jayway/jsonpath/internal/filter/FilterCompiler.java index ecec37091..828350f8b 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/filter/FilterCompiler.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/filter/FilterCompiler.java @@ -355,6 +355,7 @@ private PathNode readPath() { int begin = filter.position(); filter.incrementPosition(1); //skip $ and @ + int groupParen = 0; while (filter.inBounds()) { if (filter.currentChar() == OPEN_SQUARE_BRACKET) { int closingSquareBracketIndex = filter.indexOfMatchingCloseChar(filter.position(), OPEN_SQUARE_BRACKET, CLOSE_SQUARE_BRACKET, true, false); @@ -364,14 +365,31 @@ private PathNode readPath() { filter.setPosition(closingSquareBracketIndex + 1); } } - boolean closingFunctionBracket = (filter.currentChar() == CLOSE_PARENTHESIS && currentCharIsClosingFunctionBracket(begin)); - boolean closingLogicalBracket = (filter.currentChar() == CLOSE_PARENTHESIS && !closingFunctionBracket); - if (!filter.inBounds() || isRelationalOperatorChar(filter.currentChar()) || filter.currentChar() == SPACE || closingLogicalBracket) { - break; + if (filter.currentChar() == OPEN_PARENTHESIS) { + groupParen++; + } + + if (groupParen == 0) { + boolean closingFunctionBracket = (filter.currentChar() == CLOSE_PARENTHESIS && currentCharIsClosingFunctionBracket(begin)); + boolean closingLogicalBracket = (filter.currentChar() == CLOSE_PARENTHESIS && !closingFunctionBracket); + + if (!filter.inBounds() || isRelationalOperatorChar(filter.currentChar()) || filter.currentChar() == SPACE || closingLogicalBracket) { + break; + } else { + filter.incrementPosition(1); + } } else { + if (filter.currentChar() == CLOSE_PARENTHESIS) { + groupParen--; + if (groupParen < 0) { + throw new InvalidPathException("Parentheses does not match in filter " + filter); + } + } filter.incrementPosition(1); } + + } boolean shouldExists = !(previousSignificantChar == NOT); diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/path/PathCompiler.java b/json-path/src/main/java/com/jayway/jsonpath/internal/path/PathCompiler.java index 27b6e0633..40e75c28d 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/path/PathCompiler.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/path/PathCompiler.java @@ -349,15 +349,11 @@ else if (isPathContext(c)) { // we've encountered a COMMA do the same case CLOSE_PARENTHESIS: groupParen--; - //CS304 Issue link: https://github.com/json-path/JsonPath/issues/620 - if (0 > groupParen || priorChar == '(') { - parameter.append(c); - } case COMMA: // In this state we've reach the end of a function parameter and we can pass along the parameter string // to the parser if ((0 == groupQuote && 0 == groupBrace && 0 == groupBracket - && ((0 == groupParen && CLOSE_PARENTHESIS == c) || 1 == groupParen))) { + && ((0 == groupParen && CLOSE_PARENTHESIS == c) || (1 == groupParen && c == COMMA)))) { endOfStream = (0 == groupParen); if (null != type) { diff --git a/json-path/src/test/java/com/jayway/jsonpath/InlineFilterTest.java b/json-path/src/test/java/com/jayway/jsonpath/InlineFilterTest.java index 1249474a6..7dcd5fc9b 100644 --- a/json-path/src/test/java/com/jayway/jsonpath/InlineFilterTest.java +++ b/json-path/src/test/java/com/jayway/jsonpath/InlineFilterTest.java @@ -286,4 +286,11 @@ public void escape_pattern_before_literal(Configuration conf) { public void filter_evaluation_does_not_break_path_evaluation(Configuration conf) { assertHasOneResult("[{\"s\": \"fo\", \"expected_size\": \"m\"}, {\"s\": \"lo\", \"expected_size\": 2}]", "$[?(@.s size @.expected_size)]", conf); } + + @ParameterizedTest + @MethodSource("configurations") + public void testFilterCallingFunction(Configuration conf) { + assertHasOneResult("[[\"abcdef\"]]", "$[?(@.concat(\"-\") == \"abcdef-\")]", conf); + } + } diff --git a/json-path/src/test/java/com/jayway/jsonpath/internal/function/NestedFunctionTest.java b/json-path/src/test/java/com/jayway/jsonpath/internal/function/NestedFunctionTest.java index 36faf6563..0b7695bc8 100644 --- a/json-path/src/test/java/com/jayway/jsonpath/internal/function/NestedFunctionTest.java +++ b/json-path/src/test/java/com/jayway/jsonpath/internal/function/NestedFunctionTest.java @@ -73,6 +73,14 @@ public void testStringConcat(Configuration conf) { } + @ParameterizedTest + @MethodSource("configurations") + public void testMultipleCall(Configuration conf) { + verifyTextFunction(conf, "$.concat($.text[0], $.concat( $.concat($.text[3], \"-1\"), $.concat($.text[4], \"-1\")))", "ad-1e-1"); + } + + + @ParameterizedTest @MethodSource("configurations") public void testStringAndNumberConcat(Configuration conf) {