diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/SpelExpressionTransformer.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/SpelExpressionTransformer.java index 96aaaf872..d76d2b367 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/SpelExpressionTransformer.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/SpelExpressionTransformer.java @@ -1,5 +1,5 @@ /* - * Copyright 2013-2016 the original author or authors. + * Copyright 2013-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -49,9 +49,10 @@ import org.springframework.util.ObjectUtils; /** * Renders the AST of a SpEL expression as a MongoDB Aggregation Framework projection expression. - * + * * @author Thomas Darimont * @author Christoph Strobl + * @author Mark Paluch */ class SpelExpressionTransformer implements AggregationExpressionTransformer { @@ -84,7 +85,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer { * {@link AggregationOperationContext} {@code context}. *

* Exposes the given @{code params} as [0] ... [n]. - * + * * @param expression must not be {@literal null} * @param context must not be {@literal null} * @param params must not be {@literal null} @@ -114,7 +115,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer { /** * Returns an appropriate {@link ExpressionNodeConversion} for the given {@code node}. Throws an * {@link IllegalArgumentException} if no conversion could be found. - * + * * @param node * @return the appropriate {@link ExpressionNodeConversion} for the given {@link ExpressionNode}. */ @@ -133,7 +134,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer { /** * Abstract base class for {@link SpelNode} to (Db)-object conversions. - * + * * @author Thomas Darimont * @author Oliver Gierke */ @@ -145,7 +146,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer { /** * Creates a new {@link ExpressionNodeConversion}. - * + * * @param transformer must not be {@literal null}. */ @SuppressWarnings("unchecked") @@ -161,7 +162,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer { /** * Returns whether the current conversion supports the given {@link ExpressionNode}. By default we will match the * node type against the genric type the subclass types the type parameter to. - * + * * @param node will never be {@literal null}. * @return true if {@literal this} conversion can be applied to the given {@code node}. */ @@ -171,7 +172,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer { /** * Triggers the transformation for the given {@link ExpressionNode} and the given current context. - * + * * @param node must not be {@literal null}. * @param context must not be {@literal null}. * @return @@ -187,7 +188,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer { /** * Triggers the transformation with the given new {@link ExpressionNode}, new parent node, the current operation and * the previous context. - * + * * @param node must not be {@literal null}. * @param parent * @param operation @@ -204,7 +205,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer { context.getAggregationContext())); } - /* + /* * (non-Javadoc) * @see org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.NodeConversion#transform(org.springframework.data.mongodb.core.aggregation.AggregationExpressionTransformer.AggregationExpressionTransformationContext) */ @@ -215,7 +216,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer { /** * Performs the actual conversion from {@link SpelNode} to the corresponding representation for MongoDB. - * + * * @param context * @return */ @@ -224,7 +225,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer { /** * A {@link ExpressionNodeConversion} that converts arithmetic operations. - * + * * @author Thomas Darimont */ private static class OperatorNodeConversion extends ExpressionNodeConversion { @@ -233,7 +234,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer { super(transformer); } - /* + /* * (non-Javadoc) * @see org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.SpelNodeWrapper#convertSpelNodeToMongoObjectExpression(org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.ExpressionConversionContext) */ @@ -258,8 +259,10 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer { return convertUnaryMinusOp(context, leftResult); } - // we deliberately ignore the RHS result - transform(currentNode.getRight(), currentNode, operationObject, context); + if (!currentNode.isUnaryOperator()) { + // we deliberately ignore the RHS result + transform(currentNode.getRight(), currentNode, operationObject, context); + } return operationObject; } @@ -299,7 +302,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer { return result; } - /* + /* * (non-Javadoc) * @see org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.SpelNodeWrapper#supports(java.lang.Class) */ @@ -311,7 +314,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer { /** * A {@link ExpressionNodeConversion} that converts indexed expressions. - * + * * @author Thomas Darimont * @author Oliver Gierke */ @@ -321,7 +324,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer { super(transformer); } - /* + /* * (non-Javadoc) * @see org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.SpelNodeWrapper#convertSpelNodeToMongoObjectExpression(org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.ExpressionConversionContext) */ @@ -330,7 +333,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer { return context.addToPreviousOrReturn(context.getCurrentNode().getValue()); } - /* + /* * (non-Javadoc) * @see org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.NodeConversion#supports(org.springframework.data.mongodb.core.spel.ExpressionNode) */ @@ -342,7 +345,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer { /** * A {@link ExpressionNodeConversion} that converts in-line list expressions. - * + * * @author Thomas Darimont */ private static class InlineListNodeConversion extends ExpressionNodeConversion { @@ -351,7 +354,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer { super(transformer); } - /* + /* * (non-Javadoc) * @see org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.SpelNodeWrapper#convertSpelNodeToMongoObjectExpression(org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.ExpressionConversionContext) */ @@ -368,7 +371,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer { return transform(currentNode.getChild(0), currentNode, null, context); } - /* + /* * (non-Javadoc) * @see org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.NodeConversion#supports(org.springframework.data.mongodb.core.spel.ExpressionNode) */ @@ -380,7 +383,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer { /** * A {@link ExpressionNodeConversion} that converts property or field reference expressions. - * + * * @author Thomas Darimont * @author Oliver Gierke */ @@ -401,7 +404,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer { return context.addToPreviousOrReturn(fieldReference); } - /* + /* * (non-Javadoc) * @see org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.NodeConversion#supports(org.springframework.data.mongodb.core.spel.ExpressionNode) */ @@ -413,7 +416,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer { /** * A {@link ExpressionNodeConversion} that converts literal expressions. - * + * * @author Thomas Darimont * @author Oliver Gierke */ @@ -423,7 +426,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer { super(transformer); } - /* + /* * (non-Javadoc) * @see org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.SpelNodeWrapper#convertSpelNodeToMongoObjectExpression(org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.ExpressionConversionContext) */ @@ -448,7 +451,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer { return value; } - /* + /* * (non-Javadoc) * @see org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.SpelNodeWrapper#supports(org.springframework.expression.spel.SpelNode) */ @@ -460,7 +463,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer { /** * A {@link ExpressionNodeConversion} that converts method reference expressions. - * + * * @author Thomas Darimont * @author Oliver Gierke */ @@ -470,7 +473,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer { super(transformer); } - /* + /* * (non-Javadoc) * @see org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.SpelNodeWrapper#convertSpelNodeToMongoObjectExpression(org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.ExpressionConversionContext) */ @@ -489,7 +492,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer { Document dbo = new Document(); int i = 0; - for(ExpressionNode child : node) { + for (ExpressionNode child : node) { dbo.put(methodReference.getArgumentMap()[i++], transform(child, context)); } args = dbo; @@ -510,7 +513,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer { /** * A {@link ExpressionNodeConversion} that converts method compound expressions. - * + * * @author Thomas Darimont * @author Oliver Gierke */ @@ -520,7 +523,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer { super(transformer); } - /* + /* * (non-Javadoc) * @see org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.SpelNodeWrapper#convertSpelNodeToMongoObjectExpression(org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.ExpressionConversionContext) */ @@ -537,7 +540,7 @@ class SpelExpressionTransformer implements AggregationExpressionTransformer { return context.addToPreviousOrReturn(currentNode.getValue()); } - /* + /* * (non-Javadoc) * @see org.springframework.data.mongodb.core.aggregation.SpelExpressionTransformer.NodeConversion#supports(org.springframework.data.mongodb.core.spel.ExpressionNode) */ diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/spel/LiteralNode.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/spel/LiteralNode.java index 1f5529452..4add40cc7 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/spel/LiteralNode.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/spel/LiteralNode.java @@ -1,5 +1,5 @@ /* - * Copyright 2013-2016 the original author or authors. + * Copyright 2013-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,6 +34,7 @@ import org.springframework.expression.spel.ast.StringLiteral; * * @author Oliver Gierke * @author Christoph Strobl + * @author Mark Paluch */ public class LiteralNode extends ExpressionNode { @@ -56,7 +57,7 @@ public class LiteralNode extends ExpressionNode { /** * Creates a new {@link LiteralNode} from the given {@link Literal} and {@link ExpressionState}. - * + * * @param node must not be {@literal null}. * @param state must not be {@literal null}. */ @@ -67,7 +68,7 @@ public class LiteralNode extends ExpressionNode { /** * Returns whether the given {@link ExpressionNode} is a unary minus. - * + * * @param parent * @return */ @@ -78,7 +79,7 @@ public class LiteralNode extends ExpressionNode { } OperatorNode operator = (OperatorNode) parent; - return operator.isUnaryMinus() && operator.getRight() == null; + return operator.isUnaryMinus(); } /* diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/spel/OperatorNode.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/spel/OperatorNode.java index 948c9544f..ea98ddc98 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/spel/OperatorNode.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/spel/OperatorNode.java @@ -1,5 +1,5 @@ /* - * Copyright 2013-2016 the original author or authors. + * Copyright 2013-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,21 +22,7 @@ import java.util.Map; import java.util.Set; import org.springframework.expression.spel.ExpressionState; -import org.springframework.expression.spel.ast.OpAnd; -import org.springframework.expression.spel.ast.OpDivide; -import org.springframework.expression.spel.ast.OpEQ; -import org.springframework.expression.spel.ast.OpGE; -import org.springframework.expression.spel.ast.OpGT; -import org.springframework.expression.spel.ast.OpLE; -import org.springframework.expression.spel.ast.OpLT; -import org.springframework.expression.spel.ast.OpMinus; -import org.springframework.expression.spel.ast.OpModulus; -import org.springframework.expression.spel.ast.OpMultiply; -import org.springframework.expression.spel.ast.OpNE; -import org.springframework.expression.spel.ast.OpOr; -import org.springframework.expression.spel.ast.OpPlus; -import org.springframework.expression.spel.ast.Operator; -import org.springframework.expression.spel.ast.OperatorPower; +import org.springframework.expression.spel.ast.*; /** * An {@link ExpressionNode} representing an operator. @@ -44,6 +30,7 @@ import org.springframework.expression.spel.ast.OperatorPower; * @author Oliver Gierke * @author Thomas Darimont * @author Christoph Strobl + * @author Mark Paluch */ public class OperatorNode extends ExpressionNode { @@ -102,7 +89,7 @@ public class OperatorNode extends ExpressionNode { this.operator = node; } - /* + /* * (non-Javadoc) * @see org.springframework.data.mongodb.core.spel.ExpressionNode#isMathematicalOperation() */ @@ -122,16 +109,16 @@ public class OperatorNode extends ExpressionNode { /** * Returns whether the operator is unary. - * + * * @return */ public boolean isUnaryOperator() { - return operator.getRightOperand() == null; + return operator.getChildCount() == 1; } /** * Returns the Mongo expression of the operator. - * + * * @return */ public String getMongoOperator() { @@ -147,7 +134,7 @@ public class OperatorNode extends ExpressionNode { /** * Returns whether the operator is a unary minus, e.g. -1. - * + * * @return */ public boolean isUnaryMinus() { @@ -156,7 +143,7 @@ public class OperatorNode extends ExpressionNode { /** * Returns the left operand as {@link ExpressionNode}. - * + * * @return */ public ExpressionNode getLeft() { @@ -165,7 +152,7 @@ public class OperatorNode extends ExpressionNode { /** * Returns the right operand as {@link ExpressionNode}. - * + * * @return */ public ExpressionNode getRight() { diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryMethod.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryMethod.java index 8bdb42d40..da40346a8 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryMethod.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryMethod.java @@ -93,7 +93,7 @@ public class MongoQueryMethod extends QueryMethod { * @return */ public boolean hasAnnotatedQuery() { - return getAnnotatedQuery() != null; + return findAnnotatedQuery().isPresent(); } /** @@ -103,9 +103,15 @@ public class MongoQueryMethod extends QueryMethod { * @return */ String getAnnotatedQuery() { + return findAnnotatedQuery().orElse(null); + } - String query = (String) AnnotationUtils.getValue(getQueryAnnotation()); - return StringUtils.hasText(query) ? query : null; + private Optional findAnnotatedQuery() { + + return Optional.ofNullable(getQueryAnnotation()) // + .map(AnnotationUtils::getValue) // + .map(it -> (String) it) // + .filter(StringUtils::hasText); } /** @@ -115,8 +121,10 @@ public class MongoQueryMethod extends QueryMethod { */ String getFieldSpecification() { - String value = (String) AnnotationUtils.getValue(getQueryAnnotation(), "fields"); - return StringUtils.hasText(value) ? value : null; + return Optional.ofNullable(getQueryAnnotation()) // + .map(it -> (String) AnnotationUtils.getValue(it, "fields")) // + .filter(StringUtils::hasText) // + .orElse(null); } /*