From 49fe6ebebfe482f5fb6c91529a9669a03762d4fa Mon Sep 17 00:00:00 2001 From: lukaseder Date: Fri, 9 Feb 2018 13:26:40 +0100 Subject: [PATCH] [#7148] Improved implicit join code generation If table A references table B only once, then B is a much better method name than the foreign key name itself. --- .../java/org/jooq/util/DefaultGeneratorStrategy.java | 10 ++++++++++ .../java/org/jooq/util/AbstractTableDefinition.java | 11 +++++++++++ .../src/main/java/org/jooq/util/TableDefinition.java | 5 +++++ 3 files changed, 26 insertions(+) diff --git a/jOOQ-codegen/src/main/java/org/jooq/util/DefaultGeneratorStrategy.java b/jOOQ-codegen/src/main/java/org/jooq/util/DefaultGeneratorStrategy.java index d25a21b4a3..84b869aea0 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/util/DefaultGeneratorStrategy.java +++ b/jOOQ-codegen/src/main/java/org/jooq/util/DefaultGeneratorStrategy.java @@ -159,6 +159,16 @@ public class DefaultGeneratorStrategy extends AbstractGeneratorStrategy { @Override public String getJavaMethodName(Definition definition, Mode mode) { + // [#7148] If table A references table B only once, then B is the ideal name + // for the implicit JOIN path. Otherwise, fall back to the foreign key name + if (definition instanceof ForeignKeyDefinition) { + ForeignKeyDefinition fk = (ForeignKeyDefinition) definition; + TableDefinition referenced = fk.getReferencedTable(); + + if (fk.getKeyTable().getForeignKeys(referenced).size() == 1) + return getJavaMethodName(referenced, mode); + } + return getJavaClassName0LC(definition, Mode.DEFAULT); } diff --git a/jOOQ-meta/src/main/java/org/jooq/util/AbstractTableDefinition.java b/jOOQ-meta/src/main/java/org/jooq/util/AbstractTableDefinition.java index 599b661b17..10fc74ae92 100644 --- a/jOOQ-meta/src/main/java/org/jooq/util/AbstractTableDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/util/AbstractTableDefinition.java @@ -97,6 +97,17 @@ implements TableDefinition { return getDatabase().getRelations().getForeignKeys(this); } + @Override + public final List getForeignKeys(TableDefinition referenced) { + List result = new ArrayList(); + + for (ForeignKeyDefinition key : getForeignKeys()) + if (referenced.equals(key.getReferencedTable())) + result.add(key); + + return result; + } + @Override public final List getCheckConstraints() { return getDatabase().getRelations().getCheckConstraints(this); diff --git a/jOOQ-meta/src/main/java/org/jooq/util/TableDefinition.java b/jOOQ-meta/src/main/java/org/jooq/util/TableDefinition.java index 2643156ffd..f4c1b7cf27 100644 --- a/jOOQ-meta/src/main/java/org/jooq/util/TableDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/util/TableDefinition.java @@ -90,6 +90,11 @@ public interface TableDefinition extends Definition { */ List getForeignKeys(); + /** + * Get the foreign keys for this table referencing a specific table. + */ + List getForeignKeys(TableDefinition referenced); + /** * Get the CHECK constraints for this table. */