From f6a5b60b7a27524c55a651b78adc813a92300b76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=ED=98=95=EC=A4=80?= Date: Fri, 18 Jul 2014 13:32:44 +0900 Subject: [PATCH] TAJO-956: CONCAT should be support multiple params and null param. --- .../tajo/engine/function/string/Concat.java | 16 ++++-------- .../engine/function/string/Concat_ws.java | 25 +++++++++++-------- .../TestStringOperatorsAndFunctions.java | 6 +++++ 3 files changed, 25 insertions(+), 22 deletions(-) diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Concat.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Concat.java index 56b07eb15a..50b14401d4 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Concat.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Concat.java @@ -18,7 +18,6 @@ package org.apache.tajo.engine.function.string; -import com.google.gson.annotations.Expose; import org.apache.tajo.catalog.Column; import org.apache.tajo.common.TajoDataTypes; import org.apache.tajo.datum.Datum; @@ -42,12 +41,10 @@ example = "> SELECT concat('abcde', '2');\n" + "abcde2", returnType = TajoDataTypes.Type.TEXT, - paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT, TajoDataTypes.Type.TEXT}) - } + paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT, TajoDataTypes.Type.TEXT_ARRAY}) + } ) public class Concat extends GeneralFunction { - @Expose private boolean hasMoreCharacters; - public Concat() { super(new Column[] { new Column("text", TajoDataTypes.Type.TEXT), @@ -56,13 +53,10 @@ public Concat() { @Override public Datum eval(Tuple params) { - Datum datum = params.get(0); - - if(datum instanceof NullDatum) return NullDatum.get(); - - StringBuilder result = new StringBuilder(datum.asChars()); + StringBuilder result = new StringBuilder(); - for(int i = 1 ; i < params.size() ; i++) { + int paramSize = params.size(); + for(int i = 0 ; i < paramSize; i++) { Datum tmpDatum = params.get(i); if(tmpDatum instanceof NullDatum) continue; diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Concat_ws.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Concat_ws.java index dd48151ccb..d8e2113c28 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Concat_ws.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Concat_ws.java @@ -24,6 +24,7 @@ import org.apache.tajo.datum.Datum; import org.apache.tajo.datum.DatumFactory; import org.apache.tajo.datum.NullDatum; +import org.apache.tajo.datum.TextDatum; import org.apache.tajo.engine.function.GeneralFunction; import org.apache.tajo.engine.function.annotation.Description; import org.apache.tajo.engine.function.annotation.ParamTypes; @@ -32,7 +33,7 @@ /** * Function definition * - * text concat(str "any" [, str "any" [, ...] ]) + * text concat_ws(sep text, str "any" [, str "any" [, ...] ]) */ @Description( functionName = "concat_ws", @@ -41,7 +42,7 @@ example = "> concat_ws(',', 'abcde', 2);\n" + "abcde,2", returnType = TajoDataTypes.Type.TEXT, - paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT, TajoDataTypes.Type.TEXT, TajoDataTypes.Type.TEXT})} + paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT, TajoDataTypes.Type.TEXT, TajoDataTypes.Type.TEXT_ARRAY})} ) public class Concat_ws extends GeneralFunction { @Expose private boolean hasMoreCharacters; @@ -57,21 +58,23 @@ public Concat_ws() { @Override public Datum eval(Tuple params) { Datum sepDatum = params.get(0); - Datum datum = params.get(1); - - if(datum instanceof NullDatum) return NullDatum.get(); if(sepDatum instanceof NullDatum) return NullDatum.get(); - StringBuilder result = new StringBuilder(datum.asChars()); + String seperator = ((TextDatum)sepDatum).asChars(); + String opSperator = ""; + StringBuilder result = new StringBuilder(); - for(int i = 2 ; i < params.size() ; i++) { - Datum tmpDatum = params.get(i); - if(tmpDatum instanceof NullDatum) + int paramSize = params.size(); + for(int i = 1; i < paramSize; i++) { + Datum datum = params.get(i); + if(datum instanceof NullDatum) { continue; - result.append(sepDatum.asChars()); - result.append(tmpDatum.asChars()); + } else { + result.append(opSperator).append(datum.asChars()); + } + opSperator = seperator; } return DatumFactory.createText(result.toString()); } diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/function/TestStringOperatorsAndFunctions.java b/tajo-core/src/test/java/org/apache/tajo/engine/function/TestStringOperatorsAndFunctions.java index fa13011e43..7f402a13bc 100644 --- a/tajo-core/src/test/java/org/apache/tajo/engine/function/TestStringOperatorsAndFunctions.java +++ b/tajo-core/src/test/java/org/apache/tajo/engine/function/TestStringOperatorsAndFunctions.java @@ -600,11 +600,17 @@ public void testFindInSet() throws IOException { public void testConcat() throws IOException { testSimpleEval("select concat('333', '22') ", new String[]{"33322"}); testSimpleEval("select concat('한글', '22') ", new String[]{"한글22"}); + testSimpleEval("select concat(null, '22') ", new String[]{"22"}); + testSimpleEval("select concat('22',null) ", new String[]{"22"}); + testSimpleEval("select concat('22',null, '33', null, '44') ", new String[]{"223344"}); } @Test public void testConcat_ws() throws IOException { testSimpleEval("select concat_ws(',', '333', '22') ", new String[]{"333,22"}); testSimpleEval("select concat_ws(',', '한글', '22') ", new String[]{"한글,22"}); + testSimpleEval("select concat_ws(',', '22', null) ", new String[]{"22"}); + testSimpleEval("select concat_ws(',', '22', '33', '33') ", new String[]{"22,33,33"}); + testSimpleEval("select concat_ws(',', null, '22') ", new String[]{"22"}); } }