From 6dd904d3d43ed7b2b19e046d4c5a47d37d68c478 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Wed, 18 Aug 2021 13:14:51 +0200 Subject: [PATCH] =?UTF-8?q?[jOOQ/jOOQ#12324]=20Wrong=20(+)=20to=20LEFT=20J?= =?UTF-8?q?OIN=20transformation=20in=20join=20tree=20A=E2=9F=95B,=20A?= =?UTF-8?q?=E2=9F=95C,=20A=E2=8B=88D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/jooq/impl/SelectQueryImpl.java | 11 ++++++++ jOOQ/src/main/java/org/jooq/impl/Tools.java | 26 ++++++++++++++++--- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java index 6ba93c1b77..bf4360ac5e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java @@ -2934,6 +2934,17 @@ final class SelectQueryImpl extends AbstractResultQuery imp + + + + + + + + + + + diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index 131e4dc313..7ebd27f092 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -260,6 +260,7 @@ import org.jooq.ForeignKey; import org.jooq.JSON; import org.jooq.JSONB; import org.jooq.JSONEntry; +import org.jooq.JoinType; import org.jooq.Name; import org.jooq.OrderField; import org.jooq.Param; @@ -6282,20 +6283,37 @@ final class Tools { T result, Predicate abort, BiFunction, ? extends T> function + ) { + return traverseJoins(t, result, abort, null, function); + } + + static final T traverseJoins( + Table t, + T result, + Predicate abort, + BiFunction joinTypeFunction, + BiFunction, ? extends T> tableFunction ) { if (abort.test(result)) return result; if (t instanceof JoinTable) { - result = traverseJoins(((JoinTable) t).lhs, result, abort, function); + result = traverseJoins(((JoinTable) t).lhs, result, abort, joinTypeFunction, tableFunction); if (abort.test(result)) return result; - result = traverseJoins(((JoinTable) t).rhs, result, abort, function); + if (joinTypeFunction != null) { + result = joinTypeFunction.apply(result, ((JoinTable) t).type); + + if (abort.test(result)) + return result; + } + + result = traverseJoins(((JoinTable) t).rhs, result, abort, joinTypeFunction, tableFunction); } - else - result = function.apply(result, t); + else if (tableFunction != null) + result = tableFunction.apply(result, t); return result; }