You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by sh...@apache.org on 2018/08/02 03:38:40 UTC

[kylin] branch master updated: KYLIN-3475 Make calcite connection is more configurable.

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

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


The following commit(s) were added to refs/heads/master by this push:
     new bccfb7f  KYLIN-3475 Make calcite connection is more configurable.
bccfb7f is described below

commit bccfb7f0010b29054b0d301da818c406ab5ff601
Author: hujixu <hu...@youzan.com>
AuthorDate: Mon Jul 30 16:14:42 2018 +0800

    KYLIN-3475 Make calcite connection is more configurable.
---
 .../org/apache/kylin/common/KylinConfigBase.java   | 10 +++
 .../src/main/resources/kylin-defaults.properties   | 12 ++++
 .../org/apache/kylin/common/KylinConfigTest.java   | 17 +++++
 .../org/apache/kylin/query/QueryConnection.java    |  1 +
 .../apache/kylin/query/QueryConnectionTest.java    | 77 ++++++++++++++++++++++
 5 files changed, 117 insertions(+)

diff --git a/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java b/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
index 43e7d62..4833ca9 100644
--- a/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
+++ b/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
@@ -1240,6 +1240,16 @@ abstract public class KylinConfigBase implements Serializable {
     }
 
     /**
+     * Extras calcite properties to config Calcite connection
+     */
+    public Properties getCalciteExtrasProperties() {
+        Properties properties = new Properties();
+        Map<String, String> map = getPropertiesByPrefix("kylin.query.calcite.extras-props.");
+        properties.putAll(map);
+        return properties;
+    }
+
+    /**
      * Rule is usually singleton as static field, the configuration of this property is like:
      * RuleClassName1#FieldName1,RuleClassName2#FieldName2,...
      */
diff --git a/core-common/src/main/resources/kylin-defaults.properties b/core-common/src/main/resources/kylin-defaults.properties
index c01d3a8..23c0730 100644
--- a/core-common/src/main/resources/kylin-defaults.properties
+++ b/core-common/src/main/resources/kylin-defaults.properties
@@ -225,6 +225,18 @@ kylin.query.max-scan-bytes=0
 
 kylin.query.cache-enabled=true
 
+# Controls extras properties for Calcite jdbc driver
+# all extras properties should undder prefix "kylin.query.calcite.extras-props."
+# case sensitive, default: true, to enable case insensitive set it to false
+# @see org.apache.calcite.config.CalciteConnectionProperty.CASE_SENSITIVE
+kylin.query.calcite.extras-props.caseSensitive=true
+# how to handle unquoted identity, defualt: TO_UPPER, available options: UNCHANGED, TO_UPPER, TO_LOWER
+# @see org.apache.calcite.config.CalciteConnectionProperty.UNQUOTED_CASING
+kylin.query.calcite.extras-props.unquotedCasing=TO_UPPER
+# quoting method, default: DOUBLE_QUOTE, available options: DOUBLE_QUOTE, BACK_TICK, BRACKET
+# @see org.apache.calcite.config.CalciteConnectionProperty.QUOTING
+kylin.query.calcite.extras-props.quoting=DOUBLE_QUOTE
+
 # TABLE ACL
 kylin.query.security.table-acl-enabled=true
 
diff --git a/core-common/src/test/java/org/apache/kylin/common/KylinConfigTest.java b/core-common/src/test/java/org/apache/kylin/common/KylinConfigTest.java
index 811c574..c9939e7 100644
--- a/core-common/src/test/java/org/apache/kylin/common/KylinConfigTest.java
+++ b/core-common/src/test/java/org/apache/kylin/common/KylinConfigTest.java
@@ -146,4 +146,21 @@ public class KylinConfigTest extends HotLoadKylinPropertiesTestCase {
         String s = override.get("test2");
         assertEquals("test2", s);
     }
+
+    @Test
+    public void testCalciteExtrasProperties() {
+        KylinConfig conf = KylinConfig.getInstanceFromEnv();
+        Properties extras = conf.getCalciteExtrasProperties();
+        assertEquals("true", extras.getProperty("caseSensitive"));
+        assertEquals("TO_UPPER", extras.getProperty("unquotedCasing"));
+        assertEquals("DOUBLE_QUOTE", extras.getProperty("quoting"));
+
+        conf.setProperty("kylin.query.calcite.extras-props.caseSensitive", "false");
+        conf.setProperty("kylin.query.calcite.extras-props.unquotedCasing", "UNCHANGED");
+        conf.setProperty("kylin.query.calcite.extras-props.quoting", "BRACKET");
+        extras = conf.getCalciteExtrasProperties();
+        assertEquals("false", extras.getProperty("caseSensitive"));
+        assertEquals("UNCHANGED", extras.getProperty("unquotedCasing"));
+        assertEquals("BRACKET", extras.getProperty("quoting"));
+    }
 }
diff --git a/query/src/main/java/org/apache/kylin/query/QueryConnection.java b/query/src/main/java/org/apache/kylin/query/QueryConnection.java
index ed90654..b2db178 100644
--- a/query/src/main/java/org/apache/kylin/query/QueryConnection.java
+++ b/query/src/main/java/org/apache/kylin/query/QueryConnection.java
@@ -46,6 +46,7 @@ public class QueryConnection {
         }
         File olapTmp = OLAPSchemaFactory.createTempOLAPJson(project, KylinConfig.getInstanceFromEnv());
         Properties info = new Properties();
+        info.putAll(KylinConfig.getInstanceFromEnv().getCalciteExtrasProperties());
         info.put("model", olapTmp.getAbsolutePath());
         info.put("typeSystem", "org.apache.kylin.query.calcite.KylinRelDataTypeSystem");
         return DriverManager.getConnection("jdbc:calcite:", info);
diff --git a/query/src/test/java/org/apache/kylin/query/QueryConnectionTest.java b/query/src/test/java/org/apache/kylin/query/QueryConnectionTest.java
new file mode 100644
index 0000000..e0bdf22
--- /dev/null
+++ b/query/src/test/java/org/apache/kylin/query/QueryConnectionTest.java
@@ -0,0 +1,77 @@
+/*
+ * 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.kylin.query;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Map;
+
+import org.apache.calcite.avatica.InternalProperty;
+import org.apache.calcite.avatica.util.Casing;
+import org.apache.calcite.avatica.util.Quoting;
+import org.apache.calcite.jdbc.CalciteConnection;
+import org.apache.commons.lang3.reflect.FieldUtils;
+import org.apache.kylin.common.HotLoadKylinPropertiesTestCase;
+import org.apache.kylin.common.KylinConfig;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+public class QueryConnectionTest extends HotLoadKylinPropertiesTestCase {
+
+    private static final String SQL_WITH_MIXED_CASE = "select 1 as value_ALIAS";
+
+    @Test
+    public void testGetConnection() throws SQLException, IllegalAccessException {
+        Connection connection = QueryConnection.getConnection("default");
+        assertNotNull(connection);
+        Map<InternalProperty, Object> properties = dirtyReadProperties(connection);
+        assertEquals(true, properties.get(InternalProperty.CASE_SENSITIVE));
+        assertEquals(Casing.TO_UPPER, properties.get(InternalProperty.UNQUOTED_CASING));
+        assertEquals(Quoting.DOUBLE_QUOTE, properties.get(InternalProperty.QUOTING));
+
+        ResultSet resultSet = connection.prepareStatement(SQL_WITH_MIXED_CASE).executeQuery();
+        String columnName = resultSet.getMetaData().getColumnName(1);
+        assertEquals("VALUE_ALIAS", columnName);
+
+        // override connection properties
+        KylinConfig conf = KylinConfig.getInstanceFromEnv();
+        conf.setProperty("kylin.query.calcite.extras-props.caseSensitive", "false");
+        conf.setProperty("kylin.query.calcite.extras-props.unquotedCasing", "UNCHANGED");
+        conf.setProperty("kylin.query.calcite.extras-props.quoting", "BRACKET");
+        Connection conn2 = QueryConnection.getConnection("default");
+        Map<InternalProperty, Object> props = dirtyReadProperties(conn2);
+        assertEquals(false, props.get(InternalProperty.CASE_SENSITIVE));
+        assertEquals(Casing.UNCHANGED, props.get(InternalProperty.UNQUOTED_CASING));
+        assertEquals(Quoting.BRACKET, props.get(InternalProperty.QUOTING));
+
+        ResultSet resultSet1 = conn2.prepareStatement(SQL_WITH_MIXED_CASE).executeQuery();
+        assertEquals("value_ALIAS", resultSet1.getMetaData().getColumnName(1));
+    }
+
+    @SuppressWarnings("unchecked")
+    private static Map<InternalProperty, Object> dirtyReadProperties(Connection connection) throws IllegalAccessException {
+        assertTrue(connection instanceof CalciteConnection);
+        return (Map<InternalProperty, Object>) FieldUtils.readField(connection, "properties");
+
+    }
+}