[jOOQ/jOOQ#14916] Compilation error with embedded domains and postgres types

This commit is contained in:
Lukas Eder 2023-04-06 17:16:34 +02:00
parent cedbbde925
commit 22ca708b2b
2 changed files with 52 additions and 6 deletions

View File

@ -3507,6 +3507,8 @@ public class JavaGenerator extends AbstractGenerator {
final String domainTypeFull = getJavaType(domain.getType(resolver(out)), out);
final String domainType = out.ref(domainTypeFull);
final String domainTypeRef = getJavaTypeReference(domain.getDatabase(), domain.getType(resolver(out)), out);
final List<String> converter = out.ref(list(domain.getType(resolver(out)).getConverter()));
final List<String> binding = out.ref(list(domain.getType(resolver(out)).getBinding()));
out.javadoc("The domain <code>%s</code>.", domain.getQualifiedOutputName());
@ -3515,6 +3517,8 @@ public class JavaGenerator extends AbstractGenerator {
out.println(" schema");
out.println(", %s.name(\"%s\")", DSL.class, escapeString(domain.getOutputName()));
out.println(", %s", domainTypeRef);
if (!converter.isEmpty() && !binding.isEmpty())
out.println(converterTemplate(converter) + converterTemplate(binding), converter, binding);
for (String check : domain.getCheckClauses())
out.println(", %s.createCheck(null, null, \"%s\")", Internal.class, escapeString(check));
@ -3526,6 +3530,8 @@ public class JavaGenerator extends AbstractGenerator {
out.println(" schema()");
out.println(", %s.name(\"%s\")", DSL.class, escapeString(domain.getOutputName()));
out.println(", %s", domainTypeRef);
if (!converter.isEmpty() && !binding.isEmpty())
out.println(converterTemplate(converter) + converterTemplate(binding), converter, binding);
for (String check : domain.getCheckClauses())
out.println(", %s.createCheck<%s>(null, null, \"%s\")", Internal.class, Record.class, escapeString(check));
@ -3533,10 +3539,13 @@ public class JavaGenerator extends AbstractGenerator {
out.println(")");
}
else {
//
out.println("%sstatic final %s<%s> %s = %s.createDomain(", visibility(), Domain.class, domainType, id, Internal.class);
out.println(" schema()");
out.println(", %s.name(\"%s\")", DSL.class, escapeString(domain.getOutputName()));
out.println(", %s", domainTypeRef);
if (!converter.isEmpty() && !binding.isEmpty())
out.println(converterTemplate(converter) + converterTemplate(binding), converter, binding);
for (String check : domain.getCheckClauses())
out.println(", %s.createCheck(null, null, \"%s\")", Internal.class, escapeString(check));
@ -6125,14 +6134,21 @@ public class JavaGenerator extends AbstractGenerator {
}
for (ColumnDefinition column : table.getColumns()) {
final String columnTypeFull = getJavaType(column.getType(resolver(out)), out);
final DataTypeDefinition columnTypeDef = column.getType(resolver(out));
final DomainDefinition domain = schema.getDatabase().getDomain(schema, columnTypeDef.getQualifiedUserType());
final String columnTypeFull = getJavaType(columnTypeDef, out);
final String columnType = out.ref(columnTypeFull);
final String columnTypeRef = getJavaTypeReference(column.getDatabase(), column.getType(resolver(out)), out);
final String columnTypeRef = getJavaTypeReference(column.getDatabase(), columnTypeDef, out);
final String columnId = out.ref(getStrategy().getJavaIdentifier(column), colRefSegments(column));
final String columnName = column.getName();
final List<String> converter = out.ref(list(column.getType(resolver(out)).getConverter()));
final List<String> binding = out.ref(list(column.getType(resolver(out)).getBinding()));
final List<String> converter = new ArrayList<>();
final List<String> binding = new ArrayList<>();
final List<String> generator = new ArrayList<>();
// [#14916] Domain types may already have bindings/converters. Don't re-apply them.
if (domain == null || !StringUtils.equals(domain.getType(resolver(out)).getConverter(), columnTypeDef.getConverter()))
binding.addAll(out.ref(list(columnTypeDef.getConverter())));
if (domain == null || !StringUtils.equals(domain.getType(resolver(out)).getBinding(), columnTypeDef.getBinding()))
binding.addAll(out.ref(list(columnTypeDef.getBinding())));
@ -9639,7 +9655,7 @@ public class JavaGenerator extends AbstractGenerator {
// Check for DOMAIN types
else if (db.getDomain(schema, u) != null) {
type = getJavaType(db.getDomain(schema, u).getDefinedType(), out);
type = getJavaType(db.getDomain(schema, u).getType(resolver(out)), out);
}
// Check for ENUM types

View File

@ -254,7 +254,37 @@ public final class Internal {
*/
@NotNull
public static final <T> Domain<T> createDomain(Schema schema, Name name, DataType<T> type, Check<?>... checks) {
return new DomainImpl<>(schema, name, type, checks);
return createDomain(schema, name, type, null, null, checks);
}
/**
* Factory method for domain specifications.
*/
@NotNull
public static final <T, U> Domain<U> createDomain(Schema schema, Name name, DataType<T> type, Converter<T, U> converter, Check<?>... checks) {
return createDomain(schema, name, type, converter, null, checks);
}
/**
* Factory method for domain specifications.
*/
@NotNull
public static final <T, U> Domain<U> createDomain(Schema schema, Name name, DataType<T> type, Binding<T, U> binding, Check<?>... checks) {
return createDomain(schema, name, type, null, binding, checks);
}
/**
* Factory method for domain specifications.
*/
@NotNull
public static final <T, X, U> Domain<U> createDomain(Schema schema, Name name, DataType<T> type, Converter<X, U> converter, Binding<T, X> binding, Check<?>... checks) {
Binding<T, U> actualBinding = DefaultBinding.newBinding(converter, type, binding);
DataType<U> actualType =
converter == null && binding == null
? (DataType<U>) type
: type.asConvertedDataType(actualBinding);
return new DomainImpl<>(schema, name, actualType, checks);
}
/**