Repository: tajo Updated Branches: refs/heads/master 4e6d3cbab -> 53f7ffa54
TAJO-378: Implement concat_ws function. (Seungun Choe via jaehwa) Project: http://git-wip-us.apache.org/repos/asf/tajo/repo Commit: http://git-wip-us.apache.org/repos/asf/tajo/commit/53f7ffa5 Tree: http://git-wip-us.apache.org/repos/asf/tajo/tree/53f7ffa5 Diff: http://git-wip-us.apache.org/repos/asf/tajo/diff/53f7ffa5 Branch: refs/heads/master Commit: 53f7ffa54913c2d2bf6dd55f2568620d7672dd81 Parents: 4e6d3cb Author: blrunner <[email protected]> Authored: Fri Mar 28 15:54:40 2014 +0900 Committer: blrunner <[email protected]> Committed: Fri Mar 28 15:54:40 2014 +0900 ---------------------------------------------------------------------- CHANGES.txt | 2 + .../tajo/engine/function/string/Concat_ws.java | 81 ++++++++++++++++++++ .../TestStringOperatorsAndFunctions.java | 6 ++ 3 files changed, 89 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tajo/blob/53f7ffa5/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 6a73cf1..f50b0ee 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -4,6 +4,8 @@ Release 0.8.0 - unreleased NEW FEATURES + TAJO-378: Implement concat_ws function. (Seungun Choe via jaehwa) + TAJO-377: Implement concat function (Seungun Choe via jaehwa) TAJO-30: Parquet Integration. (David Chen via hyunsik) http://git-wip-us.apache.org/repos/asf/tajo/blob/53f7ffa5/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Concat_ws.java ---------------------------------------------------------------------- diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Concat_ws.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Concat_ws.java new file mode 100644 index 0000000..e512b60 --- /dev/null +++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Concat_ws.java @@ -0,0 +1,81 @@ +/** + * 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.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; +import org.apache.tajo.datum.DatumFactory; +import org.apache.tajo.datum.NullDatum; +import org.apache.tajo.engine.function.GeneralFunction; +import org.apache.tajo.engine.function.annotation.Description; +import org.apache.tajo.engine.function.annotation.ParamTypes; +import org.apache.tajo.storage.Tuple; + +import java.lang.StringBuffer; + + +/** + * Function definition + * + * text concat(str "any" [, str "any" [, ...] ]) + */ +@Description( + functionName = "concat_ws", + description = "Concatenate all but first arguments with separators.", + detail = "The first parameter is used as a separator. NULL arguments are ignored.", + example = "> concat_ws(',', 'abcde', 2);\n" + + "abcde,2", + returnType = TajoDataTypes.Type.TEXT, + paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT, TajoDataTypes.Type.TEXT, TajoDataTypes.Type.TEXT})} +) +public class Concat_ws extends GeneralFunction { + @Expose private boolean hasMoreCharacters; + + public Concat_ws() { + super(new Column[] { + new Column("text", TajoDataTypes.Type.TEXT), + new Column("text", TajoDataTypes.Type.TEXT), + new Column("text", TajoDataTypes.Type.TEXT), + }); + } + + @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()); + + + for(int i = 2 ; i < params.size() ; i++) { + Datum tmpDatum = params.get(i); + if(tmpDatum instanceof NullDatum) + continue; + result.append(sepDatum.asChars()); + result.append(tmpDatum.asChars()); + } + return DatumFactory.createText(result.toString()); + } +} http://git-wip-us.apache.org/repos/asf/tajo/blob/53f7ffa5/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/function/TestStringOperatorsAndFunctions.java ---------------------------------------------------------------------- diff --git a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/function/TestStringOperatorsAndFunctions.java b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/function/TestStringOperatorsAndFunctions.java index 339f8ba..50ff972 100644 --- a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/function/TestStringOperatorsAndFunctions.java +++ b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/function/TestStringOperatorsAndFunctions.java @@ -602,4 +602,10 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase { testSimpleEval("select concat('333', '22') ", new String[]{"33322"}); testSimpleEval("select concat('íê¸', '22') ", new String[]{"íê¸22"}); } + + @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"}); + } }
