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 302d276..71658cc 100644 --- a/src/main/java/cz/jirutka/rsql/parser/ast/ComparisonNode.java +++ b/src/main/java/cz/jirutka/rsql/parser/ast/ComparisonNode.java @@ -96,7 +96,9 @@ public String getSelector() { * @return a copy of this node with the specified selector. */ public ComparisonNode withSelector(String newSelector) { - return new ComparisonNode(operator, newSelector, arguments, true); + return selector.equals(newSelector) + ? this + : 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 3d543c2..29cae9b 100644 --- a/src/test/groovy/cz/jirutka/rsql/parser/ast/ComparisonNodeTest.groovy +++ b/src/test/groovy/cz/jirutka/rsql/parser/ast/ComparisonNodeTest.groovy @@ -83,6 +83,17 @@ class ComparisonNodeTest extends Specification { argsField.get(actual2) is(rawArguments) } + def 'should not copy node when not needed'() { + given: + def node = new ComparisonNode(IN, 'genres', ['thriller', 'sci-fi']) + + when: + def actual1 = node.withSelector(node.selector) + + then: + actual1.is(node) + } + def 'should create proper toString representation'() { expect: node.toString() == expected