minor, push down operator ||
Project: http://git-wip-us.apache.org/repos/asf/kylin/repo Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/0eeceeff Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/0eeceeff Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/0eeceeff Branch: refs/heads/master Commit: 0eeceeff43ff64bcd4baa1bc214e1288d7716f9e Parents: 401bb0a Author: Cheng Wang <[email protected]> Authored: Thu Jun 22 20:30:09 2017 +0800 Committer: Hongbin Ma <[email protected]> Committed: Thu Jun 22 20:56:24 2017 +0800 ---------------------------------------------------------------------- .../filter/BuiltInFunctionTupleFilter.java | 21 +++++++++++++++----- .../metadata/filter/function/BuiltInMethod.java | 11 +++++++++- 2 files changed, 26 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/kylin/blob/0eeceeff/core-metadata/src/main/java/org/apache/kylin/metadata/filter/BuiltInFunctionTupleFilter.java ---------------------------------------------------------------------- diff --git a/core-metadata/src/main/java/org/apache/kylin/metadata/filter/BuiltInFunctionTupleFilter.java b/core-metadata/src/main/java/org/apache/kylin/metadata/filter/BuiltInFunctionTupleFilter.java index 767d868..aa9cd3d 100755 --- a/core-metadata/src/main/java/org/apache/kylin/metadata/filter/BuiltInFunctionTupleFilter.java +++ b/core-metadata/src/main/java/org/apache/kylin/metadata/filter/BuiltInFunctionTupleFilter.java @@ -24,6 +24,7 @@ import java.lang.reflect.Method; import java.nio.ByteBuffer; import java.util.Collection; import java.util.List; +import java.util.Map; import org.apache.kylin.common.util.BytesUtil; import org.apache.kylin.metadata.filter.function.BuiltInMethod; @@ -33,6 +34,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import com.google.common.primitives.Primitives; public class BuiltInFunctionTupleFilter extends FunctionTupleFilter { @@ -49,12 +51,18 @@ public class BuiltInFunctionTupleFilter extends FunctionTupleFilter { protected boolean isValidFunc = false; protected boolean isReversed = false; + final static Map<String, String> converters = Maps.newHashMap(); + static { + converters.put("||", "CONCAT"); + } + public BuiltInFunctionTupleFilter(String name) { this(name, null); } public BuiltInFunctionTupleFilter(String name, FilterOperatorEnum filterOperatorEnum) { - super(Lists.<TupleFilter> newArrayList(), filterOperatorEnum == null ? FilterOperatorEnum.FUNCTION : filterOperatorEnum); + super(Lists.<TupleFilter> newArrayList(), + filterOperatorEnum == null ? FilterOperatorEnum.FUNCTION : filterOperatorEnum); this.methodParams = Lists.newArrayList(); if (name != null) { @@ -91,7 +99,8 @@ public class BuiltInFunctionTupleFilter extends FunctionTupleFilter { if (columnContainerFilter instanceof ColumnTupleFilter) methodParams.set(colPosition, (Serializable) input); else if (columnContainerFilter instanceof BuiltInFunctionTupleFilter) - methodParams.set(colPosition, (Serializable) ((BuiltInFunctionTupleFilter) columnContainerFilter).invokeFunction(input)); + methodParams.set(colPosition, + (Serializable) ((BuiltInFunctionTupleFilter) columnContainerFilter).invokeFunction(input)); return method.invoke(null, (Object[]) (methodParams.toArray())); } @@ -128,7 +137,8 @@ public class BuiltInFunctionTupleFilter extends FunctionTupleFilter { if (!Primitives.isWrapperType(clazz)) methodParams.add(constVal); else - methodParams.add((Serializable) clazz.cast(clazz.getDeclaredMethod("valueOf", String.class).invoke(null, constVal))); + methodParams.add((Serializable) clazz + .cast(clazz.getDeclaredMethod("valueOf", String.class).invoke(null, constVal))); } catch (Exception e) { logger.warn("Reflection failed for methodParams. ", e); isValidFunc = false; @@ -186,8 +196,9 @@ public class BuiltInFunctionTupleFilter extends FunctionTupleFilter { } protected void initMethod() { - if (BuiltInMethod.MAP.containsKey(name)) { - this.method = BuiltInMethod.MAP.get(name).method; + String operator = BuiltInMethod.MAP.containsKey(name) ? name : converters.get(name); + if (operator != null) { + this.method = BuiltInMethod.MAP.get(operator).method; isValidFunc = true; } } http://git-wip-us.apache.org/repos/asf/kylin/blob/0eeceeff/core-metadata/src/main/java/org/apache/kylin/metadata/filter/function/BuiltInMethod.java ---------------------------------------------------------------------- diff --git a/core-metadata/src/main/java/org/apache/kylin/metadata/filter/function/BuiltInMethod.java b/core-metadata/src/main/java/org/apache/kylin/metadata/filter/function/BuiltInMethod.java index 31ee297..e156174 100644 --- a/core-metadata/src/main/java/org/apache/kylin/metadata/filter/function/BuiltInMethod.java +++ b/core-metadata/src/main/java/org/apache/kylin/metadata/filter/function/BuiltInMethod.java @@ -29,7 +29,7 @@ import org.apache.commons.lang3.reflect.MethodUtils; import com.google.common.collect.ImmutableMap; public enum BuiltInMethod { - UPPER(BuiltInMethod.class, "upper", String.class), LOWER(BuiltInMethod.class, "lower", String.class), SUBSTRING(BuiltInMethod.class, "substring", String.class, int.class, int.class), CHAR_LENGTH(BuiltInMethod.class, "charLength", String.class), LIKE(BuiltInMethod.class, "like", String.class, String.class), INITCAP(BuiltInMethod.class, "initcap", String.class); + UPPER(BuiltInMethod.class, "upper", String.class), LOWER(BuiltInMethod.class, "lower", String.class), SUBSTRING(BuiltInMethod.class, "substring", String.class, int.class, int.class), CHAR_LENGTH(BuiltInMethod.class, "charLength", String.class), LIKE(BuiltInMethod.class, "like", String.class, String.class), INITCAP(BuiltInMethod.class, "initcap", String.class), CONCAT(BuiltInMethod.class, "concat", String.class, String.class); public final Method method; public static final ImmutableMap<String, BuiltInMethod> MAP; @@ -140,4 +140,13 @@ public enum BuiltInMethod { return s.toLowerCase(); } + /** SQL left || right */ + public static String concat(String left, String right) { + if (left == null) + return right; + if (right == null) + return left; + return left.concat(right); + } + }
