From 8e15f276821e7c8e3957e46cc6ca5231747fc526 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Thu, 28 May 2020 16:50:47 +0200 Subject: [PATCH] [jOOQ/jOOQ#681] Add interpreter support for DOMAINS (WIP) This change includes: - Support interpreting CREATE DOMAIN .. CHECK - Support interpreting DROP DOMAIN - Improved DomainImpl and added DomainDataType --- jOOQ/src/main/java/org/jooq/DataType.java | 6 ++++ .../java/org/jooq/impl/ArrayDataType.java | 2 +- jOOQ/src/main/java/org/jooq/impl/DSL.java | 4 +-- .../java/org/jooq/impl/DefaultDataType.java | 6 ++++ .../main/java/org/jooq/impl/DomainImpl.java | 36 +++++++++++++++++-- .../main/java/org/jooq/impl/Interpreter.java | 28 ++++++++++++--- jOOQ/src/main/java/org/jooq/impl/Names.java | 1 + 7 files changed, 73 insertions(+), 10 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/DataType.java b/jOOQ/src/main/java/org/jooq/DataType.java index 0a738abb28..427b156d09 100644 --- a/jOOQ/src/main/java/org/jooq/DataType.java +++ b/jOOQ/src/main/java/org/jooq/DataType.java @@ -114,6 +114,12 @@ public interface DataType extends Serializable { */ Class getType(); + /** + * Get the defining DOMAIN type or NULL if there is no such + * type. + */ + Domain getDomain(); + /** * Retrieve the Java type associated with ARRAYs of this data type. */ diff --git a/jOOQ/src/main/java/org/jooq/impl/ArrayDataType.java b/jOOQ/src/main/java/org/jooq/impl/ArrayDataType.java index a0cbddb24c..25d5a09a36 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ArrayDataType.java +++ b/jOOQ/src/main/java/org/jooq/impl/ArrayDataType.java @@ -81,7 +81,7 @@ final class ArrayDataType extends DefaultDataType { ) { super(t, precision, scale, length, nullability, collation, characterSet, identity, defaultValue); - this.elementType= elementType; + this.elementType = elementType; } @SuppressWarnings({ "unchecked", "rawtypes" }) diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index b831e27ed2..8fe8de2f27 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -87,10 +87,10 @@ import static org.jooq.SQLDialect.SQLITE; // ... import static org.jooq.impl.Keywords.K_CUBE; import static org.jooq.impl.Keywords.K_GROUPING_SETS; -import static org.jooq.impl.Keywords.K_VALUE; import static org.jooq.impl.Names.N_IF; import static org.jooq.impl.Names.N_IIF; import static org.jooq.impl.Names.N_SYSTEM_TIME; +import static org.jooq.impl.Names.N_VALUE; import static org.jooq.impl.PositionalWindowFunction.PositionalFunctionType.FIRST_VALUE; import static org.jooq.impl.PositionalWindowFunction.PositionalFunctionType.LAG; import static org.jooq.impl.PositionalWindowFunction.PositionalFunctionType.LAST_VALUE; @@ -11942,7 +11942,7 @@ public class DSL { */ @Support({ H2, POSTGRES }) public static Field value(DataType type) { - return field("{0}", type, K_VALUE); + return field("{0}", type, N_VALUE); } /** diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultDataType.java b/jOOQ/src/main/java/org/jooq/impl/DefaultDataType.java index c488057e70..6de6e60536 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultDataType.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultDataType.java @@ -74,6 +74,7 @@ import org.jooq.Collation; import org.jooq.Configuration; import org.jooq.Converter; import org.jooq.DataType; +import org.jooq.Domain; import org.jooq.EnumType; import org.jooq.Field; import org.jooq.JSON; @@ -769,6 +770,11 @@ public class DefaultDataType implements DataType { return uType; } + @Override + public /* non-final */ Domain getDomain() { + return null; + } + @Override public final Binding getBinding() { return binding; diff --git a/jOOQ/src/main/java/org/jooq/impl/DomainImpl.java b/jOOQ/src/main/java/org/jooq/impl/DomainImpl.java index dc9d1107af..72afa9337e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DomainImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/DomainImpl.java @@ -42,8 +42,11 @@ import static java.util.Collections.unmodifiableList; import java.util.List; +import org.jooq.Binding; import org.jooq.Check; +import org.jooq.Configuration; import org.jooq.Context; +import org.jooq.Converter; import org.jooq.DataType; import org.jooq.Domain; import org.jooq.Name; @@ -52,7 +55,7 @@ import org.jooq.Schema; /** * @author Lukas Eder */ -class DomainImpl extends AbstractTypedNamed implements Domain { +class DomainImpl extends AbstractNamed implements Domain { /** * Generated UID @@ -60,12 +63,14 @@ class DomainImpl extends AbstractTypedNamed implements Domain { private static final long serialVersionUID = 162853300137140844L; private final Schema schema; private final Check[] checks; + private final DataType type; - DomainImpl(Schema schema, Name name, DataType dataType, Check... checks) { - super(qualify(schema, name), null, dataType); + DomainImpl(Schema schema, Name name, DataType type, Check... checks) { + super(qualify(schema, name), null); this.schema = schema; this.checks = checks; + this.type = new DomainDataType<>(this, type); } @Override @@ -78,6 +83,31 @@ class DomainImpl extends AbstractTypedNamed implements Domain { return unmodifiableList(asList(checks)); } + @Override + public final Converter getConverter() { + return type.getConverter(); + } + + @Override + public final Binding getBinding() { + return type.getBinding(); + } + + @Override + public final Class getType() { + return type.getType(); + } + + @Override + public final DataType getDataType() { + return type; + } + + @Override + public final DataType getDataType(Configuration configuration) { + return type.getDataType(configuration); + } + @Override public final void accept(Context ctx) { ctx.visit(getUnqualifiedName()); diff --git a/jOOQ/src/main/java/org/jooq/impl/Interpreter.java b/jOOQ/src/main/java/org/jooq/impl/Interpreter.java index b2d154a86a..089e0d9b6e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Interpreter.java +++ b/jOOQ/src/main/java/org/jooq/impl/Interpreter.java @@ -209,7 +209,9 @@ final class Interpreter { accept0((DropIndexImpl) query); else if (query instanceof CreateDomainImpl) - accept0((CreateDomainImpl) query); + accept0((CreateDomainImpl) query); + else if (query instanceof DropDomainImpl) + accept0((DropDomainImpl) query); else if (query instanceof CommentOnImpl) accept0((CommentOnImpl) query); @@ -997,7 +999,7 @@ final class Interpreter { @SuppressWarnings({ "rawtypes", "unchecked" }) private final void accept0(CreateDomainImpl query) { Domain domain = query.$domain(); - MutableSchema schema = getSchema(domain.getSchema(), true); + MutableSchema schema = getSchema(domain.getSchema()); MutableDomain existing = schema.domain(domain); if (existing != null) { @@ -1027,6 +1029,21 @@ final class Interpreter { } } + private final void accept0(DropDomainImpl query) { + Domain domain = query.$domain(); + MutableSchema schema = getSchema(domain.getSchema()); + + MutableDomain existing = schema.domain(domain); + if (existing == null) { + if (!query.$dropDomainIfExists()) + throw notExists(domain); + + return; + } + + schema.domains.remove(existing); + } + private final void accept0(CommentOnImpl query) { Table table = query.$table(); Field field = query.$field(); @@ -2063,14 +2080,17 @@ final class Interpreter { } private final class MutableField extends MutableNamed { - MutableTable table; - DataType type; + MutableTable table; + DataType type; + MutableDomain domain; MutableField(UnqualifiedName name, MutableTable table, DataType type) { super(name); this.table = table; this.type = type; + + // TODO: Link type to domain } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/Names.java b/jOOQ/src/main/java/org/jooq/impl/Names.java index 4f8e87b3eb..45372ea281 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Names.java +++ b/jOOQ/src/main/java/org/jooq/impl/Names.java @@ -230,6 +230,7 @@ final class Names { static final Name N_UCASE = unquotedName("ucase"); static final Name N_UPPER = unquotedName("upper"); static final Name N_USER = unquotedName("user"); + static final Name N_VALUE = unquotedName("value"); static final Name N_VALUES = unquotedName("values"); static final Name N_WEEKDAY = unquotedName("weekday"); static final Name N_WIDTH_BUCKET = unquotedName("width_bucket");