diff --git a/src/main/java/cz/jirutka/rsql/parser/ast/ComparisonNode.java b/src/main/java/cz/jirutka/rsql/parser/ast/ComparisonNode.java index 0021df9..302d276 100644 --- a/src/main/java/cz/jirutka/rsql/parser/ast/ComparisonNode.java +++ b/src/main/java/cz/jirutka/rsql/parser/ast/ComparisonNode.java @@ -52,6 +52,11 @@ public final class ComparisonNode extends AbstractNode { * @throws IllegalArgumentException If one of the conditions specified above it not met. */ public ComparisonNode(ComparisonOperator operator, String selector, List arguments) { + this(operator, selector, new ArrayList<>(arguments), true); + } + + ComparisonNode(ComparisonOperator operator, String selector, List arguments, + @SuppressWarnings("unused") boolean trusted) { Assert.notNull(operator, "operator must not be null"); Assert.notBlank(selector, "selector must not be blank"); Assert.notNull(arguments, "arguments must not be null"); @@ -59,7 +64,7 @@ public ComparisonNode(ComparisonOperator operator, String selector, List this.operator = operator; this.selector = selector; - this.arguments = new ArrayList<>(arguments); + this.arguments = arguments; } public R accept(RSQLVisitor visitor, A param) { @@ -77,7 +82,7 @@ public ComparisonOperator getOperator() { * @return a copy of this node with the specified operator. */ public ComparisonNode withOperator(ComparisonOperator newOperator) { - return new ComparisonNode(newOperator, selector, arguments); + return new ComparisonNode(newOperator, selector, arguments, true); } public String getSelector() { @@ -91,7 +96,7 @@ public String getSelector() { * @return a copy of this node with the specified selector. */ public ComparisonNode withSelector(String newSelector) { - return new ComparisonNode(operator, newSelector, arguments); + return new ComparisonNode(operator, newSelector, arguments, true); } /** diff --git a/src/test/groovy/cz/jirutka/rsql/parser/ast/ComparisonNodeTest.groovy b/src/test/groovy/cz/jirutka/rsql/parser/ast/ComparisonNodeTest.groovy index f9fb099..3d543c2 100644 --- a/src/test/groovy/cz/jirutka/rsql/parser/ast/ComparisonNodeTest.groovy +++ b/src/test/groovy/cz/jirutka/rsql/parser/ast/ComparisonNodeTest.groovy @@ -62,6 +62,27 @@ class ComparisonNodeTest extends Specification { node.getArguments() == ['thriller', 'sci-fi'] } + def 'should not copy list when not needed'() { + given: + def args = ['thriller', 'sci-fi'] + def node = new ComparisonNode(IN, 'genres', args) + def argsField = ComparisonNode.getDeclaredField('arguments') + argsField.setAccessible(true) + def rawArguments = argsField.get(node) + + when: + def actual1 = node.withSelector('gs') + + then: + argsField.get(actual1) is(rawArguments) + + when: + def actual2 = actual1.withOperator(NOT_IN) + + then: + argsField.get(actual2) is(rawArguments) + } + def 'should create proper toString representation'() { expect: node.toString() == expected