From 58708779dacb2ef91499013426526fed9d965ee0 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Tue, 9 Jun 2020 15:26:08 +0200 Subject: [PATCH] #383 - Fix Criteria mapping when composing a group from top-level criteria. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Using Criteria.from(…) with multiple Criteria objects now uses properly AND combination along with group nesting to render a correct criteria. Previously, the INITIAL combinator in groups caused a mapping exception. --- .../data/r2dbc/query/QueryMapper.java | 4 +++- .../data/r2dbc/query/QueryMapperUnitTests.java | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/springframework/data/r2dbc/query/QueryMapper.java b/src/main/java/org/springframework/data/r2dbc/query/QueryMapper.java index a4aa231..5824e10 100644 --- a/src/main/java/org/springframework/data/r2dbc/query/QueryMapper.java +++ b/src/main/java/org/springframework/data/r2dbc/query/QueryMapper.java @@ -322,12 +322,14 @@ public class QueryMapper { if (currentCondition == null) { currentCondition = nextCondition; + } else if (combinator == CriteriaDefinition.Combinator.INITIAL) { + currentCondition = currentCondition.and(Conditions.nest(nextCondition)); } else if (combinator == CriteriaDefinition.Combinator.AND) { currentCondition = currentCondition.and(nextCondition); } else if (combinator == CriteriaDefinition.Combinator.OR) { currentCondition = currentCondition.or(nextCondition); } else { - throw new IllegalStateException("Combinator " + criteria.getCombinator() + " not supported"); + throw new IllegalStateException("Combinator " + combinator + " not supported"); } return currentCondition; diff --git a/src/test/java/org/springframework/data/r2dbc/query/QueryMapperUnitTests.java b/src/test/java/org/springframework/data/r2dbc/query/QueryMapperUnitTests.java index 9a28908..0d67800 100644 --- a/src/test/java/org/springframework/data/r2dbc/query/QueryMapperUnitTests.java +++ b/src/test/java/org/springframework/data/r2dbc/query/QueryMapperUnitTests.java @@ -126,6 +126,22 @@ public class QueryMapperUnitTests { .isEqualTo("person.name = ?[$1] AND (person.name = ?[$2] OR person.age < ?[$3])"); } + @Test // gh-383 + public void shouldMapFromConcat() { + + Criteria criteria = Criteria.from(Criteria.where("name").is("Foo"), Criteria.where("name").is("Bar") // + .or("age").lessThan(49)); + + assertThat(map(criteria).getCondition().toString()) + .isEqualTo("(person.name = ?[$1] AND (person.name = ?[$2] OR person.age < ?[$3]))"); + + criteria = Criteria.from(Criteria.where("name").is("Foo"), Criteria.where("name").is("Bar") // + .or("age").lessThan(49), Criteria.where("foo").is("bar")); + + assertThat(map(criteria).getCondition().toString()) + .isEqualTo("(person.name = ?[$1] AND (person.name = ?[$2] OR person.age < ?[$3]) AND (person.foo = ?[$4]))"); + } + @Test // gh-64 public void shouldMapSimpleCriteria() {