Repository: kylin
Updated Branches:
  refs/heads/2.x-staging 7561d80c9 -> 2997fdef1


KYLIN-976 minor refactor on function validation, ignore_unknown_function


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

Branch: refs/heads/2.x-staging
Commit: 2997fdef19ec8e1633fb6ded348967b49dd7f185
Parents: 7561d80
Author: Yang Li <liy...@apache.org>
Authored: Sat Dec 5 07:23:44 2015 +0800
Committer: Yang Li <liy...@apache.org>
Committed: Sat Dec 5 07:23:52 2015 +0800

----------------------------------------------------------------------
 .../org/apache/kylin/common/KylinConfig.java    | 17 +++++++----
 .../model/validation/rule/FunctionRule.java     | 30 ++++----------------
 .../rule/IKylinValidationConstants.java         |  1 -
 .../kylin/measure/basic/BasicMeasureType.java   | 26 +++++++++++++----
 4 files changed, 38 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kylin/blob/2997fdef/core-common/src/main/java/org/apache/kylin/common/KylinConfig.java
----------------------------------------------------------------------
diff --git a/core-common/src/main/java/org/apache/kylin/common/KylinConfig.java 
b/core-common/src/main/java/org/apache/kylin/common/KylinConfig.java
index a4b2b1a..49715e1 100644
--- a/core-common/src/main/java/org/apache/kylin/common/KylinConfig.java
+++ b/core-common/src/main/java/org/apache/kylin/common/KylinConfig.java
@@ -29,7 +29,10 @@ import java.io.InputStream;
 import java.io.PrintWriter;
 import java.io.Serializable;
 import java.io.StringWriter;
-import java.util.*;
+import java.util.Enumeration;
+import java.util.Map;
+import java.util.Properties;
+import java.util.SortedSet;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -308,7 +311,7 @@ public class KylinConfig implements Serializable {
     public String getHBaseClusterFs() {
         return getOptional(KYLIN_HBASE_CLUSTER_FS, "");
     }
-    
+
     public String[] getMeasureTypeFactories() {
         return getOptionalStringArray("kylin.measure.type.factories", new 
String[0]);
     }
@@ -514,6 +517,10 @@ public class KylinConfig implements Serializable {
         return 
Boolean.parseBoolean(this.getOptional("kylin.query.cache.enabled", "true"));
     }
 
+    public boolean isQueryIgnoreUnknownFunction() {
+        return 
Boolean.parseBoolean(this.getOptional("kylin.query.ignore_unknown_function", 
"false"));
+    }
+
     public int getHBaseKeyValueSize() {
         return 
Integer.parseInt(this.getOptional("kylin.hbase.client.keyvalue.maxsize", 
"10485760"));
     }
@@ -743,9 +750,9 @@ public class KylinConfig implements Serializable {
     }
 
     private void list(PrintWriter out) {
-        for (Enumeration e = properties.keys() ; e.hasMoreElements() ;) {
-            String key = (String)e.nextElement();
-            String val = (String)properties.get(key);
+        for (Enumeration<?> e = properties.keys(); e.hasMoreElements();) {
+            String key = (String) e.nextElement();
+            String val = (String) properties.get(key);
             out.println(key + "=" + val);
         }
     }

http://git-wip-us.apache.org/repos/asf/kylin/blob/2997fdef/core-cube/src/main/java/org/apache/kylin/cube/model/validation/rule/FunctionRule.java
----------------------------------------------------------------------
diff --git 
a/core-cube/src/main/java/org/apache/kylin/cube/model/validation/rule/FunctionRule.java
 
b/core-cube/src/main/java/org/apache/kylin/cube/model/validation/rule/FunctionRule.java
index 5a3202d..261c125 100644
--- 
a/core-cube/src/main/java/org/apache/kylin/cube/model/validation/rule/FunctionRule.java
+++ 
b/core-cube/src/main/java/org/apache/kylin/cube/model/validation/rule/FunctionRule.java
@@ -25,13 +25,11 @@ import java.util.List;
 import java.util.Set;
 
 import org.apache.commons.lang.StringUtils;
-import org.apache.kylin.common.KylinConfig;
 import org.apache.kylin.cube.model.CubeDesc;
 import org.apache.kylin.cube.model.validation.IValidatorRule;
 import org.apache.kylin.cube.model.validation.ResultLevel;
 import org.apache.kylin.cube.model.validation.ValidateContext;
 import org.apache.kylin.metadata.MetadataManager;
-import org.apache.kylin.metadata.datatype.DataType;
 import org.apache.kylin.metadata.model.ColumnDesc;
 import org.apache.kylin.metadata.model.FunctionDesc;
 import org.apache.kylin.metadata.model.MeasureDesc;
@@ -94,7 +92,12 @@ public class FunctionRule implements 
IValidatorRule<CubeDesc> {
             } else if 
(StringUtils.equals(FunctionDesc.PARAMETER_TYPE_CONSTANT, type)) {
                 validateCostantParameter(context, cube, value);
             }
-            validateReturnType(context, cube, func);
+
+            try {
+                func.getMeasureType().validate(func);
+            } catch (IllegalArgumentException ex) {
+                context.addResult(ResultLevel.ERROR, ex.getMessage());
+            }
 
             if (func.isCount())
                 countFuncs.add(func);
@@ -105,27 +108,6 @@ public class FunctionRule implements 
IValidatorRule<CubeDesc> {
         }
     }
 
-    private void validateReturnType(ValidateContext context, CubeDesc cube, 
FunctionDesc funcDesc) {
-
-        String func = funcDesc.getExpression();
-        DataType rtype = funcDesc.getReturnDataType();
-
-        if (funcDesc.isCount()) {
-            if (rtype.isIntegerFamily() == false) {
-                context.addResult(ResultLevel.ERROR, "Return type for function 
" + func + " must be one of " + DataType.INTEGER_FAMILY);
-            }
-        } else if (funcDesc.isMax() || funcDesc.isMin() || funcDesc.isSum()) {
-            if (rtype.isNumberFamily() == false) {
-                context.addResult(ResultLevel.ERROR, "Return type for function 
" + func + " must be one of " + DataType.NUMBER_FAMILY);
-            }
-        } else {
-            if 
(StringUtils.equalsIgnoreCase(KylinConfig.getInstanceFromEnv().getProperty(KEY_IGNORE_UNKNOWN_FUNC,
 "false"), "false")) {
-                context.addResult(ResultLevel.ERROR, "Unrecognized function: 
[" + func + "]");
-            }
-        }
-
-    }
-
     /**
      * @param context
      * @param cube

http://git-wip-us.apache.org/repos/asf/kylin/blob/2997fdef/core-cube/src/main/java/org/apache/kylin/cube/model/validation/rule/IKylinValidationConstants.java
----------------------------------------------------------------------
diff --git 
a/core-cube/src/main/java/org/apache/kylin/cube/model/validation/rule/IKylinValidationConstants.java
 
b/core-cube/src/main/java/org/apache/kylin/cube/model/validation/rule/IKylinValidationConstants.java
index 80d4676..d0a07de 100644
--- 
a/core-cube/src/main/java/org/apache/kylin/cube/model/validation/rule/IKylinValidationConstants.java
+++ 
b/core-cube/src/main/java/org/apache/kylin/cube/model/validation/rule/IKylinValidationConstants.java
@@ -24,6 +24,5 @@ public interface IKylinValidationConstants extends 
MetadataConstants {
 
     public static final int DEFAULT_MAX_AGR_GROUP_SIZE = 12;
     public static final String KEY_MAX_AGR_GROUP_SIZE = 
"rule_max.arggregation.group.size";
-    public static final String KEY_IGNORE_UNKNOWN_FUNC = 
"rule_ignore_unknown_func";
 
 }

http://git-wip-us.apache.org/repos/asf/kylin/blob/2997fdef/core-metadata/src/main/java/org/apache/kylin/measure/basic/BasicMeasureType.java
----------------------------------------------------------------------
diff --git 
a/core-metadata/src/main/java/org/apache/kylin/measure/basic/BasicMeasureType.java
 
b/core-metadata/src/main/java/org/apache/kylin/measure/basic/BasicMeasureType.java
index bc9e6b1..46e49cf 100644
--- 
a/core-metadata/src/main/java/org/apache/kylin/measure/basic/BasicMeasureType.java
+++ 
b/core-metadata/src/main/java/org/apache/kylin/measure/basic/BasicMeasureType.java
@@ -18,6 +18,7 @@
 
 package org.apache.kylin.measure.basic;
 
+import org.apache.kylin.common.KylinConfig;
 import org.apache.kylin.measure.MeasureAggregator;
 import org.apache.kylin.measure.MeasureIngester;
 import org.apache.kylin.measure.MeasureType;
@@ -66,11 +67,25 @@ public class BasicMeasureType extends MeasureType {
     }
 
     private void validate(String funcName, DataType dataType) throws 
IllegalArgumentException {
-        if ((funcName.equals(FunctionDesc.FUNC_SUM) //
-                || funcName.equals(FunctionDesc.FUNC_COUNT) //
-                || funcName.equals(FunctionDesc.FUNC_MAX) //
-                || funcName.equals(FunctionDesc.FUNC_MIN)) == false)
-            throw new IllegalArgumentException();
+        DataType rtype = dataType;
+
+        if (funcName.equals(FunctionDesc.FUNC_SUM)) {
+            if (rtype.isNumberFamily() == false) {
+                throw new IllegalArgumentException("Return type for function " 
+ funcName + " must be one of " + DataType.NUMBER_FAMILY);
+            }
+        } else if (funcName.equals(FunctionDesc.FUNC_COUNT)) {
+            if (rtype.isIntegerFamily() == false) {
+                throw new IllegalArgumentException("Return type for function " 
+ funcName + " must be one of " + DataType.INTEGER_FAMILY);
+            }
+        } else if (funcName.equals(FunctionDesc.FUNC_MAX) || 
funcName.equals(FunctionDesc.FUNC_MIN)) {
+            if (rtype.isNumberFamily() == false) {
+                throw new IllegalArgumentException("Return type for function " 
+ funcName + " must be one of " + DataType.NUMBER_FAMILY);
+            }
+        } else {
+            KylinConfig config = KylinConfig.getInstanceFromEnv();
+            if (config.isQueryIgnoreUnknownFunction() == false)
+                throw new IllegalArgumentException("Unrecognized function: [" 
+ funcName + "]");
+        }
     }
     
     @Override
@@ -135,7 +150,6 @@ public class BasicMeasureType extends MeasureType {
 
     @Override
     public Class<?> getRewriteCalciteAggrFunctionClass() {
-        // TODO Auto-generated method stub
         return null;
     }
 

Reply via email to