From ec3e4127d2f5ee2bcd8e8cb1fd92953fbe0bb785 Mon Sep 17 00:00:00 2001 From: lukaseder Date: Thu, 1 Jun 2017 12:23:00 +0200 Subject: [PATCH] [#6304] Improve internal TableAlias discovery --- .../java/org/jooq/impl/AbstractTable.java | 16 ++--------- .../java/org/jooq/impl/DeleteQueryImpl.java | 7 ++--- .../main/java/org/jooq/impl/JoinTable.java | 28 +++++-------------- jOOQ/src/main/java/org/jooq/impl/Tools.java | 2 +- 4 files changed, 13 insertions(+), 40 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java b/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java index 2df11c8451..ffc850b347 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java @@ -487,19 +487,9 @@ abstract class AbstractTable extends AbstractQueryPart impleme result.add((ForeignKey) reference); } - // TODO: Refactor the following two blocks and make things more OO - // [#1460] In case the other table was aliased using - else if (other instanceof TableImpl) { - Table aliased = ((TableImpl) other).getAliasedTable(); - - if (aliased != null && aliased.equals(reference.getKey().getTable())) { - result.add((ForeignKey) reference); - } - } - - // [#1460] In case the other table was aliased using - else if (other instanceof TableAlias) { - Table aliased = ((TableAlias) other).getAliasedTable(); + // [#1460] [#6304] In case the other table was aliased + else { + Table aliased = Tools.aliased(other); if (aliased != null && aliased.equals(reference.getKey().getTable())) { result.add((ForeignKey) reference); diff --git a/jOOQ/src/main/java/org/jooq/impl/DeleteQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/DeleteQueryImpl.java index 9c68000e22..e4e14d130b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DeleteQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/DeleteQueryImpl.java @@ -108,13 +108,10 @@ final class DeleteQueryImpl extends AbstractDMLQuery implem // DELETE t1 FROM my_table AS t1 if (asList(MARIADB, MYSQL).contains(ctx.configuration().dialect())) { - // [#2579] TODO: Improve Table API to discover aliased tables more - // reliably instead of resorting to instanceof: - if (table instanceof TableAlias || - (table instanceof TableImpl && ((TableImpl) table).getAliasedTable() != null)) { + // [#2579] [#6304] TableAlias discovery + if (Tools.alias(table) != null) ctx.visit(table) .sql(' '); - } } ctx.visit(K_FROM).sql(' ') diff --git a/jOOQ/src/main/java/org/jooq/impl/JoinTable.java b/jOOQ/src/main/java/org/jooq/impl/JoinTable.java index 4ca2ad5469..ae9d6bbbf9 100755 --- a/jOOQ/src/main/java/org/jooq/impl/JoinTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/JoinTable.java @@ -602,25 +602,10 @@ implements private final Table search(Table tree, Table search) { - // TODO: Another instanceof, and we should probably resort to - // implementing a new org.jooq.Context to traverse the AST - if (tree instanceof TableImpl) { - TableImpl t = (TableImpl) tree; - - if (t.alias == null && search.equals(t)) - return t; - else if (t.alias != null && search.equals(t.alias.wrapped())) - return t; - else - return null; - } - else if (tree instanceof TableAlias) { - TableAlias t = (TableAlias) tree; - - if (search.equals(t.alias.wrapped())) - return t; - else - return null; + // [#6304] Improved alias discovery + Alias> alias = Tools.alias(tree); + if (alias != null) { + return search(alias.wrapped(), search); } else if (tree instanceof JoinTable) { JoinTable t = (JoinTable) tree; @@ -631,8 +616,9 @@ implements return r; } - - return tree; + else { + return search.equals(tree) ? tree : null; + } } @SuppressWarnings({ "unchecked", "rawtypes" }) diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index d39f037fef..c257307d06 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -3735,7 +3735,7 @@ final class Tools { return null; } - static final Alias alias(Table table) { + static final Alias> alias(Table table) { if (table instanceof TableImpl) return ((TableImpl) table).alias; else if (table instanceof TableAlias)