From 8e34cd041786d1f7002dedf880f52fe7b3cacdcc Mon Sep 17 00:00:00 2001 From: lukaseder Date: Fri, 9 Feb 2018 12:57:00 +0100 Subject: [PATCH] [#1502] Support implicit self joins, generating aliases for implicit join path --- .../java/org/jooq/impl/AbstractContext.java | 2 +- .../org/jooq/impl/DefaultRenderContext.java | 2 ++ jOOQ/src/main/java/org/jooq/impl/TableImpl.java | 17 ++++++++++++++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java b/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java index faa43e55d4..9d80f1c883 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java @@ -738,7 +738,7 @@ abstract class AbstractContext> extends AbstractScope imple Table result = table; for (Entry, JoinNode> e : children.entrySet()) - result = result.leftJoin(e.getValue().table).onKey(e.getKey()); + result = result.leftJoin(e.getValue().joinTree()).onKey(e.getKey()); return result; } diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java b/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java index b4fb086934..da1b155e2c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java @@ -208,6 +208,8 @@ class DefaultRenderContext extends AbstractContext implements Ren next = new JoinNode(t); childNode.children.put(k, next); } + + childNode = next; } } } diff --git a/jOOQ/src/main/java/org/jooq/impl/TableImpl.java b/jOOQ/src/main/java/org/jooq/impl/TableImpl.java index 64683b70d5..16e41a94c6 100644 --- a/jOOQ/src/main/java/org/jooq/impl/TableImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/TableImpl.java @@ -156,7 +156,22 @@ public class TableImpl extends AbstractTable { } public TableImpl(Table child, ForeignKey path, Table parent) { - this(parent.getQualifiedName(), parent.getSchema(), child, path, null, null, DSL.comment(parent.getComment())); + this(pathAlias(child, path), null, child, path, parent, null, DSL.comment(parent.getComment())); + } + + private static final Name pathAlias(Table child, ForeignKey path) { + Name name = DSL.name(path.getName()); + + if (child instanceof TableImpl) { + Table ancestor = ((TableImpl) child).child; + + if (ancestor != null) + name = pathAlias(ancestor, ((TableImpl) child).childPath).append(name); + else + name = child.getQualifiedName().append(name); + } + + return DSL.name("alias_" + Tools.hash(name)); } public TableImpl(Name name, Schema schema, Table child, ForeignKey path, Table aliased, Field[] parameters, Comment comment) {