From 7da5918be75a1ed75711efe18fa6c317e8cc7549 Mon Sep 17 00:00:00 2001 From: Knut Wannheden Date: Tue, 6 Aug 2019 18:37:34 +0200 Subject: [PATCH] [jOOQ/jOOQ#9009] Consistent caching in AbstractMeta `AbstractMeta` now implements caching for all methods defined by the `Meta` interface. --- .../main/java/org/jooq/impl/AbstractMeta.java | 122 ++++++++++++++++-- .../java/org/jooq/impl/CatalogMetaImpl.java | 13 +- .../jooq/impl/InformationSchemaMetaImpl.java | 28 ++-- .../src/main/java/org/jooq/impl/MetaImpl.java | 10 +- .../java/org/jooq/impl/SchemaMetaImpl.java | 10 +- .../java/org/jooq/impl/TableMetaImpl.java | 10 +- 6 files changed, 145 insertions(+), 48 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractMeta.java b/jOOQ/src/main/java/org/jooq/impl/AbstractMeta.java index d2deb7e214..154b4b14c4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractMeta.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractMeta.java @@ -54,6 +54,8 @@ import org.jooq.Named; import org.jooq.Schema; import org.jooq.Sequence; import org.jooq.Table; +import org.jooq.UniqueKey; +import org.jooq.exception.DataAccessException; /** * @author Lukas Eder @@ -62,17 +64,18 @@ abstract class AbstractMeta implements Meta, Serializable { private static final long serialVersionUID = 910484713008245977L; - private final Map cachedCatalogs; - private final Map cachedQualifiedSchemas; - private final Map> cachedQualifiedTables; - private final Map> cachedQualifiedSequences; - private final Map> cachedUnqualifiedSchemas; - private final Map>> cachedUnqualifiedTables; - private final Map>> cachedUnqualifiedSequences; + private Map cachedCatalogs; + private Map cachedQualifiedSchemas; + private Map> cachedQualifiedTables; + private Map> cachedQualifiedSequences; + private Map> cachedUnqualifiedSchemas; + private Map>> cachedUnqualifiedTables; + private Map>> cachedUnqualifiedSequences; + private List> cachedPrimaryKeys; AbstractMeta() { - // [#7165] TODO: Allow for opting out of this cache + // [#9010] TODO: Allow for opting out of this cache this.cachedCatalogs = new LinkedHashMap<>(); this.cachedQualifiedSchemas = new LinkedHashMap<>(); this.cachedQualifiedTables = new LinkedHashMap<>(); @@ -80,6 +83,7 @@ abstract class AbstractMeta implements Meta, Serializable { this.cachedUnqualifiedSchemas = new LinkedHashMap<>(); this.cachedUnqualifiedTables = new LinkedHashMap<>(); this.cachedUnqualifiedSequences = new LinkedHashMap<>(); + this.cachedPrimaryKeys = new ArrayList<>(); } @Override @@ -89,13 +93,26 @@ abstract class AbstractMeta implements Meta, Serializable { @Override public final Catalog getCatalog(Name name) { - if (cachedCatalogs.isEmpty()) - for (Catalog catalog : getCatalogs()) - cachedCatalogs.put(catalog.getQualifiedName(), catalog); - + initCatalogs(); return cachedCatalogs.get(name); } + @Override + public final List getCatalogs() throws DataAccessException { + initCatalogs(); + return Collections.unmodifiableList(new ArrayList<>(cachedCatalogs.values())); + } + + private final void initCatalogs() { + if (cachedCatalogs == null) { + cachedCatalogs = new LinkedHashMap<>(); + for (Catalog catalog : getCatalogs0()) + cachedCatalogs.put(catalog.getQualifiedName(), catalog); + } + } + + protected abstract List getCatalogs0() throws DataAccessException; + @Override public final List getSchemas(String name) { return getSchemas(name(name)); @@ -103,14 +120,36 @@ abstract class AbstractMeta implements Meta, Serializable { @Override public final List getSchemas(Name name) { + initSchemas(); return get(name, new Iterable() { @Override public Iterator iterator() { - return getSchemas().iterator(); + return getSchemas0().iterator(); } }, cachedQualifiedSchemas, cachedUnqualifiedSchemas); } + @Override + public final List getSchemas() throws DataAccessException { + initSchemas(); + return Collections.unmodifiableList(new ArrayList<>(cachedQualifiedSchemas.values())); + } + + private final void initSchemas() { + if (cachedQualifiedSchemas == null) { + cachedQualifiedSchemas = new LinkedHashMap<>(); + cachedUnqualifiedSchemas = new LinkedHashMap<>(); + get(name(""), new Iterable() { + @Override + public Iterator iterator() { + return getSchemas0().iterator(); + } + }, cachedQualifiedSchemas, cachedUnqualifiedSchemas); + } + } + + protected abstract List getSchemas0() throws DataAccessException; + @Override public final List> getTables(String name) { return getTables(name(name)); @@ -118,6 +157,7 @@ abstract class AbstractMeta implements Meta, Serializable { @Override public final List> getTables(Name name) { + initTables(); return get(name, new Iterable>() { @Override public Iterator> iterator() { @@ -126,6 +166,27 @@ abstract class AbstractMeta implements Meta, Serializable { }, cachedQualifiedTables, cachedUnqualifiedTables); } + @Override + public final List> getTables() throws DataAccessException { + initTables(); + return Collections.unmodifiableList(new ArrayList<>(cachedQualifiedTables.values())); + } + + private final void initTables() { + if (cachedQualifiedTables == null) { + cachedQualifiedTables = new LinkedHashMap<>(); + cachedUnqualifiedTables = new LinkedHashMap<>(); + get(name(""), new Iterable>() { + @Override + public Iterator> iterator() { + return getTables0().iterator(); + } + }, cachedQualifiedTables, cachedUnqualifiedTables); + } + } + + protected abstract List> getTables0() throws DataAccessException; + @Override public final List> getSequences(String name) { return getSequences(name(name)); @@ -133,6 +194,7 @@ abstract class AbstractMeta implements Meta, Serializable { @Override public final List> getSequences(Name name) { + initSequences(); return get(name, new Iterable>() { @Override public Iterator> iterator() { @@ -141,6 +203,40 @@ abstract class AbstractMeta implements Meta, Serializable { }, cachedQualifiedSequences, cachedUnqualifiedSequences); } + @Override + public final List> getSequences() throws DataAccessException { + initSequences(); + return Collections.unmodifiableList(new ArrayList<>(cachedQualifiedSequences.values())); + } + + private final void initSequences() { + if (cachedQualifiedSequences == null) { + cachedQualifiedSequences = new LinkedHashMap<>(); + cachedUnqualifiedSequences = new LinkedHashMap<>(); + get(name(""), new Iterable>() { + @Override + public Iterator> iterator() { + return getSequences0().iterator(); + } + }, cachedQualifiedSequences, cachedUnqualifiedSequences); + } + } + + protected abstract List> getSequences0() throws DataAccessException; + + @Override + public final List> getPrimaryKeys() throws DataAccessException { + initPrimaryKeys(); + return Collections.unmodifiableList(cachedPrimaryKeys); + } + + private final void initPrimaryKeys() { + if (cachedPrimaryKeys == null) + cachedPrimaryKeys = new ArrayList<>(getPrimaryKeys0()); + } + + protected abstract List> getPrimaryKeys0() throws DataAccessException; + private final List get(Name name, Iterable i, Map qualified, Map> unqualified) { if (qualified.isEmpty()) { for (T object : i) { diff --git a/jOOQ/src/main/java/org/jooq/impl/CatalogMetaImpl.java b/jOOQ/src/main/java/org/jooq/impl/CatalogMetaImpl.java index 258e309f28..a3542772a8 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CatalogMetaImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CatalogMetaImpl.java @@ -39,7 +39,6 @@ package org.jooq.impl; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.List; import org.jooq.Catalog; @@ -66,12 +65,12 @@ final class CatalogMetaImpl extends AbstractMeta { } @Override - public final List getCatalogs() { - return Collections.unmodifiableList(Arrays.asList(catalogs)); + protected final List getCatalogs0() { + return Arrays.asList(catalogs); } @Override - public final List getSchemas() { + protected final List getSchemas0() { List result = new ArrayList<>(); for (Catalog catalog : catalogs) @@ -81,7 +80,7 @@ final class CatalogMetaImpl extends AbstractMeta { } @Override - public final List> getTables() { + protected final List> getTables0() { List> result = new ArrayList<>(); for (Catalog catalog : catalogs) @@ -92,7 +91,7 @@ final class CatalogMetaImpl extends AbstractMeta { } @Override - public final List> getSequences() { + protected final List> getSequences0() { List> result = new ArrayList<>(); for (Catalog catalog : catalogs) @@ -103,7 +102,7 @@ final class CatalogMetaImpl extends AbstractMeta { } @Override - public final List> getPrimaryKeys() { + protected final List> getPrimaryKeys0() { List> result = new ArrayList<>(); for (Catalog catalog : catalogs) diff --git a/jOOQ/src/main/java/org/jooq/impl/InformationSchemaMetaImpl.java b/jOOQ/src/main/java/org/jooq/impl/InformationSchemaMetaImpl.java index c60d10a6f4..8bc5c5d2c4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/InformationSchemaMetaImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/InformationSchemaMetaImpl.java @@ -494,28 +494,30 @@ final class InformationSchemaMetaImpl extends AbstractMeta { } @Override - public final List getCatalogs() { - return Collections.unmodifiableList(catalogs); + protected final List getCatalogs0() { + return catalogs; } @Override - public final List getSchemas() { - return Collections.unmodifiableList(schemas); + protected final List getSchemas0() { + return schemas; + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Override + protected final List> getTables0() { + return (List) tables; } @Override - public final List> getTables() { - return Collections.>unmodifiableList(tables); + protected final List> getSequences0() { + return sequences; } + @SuppressWarnings({ "unchecked", "rawtypes" }) @Override - public final List> getSequences() { - return Collections.>unmodifiableList(sequences); - } - - @Override - public final List> getPrimaryKeys() { - return Collections.>unmodifiableList(primaryKeys); + protected final List> getPrimaryKeys0() { + return (List) primaryKeys; } private final class InformationSchemaCatalog extends CatalogImpl { diff --git a/jOOQ/src/main/java/org/jooq/impl/MetaImpl.java b/jOOQ/src/main/java/org/jooq/impl/MetaImpl.java index 0e992fee69..84bea8f456 100644 --- a/jOOQ/src/main/java/org/jooq/impl/MetaImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/MetaImpl.java @@ -185,7 +185,7 @@ final class MetaImpl extends AbstractMeta { } @Override - public final List getCatalogs() { + protected final List getCatalogs0() { List result = new ArrayList<>(); @@ -219,7 +219,7 @@ final class MetaImpl extends AbstractMeta { } @Override - public final List getSchemas() { + protected final List getSchemas0() { List result = new ArrayList<>(); for (Catalog catalog : getCatalogs()) @@ -229,7 +229,7 @@ final class MetaImpl extends AbstractMeta { } @Override - public final List> getTables() { + protected final List> getTables0() { List> result = new ArrayList<>(); for (Schema schema : getSchemas()) @@ -239,7 +239,7 @@ final class MetaImpl extends AbstractMeta { } @Override - public final List> getSequences() { + protected final List> getSequences0() { List> result = new ArrayList<>(); for (Schema schema : getSchemas()) @@ -249,7 +249,7 @@ final class MetaImpl extends AbstractMeta { } @Override - public final List> getPrimaryKeys() { + protected final List> getPrimaryKeys0() { List> result = new ArrayList<>(); for (Table table : getTables()) { diff --git a/jOOQ/src/main/java/org/jooq/impl/SchemaMetaImpl.java b/jOOQ/src/main/java/org/jooq/impl/SchemaMetaImpl.java index 11d8495289..ef92da3308 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SchemaMetaImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SchemaMetaImpl.java @@ -68,7 +68,7 @@ final class SchemaMetaImpl extends AbstractMeta { } @Override - public final List getCatalogs() { + protected final List getCatalogs0() { Set result = new LinkedHashSet<>(); for (Schema schema : schemas) @@ -79,12 +79,12 @@ final class SchemaMetaImpl extends AbstractMeta { } @Override - public final List getSchemas() { + protected final List getSchemas0() { return Collections.unmodifiableList(Arrays.asList(schemas)); } @Override - public final List> getTables() { + protected final List> getTables0() { List> result = new ArrayList<>(); for (Schema schema : schemas) @@ -94,7 +94,7 @@ final class SchemaMetaImpl extends AbstractMeta { } @Override - public final List> getSequences() { + protected final List> getSequences0() { List> result = new ArrayList<>(); for (Schema schema : schemas) @@ -104,7 +104,7 @@ final class SchemaMetaImpl extends AbstractMeta { } @Override - public final List> getPrimaryKeys() { + protected final List> getPrimaryKeys0() { List> result = new ArrayList<>(); for (Schema schema : schemas) diff --git a/jOOQ/src/main/java/org/jooq/impl/TableMetaImpl.java b/jOOQ/src/main/java/org/jooq/impl/TableMetaImpl.java index a949f2eeb9..12850a07a6 100644 --- a/jOOQ/src/main/java/org/jooq/impl/TableMetaImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/TableMetaImpl.java @@ -68,7 +68,7 @@ final class TableMetaImpl extends AbstractMeta { } @Override - public final List getCatalogs() { + protected final List getCatalogs0() { Set result = new LinkedHashSet<>(); for (Table table : tables) @@ -80,7 +80,7 @@ final class TableMetaImpl extends AbstractMeta { } @Override - public final List getSchemas() { + protected final List getSchemas0() { Set result = new LinkedHashSet<>(); for (Table table : tables) @@ -91,17 +91,17 @@ final class TableMetaImpl extends AbstractMeta { } @Override - public final List> getTables() { + protected final List> getTables0() { return Collections.unmodifiableList(Arrays.asList(tables)); } @Override - public final List> getSequences() { + protected final List> getSequences0() { return Collections.emptyList(); } @Override - public final List> getPrimaryKeys() { + protected final List> getPrimaryKeys0() { List> result = new ArrayList<>(); for (Table table : tables)