From 594e90789ddf0535c7b532e08ff365f19d0b1ef0 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Wed, 8 Jul 2015 10:13:20 +0200 Subject: [PATCH] DATAMONGO-1244 - Polishing. Minor reformattings and extracted a method to improve digestability. Original pull request: #306. --- .../query/StringBasedMongoQuery.java | 54 ++++++++++--------- .../query/StringBasedMongoQueryUnitTests.java | 17 +++--- 2 files changed, 38 insertions(+), 33 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQuery.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQuery.java index e75531415..f0391683f 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQuery.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQuery.java @@ -161,7 +161,8 @@ public class StringBasedMongoQuery extends AbstractMongoQuery { * @param bindings * @return */ - private String replacePlaceholders(String input, ConvertingParameterAccessor accessor, List bindings) { + private String replacePlaceholders(String input, ConvertingParameterAccessor accessor, + List bindings) { if (bindings.isEmpty()) { return input; @@ -187,11 +188,11 @@ public class StringBasedMongoQuery extends AbstractMongoQuery { int end = idx + parameter.length(); if (shouldPotentiallyRemoveQuotes) { - + // is the insertion point actually surrounded by quotes? char beforeStart = result.charAt(start - 1); char afterEnd = result.charAt(end); - + if ((beforeStart == '\'' || beforeStart == '"') && (afterEnd == '\'' || afterEnd == '"')) { // skip preceeding and following quote @@ -235,9 +236,10 @@ public class StringBasedMongoQuery extends AbstractMongoQuery { */ private Object evaluateExpression(String expressionString, Object[] parameterValues) { - EvaluationContext evaluationContext = evaluationContextProvider.getEvaluationContext(getQueryMethod() - .getParameters(), parameterValues); + EvaluationContext evaluationContext = evaluationContextProvider + .getEvaluationContext(getQueryMethod().getParameters(), parameterValues); Expression expression = expressionParser.parseExpression(expressionString); + return expression.getValue(evaluationContext, Object.class); } @@ -287,7 +289,7 @@ public class StringBasedMongoQuery extends AbstractMongoQuery { return transformedInput; } - private String transformQueryAndCollectExpressionParametersIntoBindings(String input, + private static String transformQueryAndCollectExpressionParametersIntoBindings(String input, List bindings) { StringBuilder result = new StringBuilder(); @@ -297,14 +299,11 @@ public class StringBasedMongoQuery extends AbstractMongoQuery { int exprIndex = 0; while (currentPos < input.length()) { - int indexOfExpressionParameter = input.indexOf(INDEX_BASED_EXPRESSION_PARAM_START, currentPos); - if (indexOfExpressionParameter < 0) { - indexOfExpressionParameter = input.indexOf(NAME_BASED_EXPRESSION_PARAM_START, currentPos); - } + int indexOfExpressionParameter = getIndexOfExpressionParameter(input, currentPos); + // no expression parameter found if (indexOfExpressionParameter < 0) { - // no expression parameter found break; } @@ -313,9 +312,9 @@ public class StringBasedMongoQuery extends AbstractMongoQuery { // eat parameter expression int curlyBraceOpenCnt = 1; + while (curlyBraceOpenCnt > 0) { - char c = input.charAt(currentPos++); - switch (c) { + switch (input.charAt(currentPos++)) { case CURRLY_BRACE_OPEN: curlyBraceOpenCnt++; break; @@ -323,13 +322,14 @@ public class StringBasedMongoQuery extends AbstractMongoQuery { curlyBraceOpenCnt--; break; default: - ; } } result.append(input.subSequence(startIndex, indexOfExpressionParameter)); - result.append(EXPRESSION_PARAM_QUOTE).append(EXPRESSION_PARAM_PREFIX).append(exprIndex) - .append(EXPRESSION_PARAM_QUOTE); + result.append(EXPRESSION_PARAM_QUOTE).append(EXPRESSION_PARAM_PREFIX); + result.append(exprIndex); + result.append(EXPRESSION_PARAM_QUOTE); + bindings.add(new ParameterBinding(exprIndex, true, input.substring(exprStart, currentPos - 1))); startIndex = currentPos; @@ -337,20 +337,16 @@ public class StringBasedMongoQuery extends AbstractMongoQuery { exprIndex++; } - result.append(input.subSequence(currentPos, input.length())); - - return result.toString(); + return result.append(input.subSequence(currentPos, input.length())).toString(); } - private String makeParameterReferencesParseable(String input) { + private static String makeParameterReferencesParseable(String input) { Matcher matcher = PARAMETER_BINDING_PATTERN.matcher(input); - String parseableInput = matcher.replaceAll(PARSEABLE_PARAMETER); - - return parseableInput; + return matcher.replaceAll(PARSEABLE_PARAMETER); } - private void collectParameterReferencesIntoBindings(List bindings, Object value) { + private static void collectParameterReferencesIntoBindings(List bindings, Object value) { if (value instanceof String) { @@ -393,7 +389,7 @@ public class StringBasedMongoQuery extends AbstractMongoQuery { } } - private void potentiallyAddBinding(String source, List bindings) { + private static void potentiallyAddBinding(String source, List bindings) { Matcher valueMatcher = PARSEABLE_BINDING_PATTERN.matcher(source); @@ -406,6 +402,14 @@ public class StringBasedMongoQuery extends AbstractMongoQuery { bindings.add(new ParameterBinding(paramIndex, quoted)); } } + + private static int getIndexOfExpressionParameter(String input, int position) { + + int indexOfExpressionParameter = input.indexOf(INDEX_BASED_EXPRESSION_PARAM_START, position); + + return indexOfExpressionParameter < 0 ? input.indexOf(NAME_BASED_EXPRESSION_PARAM_START, position) + : indexOfExpressionParameter; + } } /** diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQueryUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQueryUnitTests.java index ddd026896..e22e5f8f9 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQueryUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQueryUnitTests.java @@ -310,7 +310,6 @@ public class StringBasedMongoQueryUnitTests { assertThat(query.getQueryObject(), is(reference.getQueryObject())); } - /** * @see DATAMONGO-1244 */ @@ -318,7 +317,8 @@ public class StringBasedMongoQueryUnitTests { public void shouldSupportExpressionsInCustomQueriesWithNestedObject() throws Exception { ConvertingParameterAccessor accesor = StubParameterAccessor.getAccessor(converter, true, "param1", "param2"); - StringBasedMongoQuery mongoQuery = createQueryForMethod("findByQueryWithExpressionAndNestedObject", boolean.class, String.class); + StringBasedMongoQuery mongoQuery = createQueryForMethod("findByQueryWithExpressionAndNestedObject", boolean.class, + String.class); org.springframework.data.mongodb.core.query.Query query = mongoQuery.createQuery(accesor); org.springframework.data.mongodb.core.query.Query reference = new BasicQuery("{ \"id\" : { \"$exists\" : true}}"); @@ -333,15 +333,16 @@ public class StringBasedMongoQueryUnitTests { public void shouldSupportExpressionsInCustomQueriesWithMultipleNestedObjects() throws Exception { ConvertingParameterAccessor accesor = StubParameterAccessor.getAccessor(converter, true, "param1", "param2"); - StringBasedMongoQuery mongoQuery = createQueryForMethod("findByQueryWithExpressionAndMultipleNestedObjects", boolean.class, String.class, String.class); + StringBasedMongoQuery mongoQuery = createQueryForMethod("findByQueryWithExpressionAndMultipleNestedObjects", + boolean.class, String.class, String.class); org.springframework.data.mongodb.core.query.Query query = mongoQuery.createQuery(accesor); - org.springframework.data.mongodb.core.query.Query reference = new BasicQuery("{ \"id\" : { \"$exists\" : true} , \"foo\" : 42 , \"bar\" : { \"$exists\" : false}}"); + org.springframework.data.mongodb.core.query.Query reference = new BasicQuery( + "{ \"id\" : { \"$exists\" : true} , \"foo\" : 42 , \"bar\" : { \"$exists\" : false}}"); assertThat(query.getQueryObject(), is(reference.getQueryObject())); } - private StringBasedMongoQuery createQueryForMethod(String name, Class... parameters) throws Exception { Method method = SampleRepository.class.getMethod(name, parameters); @@ -389,11 +390,11 @@ public class StringBasedMongoQueryUnitTests { @Query("{'lastname': ?#{[0]} }") List findByQueryWithExpression(String param0); - + @Query("{'id':?#{ [0] ? { $exists :true} : [1] }}") List findByQueryWithExpressionAndNestedObject(boolean param0, String param1); - + @Query("{'id':?#{ [0] ? { $exists :true} : [1] }, 'foo':42, 'bar': ?#{ [0] ? { $exists :false} : [1] }}") - List findByQueryWithExpressionAndMultipleNestedObjects(boolean param0, String param1, String param2); + List findByQueryWithExpressionAndMultipleNestedObjects(boolean param0, String param1, String param2); } }