[CALCITE-2435] tests: refactor SqlTestFactory closes #771
Project: http://git-wip-us.apache.org/repos/asf/calcite/repo Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/96b28f7b Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/96b28f7b Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/96b28f7b Branch: refs/heads/master Commit: 96b28f7ba11de22a68d984de6b6b88311cc2c57e Parents: c113765 Author: Vladimir Sitnikov <[email protected]> Authored: Wed Aug 1 13:40:56 2018 +0300 Committer: Vladimir Sitnikov <[email protected]> Committed: Thu Aug 2 12:10:12 2018 +0300 ---------------------------------------------------------------------- .../calcite/sql/test/DefaultSqlTestFactory.java | 159 -- .../sql/test/DelegatingSqlTestFactory.java | 73 - .../apache/calcite/sql/test/SqlAdvisorTest.java | 48 +- .../calcite/sql/test/SqlOperatorBaseTest.java | 14 +- .../apache/calcite/sql/test/SqlTestFactory.java | 181 +- .../apache/calcite/sql/test/SqlTesterImpl.java | 16 +- .../sql/validate/SqlValidatorUtilTest.java | 4 +- .../apache/calcite/test/MockCatalogReader.java | 1750 ------------------ .../apache/calcite/test/RelOptRulesTest.java | 1 + .../org/apache/calcite/test/SqlTestGen.java | 20 +- .../calcite/test/SqlToRelConverterTest.java | 3 +- .../apache/calcite/test/SqlToRelTestBase.java | 4 +- .../calcite/test/SqlValidatorFeatureTest.java | 28 +- .../apache/calcite/test/SqlValidatorTest.java | 11 +- .../calcite/test/SqlValidatorTestCase.java | 13 +- .../test/catalog/CompoundNameColumn.java | 39 + .../catalog/CompoundNameColumnResolver.java | 150 ++ .../calcite/test/catalog/CountingFactory.java | 82 + .../EmpInitializerExpressionFactory.java | 64 + .../apache/calcite/test/catalog/Fixture.java | 125 ++ .../calcite/test/catalog/MockCatalogReader.java | 1006 ++++++++++ .../test/catalog/MockCatalogReaderExtended.java | 120 ++ .../test/catalog/MockCatalogReaderSimple.java | 422 +++++ 23 files changed, 2218 insertions(+), 2115 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/calcite/blob/96b28f7b/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 deleted file mode 100644 index e2667d5..0000000 --- a/core/src/test/java/org/apache/calcite/sql/test/DefaultSqlTestFactory.java +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to you 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. - */ -package org.apache.calcite.sql.test; - -import org.apache.calcite.adapter.java.JavaTypeFactory; -import org.apache.calcite.avatica.util.Casing; -import org.apache.calcite.avatica.util.Quoting; -import org.apache.calcite.jdbc.JavaTypeFactoryImpl; -import org.apache.calcite.rel.type.DelegatingTypeSystem; -import org.apache.calcite.rel.type.RelDataTypeSystem; -import org.apache.calcite.sql.SqlOperatorTable; -import org.apache.calcite.sql.advise.SqlAdvisor; -import org.apache.calcite.sql.fun.SqlStdOperatorTable; -import org.apache.calcite.sql.parser.SqlParser; -import org.apache.calcite.sql.validate.SqlConformance; -import org.apache.calcite.sql.validate.SqlConformanceEnum; -import org.apache.calcite.sql.validate.SqlValidator; -import org.apache.calcite.sql.validate.SqlValidatorUtil; -import org.apache.calcite.sql.validate.SqlValidatorWithHints; -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}. - * - * <p>Suitable for most tests. If you want different behavior, you can extend; - * if you want a factory with different properties (e.g. SQL conformance level - * or identifier quoting), wrap in a - * {@link DelegatingSqlTestFactory} and - * override {@link #get}.</p> -*/ -public class DefaultSqlTestFactory implements SqlTestFactory { - public static final ImmutableMap<String, Object> DEFAULT_OPTIONS = - ImmutableMap.<String, Object>builder() - .put("quoting", Quoting.DOUBLE_QUOTE) - .put("quotedCasing", Casing.UNCHANGED) - .put("unquotedCasing", Casing.TO_UPPER) - .put("caseSensitive", true) - .put("conformance", SqlConformanceEnum.DEFAULT) - .put("operatorTable", SqlStdOperatorTable.instance()) - .put("connectionFactory", - CalciteAssert.EMPTY_CONNECTION_FACTORY - .with( - new CalciteAssert.AddSchemaSpecPostProcessor( - 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(CacheLoader.from(Xyz::from)); - - public static final DefaultSqlTestFactory INSTANCE = - new DefaultSqlTestFactory(); - - private DefaultSqlTestFactory() { - } - - public MockCatalogReader createCatalogReader(SqlTestFactory testFactory, - JavaTypeFactory typeFactory) { - final boolean caseSensitive = (Boolean) testFactory.get("caseSensitive"); - return new MockCatalogReader(typeFactory, caseSensitive).init(); - } - - public SqlOperatorTable createOperatorTable(SqlTestFactory factory) { - final SqlOperatorTable opTab0 = - (SqlOperatorTable) factory.get("operatorTable"); - MockSqlOperatorTable opTab = new MockSqlOperatorTable(opTab0); - MockSqlOperatorTable.addRamp(opTab); - return opTab; - } - - public SqlParser createParser(SqlTestFactory factory, String sql) { - return SqlParser.create(sql, - SqlParser.configBuilder() - .setQuoting((Quoting) factory.get("quoting")) - .setUnquotedCasing((Casing) factory.get("unquotedCasing")) - .setQuotedCasing((Casing) factory.get("quotedCasing")) - .setConformance((SqlConformance) factory.get("conformance")) - .build()); - } - - public SqlValidator getValidator(SqlTestFactory factory) { - final Xyz xyz = cache.getUnchecked(factory); - final SqlConformance conformance = - (SqlConformance) factory.get("conformance"); - return SqlValidatorUtil.newValidator(xyz.operatorTable, - xyz.catalogReader, xyz.typeFactory, conformance); - } - - public SqlAdvisor createAdvisor(SqlValidatorWithHints validator) { - throw new UnsupportedOperationException(); - } - - 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; - } - - static Xyz from(@Nonnull SqlTestFactory factory) { - final SqlOperatorTable operatorTable = - factory.createOperatorTable(factory); - RelDataTypeSystem typeSystem = RelDataTypeSystem.DEFAULT; - final SqlConformance conformance = - (SqlConformance) factory.get("conformance"); - if (conformance.shouldConvertRaggedUnionTypesToVarying()) { - typeSystem = new DelegatingTypeSystem(typeSystem) { - public boolean shouldConvertRaggedUnionTypesToVarying() { - return true; - } - }; - } - final JavaTypeFactory typeFactory = - new JavaTypeFactoryImpl(typeSystem); - final MockCatalogReader catalogReader = - factory.createCatalogReader(factory, typeFactory); - return new Xyz(operatorTable, typeFactory, catalogReader); - } - } -} - -// End DefaultSqlTestFactory.java http://git-wip-us.apache.org/repos/asf/calcite/blob/96b28f7b/core/src/test/java/org/apache/calcite/sql/test/DelegatingSqlTestFactory.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/calcite/sql/test/DelegatingSqlTestFactory.java b/core/src/test/java/org/apache/calcite/sql/test/DelegatingSqlTestFactory.java deleted file mode 100644 index cfd628f..0000000 --- a/core/src/test/java/org/apache/calcite/sql/test/DelegatingSqlTestFactory.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to you 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. - */ -package org.apache.calcite.sql.test; - -import org.apache.calcite.adapter.java.JavaTypeFactory; -import org.apache.calcite.sql.SqlOperatorTable; -import org.apache.calcite.sql.advise.SqlAdvisor; -import org.apache.calcite.sql.parser.SqlParser; -import org.apache.calcite.sql.validate.SqlValidator; -import org.apache.calcite.sql.validate.SqlValidatorWithHints; -import org.apache.calcite.test.MockCatalogReader; - -/** -* Implementation of {@link SqlTestFactory} that delegates - * everything to an underlying factory. - * - * <p>Generally a chain starts with a - * {@link org.apache.calcite.sql.test.DefaultSqlTestFactory}, and continues with - * a succession of objects that derive from {@code DelegatingSqlTestFactory} and - * override one method.</p> - * - * <p>Methods such as - * {@link org.apache.calcite.sql.test.SqlTester#withConformance} help create - * such chains.</p> -*/ -public class DelegatingSqlTestFactory implements SqlTestFactory { - private final SqlTestFactory factory; - - public DelegatingSqlTestFactory(SqlTestFactory factory) { - this.factory = factory; - } - - public Object get(String name) { - return factory.get(name); - } - - public MockCatalogReader createCatalogReader(SqlTestFactory factory, - JavaTypeFactory typeFactory) { - return this.factory.createCatalogReader(factory, typeFactory); - } - - public SqlOperatorTable createOperatorTable(SqlTestFactory factory) { - return this.factory.createOperatorTable(factory); - } - - public SqlAdvisor createAdvisor(SqlValidatorWithHints validator) { - return factory.createAdvisor(validator); - } - - public SqlValidator getValidator(SqlTestFactory factory) { - return this.factory.getValidator(factory); - } - - public SqlParser createParser(SqlTestFactory factory, String sql) { - return this.factory.createParser(factory, sql); - } -} - -// End DelegatingSqlTestFactory.java http://git-wip-us.apache.org/repos/asf/calcite/blob/96b28f7b/core/src/test/java/org/apache/calcite/sql/test/SqlAdvisorTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/calcite/sql/test/SqlAdvisorTest.java b/core/src/test/java/org/apache/calcite/sql/test/SqlAdvisorTest.java index c8476be..0742731 100644 --- a/core/src/test/java/org/apache/calcite/sql/test/SqlAdvisorTest.java +++ b/core/src/test/java/org/apache/calcite/sql/test/SqlAdvisorTest.java @@ -16,20 +16,12 @@ */ package org.apache.calcite.sql.test; -import org.apache.calcite.rel.type.RelDataTypeFactory; -import org.apache.calcite.rel.type.RelDataTypeSystem; import org.apache.calcite.sql.advise.SqlAdvisor; import org.apache.calcite.sql.advise.SqlAdvisorValidator; import org.apache.calcite.sql.advise.SqlSimpleParser; -import org.apache.calcite.sql.fun.SqlStdOperatorTable; import org.apache.calcite.sql.parser.SqlParserUtil; -import org.apache.calcite.sql.type.SqlTypeFactoryImpl; -import org.apache.calcite.sql.validate.SqlConformance; import org.apache.calcite.sql.validate.SqlMoniker; import org.apache.calcite.sql.validate.SqlMonikerType; -import org.apache.calcite.sql.validate.SqlValidator; -import org.apache.calcite.sql.validate.SqlValidatorWithHints; -import org.apache.calcite.test.MockCatalogReader; import org.apache.calcite.test.SqlValidatorTestCase; import org.junit.Assert; @@ -52,6 +44,9 @@ import static org.junit.Assert.fail; * for SqlAdvisor. */ public class SqlAdvisorTest extends SqlValidatorTestCase { + public static final SqlTestFactory ADVISOR_TEST_FACTORY = SqlTestFactory.INSTANCE.withValidator( + SqlAdvisorValidator::new); + //~ Static fields/initializers --------------------------------------------- private static final List<String> STAR_KEYWORD = @@ -413,9 +408,7 @@ public class SqlAdvisorTest extends SqlValidatorTestCase { protected void assertHint( String sql, String expectedResults) throws Exception { - SqlValidatorWithHints validator = - (SqlValidatorWithHints) tester.getValidator(); - SqlAdvisor advisor = tester.getFactory().createAdvisor(validator); + SqlAdvisor advisor = tester.getFactory().createAdvisor(); SqlParserUtil.StringAndPos sap = SqlParserUtil.findPos(sql); @@ -436,9 +429,7 @@ public class SqlAdvisorTest extends SqlValidatorTestCase { * @param expected Expected result after simplification. */ protected void assertSimplify(String sql, String expected) { - SqlValidatorWithHints validator = - (SqlValidatorWithHints) tester.getValidator(); - SqlAdvisor advisor = tester.getFactory().createAdvisor(validator); + SqlAdvisor advisor = tester.getFactory().createAdvisor(); SqlParserUtil.StringAndPos sap = SqlParserUtil.findPos(sql); String actual = advisor.simplifySql(sap.sql, sap.cursor); @@ -467,9 +458,7 @@ public class SqlAdvisorTest extends SqlValidatorTestCase { String sql, String expectedResults, String expectedWord) { - SqlValidatorWithHints validator = - (SqlValidatorWithHints) tester.getValidator(); - SqlAdvisor advisor = tester.getFactory().createAdvisor(validator); + SqlAdvisor advisor = tester.getFactory().createAdvisor(); SqlParserUtil.StringAndPos sap = SqlParserUtil.findPos(sql); final String[] replaced = {null}; @@ -527,7 +516,7 @@ public class SqlAdvisorTest extends SqlValidatorTestCase { } @Override public SqlTester getTester() { - return new SqlTesterImpl(new AdvisorTesterFactory()); + return new SqlTesterImpl(ADVISOR_TEST_FACTORY); } /** @@ -1234,29 +1223,6 @@ public class SqlAdvisorTest extends SqlValidatorTestCase { simplified = "SELECT * FROM emp GROUP BY _suggest_"; assertSimplify(sql, simplified); } - - /** Factory that creates testers. */ - private static class AdvisorTesterFactory extends DelegatingSqlTestFactory { - AdvisorTesterFactory() { - super(DefaultSqlTestFactory.INSTANCE); - } - - @Override public SqlValidator getValidator(SqlTestFactory factory) { - final RelDataTypeFactory typeFactory = - new SqlTypeFactoryImpl(RelDataTypeSystem.DEFAULT); - final SqlConformance conformance = (SqlConformance) get("conformance"); - final boolean caseSensitive = (Boolean) factory.get("caseSensitive"); - return new SqlAdvisorValidator( - SqlStdOperatorTable.instance(), - new MockCatalogReader(typeFactory, caseSensitive).init(), - typeFactory, - conformance); - } - - @Override public SqlAdvisor createAdvisor(SqlValidatorWithHints validator) { - return new SqlAdvisor(validator); - } - } } // End SqlAdvisorTest.java http://git-wip-us.apache.org/repos/asf/calcite/blob/96b28f7b/core/src/test/java/org/apache/calcite/sql/test/SqlOperatorBaseTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/calcite/sql/test/SqlOperatorBaseTest.java b/core/src/test/java/org/apache/calcite/sql/test/SqlOperatorBaseTest.java index 778715c..903504c 100644 --- a/core/src/test/java/org/apache/calcite/sql/test/SqlOperatorBaseTest.java +++ b/core/src/test/java/org/apache/calcite/sql/test/SqlOperatorBaseTest.java @@ -7641,7 +7641,7 @@ public abstract class SqlOperatorBaseTest { } public static SqlTester tester() { - return new TesterImpl(DefaultSqlTestFactory.INSTANCE); + return new TesterImpl(SqlTestFactory.INSTANCE); } /** @@ -7672,16 +7672,8 @@ public abstract class SqlOperatorBaseTest { } } - @Override protected TesterImpl with(final String name2, final Object value) { - return new TesterImpl( - new DelegatingSqlTestFactory(factory) { - @Override public Object get(String name) { - if (name.equals(name2)) { - return value; - } - return super.get(name); - } - }); + @Override protected TesterImpl with(final String name, final Object value) { + return new TesterImpl(factory.with(name, value)); } } http://git-wip-us.apache.org/repos/asf/calcite/blob/96b28f7b/core/src/test/java/org/apache/calcite/sql/test/SqlTestFactory.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/calcite/sql/test/SqlTestFactory.java b/core/src/test/java/org/apache/calcite/sql/test/SqlTestFactory.java index f4dd25a..7269c8a 100644 --- a/core/src/test/java/org/apache/calcite/sql/test/SqlTestFactory.java +++ b/core/src/test/java/org/apache/calcite/sql/test/SqlTestFactory.java @@ -16,27 +16,184 @@ */ package org.apache.calcite.sql.test; -import org.apache.calcite.adapter.java.JavaTypeFactory; +import org.apache.calcite.avatica.util.Casing; +import org.apache.calcite.avatica.util.Quoting; +import org.apache.calcite.jdbc.JavaTypeFactoryImpl; +import org.apache.calcite.rel.type.DelegatingTypeSystem; +import org.apache.calcite.rel.type.RelDataTypeFactory; +import org.apache.calcite.rel.type.RelDataTypeSystem; import org.apache.calcite.sql.SqlOperatorTable; import org.apache.calcite.sql.advise.SqlAdvisor; +import org.apache.calcite.sql.fun.SqlStdOperatorTable; import org.apache.calcite.sql.parser.SqlParser; +import org.apache.calcite.sql.validate.SqlConformance; +import org.apache.calcite.sql.validate.SqlConformanceEnum; import org.apache.calcite.sql.validate.SqlValidator; +import org.apache.calcite.sql.validate.SqlValidatorCatalogReader; +import org.apache.calcite.sql.validate.SqlValidatorUtil; import org.apache.calcite.sql.validate.SqlValidatorWithHints; -import org.apache.calcite.test.MockCatalogReader; +import org.apache.calcite.test.CalciteAssert; +import org.apache.calcite.test.MockSqlOperatorTable; +import org.apache.calcite.test.catalog.MockCatalogReader; +import org.apache.calcite.test.catalog.MockCatalogReaderSimple; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSortedMap; + +import java.util.Map; +import java.util.Objects; /** -* Creates the objects needed to run a SQL parsing or validation test. + * Default implementation of {@link SqlTestFactory}. * - * @see org.apache.calcite.sql.test.SqlTester + * <p>Suitable for most tests. If you want different behavior, you can extend; + * if you want a factory with different properties (e.g. SQL conformance level + * or identifier quoting), use {@link #with(String, Object)} to create a new factory.</p> */ -public interface SqlTestFactory { - MockCatalogReader createCatalogReader(SqlTestFactory testFactory, - JavaTypeFactory typeFactory); - SqlOperatorTable createOperatorTable(SqlTestFactory factory); - SqlParser createParser(SqlTestFactory factory, String sql); - SqlValidator getValidator(SqlTestFactory factory); - SqlAdvisor createAdvisor(SqlValidatorWithHints validator); - Object get(String name); +public class SqlTestFactory { + public static final ImmutableMap<String, Object> DEFAULT_OPTIONS = + ImmutableSortedMap.<String, Object>naturalOrder() + .put("quoting", Quoting.DOUBLE_QUOTE) + .put("quotedCasing", Casing.UNCHANGED) + .put("unquotedCasing", Casing.TO_UPPER) + .put("caseSensitive", true) + .put("conformance", SqlConformanceEnum.DEFAULT) + .put("operatorTable", SqlStdOperatorTable.instance()) + .put("connectionFactory", + CalciteAssert.EMPTY_CONNECTION_FACTORY + .with( + new CalciteAssert.AddSchemaSpecPostProcessor( + CalciteAssert.SchemaSpec.HR))) + .build(); + + public static final SqlTestFactory INSTANCE = + new SqlTestFactory(); + + private final ImmutableMap<String, Object> options; + private final MockCatalogReaderFactory catalogReaderFactory; + private final ValidatorFactory validatorFactory; + + private final RelDataTypeFactory typeFactory; + private final SqlOperatorTable operatorTable; + private final SqlValidatorCatalogReader catalogReader; + private final SqlParser.Config parserConfig; + + protected SqlTestFactory() { + this(DEFAULT_OPTIONS, MockCatalogReaderSimple::new, SqlValidatorUtil::newValidator); + } + + protected SqlTestFactory(ImmutableMap<String, Object> options, + MockCatalogReaderFactory catalogReaderFactory, + ValidatorFactory validatorFactory) { + this.options = options; + this.catalogReaderFactory = catalogReaderFactory; + this.validatorFactory = validatorFactory; + this.operatorTable = createOperatorTable((SqlOperatorTable) options.get("operatorTable")); + this.typeFactory = createTypeFactory((SqlConformance) options.get("conformance")); + Boolean caseSensitive = (Boolean) options.get("caseSensitive"); + this.catalogReader = catalogReaderFactory.create(typeFactory, caseSensitive).init(); + this.parserConfig = createParserConfig(options); + } + + public static MockCatalogReader createCatalogReader( + RelDataTypeFactory typeFactory, + boolean caseSensitive) { + return new MockCatalogReaderSimple(typeFactory, caseSensitive).init(); + } + + private static SqlOperatorTable createOperatorTable(SqlOperatorTable opTab0) { + MockSqlOperatorTable opTab = new MockSqlOperatorTable(opTab0); + MockSqlOperatorTable.addRamp(opTab); + return opTab; + } + + public SqlParser createParser(String sql) { + return SqlParser.create(sql, parserConfig); + } + + public static SqlParser.Config createParserConfig(ImmutableMap<String, Object> options) { + return SqlParser.configBuilder() + .setQuoting((Quoting) options.get("quoting")) + .setUnquotedCasing((Casing) options.get("unquotedCasing")) + .setQuotedCasing((Casing) options.get("quotedCasing")) + .setConformance((SqlConformance) options.get("conformance")) + .build(); + } + + public SqlValidator getValidator() { + final SqlConformance conformance = + (SqlConformance) options.get("conformance"); + return validatorFactory.create(operatorTable, catalogReader, typeFactory, conformance); + } + + public SqlAdvisor createAdvisor() { + SqlValidator validator = getValidator(); + if (validator instanceof SqlValidatorWithHints) { + return new SqlAdvisor((SqlValidatorWithHints) validator); + } + throw new UnsupportedOperationException( + "Validator should implement SqlValidatorWithHints, actual validator is " + validator); + } + + public SqlTestFactory with(String name, Object value) { + if (Objects.equals(value, options.get(name))) { + return this; + } + ImmutableMap.Builder<String, Object> builder = ImmutableSortedMap.naturalOrder(); + // Protect from IllegalArgumentException: Multiple entries with same key + for (Map.Entry<String, Object> entry : options.entrySet()) { + if (name.equals(entry.getKey())) { + continue; + } + builder.put(entry); + } + builder.put(name, value); + return new SqlTestFactory(builder.build(), catalogReaderFactory, validatorFactory); + } + + public SqlTestFactory withCatalogReader(MockCatalogReaderFactory newCatalogReaderFactory) { + return new SqlTestFactory(options, newCatalogReaderFactory, validatorFactory); + } + + public SqlTestFactory withValidator(ValidatorFactory newValidatorFactory) { + return new SqlTestFactory(options, catalogReaderFactory, newValidatorFactory); + } + + public final Object get(String name) { + return options.get(name); + } + + private static RelDataTypeFactory createTypeFactory(SqlConformance conformance) { + RelDataTypeSystem typeSystem = RelDataTypeSystem.DEFAULT; + if (conformance.shouldConvertRaggedUnionTypesToVarying()) { + typeSystem = new DelegatingTypeSystem(typeSystem) { + public boolean shouldConvertRaggedUnionTypesToVarying() { + return true; + } + }; + } + return new JavaTypeFactoryImpl(typeSystem); + } + + /** + * Creates {@link SqlValidator} for tests. + */ + public interface ValidatorFactory { + SqlValidator create( + SqlOperatorTable opTab, + SqlValidatorCatalogReader catalogReader, + RelDataTypeFactory typeFactory, + SqlConformance conformance); + } + + /** + * Creates {@link MockCatalogReader} for tests. + * Note: {@link MockCatalogReader#init()} is to be invoked later, so a typical implementation + * should be via constructor reference like {@code MockCatalogReaderSimple::new}. + */ + public interface MockCatalogReaderFactory { + MockCatalogReader create(RelDataTypeFactory typeFactory, boolean caseSensitive); + } } // End SqlTestFactory.java http://git-wip-us.apache.org/repos/asf/calcite/blob/96b28f7b/core/src/test/java/org/apache/calcite/sql/test/SqlTesterImpl.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/calcite/sql/test/SqlTesterImpl.java b/core/src/test/java/org/apache/calcite/sql/test/SqlTesterImpl.java index d215b45..533cb99 100644 --- a/core/src/test/java/org/apache/calcite/sql/test/SqlTesterImpl.java +++ b/core/src/test/java/org/apache/calcite/sql/test/SqlTesterImpl.java @@ -98,7 +98,7 @@ public class SqlTesterImpl implements SqlTester, AutoCloseable { } public final SqlValidator getValidator() { - return factory.getValidator(factory); + return factory.getValidator(); } public void assertExceptionIsThrown( @@ -163,7 +163,7 @@ public class SqlTesterImpl implements SqlTester, AutoCloseable { } public SqlNode parseQuery(String sql) throws SqlParseException { - SqlParser parser = factory.createParser(factory, sql); + SqlParser parser = factory.createParser(sql); return parser.parseQuery(); } @@ -312,16 +312,8 @@ public class SqlTesterImpl implements SqlTester, AutoCloseable { return with("connectionFactory", connectionFactory); } - protected SqlTesterImpl with(final String name2, final Object value) { - return new SqlTesterImpl( - new DelegatingSqlTestFactory(factory) { - @Override public Object get(String name) { - if (name.equals(name2)) { - return value; - } - return super.get(name); - } - }); + protected SqlTesterImpl with(final String name, final Object value) { + return new SqlTesterImpl(factory.with(name, value)); } // SqlTester methods http://git-wip-us.apache.org/repos/asf/calcite/blob/96b28f7b/core/src/test/java/org/apache/calcite/sql/validate/SqlValidatorUtilTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/calcite/sql/validate/SqlValidatorUtilTest.java b/core/src/test/java/org/apache/calcite/sql/validate/SqlValidatorUtilTest.java index a716002..0405308 100644 --- a/core/src/test/java/org/apache/calcite/sql/validate/SqlValidatorUtilTest.java +++ b/core/src/test/java/org/apache/calcite/sql/validate/SqlValidatorUtilTest.java @@ -20,7 +20,7 @@ import org.apache.calcite.runtime.CalciteContextException; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.parser.SqlParserPos; -import org.apache.calcite.sql.test.DefaultSqlTestFactory; +import org.apache.calcite.sql.test.SqlTestFactory; import org.apache.calcite.sql.test.SqlTesterImpl; import com.google.common.collect.ImmutableList; @@ -125,7 +125,7 @@ public class SqlValidatorUtilTest { newList.add(new SqlIdentifier(Arrays.asList("f0", "c0"), SqlParserPos.ZERO)); newList.add(new SqlIdentifier(Arrays.asList("f0", "c0"), SqlParserPos.ZERO)); final SqlTesterImpl tester = - new SqlTesterImpl(DefaultSqlTestFactory.INSTANCE); + new SqlTesterImpl(SqlTestFactory.INSTANCE); final SqlValidatorImpl validator = (SqlValidatorImpl) tester.getValidator(); try {
