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; }