Cache the mock catalog used by several test suites
Project: http://git-wip-us.apache.org/repos/asf/calcite/repo Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/39c22f0c Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/39c22f0c Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/39c22f0c Branch: refs/heads/master Commit: 39c22f0c8b7b5b46a152f432e8708ce73ace1ef7 Parents: 7cec056 Author: Julian Hyde <[email protected]> Authored: Tue Apr 25 17:59:02 2017 -0700 Committer: Julian Hyde <[email protected]> Committed: Wed Apr 26 14:21:11 2017 -0700 ---------------------------------------------------------------------- .../calcite/sql/test/DefaultSqlTestFactory.java | 51 +++++++++++++++++--- 1 file changed, 44 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/calcite/blob/39c22f0c/core/src/test/java/org/apache/calcite/sql/test/DefaultSqlTestFactory.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/calcite/sql/test/DefaultSqlTestFactory.java b/core/src/test/java/org/apache/calcite/sql/test/DefaultSqlTestFactory.java index 63c1cdd..b9f9d66 100644 --- a/core/src/test/java/org/apache/calcite/sql/test/DefaultSqlTestFactory.java +++ b/core/src/test/java/org/apache/calcite/sql/test/DefaultSqlTestFactory.java @@ -34,8 +34,13 @@ import org.apache.calcite.test.CalciteAssert; import org.apache.calcite.test.MockCatalogReader; import org.apache.calcite.test.MockSqlOperatorTable; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; import com.google.common.collect.ImmutableMap; +import javax.annotation.Nonnull; + /** * Default implementation of {@link SqlTestFactory}. * @@ -61,6 +66,28 @@ public class DefaultSqlTestFactory implements SqlTestFactory { CalciteAssert.SchemaSpec.HR))) .build(); + /** Caches the mock catalog. + * Due to view parsing, initializing a mock catalog is quite expensive. + * Validator is not re-entrant, so we create a new one for each test. + * Caching improves SqlValidatorTest from 23s to 8s, + * and CalciteSqlOperatorTest from 65s to 43s. */ + private final LoadingCache<SqlTestFactory, Xyz> cache = + CacheBuilder.newBuilder() + .build( + new CacheLoader<SqlTestFactory, Xyz>() { + public Xyz load(@Nonnull SqlTestFactory factory) + throws Exception { + final SqlOperatorTable operatorTable = + factory.createOperatorTable(factory); + final boolean caseSensitive = + (Boolean) factory.get("caseSensitive"); + final JavaTypeFactory typeFactory = + new JavaTypeFactoryImpl(RelDataTypeSystem.DEFAULT); + return new Xyz(operatorTable, typeFactory, + new MockCatalogReader(typeFactory, caseSensitive).init()); + } + }); + public static final DefaultSqlTestFactory INSTANCE = new DefaultSqlTestFactory(); @@ -86,15 +113,11 @@ public class DefaultSqlTestFactory implements SqlTestFactory { } public SqlValidator getValidator(SqlTestFactory factory) { - final SqlOperatorTable operatorTable = factory.createOperatorTable(factory); - final boolean caseSensitive = (Boolean) factory.get("caseSensitive"); + final Xyz xyz = cache.getUnchecked(factory); final SqlConformance conformance = (SqlConformance) factory.get("conformance"); - final JavaTypeFactory typeFactory = - new JavaTypeFactoryImpl(RelDataTypeSystem.DEFAULT); - return SqlValidatorUtil.newValidator(operatorTable, - new MockCatalogReader(typeFactory, caseSensitive).init(), - typeFactory, conformance); + return SqlValidatorUtil.newValidator(xyz.operatorTable, + xyz.catalogReader, xyz.typeFactory, conformance); } public SqlAdvisor createAdvisor(SqlValidatorWithHints validator) { @@ -104,6 +127,20 @@ public class DefaultSqlTestFactory implements SqlTestFactory { public Object get(String name) { return DEFAULT_OPTIONS.get(name); } + + /** State that can be cached and shared among tests. */ + private static class Xyz { + private final SqlOperatorTable operatorTable; + private final JavaTypeFactory typeFactory; + private final MockCatalogReader catalogReader; + + Xyz(SqlOperatorTable operatorTable, JavaTypeFactory typeFactory, + MockCatalogReader catalogReader) { + this.operatorTable = operatorTable; + this.typeFactory = typeFactory; + this.catalogReader = catalogReader; + } + } } // End DefaultSqlTestFactory.java
