From 995e80ee4c073d2f03e5ff872cdaacaff231fbef Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Wed, 23 Oct 2019 13:42:07 +0200 Subject: [PATCH] [jOOQ/jOOQ#9425] Commercial only feature --- jOOQ/src/main/java/org/jooq/Meta.java | 18 +- .../main/java/org/jooq/impl/AbstractMeta.java | 12 +- jOOQ/src/main/java/org/jooq/impl/Diff.java | 353 +++++++++--------- 3 files changed, 197 insertions(+), 186 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/Meta.java b/jOOQ/src/main/java/org/jooq/Meta.java index 2ada8c788a..6e97a1bdc6 100644 --- a/jOOQ/src/main/java/org/jooq/Meta.java +++ b/jOOQ/src/main/java/org/jooq/Meta.java @@ -219,13 +219,17 @@ public interface Meta extends Scope { */ Queries ddl(DDLExportConfiguration configuration) throws DataAccessException; - /** - * Generate a migration script to get from this meta data to another one. - * - * @throws DataAccessException If something went wrong fetching the meta - * objects - */ - Queries diff(Meta other) throws DataAccessException; + + + + + + + + + + + /** * Export to the {@link InformationSchema} format. diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractMeta.java b/jOOQ/src/main/java/org/jooq/impl/AbstractMeta.java index 36c11e3692..1fdc0aa946 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractMeta.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractMeta.java @@ -295,10 +295,14 @@ abstract class AbstractMeta extends AbstractScope implements Meta, Serializable return new DDL(this, exportConfiguration).queries(); } - @Override - public final Queries diff(Meta other) { - return new Diff(configuration(), this, other).queries(); - } + + + + + + + + // [#9396] TODO Fix this. Subclasses should not need to override this to get // correct results diff --git a/jOOQ/src/main/java/org/jooq/impl/Diff.java b/jOOQ/src/main/java/org/jooq/impl/Diff.java index b9ac694f7d..d34ab551a4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Diff.java +++ b/jOOQ/src/main/java/org/jooq/impl/Diff.java @@ -37,203 +37,206 @@ */ package org.jooq.impl; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.Iterator; -import java.util.List; -import org.jooq.Catalog; -import org.jooq.Configuration; -import org.jooq.DSLContext; -import org.jooq.Field; -import org.jooq.Meta; -import org.jooq.Named; -import org.jooq.Queries; -import org.jooq.Query; -import org.jooq.Schema; -import org.jooq.Table; -/** - * A class producing a diff between two {@link Meta} objects. - * - * @author Lukas Eder - */ -final class Diff { - private static final NamedComparator COMP = new NamedComparator(); - private final DSLContext ctx; - private final Meta meta1; - private final Meta meta2; - Diff(Configuration configuration, Meta meta1, Meta meta2) { - this.ctx = configuration.dsl(); - this.meta1 = meta1; - this.meta2 = meta2; - } - final Queries queries() { - return ctx.queries(appendCatalogs(new ArrayList<>(), sorted(meta1.getCatalogs()), sorted(meta2.getCatalogs()))); - } - private final List appendCatalogs(final List queries, final Iterator i1, final Iterator i2) { - return append(queries, i1, i2, - null, - null, - new Merge() { - @Override - public void merge(List q, Catalog c1, Catalog c2) { - appendSchemas(q, sorted(c1.getSchemas()), sorted(c2.getSchemas())); - } - } - ); - } - private final List appendSchemas(final List queries, final Iterator i1, final Iterator i2) { - // TODO Cascade semantics when creating and deleting - return append(queries, i1, i2, - new Create() { - @Override - public void create(List q, Schema s) { - q.add(ctx.createSchema(s)); - } - }, - new Drop() { - @Override - public void drop(List q, Schema s) { - q.add(ctx.dropSchema(s)); - } - }, - new Merge() { - @Override - public void merge(List q, Schema s1, Schema s2) { - appendTables(q, sorted(s1.getTables()), sorted(s2.getTables())); - } - } - ); - } - private final List appendTables(final List queries, final Iterator> i1, final Iterator> i2) { - // TODO Cascade semantics when creating and deleting - return append(queries, i1, i2, - new Create>() { - @Override - public void create(List q, Table t) { - q.addAll(Arrays.asList(ctx.ddl(t).queries())); - } - }, - new Drop>() { - @Override - public void drop(List q, Table t) { - q.add(ctx.dropTable(t)); - } - }, - new Merge>() { - @Override - public void merge(List q, Table t1, Table t2) { - appendColumns(queries, t1, t2, sorted(t1.fields()), sorted(t2.fields())); - } - } - ); - } - private final List appendColumns(final List queries, final Table t1, final Table t2, final Iterator> i1, final Iterator> i2) { - return append(queries, i1, i2, - new Create>() { - @Override - public void create(List q, Field f) { - q.add(ctx.alterTable(t1).add(f)); - } - }, - new Drop>() { - @Override - public void drop(List q, Field f) { - q.add(ctx.alterTable(t1).drop(f)); - } - }, - null - ); - } - private final List append( - List queries, - Iterator i1, - Iterator i2, - Create create, - Drop drop, - Merge merge - ) { - N s1 = null; - N s2 = null; - for (;;) { - if (s1 == null && i1.hasNext()) - s1 = i1.next(); - if (s2 == null && i2.hasNext()) - s2 = i2.next(); - if (s1 == null && s2 == null) - break; - int comp = s1 == null - ? 1 - : s2 == null - ? -1 - : s1.getQualifiedName().compareTo(s2.getQualifiedName()); - if (comp < 0) { - if (drop != null) - drop.drop(queries, s1); - s1 = null; - } - else if (comp > 0) { - if (create != null) - create.create(queries, s2); - s2 = null; - } - else { - if (merge != null) - merge.merge(queries, s1, s2); - s1 = s2 = null; - } - } - return queries; - } - private static interface Create { - void create(List queries, N named); - } - private static interface Drop { - void drop(List queries, N named); - } - private static interface Merge { - void merge(List queries, N named1, N named2); - } - private static final Iterator sorted(N... array) { - List result = Arrays.asList(array); - Collections.sort(result, COMP); - return result.iterator(); - } - private static final Iterator sorted(List list) { - List result = new ArrayList<>(list); - Collections.sort(result, COMP); - return result.iterator(); - } - private static final class NamedComparator implements Comparator { - @Override - public int compare(Named o1, Named o2) { - return o1.getQualifiedName().compareTo(o2.getQualifiedName()); - } - } -} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +