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; }