From b8cbde22ccebf7deeaf309f2da8c843172d953bd Mon Sep 17 00:00:00 2001 From: Knut Wannheden Date: Wed, 30 Oct 2019 17:28:32 +0100 Subject: [PATCH] [jOOQ/jOOQ#9437] Add flag clauses to ALTER SEQUENCE to DSL API Adds the new `AlterSequenceFlagsStep` as a supertype to `AlterSequenceStep`, which allows setting and clearing various flags like `MINVALUE` and `CACHE`. --- .../java/org/jooq/meta/AbstractDatabase.java | 8 +- .../java/org/jooq/AlterSequenceFlagsStep.java | 206 ++++++++++++++++++ .../main/java/org/jooq/AlterSequenceStep.java | 29 +-- .../java/org/jooq/impl/AlterSequenceImpl.java | 180 +++++++++++++-- 4 files changed, 373 insertions(+), 50 deletions(-) create mode 100644 jOOQ/src/main/java/org/jooq/AlterSequenceFlagsStep.java diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java b/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java index ed467791b8..63aa64a82a 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java @@ -575,11 +575,9 @@ public abstract class AbstractDatabase implements Database { @Override public final CatalogDefinition getCatalog(String inputName) { - for (CatalogDefinition catalog : getCatalogs()) { - if (catalog.getName().equals(inputName)) { + for (CatalogDefinition catalog : getCatalogs()) + if (catalog.getName().equals(inputName)) return catalog; - } - } return null; } @@ -674,7 +672,7 @@ public abstract class AbstractDatabase implements Database { inputSchemata = new ArrayList<>(); inputSchemataPerCatalog = new LinkedHashMap<>(); - // [#1312] Allow for ommitting inputSchema configuration. Generate all schemata instead. + // [#1312] Allow for omitting inputSchema configuration. Generate all schemata instead. if (configuredSchemata.size() == 1 && StringUtils.isBlank(configuredSchemata.get(0).getInputSchema())) { initAllSchemata(); } diff --git a/jOOQ/src/main/java/org/jooq/AlterSequenceFlagsStep.java b/jOOQ/src/main/java/org/jooq/AlterSequenceFlagsStep.java new file mode 100644 index 0000000000..7ce6ad6b10 --- /dev/null +++ b/jOOQ/src/main/java/org/jooq/AlterSequenceFlagsStep.java @@ -0,0 +1,206 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Other licenses: + * ----------------------------------------------------------------------------- + * Commercial licenses for this work are available. These replace the above + * ASL 2.0 and offer limited warranties, support, maintenance, and commercial + * database integrations. + * + * For more information, please visit: http://www.jooq.org/licenses + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + */ +package org.jooq; + +// ... +import static org.jooq.SQLDialect.CUBRID; +// ... +import static org.jooq.SQLDialect.FIREBIRD; +// ... +import static org.jooq.SQLDialect.H2; +// ... +import static org.jooq.SQLDialect.HSQLDB; +// ... +// ... +import static org.jooq.SQLDialect.MARIADB; +// ... +import static org.jooq.SQLDialect.POSTGRES; +// ... +// ... +// ... +// ... + +/** + * The step in the ALTER SEQUENCE statement where the flags of the + * sequence are modified or cleared. + *

+ *

Referencing XYZ*Step types directly from client code

+ *

+ * It is usually not recommended to reference any XYZ*Step types + * directly from client code, or assign them to local variables. When writing + * dynamic SQL, creating a statement's components dynamically, and passing them + * to the DSL API statically is usually a better choice. See the manual's + * section about dynamic SQL for details: https://www.jooq.org/doc/latest/manual/sql-building/dynamic-sql. + *

+ * Drawbacks of referencing the XYZ*Step types directly: + *

+ * + * @author Knut Wannheden + */ +public interface AlterSequenceFlagsStep extends AlterSequenceFinalStep { + + /** + * Restart the sequence at its initial value. + */ + @Support({ HSQLDB, MARIADB, POSTGRES }) + AlterSequenceStep restart(); + + /** + * Restart the sequence at a given value. + */ + @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, POSTGRES }) + AlterSequenceStep restartWith(T value); + + /** + * Restart the sequence at a given value. + */ + @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, POSTGRES }) + AlterSequenceStep restartWith(Field value); + + /** + * Add a START WITH clause to the ALTER SEQUENCE + * statement. + */ + @Support({ MARIADB, POSTGRES }) + AlterSequenceFlagsStep startWith(Number constant); + + /** + * Add a START WITH clause to the ALTER SEQUENCE + * statement. + */ + @Support({ MARIADB, POSTGRES }) + AlterSequenceFlagsStep startWith(Field constant); + + /** + * Add a INCREMENT BY clause to the ALTER SEQUENCE + * statement. + */ + @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, POSTGRES }) + AlterSequenceFlagsStep incrementBy(Number constant); + + /** + * Add a INCREMENT BY clause to the ALTER SEQUENCE + * statement. + */ + @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, POSTGRES }) + AlterSequenceFlagsStep incrementBy(Field constant); + + /** + * Add a MINVALUE clause to the ALTER SEQUENCE + * statement. + */ + @Support({ CUBRID, H2, HSQLDB, MARIADB, POSTGRES }) + AlterSequenceFlagsStep minvalue(Number constant); + + /** + * Add a MINVALUE clause to the ALTER SEQUENCE + * statement. + */ + @Support({ CUBRID, H2, HSQLDB, MARIADB, POSTGRES }) + AlterSequenceFlagsStep minvalue(Field constant); + + /** + * Add a NO MINVALUE clause to the ALTER SEQUENCE + * statement. + */ + @Support({ CUBRID, H2, HSQLDB, MARIADB, POSTGRES }) + AlterSequenceFlagsStep noMinvalue(); + + /** + * Add a MINVALUE clause to the ALTER SEQUENCE + * statement. + */ + @Support({ CUBRID, H2, HSQLDB, MARIADB, POSTGRES }) + AlterSequenceFlagsStep maxvalue(Number constant); + + /** + * Add a MINVALUE clause to the ALTER SEQUENCE + * statement. + */ + @Support({ CUBRID, H2, HSQLDB, MARIADB, POSTGRES }) + AlterSequenceFlagsStep maxvalue(Field constant); + + /** + * Add a NO MINVALUE clause to the ALTER SEQUENCE + * statement. + */ + @Support({ CUBRID, H2, HSQLDB, MARIADB, POSTGRES }) + AlterSequenceFlagsStep noMaxvalue(); + + /** + * Add a CYCLE clause to the ALTER SEQUENCE + * statement. + */ + @Support({ CUBRID, H2, HSQLDB, MARIADB, POSTGRES }) + AlterSequenceFlagsStep cycle(); + + /** + * Add a NO CYCLE clause to the ALTER SEQUENCE + * statement. + */ + @Support({ CUBRID, H2, HSQLDB, MARIADB, POSTGRES }) + AlterSequenceFlagsStep noCycle(); + + /** + * Add a CACHE clause to the ALTER SEQUENCE + * statement. + */ + @Support({ CUBRID, H2, MARIADB, POSTGRES }) + AlterSequenceFlagsStep cache(Number constant); + + /** + * Add a CACHE clause to the ALTER SEQUENCE + * statement. + */ + @Support({ CUBRID, H2, MARIADB, POSTGRES }) + AlterSequenceFlagsStep cache(Field constant); + + /** + * Add a NO CACHE clause to the ALTER SEQUENCE + * statement. + */ + @Support({ CUBRID, H2, HSQLDB, MARIADB, POSTGRES }) + AlterSequenceFlagsStep noCache(); +} diff --git a/jOOQ/src/main/java/org/jooq/AlterSequenceStep.java b/jOOQ/src/main/java/org/jooq/AlterSequenceStep.java index 0977fd9bcf..2cdd26f490 100644 --- a/jOOQ/src/main/java/org/jooq/AlterSequenceStep.java +++ b/jOOQ/src/main/java/org/jooq/AlterSequenceStep.java @@ -37,21 +37,12 @@ */ package org.jooq; -// ... -import static org.jooq.SQLDialect.CUBRID; -// ... -import static org.jooq.SQLDialect.FIREBIRD; -import static org.jooq.SQLDialect.H2; // ... import static org.jooq.SQLDialect.HSQLDB; -// ... -// ... import static org.jooq.SQLDialect.MARIADB; // ... import static org.jooq.SQLDialect.POSTGRES; // ... -// ... -// ... /** * A {@link Query} that can alter sequences. @@ -76,25 +67,7 @@ import static org.jooq.SQLDialect.POSTGRES; * * @author Lukas Eder */ -public interface AlterSequenceStep { - - /** - * Restart the sequence at its initial value. - */ - @Support({ HSQLDB, MARIADB, POSTGRES }) - AlterSequenceFinalStep restart(); - - /** - * Restart the sequence at a given value. - */ - @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, POSTGRES }) - AlterSequenceFinalStep restartWith(T value); - - /** - * Restart the sequence at a given value. - */ - @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, POSTGRES }) - AlterSequenceFinalStep restartWith(Field value); +public interface AlterSequenceStep extends AlterSequenceFlagsStep { /** * Add a RENAME TO clause to the ALTER SEQUENCE diff --git a/jOOQ/src/main/java/org/jooq/impl/AlterSequenceImpl.java b/jOOQ/src/main/java/org/jooq/impl/AlterSequenceImpl.java index 9cb56f8899..cf0fe8c74b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AlterSequenceImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/AlterSequenceImpl.java @@ -48,13 +48,21 @@ import static org.jooq.SQLDialect.CUBRID; import static org.jooq.SQLDialect.DERBY; import static org.jooq.SQLDialect.FIREBIRD; // ... +import static org.jooq.SQLDialect.HSQLDB; // ... +import static org.jooq.SQLDialect.MARIADB; // ... // ... // ... import static org.jooq.impl.Keywords.K_ALTER; import static org.jooq.impl.Keywords.K_ALTER_TABLE; +import static org.jooq.impl.Keywords.K_CACHE; +import static org.jooq.impl.Keywords.K_CYCLE; import static org.jooq.impl.Keywords.K_IF_EXISTS; +import static org.jooq.impl.Keywords.K_INCREMENT_BY; +import static org.jooq.impl.Keywords.K_MAXVALUE; +import static org.jooq.impl.Keywords.K_MINVALUE; +import static org.jooq.impl.Keywords.K_NO; import static org.jooq.impl.Keywords.K_RENAME; import static org.jooq.impl.Keywords.K_RENAME_SEQUENCE; import static org.jooq.impl.Keywords.K_RENAME_TO; @@ -86,24 +94,35 @@ import org.jooq.Sequence; final class AlterSequenceImpl extends AbstractRowCountQuery implements // Cascading interface implementations for AlterSequence behaviour - AlterSequenceStep, - AlterSequenceFinalStep { + AlterSequenceStep { /** * Generated UID */ - private static final long serialVersionUID = 8904572826501186329L; - private static final Clause[] CLAUSES = { ALTER_SEQUENCE }; - private static final Set NO_SUPPORT_IF_EXISTS = SQLDialect.supported(CUBRID, DERBY, FIREBIRD); + private static final long serialVersionUID = 8904572826501186329L; + private static final Clause[] CLAUSES = { ALTER_SEQUENCE }; + private static final Set NO_SUPPORT_IF_EXISTS = SQLDialect.supported(CUBRID, DERBY, FIREBIRD); + private static final Set NO_SEPARATOR = SQLDialect.supported(CUBRID, MARIADB); + private static final Set NO_SUPPORT_CACHE = SQLDialect.supported(DERBY, FIREBIRD, HSQLDB); - private final Sequence sequence; - private final boolean ifExists; - private Field restartWith; - private Sequence renameTo; + private final Sequence sequence; + private final boolean ifExists; + private Sequence renameTo; + private boolean restart; + private Field restartWith; + private Field startWith; + private Field incrementBy; + private Field minvalue; + private boolean noMinvalue; + private Field maxvalue; + private boolean noMaxvalue; + private Boolean cycle; + private Field cache; + private boolean noCache; AlterSequenceImpl(Configuration configuration, Sequence sequence) { this(configuration, sequence, false); @@ -125,17 +144,20 @@ final class AlterSequenceImpl extends AbstractRowCountQuery im // ------------------------------------------------------------------------ @Override - public final AlterSequenceFinalStep restart() { + public final AlterSequenceStep restart() { + restart = true; + restartWith = null; return this; } @Override - public final AlterSequenceFinalStep restartWith(T value) { + public final AlterSequenceStep restartWith(T value) { return restartWith(Tools.field(value, sequence.getDataType())); } @Override - public final AlterSequenceFinalStep restartWith(Field value) { + public final AlterSequenceStep restartWith(Field value) { + restart = false; restartWith = value; return this; } @@ -156,6 +178,97 @@ final class AlterSequenceImpl extends AbstractRowCountQuery im return renameTo(DSL.name(newName)); } + @Override + public AlterSequenceStep startWith(Number constant) { + return startWith(Tools.field(constant, sequence.getDataType())); + } + + @Override + public AlterSequenceStep startWith(Field constant) { + startWith = constant; + return this; + } + + @Override + public AlterSequenceStep incrementBy(Number constant) { + return incrementBy(Tools.field(constant, sequence.getDataType())); + } + + @Override + public AlterSequenceStep incrementBy(Field constant) { + incrementBy = constant; + return this; + } + + @Override + public AlterSequenceStep minvalue(Number constant) { + return minvalue(Tools.field(constant, sequence.getDataType())); + } + + @Override + public AlterSequenceStep minvalue(Field constant) { + minvalue = constant; + noMinvalue = false; + return this; + } + + @Override + public AlterSequenceStep noMinvalue() { + minvalue = null; + noMinvalue = true; + return this; + } + + @Override + public AlterSequenceStep maxvalue(Number constant) { + return maxvalue(Tools.field(constant, sequence.getDataType())); + } + + @Override + public AlterSequenceStep maxvalue(Field constant) { + maxvalue = constant; + noMaxvalue = false; + return this; + } + + @Override + public AlterSequenceStep noMaxvalue() { + maxvalue = null; + noMaxvalue = true; + return this; + } + + @Override + public AlterSequenceStep cycle() { + cycle = true; + return this; + } + + @Override + public AlterSequenceStep noCycle() { + cycle = false; + return this; + } + + @Override + public AlterSequenceStep cache(Number constant) { + return cache(Tools.field(constant, sequence.getDataType())); + } + + @Override + public AlterSequenceStep cache(Field constant) { + cache = constant; + noCache = false; + return this; + } + + @Override + public AlterSequenceStep noCache() { + cache = null; + noCache = true; + return this; + } + // ------------------------------------------------------------------------ // XXX: QueryPart API // ------------------------------------------------------------------------ @@ -286,9 +399,29 @@ final class AlterSequenceImpl extends AbstractRowCountQuery im else { ctx.start(ALTER_SEQUENCE_RESTART); - Field with = restartWith; - if (with == null) { + String noSeparator = NO_SEPARATOR.contains(ctx.family()) ? "" : " "; + if (incrementBy != null) { + ctx.sql(' ').visit(K_INCREMENT_BY) + .sql(' ').visit(incrementBy); + } + + if (minvalue != null) + ctx.sql(' ').visit(K_MINVALUE).sql(' ').visit(minvalue); + else if (noMinvalue) + ctx.sql(' ').visit(K_NO).sql(noSeparator).visit(K_MINVALUE); + + if (maxvalue != null) + ctx.sql(' ').visit(K_MAXVALUE).sql(' ').visit(maxvalue); + else if (noMaxvalue) + ctx.sql(' ').visit(K_NO).sql(noSeparator).visit(K_MAXVALUE); + + if (startWith != null) { + ctx.sql(' ').visit(K_START_WITH) + .sql(' ').visit(startWith); + } + + if (restart) { @@ -296,15 +429,27 @@ final class AlterSequenceImpl extends AbstractRowCountQuery im ctx.sql(' ').visit(K_RESTART); } - else { + else if (restartWith != null) { if (ctx.family() == CUBRID) ctx.sql(' ').visit(K_START_WITH) - .sql(' ').visit(with); + .sql(' ').visit(restartWith); else ctx.sql(' ').visit(K_RESTART_WITH) - .sql(' ').visit(with); + .sql(' ').visit(restartWith); } + if (!NO_SUPPORT_CACHE.contains(ctx.family())) + if (cache != null) + ctx.sql(' ').visit(K_CACHE).sql(' ').visit(cache); + else if (noCache) + // TODO: Postgres requires CACHE 1 here + ctx.sql(' ').visit(K_NO).sql(noSeparator).visit(K_CACHE); + + if (Boolean.TRUE.equals(cycle)) + ctx.sql(' ').visit(K_CYCLE); + else if (Boolean.FALSE.equals(cycle)) + ctx.sql(' ').visit(K_NO).sql(noSeparator).visit(K_CYCLE); + ctx.end(ALTER_SEQUENCE_RESTART); } } @@ -313,4 +458,5 @@ final class AlterSequenceImpl extends AbstractRowCountQuery im public final Clause[] clauses(Context ctx) { return CLAUSES; } + }