From 8d8ef7efbb17d72f13e01a5f562c79d2ba63671e Mon Sep 17 00:00:00 2001 From: Jens Schauder Date: Wed, 21 Jul 2021 15:43:26 +0200 Subject: [PATCH 1/3] 995-non-trivial-join-condition - Prepare branch --- pom.xml | 2 +- spring-data-jdbc-distribution/pom.xml | 2 +- spring-data-jdbc/pom.xml | 4 ++-- spring-data-relational/pom.xml | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index eeaa0b9e93..25931a0b85 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-relational-parent - 2.3.0-SNAPSHOT + 2.3.0-995-non-trivial-join-condition-SNAPSHOT pom Spring Data Relational Parent diff --git a/spring-data-jdbc-distribution/pom.xml b/spring-data-jdbc-distribution/pom.xml index 03d6a5c2a0..25b6e85f9d 100644 --- a/spring-data-jdbc-distribution/pom.xml +++ b/spring-data-jdbc-distribution/pom.xml @@ -14,7 +14,7 @@ org.springframework.data spring-data-relational-parent - 2.3.0-SNAPSHOT + 2.3.0-995-non-trivial-join-condition-SNAPSHOT ../pom.xml diff --git a/spring-data-jdbc/pom.xml b/spring-data-jdbc/pom.xml index af9ad0904e..3a77c34716 100644 --- a/spring-data-jdbc/pom.xml +++ b/spring-data-jdbc/pom.xml @@ -6,7 +6,7 @@ 4.0.0 spring-data-jdbc - 2.3.0-SNAPSHOT + 2.3.0-995-non-trivial-join-condition-SNAPSHOT Spring Data JDBC Spring Data module for JDBC repositories. @@ -15,7 +15,7 @@ org.springframework.data spring-data-relational-parent - 2.3.0-SNAPSHOT + 2.3.0-995-non-trivial-join-condition-SNAPSHOT diff --git a/spring-data-relational/pom.xml b/spring-data-relational/pom.xml index 4e42a006ec..f34912d6c1 100644 --- a/spring-data-relational/pom.xml +++ b/spring-data-relational/pom.xml @@ -6,7 +6,7 @@ 4.0.0 spring-data-relational - 2.3.0-SNAPSHOT + 2.3.0-995-non-trivial-join-condition-SNAPSHOT Spring Data Relational Spring Data Relational support @@ -14,7 +14,7 @@ org.springframework.data spring-data-relational-parent - 2.3.0-SNAPSHOT + 2.3.0-995-non-trivial-join-condition-SNAPSHOT From f1225a85a6ef9bd597887cfbf094aca6a13dff42 Mon Sep 17 00:00:00 2001 From: Jens Schauder Date: Thu, 22 Jul 2021 09:25:35 +0200 Subject: [PATCH 2/3] Allow for arbitrary conditions as join condition. #Closes 995. --- .../core/sql/DefaultSelectBuilder.java | 18 +++++++++++++++ .../relational/core/sql/SelectBuilder.java | 11 ++++++++++ .../sql/render/SelectRendererUnitTests.java | 22 +++++++++++++++++++ 3 files changed, 51 insertions(+) diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/DefaultSelectBuilder.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/DefaultSelectBuilder.java index 49ff3a2a05..6e590eae1f 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/DefaultSelectBuilder.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/DefaultSelectBuilder.java @@ -325,6 +325,18 @@ public SelectOnConditionComparison on(Expression column) { return this; } + @Override + public SelectFromAndJoinCondition on(Condition condition) { + + if (this.condition == null) { + this.condition = condition; + } else { + this.condition = this.condition.and(condition); + } + + return this; + } + /* * (non-Javadoc) * @see org.springframework.data.relational.core.sql.SelectBuilder.SelectOnConditionComparison#equals(org.springframework.data.relational.core.sql.Expression) @@ -348,6 +360,12 @@ public SelectOnConditionComparison and(Expression column) { } private void finishCondition() { + + // Nothing to do if a complete join condition was used. + if (from == null && to == null) { + return; + } + Comparison comparison = Comparison.create(from, "=", to); if (condition == null) { diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/SelectBuilder.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/SelectBuilder.java index edb7b8fbed..8148019608 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/SelectBuilder.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/SelectBuilder.java @@ -501,6 +501,17 @@ interface SelectOn { * @see Table#column(String) */ SelectOnConditionComparison on(Expression column); + + /** + * Declare a join condition in one step. + * + * This is harder to use but more flexible then the fluent style of {@link #on(Expression)} which only allows for equality comparisons chained together with `AND`. + * + * @param condition Must not be {@literal null}. + * @return @return {@code this} builder. + * @see Conditions + */ + SelectFromAndJoinCondition on(Condition condition); } /** diff --git a/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/SelectRendererUnitTests.java b/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/SelectRendererUnitTests.java index 0394d4babd..c28f0087d4 100644 --- a/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/SelectRendererUnitTests.java +++ b/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/SelectRendererUnitTests.java @@ -156,6 +156,28 @@ void shouldRenderSimpleJoinWithAnd() { + "AND employee.tenant = department.tenant"); } + @Test // GH-995 + public void shouldRenderArbitraryJoinCondition() { + + Table employee = SQL.table("employee"); + Table department = SQL.table("department"); + + Select select = Select.builder() // + .select(employee.column("id"), department.column("name")) // + .from(employee) // + .join(department) // + .on( + Conditions.isEqual( employee.column("department_id"),department.column("id")) // + .or( // + Conditions.isNotEqual( employee.column("tenant"),department.column("tenant")) // + )) // + .build(); + + assertThat(SqlRenderer.toString(select)).isEqualTo("SELECT employee.id, department.name FROM employee " // + + "JOIN department ON employee.department_id = department.id " // + + "OR employee.tenant != department.tenant"); + } + @Test // DATAJDBC-309 void shouldRenderMultipleJoinWithAnd() { From 391293e34fd498babc731c05e62ee51567704b27 Mon Sep 17 00:00:00 2001 From: Jens Schauder Date: Thu, 22 Jul 2021 13:33:53 +0200 Subject: [PATCH 3/3] Fix and improve JavaDoc based on review comments. See #1009 Original pull request #1014 --- .../data/relational/core/sql/SelectBuilder.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/SelectBuilder.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/SelectBuilder.java index 8148019608..0b701f72f1 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/SelectBuilder.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/SelectBuilder.java @@ -505,10 +505,10 @@ interface SelectOn { /** * Declare a join condition in one step. * - * This is harder to use but more flexible then the fluent style of {@link #on(Expression)} which only allows for equality comparisons chained together with `AND`. + * Using conditions allows more flexibility in comparison to {@link #on(Expression)} which only allows for equality comparisons chained together with `AND`. * - * @param condition Must not be {@literal null}. - * @return @return {@code this} builder. + * @param condition must not be {@literal null}. + * @return {@code this} builder. * @see Conditions */ SelectFromAndJoinCondition on(Condition condition);