You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by li...@apache.org on 2018/02/04 00:51:23 UTC

[20/50] [abbrv] kylin git commit: Update decimal's max precision to 38, be aligned with Hive

Update decimal's max precision to 38, be aligned with Hive

(cherry picked from commit 30e09d8c8198ed074658d2664676a5243a0690dc)


Project: http://git-wip-us.apache.org/repos/asf/kylin/repo
Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/543124da
Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/543124da
Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/543124da

Branch: refs/heads/sync
Commit: 543124dab1ec1e6f23ea8cc63c97abc89a1eae0d
Parents: 59d5064
Author: Yifan Zhang <ev...@gmail.com>
Authored: Thu Jan 18 23:44:25 2018 +0800
Committer: Li Yang <li...@apache.org>
Committed: Fri Jan 26 22:54:58 2018 +0800

----------------------------------------------------------------------
 .../query/calcite/KylinRelDataTypeSystem.java   | 11 +++
 .../calcite/KylinRelDataTypeSystemTest.java     | 78 ++++++++++++++++++++
 2 files changed, 89 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kylin/blob/543124da/query/src/main/java/org/apache/kylin/query/calcite/KylinRelDataTypeSystem.java
----------------------------------------------------------------------
diff --git a/query/src/main/java/org/apache/kylin/query/calcite/KylinRelDataTypeSystem.java b/query/src/main/java/org/apache/kylin/query/calcite/KylinRelDataTypeSystem.java
index 060747a..35b4c3d 100644
--- a/query/src/main/java/org/apache/kylin/query/calcite/KylinRelDataTypeSystem.java
+++ b/query/src/main/java/org/apache/kylin/query/calcite/KylinRelDataTypeSystem.java
@@ -45,4 +45,15 @@ public class KylinRelDataTypeSystem extends RelDataTypeSystemImpl {
         }
         return argumentType;
     }
+
+    /**
+     * Hive support decimal with 38 digits, kylin should align
+     * 
+     * @see org.apache.calcite.rel.type.RelDataTypeSystem
+     * @see <a href="https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-DecimalsdecimalDecimals">Hive/LanguageManualTypes-Decimals</a>
+     */
+    @Override
+    public int getMaxNumericPrecision() {
+        return 38;
+    }
 }

http://git-wip-us.apache.org/repos/asf/kylin/blob/543124da/query/src/test/java/org/apache/kylin/query/calcite/KylinRelDataTypeSystemTest.java
----------------------------------------------------------------------
diff --git a/query/src/test/java/org/apache/kylin/query/calcite/KylinRelDataTypeSystemTest.java b/query/src/test/java/org/apache/kylin/query/calcite/KylinRelDataTypeSystemTest.java
new file mode 100644
index 0000000..e9ef548
--- /dev/null
+++ b/query/src/test/java/org/apache/kylin/query/calcite/KylinRelDataTypeSystemTest.java
@@ -0,0 +1,78 @@
+/*
+ * 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.calcite;
+
+import org.apache.calcite.rel.type.RelDataType;
+import org.apache.calcite.rel.type.RelDataTypeFactory;
+import org.apache.calcite.rel.type.RelDataTypeSystem;
+import org.apache.calcite.sql.type.BasicSqlType;
+import org.apache.calcite.sql.type.SqlTypeFactoryImpl;
+import org.apache.calcite.sql.type.SqlTypeName;
+import org.apache.kylin.common.util.LocalFileMetadataTestCase;
+import org.apache.kylin.metadata.datatype.DataType;
+import org.apache.kylin.query.schema.OLAPTable;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class KylinRelDataTypeSystemTest extends LocalFileMetadataTestCase {
+    
+    @Before
+    public void setUp() throws Exception {
+        this.createTestMetadata();
+    }
+
+    @After
+    public void after() throws Exception {
+        this.cleanupTestMetadata();
+    }
+
+    @Test
+    public void testLegalDecimalType() {
+        RelDataTypeSystem typeSystem = new KylinRelDataTypeSystem();
+        RelDataTypeFactory typeFactory = new SqlTypeFactoryImpl(typeSystem);
+        
+        DataType dataType = DataType.getType("decimal(30, 10)");
+        RelDataType relDataType = OLAPTable.createSqlType(typeFactory, dataType, true);
+        
+        Assert.assertTrue(relDataType instanceof BasicSqlType);
+        Assert.assertEquals(relDataType.getSqlTypeName(), SqlTypeName.DECIMAL);
+        Assert.assertEquals(relDataType.getPrecision(), 30);
+        Assert.assertTrue(relDataType.getPrecision() <= typeSystem.getMaxNumericPrecision());
+        Assert.assertEquals(relDataType.getScale(), 10);
+        Assert.assertTrue(relDataType.getScale() <= typeSystem.getMaxNumericScale());
+    }
+
+    @Test
+    public void testIllegalDecimalType() {
+        RelDataTypeSystem typeSystem = new KylinRelDataTypeSystem();
+        RelDataTypeFactory typeFactory = new SqlTypeFactoryImpl(typeSystem);
+        
+        DataType dataType = DataType.getType("decimal(40, 10)");
+        RelDataType relDataType = OLAPTable.createSqlType(typeFactory, dataType, true);
+        
+        Assert.assertTrue(relDataType instanceof BasicSqlType);
+        Assert.assertEquals(relDataType.getSqlTypeName(), SqlTypeName.DECIMAL);
+        Assert.assertTrue(typeSystem.getMaxNumericPrecision() < 40);
+        Assert.assertEquals(relDataType.getPrecision(), typeSystem.getMaxNumericPrecision());
+        Assert.assertEquals(relDataType.getScale(), 10);
+        Assert.assertTrue(relDataType.getScale() <= typeSystem.getMaxNumericScale());
+    }
+}