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");
+
+ }
+}