diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/DefaultGeneratorStrategy.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/DefaultGeneratorStrategy.java index 354e4adc22..8b7e224dcc 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/DefaultGeneratorStrategy.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/DefaultGeneratorStrategy.java @@ -541,6 +541,8 @@ public class DefaultGeneratorStrategy extends AbstractGeneratorStrategy { result.append("Dao"); else if (mode == Mode.INTERFACE) result.insert(0, "I"); + else if (mode == Mode.PATH) + result.append("Path"); return result.toString(); } diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/GeneratorStrategy.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/GeneratorStrategy.java index 04b779ac07..24e5ba62a2 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/GeneratorStrategy.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/GeneratorStrategy.java @@ -48,6 +48,7 @@ import org.jooq.meta.Definition; import org.jooq.meta.DomainDefinition; import org.jooq.meta.EnumDefinition; import org.jooq.meta.ForeignKeyDefinition; +import org.jooq.meta.InverseForeignKeyDefinition; import org.jooq.meta.ParameterDefinition; import org.jooq.meta.RoutineDefinition; import org.jooq.meta.SyntheticDaoDefinition; @@ -563,7 +564,14 @@ public interface GeneratorStrategy { * The domain mode. This is used when a {@link DomainDefinition}'s class * is being rendered */ - DOMAIN + DOMAIN, + + /** + * The path mode. This is used when a {@link ForeignKeyDefinition} or an + * {@link InverseForeignKeyDefinition} is used to generate a path + * expression. + */ + PATH } } diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java index 7a14b7ba09..3ac0832175 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java @@ -6154,9 +6154,11 @@ public class JavaGenerator extends AbstractGenerator { // [#14985] Scala nested classes have to be located in the object if (generateImplicitJoinPathTableSubtypes() && (supportsPathsToOne || supportsPathsToMany)) { + final String pathClassName = getStrategy().getJavaClassName(table, Mode.PATH); + out.javadoc("A subtype implementing {@link %s} for simplified path-based joins.", Path.class); - out.println("%sclass %sPath(path: %s[_ <: %s], childPath: %s[_ <: %s, %s], parentPath: %s[_ <: %s, %s]) extends %s(path, childPath, parentPath) with %s[%s]", - visibility(), className, Table.class, Record.class, ForeignKey.class, Record.class, recordType, InverseForeignKey.class, Record.class, recordType, className, Path.class, recordType); + out.println("%sclass %s(path: %s[_ <: %s], childPath: %s[_ <: %s, %s], parentPath: %s[_ <: %s, %s]) extends %s(path, childPath, parentPath) with %s[%s]", + visibility(), pathClassName, Table.class, Record.class, ForeignKey.class, Record.class, recordType, InverseForeignKey.class, Record.class, recordType, className, Path.class, recordType); } out.println("}"); @@ -6508,40 +6510,41 @@ public class JavaGenerator extends AbstractGenerator { } if (generateImplicitJoinPathTableSubtypes()) { + final String pathClassName = getStrategy().getJavaClassName(table, Mode.PATH); // [#14985] Scala nested classes have to be located in the companion object if (scala) {} else if (kotlin) { out.javadoc("A subtype implementing {@link %s} for simplified path-based joins.", Path.class); - out.println("%sopen class %sPath : %s, %s<%s> {", - visibility(), className, className, Path.class, recordType); + out.println("%sopen class %s : %s, %s<%s> {", + visibility(), pathClassName, className, Path.class, recordType); out.println("%sconstructor(path: %s, childPath: %s?, parentPath: %s?): super(path, childPath, parentPath)", visibility(), Table.class, Record.class, ForeignKey.class, Record.class, recordType, InverseForeignKey.class, Record.class, recordType); out.println("private constructor(alias: %s, aliased: %s<%s>): super(alias, aliased)", Name.class, Table.class, recordType); - out.println("%soverride fun `as`(alias: %s): %sPath = %sPath(%s.name(alias), this)", visibilityPublic(), String.class, className, className, DSL.class); - out.println("%soverride fun `as`(alias: %s): %sPath = %sPath(alias, this)", visibilityPublic(), Name.class, className, className); - out.println("%soverride fun `as`(alias: %s<*>): %sPath = %sPath(alias.qualifiedName, this)", visibilityPublic(), Table.class, className, className); + out.println("%soverride fun `as`(alias: %s): %s = %s(%s.name(alias), this)", visibilityPublic(), String.class, pathClassName, pathClassName, DSL.class); + out.println("%soverride fun `as`(alias: %s): %s = %s(alias, this)", visibilityPublic(), Name.class, pathClassName, pathClassName); + out.println("%soverride fun `as`(alias: %s<*>): %s = %s(alias.qualifiedName, this)", visibilityPublic(), Table.class, pathClassName, pathClassName); out.println("}"); } else { out.javadoc("A subtype implementing {@link %s} for simplified path-based joins.", Path.class); - out.println("%sstatic class %sPath extends %s implements %s<%s> {", visibility(), className, className, Path.class, recordType); - out.println("%s %sPath(%s path, %s childPath, %s parentPath) {", visibility(), Record.class, className, Table.class, ForeignKey.class, recordType, InverseForeignKey.class, recordType); + out.println("%sstatic class %s extends %s implements %s<%s> {", visibility(), pathClassName, className, Path.class, recordType); + out.println("%s %s(%s path, %s childPath, %s parentPath) {", visibility(), Record.class, pathClassName, Table.class, ForeignKey.class, recordType, InverseForeignKey.class, recordType); out.println("super(path, childPath, parentPath);"); out.println("}"); - out.println("private %sPath(%s alias, %s<%s> aliased) {", className, Name.class, Table.class, recordType); + out.println("private %s(%s alias, %s<%s> aliased) {", pathClassName, Name.class, Table.class, recordType); out.println("super(alias, aliased);"); out.println("}"); out.overrideInherit(); - out.println("%s%sPath as(%s alias) {", visibilityPublic(), className, String.class); - out.println("return new %sPath(%s.name(alias), this);", className, DSL.class); + out.println("%s%s as(%s alias) {", visibilityPublic(), pathClassName, String.class); + out.println("return new %s(%s.name(alias), this);", pathClassName, DSL.class); out.println("}"); out.overrideInherit(); - out.println("%s%sPath as(%s alias) {", visibilityPublic(), className, Name.class); - out.println("return new %sPath(alias, this);", className); + out.println("%s%s as(%s alias) {", visibilityPublic(), pathClassName, Name.class); + out.println("return new %s(alias, this);", pathClassName); out.println("}"); out.overrideInherit(); - out.println("%s%sPath as(%s alias) {", visibilityPublic(), className, Table.class); - out.println("return new %sPath(alias.getQualifiedName(), this);", className); + out.println("%s%s as(%s alias) {", visibilityPublic(), pathClassName, Table.class); + out.println("return new %s(alias.getQualifiedName(), this);", pathClassName); out.println("}"); out.println("}"); }