This is an automated email from the ASF dual-hosted git repository.

danny0405 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git


The following commit(s) were added to refs/heads/master by this push:
     new 3807696  [CALCITE-3942] Move type-coercion configurations into 
SqlValidator.Config
3807696 is described below

commit 38076961698c5354375be7856944809e71cd5a21
Author: yuzhao.cyz <yuzhao....@gmail.com>
AuthorDate: Tue Apr 21 15:01:02 2020 +0800

    [CALCITE-3942] Move type-coercion configurations into SqlValidator.Config
    
    SqlValidator.Config is the new role to config all kinds of
    configurations of SqlValidator.
---
 .../calcite/sql/type/SqlTypeCoercionRule.java      |  5 +--
 .../apache/calcite/sql/validate/SqlValidator.java  | 40 +++++++++++++++++++++-
 .../calcite/sql/validate/SqlValidatorImpl.java     |  6 ++--
 .../validate/implicit/AbstractTypeCoercion.java    |  7 ++--
 ...TypeCoercions.java => TypeCoercionFactory.java} | 31 +++++++++++------
 .../sql/validate/implicit/TypeCoercionImpl.java    |  5 +--
 .../sql/validate/implicit/TypeCoercions.java       | 10 +++---
 7 files changed, 78 insertions(+), 26 deletions(-)

diff --git 
a/core/src/main/java/org/apache/calcite/sql/type/SqlTypeCoercionRule.java 
b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeCoercionRule.java
index f819d5a..fc785d9 100644
--- a/core/src/main/java/org/apache/calcite/sql/type/SqlTypeCoercionRule.java
+++ b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeCoercionRule.java
@@ -62,8 +62,9 @@ import java.util.Set;
  *     SqlTypeCoercionRules typeCoercionRules = 
SqlTypeCoercionRules.instance(builder.map);
  *
  *     // Set the SqlTypeCoercionRules instance into the SqlValidator.
- *     SqlValidator validator ...;
- *     validator.setSqlTypeCoercionRules(typeCoercionRules);
+ *     SqlValidator.Config validatorConf ...;
+ *     validatorConf.withTypeCoercionRules(typeCoercionRules);
+ *     // Use this conf to initialize the SqlValidator.
  * </pre>
  */
 public class SqlTypeCoercionRule implements SqlTypeMappingRule {
diff --git 
a/core/src/main/java/org/apache/calcite/sql/validate/SqlValidator.java 
b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidator.java
index e461034..620703c 100644
--- a/core/src/main/java/org/apache/calcite/sql/validate/SqlValidator.java
+++ b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidator.java
@@ -44,6 +44,8 @@ import org.apache.calcite.sql.SqlWith;
 import org.apache.calcite.sql.SqlWithItem;
 import org.apache.calcite.sql.type.SqlTypeCoercionRule;
 import org.apache.calcite.sql.validate.implicit.TypeCoercion;
+import org.apache.calcite.sql.validate.implicit.TypeCoercionFactory;
+import org.apache.calcite.sql.validate.implicit.TypeCoercions;
 import org.apache.calcite.util.ImmutableBeans;
 
 import org.apiguardian.api.API;
@@ -868,7 +870,10 @@ public interface SqlValidator {
    * {@link org.apache.calcite.sql.validate.implicit.TypeCoercionImpl}.
    *
    * @param typeCoercion {@link TypeCoercion} instance
+   *
+   * @deprecated Use {@link Config#withTypeCoercionFactory}
    */
+  @Deprecated // to be removed before 1.24
   void setTypeCoercion(TypeCoercion typeCoercion);
 
   /** Get the type coercion instance. */
@@ -884,7 +889,10 @@ public interface SqlValidator {
    *
    * @param typeCoercionRules The {@link SqlTypeCoercionRule} instance, see 
its documentation
    *                          for how to customize the rules.
+   *
+   * @deprecated Use {@link Config#withTypeCoercionRules}
    */
+  @Deprecated // to be removed before 1.24
   void setSqlTypeCoercionRules(SqlTypeCoercionRule typeCoercionRules);
 
   /** Returns the config of the validator. */
@@ -908,7 +916,8 @@ public interface SqlValidator {
    */
   public interface Config {
     /** Default configuration. */
-    SqlValidator.Config DEFAULT = ImmutableBeans.create(Config.class);
+    SqlValidator.Config DEFAULT = ImmutableBeans.create(Config.class)
+        .withTypeCoercionFactory(TypeCoercions::createTypeCoercion);
 
     /**
      * Returns whether to enable rewrite of "macro-like" calls such as 
COALESCE.
@@ -1001,6 +1010,35 @@ public interface SqlValidator {
      */
     Config withTypeCoercionEnabled(boolean enabled);
 
+    /** Returns the type coercion factory. */
+    @ImmutableBeans.Property
+    TypeCoercionFactory typeCoercionFactory();
+
+    /**
+     * Sets a factory to create type coercion instance that overrides the
+     * default coercion rules defined in
+     * {@link org.apache.calcite.sql.validate.implicit.TypeCoercionImpl}.
+     *
+     * @param factory Factory to create {@link TypeCoercion} instance
+     */
+    Config withTypeCoercionFactory(TypeCoercionFactory factory);
+
+    /** Returns the type coercion rules for explicit type coercion. */
+    @ImmutableBeans.Property
+    SqlTypeCoercionRule typeCoercionRules();
+
+    /**
+     * Sets the {@link SqlTypeCoercionRule} instance which defines the type 
conversion matrix
+     * for the explicit type coercion.
+     *
+     * <p>The {@code rules} setting should be thread safe. In the default 
implementation,
+     * it is set to a ThreadLocal variable.
+     *
+     * @param rules The {@link SqlTypeCoercionRule} instance,
+     *              see its documentation for how to customize the rules
+     */
+    Config withTypeCoercionRules(SqlTypeCoercionRule rules);
+
     /** Returns the dialect of SQL (SQL:2003, etc.) this validator recognizes.
      * Default is {@link SqlConformanceEnum#DEFAULT}. */
     @ImmutableBeans.Property
diff --git 
a/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java 
b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java
index cbd167c..a8a2d73 100644
--- a/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java
+++ b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java
@@ -91,7 +91,6 @@ import org.apache.calcite.sql.util.SqlBasicVisitor;
 import org.apache.calcite.sql.util.SqlShuttle;
 import org.apache.calcite.sql.util.SqlVisitor;
 import org.apache.calcite.sql.validate.implicit.TypeCoercion;
-import org.apache.calcite.sql.validate.implicit.TypeCoercions;
 import org.apache.calcite.util.BitString;
 import org.apache.calcite.util.Bug;
 import org.apache.calcite.util.ImmutableBitSet;
@@ -315,7 +314,10 @@ public class SqlValidatorImpl implements 
SqlValidatorWithHints {
     groupFinder = new AggFinder(opTab, false, false, true, null, nameMatcher);
     aggOrOverOrGroupFinder = new AggFinder(opTab, true, true, true, null,
         nameMatcher);
-    this.typeCoercion = TypeCoercions.getTypeCoercion(this, 
config.sqlConformance());
+    this.typeCoercion = config.typeCoercionFactory().create(typeFactory, this);
+    if (config.typeCoercionRules() != null) {
+      SqlTypeCoercionRule.THREAD_PROVIDERS.set(config.typeCoercionRules());
+    }
   }
 
   /**
diff --git 
a/core/src/main/java/org/apache/calcite/sql/validate/implicit/AbstractTypeCoercion.java
 
b/core/src/main/java/org/apache/calcite/sql/validate/implicit/AbstractTypeCoercion.java
index c4e6015..ad53825 100644
--- 
a/core/src/main/java/org/apache/calcite/sql/validate/implicit/AbstractTypeCoercion.java
+++ 
b/core/src/main/java/org/apache/calcite/sql/validate/implicit/AbstractTypeCoercion.java
@@ -70,10 +70,9 @@ public abstract class AbstractTypeCoercion implements 
TypeCoercion {
 
   //~ Constructors -----------------------------------------------------------
 
-  AbstractTypeCoercion(SqlValidator validator) {
-    Objects.requireNonNull(validator);
-    this.validator = validator;
-    this.factory = validator.getTypeFactory();
+  AbstractTypeCoercion(RelDataTypeFactory typeFactory, SqlValidator validator) 
{
+    this.factory = Objects.requireNonNull(typeFactory);
+    this.validator = Objects.requireNonNull(validator);
   }
 
   //~ Methods ----------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/calcite/sql/validate/implicit/TypeCoercions.java
 
b/core/src/main/java/org/apache/calcite/sql/validate/implicit/TypeCoercionFactory.java
similarity index 54%
copy from 
core/src/main/java/org/apache/calcite/sql/validate/implicit/TypeCoercions.java
copy to 
core/src/main/java/org/apache/calcite/sql/validate/implicit/TypeCoercionFactory.java
index 6de4b2e..3f0b644 100644
--- 
a/core/src/main/java/org/apache/calcite/sql/validate/implicit/TypeCoercions.java
+++ 
b/core/src/main/java/org/apache/calcite/sql/validate/implicit/TypeCoercionFactory.java
@@ -16,18 +16,29 @@
  */
 package org.apache.calcite.sql.validate.implicit;
 
-import org.apache.calcite.sql.validate.SqlConformance;
+import org.apache.calcite.rel.type.RelDataTypeFactory;
 import org.apache.calcite.sql.validate.SqlValidator;
 
-/**
- * Factory class for type coercion instantiation of different sql dialects.
+import org.apiguardian.api.API;
+
+/** Factory for {@link TypeCoercion} objects.
+ *
+ * <p>A type coercion factory allows you to include custom rules of
+ * implicit type coercion. Usually you should inherit the {@link 
TypeCoercionImpl}
+ * and override the methods that you want to customize.
+ *
+ * <p>This interface is experimental and would change without notice.
+ *
+ * @see SqlValidator.Config#withTypeCoercionFactory
  */
-public class TypeCoercions {
-  private TypeCoercions() {}
+@API(status = API.Status.EXPERIMENTAL, since = "1.23")
+public interface TypeCoercionFactory {
 
-  // All the SqlConformance would have default TypeCoercion instance.
-  public static TypeCoercion getTypeCoercion(SqlValidator validator,
-      SqlConformance conformance) {
-    return new TypeCoercionImpl(validator);
-  }
+  /**
+   * Creates a TypeCoercion.
+   *
+   * @param typeFactory Type factory
+   * @param validator   SQL validator
+   */
+  TypeCoercion create(RelDataTypeFactory typeFactory, SqlValidator validator);
 }
diff --git 
a/core/src/main/java/org/apache/calcite/sql/validate/implicit/TypeCoercionImpl.java
 
b/core/src/main/java/org/apache/calcite/sql/validate/implicit/TypeCoercionImpl.java
index 1eb91fb..5b846e9 100644
--- 
a/core/src/main/java/org/apache/calcite/sql/validate/implicit/TypeCoercionImpl.java
+++ 
b/core/src/main/java/org/apache/calcite/sql/validate/implicit/TypeCoercionImpl.java
@@ -17,6 +17,7 @@
 package org.apache.calcite.sql.validate.implicit;
 
 import org.apache.calcite.rel.type.RelDataType;
+import org.apache.calcite.rel.type.RelDataTypeFactory;
 import org.apache.calcite.rel.type.RelDataTypeField;
 import org.apache.calcite.sql.SqlCall;
 import org.apache.calcite.sql.SqlCallBinding;
@@ -51,8 +52,8 @@ import java.util.stream.Collectors;
  */
 public class TypeCoercionImpl extends AbstractTypeCoercion {
 
-  public TypeCoercionImpl(SqlValidator validator) {
-    super(validator);
+  public TypeCoercionImpl(RelDataTypeFactory typeFactory, SqlValidator 
validator) {
+    super(typeFactory, validator);
   }
 
   /**
diff --git 
a/core/src/main/java/org/apache/calcite/sql/validate/implicit/TypeCoercions.java
 
b/core/src/main/java/org/apache/calcite/sql/validate/implicit/TypeCoercions.java
index 6de4b2e..c128764 100644
--- 
a/core/src/main/java/org/apache/calcite/sql/validate/implicit/TypeCoercions.java
+++ 
b/core/src/main/java/org/apache/calcite/sql/validate/implicit/TypeCoercions.java
@@ -16,7 +16,7 @@
  */
 package org.apache.calcite.sql.validate.implicit;
 
-import org.apache.calcite.sql.validate.SqlConformance;
+import org.apache.calcite.rel.type.RelDataTypeFactory;
 import org.apache.calcite.sql.validate.SqlValidator;
 
 /**
@@ -25,9 +25,9 @@ import org.apache.calcite.sql.validate.SqlValidator;
 public class TypeCoercions {
   private TypeCoercions() {}
 
-  // All the SqlConformance would have default TypeCoercion instance.
-  public static TypeCoercion getTypeCoercion(SqlValidator validator,
-      SqlConformance conformance) {
-    return new TypeCoercionImpl(validator);
+  /** Creates a default type coercion instance. */
+  public static TypeCoercion createTypeCoercion(RelDataTypeFactory typeFactory,
+      SqlValidator validator) {
+    return new TypeCoercionImpl(typeFactory, validator);
   }
 }

Reply via email to