This is an automated email from the ASF dual-hosted git repository. luchunliang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/inlong.git
The following commit(s) were added to refs/heads/master by this push: new 02a3815b43 [INLONG-10929][SDK] Support Inlong Transform function annotation (#10936) 02a3815b43 is described below commit 02a3815b43959a56a7236b8377f936e7edcd9465 Author: vernedeng <verned...@apache.org> AuthorDate: Wed Aug 28 21:16:59 2024 +0800 [INLONG-10929][SDK] Support Inlong Transform function annotation (#10936) * [INLONG-10929][SDK] Support Inlong Transform function annotation * fix conflict * fix conflict --- inlong-sdk/transform-sdk/pom.xml | 4 + .../transform/process/function/AbsFunction.java | 1 + .../transform/process/function/AcosFunction.java | 1 + .../transform/process/function/BinFunction.java | 1 + .../transform/process/function/CeilFunction.java | 1 + .../transform/process/function/ConcatFunction.java | 1 + .../transform/process/function/CosFunction.java | 1 + .../process/function/DateExtractFunction.java | 58 +++++++++- .../process/function/DateFormatFunction.java | 1 + .../transform/process/function/ExpFunction.java | 1 + .../transform/process/function/FloorFunction.java | 1 + .../process/function/FromUnixTimeFunction.java | 1 + .../transform/process/function/FunctionTools.java | 90 +++++++++++++++ .../transform/process/function/LeftFunction.java | 1 + .../transform/process/function/LengthFunction.java | 1 + .../sdk/transform/process/function/LnFunction.java | 1 + .../process/function/LocalTimeFunction.java | 1 + .../transform/process/function/LocateFunction.java | 1 + .../transform/process/function/Log10Function.java | 1 + .../transform/process/function/Log2Function.java | 1 + .../transform/process/function/LogFunction.java | 1 + .../transform/process/function/LowerFunction.java | 1 + .../transform/process/function/Md5Function.java | 1 + .../transform/process/function/ModuloFunction.java | 1 + .../transform/process/function/NowFunction.java | 1 + .../transform/process/function/PowerFunction.java | 1 + .../transform/process/function/RandFunction.java | 1 + .../process/function/ReplaceFunction.java | 1 + .../process/function/ReplicateFunction.java | 1 + .../process/function/ReverseFunction.java | 1 + .../transform/process/function/RightFunction.java | 1 + .../transform/process/function/RoundFunction.java | 1 + .../transform/process/function/SignFunction.java | 1 + .../transform/process/function/SinFunction.java | 1 + .../transform/process/function/SinhFunction.java | 1 + .../transform/process/function/SqrtFunction.java | 1 + .../process/function/SubstringFunction.java | 1 + .../transform/process/function/TanFunction.java | 1 + .../process/function/TimestampAddFunction.java | 1 + .../process/function/TimestampExtractFunction.java | 26 ++++- .../process/function/ToBase64Function.java | 1 + .../transform/process/function/ToDateFunction.java | 1 + .../process/function/ToTimestampFunction.java | 1 + .../{NowFunction.java => TransformFunction.java} | 34 ++---- .../process/function/TranslateFunction.java | 1 + .../transform/process/function/TrimFunction.java | 1 + .../process/function/UnixTimestampFunction.java | 1 + .../transform/process/function/UpperFunction.java | 1 + .../transform/process/operator/OperatorTools.java | 125 +-------------------- .../TestTransformTemporalFunctionsProcessor.java | 42 +++---- 50 files changed, 251 insertions(+), 171 deletions(-) diff --git a/inlong-sdk/transform-sdk/pom.xml b/inlong-sdk/transform-sdk/pom.xml index 63659e0812..4770f0025d 100644 --- a/inlong-sdk/transform-sdk/pom.xml +++ b/inlong-sdk/transform-sdk/pom.xml @@ -58,6 +58,10 @@ <artifactId>protobuf-java-util</artifactId> <version>${protobuf.version}</version> </dependency> + <dependency> + <groupId>org.reflections</groupId> + <artifactId>reflections</artifactId> + </dependency> </dependencies> <build> diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/AbsFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/AbsFunction.java index d2b2ceace6..497a69c0f6 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/AbsFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/AbsFunction.java @@ -30,6 +30,7 @@ import java.math.BigDecimal; * AbsFunction * description: abs(numeric)--returns the absolute value of numeric */ +@TransformFunction(names = {"abs"}) public class AbsFunction implements ValueParser { private ValueParser numberParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/AcosFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/AcosFunction.java index 332716e57b..ba2249faef 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/AcosFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/AcosFunction.java @@ -30,6 +30,7 @@ import java.math.BigDecimal; * AcosFunction * description: acos(numeric)--returns the arc cosine of numeric */ +@TransformFunction(names = {"acos"}) public class AcosFunction implements ValueParser { private ValueParser numberParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/BinFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/BinFunction.java index ae4dbc96e7..bfb2bbc6bd 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/BinFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/BinFunction.java @@ -31,6 +31,7 @@ import java.util.List; * BinFunction * description: bin(integer)--Returns a string representation of an integer in binary format. If the integer is NULL, NULL is returned. */ +@TransformFunction(names = {"bin"}) public class BinFunction implements ValueParser { private ValueParser valueParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/CeilFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/CeilFunction.java index adb472ae6b..bd44238524 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/CeilFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/CeilFunction.java @@ -30,6 +30,7 @@ import java.math.BigDecimal; * CeilFunction * description: ceil(numeric)--rounds numeric up, and returns the smallest number that is greater than or equal to numeric */ +@TransformFunction(names = {"ceil"}) public class CeilFunction implements ValueParser { private ValueParser numberParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ConcatFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ConcatFunction.java index 529ddad007..4ea0b2e6f6 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ConcatFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ConcatFunction.java @@ -32,6 +32,7 @@ import java.util.List; * ConcatFunction * */ +@TransformFunction(names = {"concat"}) public class ConcatFunction implements ValueParser { private List<ValueParser> nodeList; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/CosFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/CosFunction.java index bbe9c9da96..d718551094 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/CosFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/CosFunction.java @@ -30,6 +30,7 @@ import java.math.BigDecimal; * CosFunction * description: cos(numeric)--returns the cosine of numeric */ +@TransformFunction(names = {"cos"}) public class CosFunction implements ValueParser { private ValueParser numberParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/DateExtractFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/DateExtractFunction.java index 896b67c31a..ff0eb6b01e 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/DateExtractFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/DateExtractFunction.java @@ -43,7 +43,7 @@ import java.util.Locale; * - dayofmonth(date)--returns the day of a month (an integer between 1 and 31) from SQL date * - dayofweek(date)--returns the day of a week (an integer between 1(Sunday) and 7(Saturday)) from SQL date */ -public class DateExtractFunction implements ValueParser { +public abstract class DateExtractFunction implements ValueParser { private DateExtractFunctionType type; private ValueParser dateParser; @@ -53,6 +53,62 @@ public class DateExtractFunction implements ValueParser { YEAR, QUARTER, MONTH, WEEK, DAY_OF_YEAR, DAY_OF_MONTH, DAY_OF_WEEK } + @TransformFunction(names = {"year"}) + public static class YearExtractFunction extends DateExtractFunction { + + public YearExtractFunction(Function expr) { + super(DateExtractFunctionType.YEAR, expr); + } + } + + @TransformFunction(names = {"quarter"}) + public static class QuarterExtractFunction extends DateExtractFunction { + + public QuarterExtractFunction(Function expr) { + super(DateExtractFunctionType.QUARTER, expr); + } + } + + @TransformFunction(names = {"month"}) + public static class MonthExtractFunction extends DateExtractFunction { + + public MonthExtractFunction(Function expr) { + super(DateExtractFunctionType.MONTH, expr); + } + } + + @TransformFunction(names = {"week"}) + public static class WeekExtractFunction extends DateExtractFunction { + + public WeekExtractFunction(Function expr) { + super(DateExtractFunctionType.WEEK, expr); + } + } + + @TransformFunction(names = {"day_of_year"}) + public static class DayOfYearExtractFunction extends DateExtractFunction { + + public DayOfYearExtractFunction(Function expr) { + super(DateExtractFunctionType.DAY_OF_YEAR, expr); + } + } + + @TransformFunction(names = {"day_of_month"}) + public static class DayOfMonthExtractFunction extends DateExtractFunction { + + public DayOfMonthExtractFunction(Function expr) { + super(DateExtractFunctionType.DAY_OF_MONTH, expr); + } + } + + @TransformFunction(names = {"day_of_week"}) + public static class DayOfWeekExtractFunction extends DateExtractFunction { + + public DayOfWeekExtractFunction(Function expr) { + super(DateExtractFunctionType.DAY_OF_WEEK, expr); + } + } + public DateExtractFunction(DateExtractFunctionType type, Function expr) { this.type = type; List<Expression> expressions = expr.getParameters().getExpressions(); diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/DateFormatFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/DateFormatFunction.java index f5ae9bfd88..b340b7bb4e 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/DateFormatFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/DateFormatFunction.java @@ -37,6 +37,7 @@ import java.util.concurrent.ConcurrentHashMap; * description: date_format(timestamp,format)--converts timestamp(in seconds) to a value of string in the format * specified by the date format string. The format string is compatible with Java’s SimpleDateFormat */ +@TransformFunction(names = {"date_format"}) public class DateFormatFunction implements ValueParser { private ValueParser timestampParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ExpFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ExpFunction.java index 5a7a9bbfac..6761a06a55 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ExpFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ExpFunction.java @@ -30,6 +30,7 @@ import java.math.BigDecimal; * ExpFunction * description: exp(numeric)--returns e raised to the power of numeric */ +@TransformFunction(names = {"exp"}) public class ExpFunction implements ValueParser { private ValueParser numberParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/FloorFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/FloorFunction.java index 9d5322570b..1096d2e28a 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/FloorFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/FloorFunction.java @@ -30,6 +30,7 @@ import java.math.BigDecimal; * FloorFunction * description: floor(numeric)--rounds numeric down, and returns the largest number that is less than or equal to numeric */ +@TransformFunction(names = {"floor"}) public class FloorFunction implements ValueParser { private ValueParser numberParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/FromUnixTimeFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/FromUnixTimeFunction.java index d8a423ca2d..b7b68a0e73 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/FromUnixTimeFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/FromUnixTimeFunction.java @@ -41,6 +41,7 @@ import java.util.concurrent.ConcurrentHashMap; * format(default is ‘yyyy-MM-dd HH:mm:ss’). numeric is an internal timestamp value representing seconds * since ‘1970-01-01 00:00:00’ UTC, such as produced by the UNIX_TIMESTAMP() function. */ +@TransformFunction(names = {"from_unix_time"}) public class FromUnixTimeFunction implements ValueParser { private ValueParser numericParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/FunctionTools.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/FunctionTools.java new file mode 100644 index 0000000000..b351aee06b --- /dev/null +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/FunctionTools.java @@ -0,0 +1,90 @@ +/* + * 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.inlong.sdk.transform.process.function; + +import org.apache.inlong.sdk.transform.process.parser.ColumnParser; +import org.apache.inlong.sdk.transform.process.parser.ValueParser; + +import com.google.common.collect.Maps; +import lombok.extern.slf4j.Slf4j; +import net.sf.jsqlparser.expression.Function; +import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang.StringUtils; +import org.reflections.Reflections; +import org.reflections.scanners.Scanners; + +import java.lang.reflect.Constructor; +import java.util.Map; +import java.util.Set; + +@Slf4j +public class FunctionTools { + + private static final String FUNCTION_PATH = "org.apache.inlong.sdk.transform.process.function"; + private final static Map<String, Class<?>> functionMap = Maps.newConcurrentMap(); + + static { + init(); + } + + private static void init() { + Reflections reflections = new Reflections(FUNCTION_PATH, Scanners.TypesAnnotated); + Set<Class<?>> clazzSet = reflections.getTypesAnnotatedWith(TransformFunction.class); + for (Class<?> clazz : clazzSet) { + TransformFunction annotation = clazz.getAnnotation(TransformFunction.class); + if (annotation == null || ArrayUtils.isEmpty(annotation.names())) { + continue; + } + + String[] functionNames = annotation.names(); + for (String functionName : functionNames) { + if (StringUtils.isEmpty(functionName)) { + continue; + } + + functionMap.compute(functionName, (name, former) -> { + if (former != null) { + log.warn("find a conflict function named [{}], the former one is [{}], new one is [{}]", + name, former.getName(), clazz.getName()); + } + return clazz; + }); + } + + } + } + + public static ValueParser getTransformFunction(Function func) { + String functionName = func.getName(); + Class<?> clazz = functionMap.get(functionName); + if (clazz == null) { + return new ColumnParser(func); + } + try { + Constructor<?> constructor = clazz.getDeclaredConstructor(func.getClass()); + return (ValueParser) constructor.newInstance(func); + } catch (NoSuchMethodException e) { + log.error("transform function {} needs one constructor that accept one params whose type is {}", + clazz.getName(), func.getClass().getName(), e); + throw new RuntimeException(e); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + +} diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/LeftFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/LeftFunction.java index e86d770f92..17c0388254 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/LeftFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/LeftFunction.java @@ -34,6 +34,7 @@ import java.util.List; * - return "" if it is less than or equal to zero * - return a substring of length starting from the right side of the string. */ +@TransformFunction(names = {"left"}) public class LeftFunction implements ValueParser { private final ValueParser stringParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/LengthFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/LengthFunction.java index 5a01652c93..0c1abba8f0 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/LengthFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/LengthFunction.java @@ -30,6 +30,7 @@ import net.sf.jsqlparser.expression.Function; * - return the length of the string * - return NULL if the string is NULL */ +@TransformFunction(names = {"length"}) public class LengthFunction implements ValueParser { private final ValueParser stringParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/LnFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/LnFunction.java index 530b2ff4f8..29a0ac64ed 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/LnFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/LnFunction.java @@ -30,6 +30,7 @@ import java.math.BigDecimal; * LnFunction * description: ln(numeric)--returns the natural logarithm (base e) of numeric */ +@TransformFunction(names = {"ln"}) public class LnFunction implements ValueParser { private ValueParser numberParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/LocalTimeFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/LocalTimeFunction.java index a3072901a3..9a40aeb3df 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/LocalTimeFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/LocalTimeFunction.java @@ -33,6 +33,7 @@ import java.time.ZoneId; * localTime([string1]) returns the current time in the specified time zone. * (by default: the current time in the system time zone) */ +@TransformFunction(names = {"localtime", "current_time"}) public class LocalTimeFunction implements ValueParser { private ValueParser stringParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/LocateFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/LocateFunction.java index e300815eec..179d56f36d 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/LocateFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/LocateFunction.java @@ -34,6 +34,7 @@ import java.util.List; * - returns 0 if not found * - returns NULL if any of arguments is NULL */ +@TransformFunction(names = {"locate"}) public class LocateFunction implements ValueParser { private ValueParser stringParser1; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/Log10Function.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/Log10Function.java index e968a27aa1..b35c6cb50b 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/Log10Function.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/Log10Function.java @@ -30,6 +30,7 @@ import java.math.BigDecimal; * Log10Function * description: log10(numeric)--returns the base 10 logarithm of numeric */ +@TransformFunction(names = {"log10"}) public class Log10Function implements ValueParser { private final ValueParser numberParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/Log2Function.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/Log2Function.java index 914bc69ac3..f73ed19176 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/Log2Function.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/Log2Function.java @@ -30,6 +30,7 @@ import java.math.BigDecimal; * Log2Function * description: log2(numeric)--returns the base 2 logarithm of numeric */ +@TransformFunction(names = {"log2"}) public class Log2Function implements ValueParser { private final ValueParser numberParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/LogFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/LogFunction.java index ddbcd71a97..bcaf2578e8 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/LogFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/LogFunction.java @@ -33,6 +33,7 @@ import java.util.List; * description: log(numeric) or log(numeric1, numeric2)--When called with one argument, returns the natural logarithm * of numeric. When called with two arguments, this function returns the logarithm of numeric2 to the base numeric1 */ +@TransformFunction(names = {"log"}) public class LogFunction implements ValueParser { private ValueParser baseParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/LowerFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/LowerFunction.java index e6aa83c58c..f6b91cf77d 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/LowerFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/LowerFunction.java @@ -28,6 +28,7 @@ import net.sf.jsqlparser.expression.Function; * LowerFunction * description: LOWER(s): Convert all letters of the string s to lowercase letters */ +@TransformFunction(names = {"lower"}) public class LowerFunction implements ValueParser { private ValueParser stringParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/Md5Function.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/Md5Function.java index 027511864a..c9f7b78e81 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/Md5Function.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/Md5Function.java @@ -31,6 +31,7 @@ import java.nio.charset.StandardCharsets; * Md5Function * description: MD5(string): Return the MD5 hash value of a string in the form of a 32-bit hexadecimal digit string; If the string is NULL, return NULL. */ +@TransformFunction(names = {"md5"}) public class Md5Function implements ValueParser { private ValueParser msgParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ModuloFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ModuloFunction.java index b6b8b3c0af..8f88c03f4d 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ModuloFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ModuloFunction.java @@ -32,6 +32,7 @@ import java.util.List; * ModuloFunction * description: MOD(NUMERIC1, NUMERIC2) : Return the remainder of numeric1 divided by numeric2. */ +@TransformFunction(names = {"mod"}) public class ModuloFunction implements ValueParser { private ValueParser dividendParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/NowFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/NowFunction.java index 3857f22147..e26c07804a 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/NowFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/NowFunction.java @@ -27,6 +27,7 @@ import net.sf.jsqlparser.expression.Function; * NowFunction * */ +@TransformFunction(names = {"now"}) public class NowFunction implements ValueParser { /** diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/PowerFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/PowerFunction.java index 938fc00f6d..737fc484cf 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/PowerFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/PowerFunction.java @@ -30,6 +30,7 @@ import java.math.BigDecimal; * PowerFunction * description: power(numeric1, numeric2)--returns numeric1.power(numeric2) */ +@TransformFunction(names = {"power"}) public class PowerFunction implements ValueParser { private ValueParser baseParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/RandFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/RandFunction.java index 2baebe038a..76a58f2bfc 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/RandFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/RandFunction.java @@ -34,6 +34,7 @@ import java.util.Random; * description: Rand()--Returns a pseudo-random double precision value in the range [0.0, 1.0) * Rand(Integer)--Returns a pseudo-random double precision value in the range [0.0, 1.0) with an initial seed of Integer. */ +@TransformFunction(names = {"rand"}) public class RandFunction implements ValueParser { private ValueParser seedParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ReplaceFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ReplaceFunction.java index d9d1d26a21..e343570eaa 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ReplaceFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ReplaceFunction.java @@ -31,6 +31,7 @@ import java.util.List; * ReplaceFunction * description: replace(s, s1, s2)--replace string s1 in string s with string s2. */ +@TransformFunction(names = {"replace"}) public class ReplaceFunction implements ValueParser { private ValueParser stringParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ReplicateFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ReplicateFunction.java index 5270720d44..82755a5baa 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ReplicateFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ReplicateFunction.java @@ -30,6 +30,7 @@ import java.util.List; * ReplicateFunction * description: replicate(string, numeric)--Repeat the string numeric times and return a new string */ +@TransformFunction(names = {"replicate"}) public class ReplicateFunction implements ValueParser { private ValueParser stringParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ReverseFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ReverseFunction.java index 5015e0225a..58f6fb1dcf 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ReverseFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ReverseFunction.java @@ -28,6 +28,7 @@ import net.sf.jsqlparser.expression.Function; * description: reverse(string)--returns the string with the order of the characters reversed. * returns NULL if string is a empty string. */ +@TransformFunction(names = {"reverse"}) public class ReverseFunction implements ValueParser { private ValueParser stringParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/RightFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/RightFunction.java index 8260d3f299..1190cb7fd6 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/RightFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/RightFunction.java @@ -34,6 +34,7 @@ import java.util.List; * - return "" if it is less than or equal to zero * - return a substring of length starting from the right side of the string. */ +@TransformFunction(names = {"right"}) public class RightFunction implements ValueParser { private final ValueParser stringParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/RoundFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/RoundFunction.java index ecad419635..60d915922d 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/RoundFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/RoundFunction.java @@ -33,6 +33,7 @@ import java.util.List; * RoundFunction * description: ROUND(x [,y]) -- Return the nearest integer to x, with optional parameter y indicating the number of decimal places to be rounded. If omitted, return the integer. */ +@TransformFunction(names = {"round"}) public class RoundFunction implements ValueParser { private ValueParser numberParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/SignFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/SignFunction.java index 792c8baf26..d9db985e5e 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/SignFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/SignFunction.java @@ -30,6 +30,7 @@ import java.math.BigDecimal; * SignFunction * description: sign(x): Return the sign of x, where x is a negative number, 0, and positive numbers return -1, 0, and 1, respectively */ +@TransformFunction(names = {"sign"}) public class SignFunction implements ValueParser { private ValueParser numberParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/SinFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/SinFunction.java index 5f97ccc119..dec7006f2e 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/SinFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/SinFunction.java @@ -30,6 +30,7 @@ import java.math.BigDecimal; * SinFunction * description: sin(numeric)--returns the sine of numeric */ +@TransformFunction(names = {"sin"}) public class SinFunction implements ValueParser { private ValueParser numberParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/SinhFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/SinhFunction.java index 7eb947aeb2..0b19bd1695 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/SinhFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/SinhFunction.java @@ -30,6 +30,7 @@ import java.math.BigDecimal; * SinhFunction * description: sinh(numeric)--returns the hyperbolic sine of numeric */ +@TransformFunction(names = {"sinh"}) public class SinhFunction implements ValueParser { private ValueParser numberParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/SqrtFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/SqrtFunction.java index 69cf43041a..3ebadf45a9 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/SqrtFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/SqrtFunction.java @@ -30,6 +30,7 @@ import java.math.BigDecimal; * SqrtFunction * description: sqrt(numeric)--returns the square root of numeric */ +@TransformFunction(names = {"sqrt"}) public class SqrtFunction implements ValueParser { private ValueParser numberParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/SubstringFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/SubstringFunction.java index 063686aa55..772dc2950c 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/SubstringFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/SubstringFunction.java @@ -32,6 +32,7 @@ import java.util.List; * description: substring(string FROM INT1 [ FOR INT2 ])--returns a substring of STRING starting from position INT1 with * length INT2 (to the end by default) */ +@TransformFunction(names = {"substring"}) public class SubstringFunction implements ValueParser { private ValueParser stringParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/TanFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/TanFunction.java index ed673f1ef6..baa9de8890 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/TanFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/TanFunction.java @@ -29,6 +29,7 @@ import java.math.BigDecimal; * TanFunction * description: tan(numeric)--returns the tangent of numeric */ +@TransformFunction(names = {"tan"}) public class TanFunction implements ValueParser { private ValueParser numberParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/TimestampAddFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/TimestampAddFunction.java index e09512cdfd..9bcbb8c8e4 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/TimestampAddFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/TimestampAddFunction.java @@ -36,6 +36,7 @@ import java.util.List; * The unit of the time interval is specified by the unit parameter, which should be one of the following values: * FRAC_SECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, or YEAR. */ +@TransformFunction(names = {"timestamp_add"}) public class TimestampAddFunction implements ValueParser { private ValueParser intervalParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/TimestampExtractFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/TimestampExtractFunction.java index 6af01e675e..30ab279a31 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/TimestampExtractFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/TimestampExtractFunction.java @@ -36,7 +36,7 @@ import java.util.List; * - minute(timestamp)--returns the minute of an hour (an integer between 0 and 59) from SQL timestamp * - second(timestamp)--returns the second of a minute (an integer between 0 and 59) from SQL timestamp */ -public class TimestampExtractFunction implements ValueParser { +public abstract class TimestampExtractFunction implements ValueParser { private TimestampExtractFunctionType type; private ValueParser timestampParser; @@ -45,6 +45,30 @@ public class TimestampExtractFunction implements ValueParser { HOUR, MINUTE, SECOND } + @TransformFunction(names = {"hour"}) + public static class HourExtractFunction extends TimestampExtractFunction { + + public HourExtractFunction(Function expr) { + super(TimestampExtractFunctionType.HOUR, expr); + } + } + + @TransformFunction(names = {"minute"}) + public static class MinuteExtractFunction extends TimestampExtractFunction { + + public MinuteExtractFunction(Function expr) { + super(TimestampExtractFunctionType.MINUTE, expr); + } + } + + @TransformFunction(names = {"second"}) + public static class SecondExtractFunction extends TimestampExtractFunction { + + public SecondExtractFunction(Function expr) { + super(TimestampExtractFunctionType.SECOND, expr); + } + } + public TimestampExtractFunction(TimestampExtractFunctionType type, Function expr) { this.type = type; List<Expression> expressions = expr.getParameters().getExpressions(); diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ToBase64Function.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ToBase64Function.java index a82f36d9c2..7352f6f61a 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ToBase64Function.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ToBase64Function.java @@ -31,6 +31,7 @@ import java.util.Base64; * ToBase64Function * description: to_base64(string1)--returns the base64-encoded result from string1 */ +@TransformFunction(names = {"to_base64"}) public class ToBase64Function implements ValueParser { private final ValueParser stringParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ToDateFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ToDateFunction.java index 5a03f1d2e4..ec77b446ac 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ToDateFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ToDateFunction.java @@ -35,6 +35,7 @@ import java.util.concurrent.ConcurrentHashMap; * ToDateFunction * description: to_date(string1[, string2])--converts a date string string1 with format string2 (by default ‘yyyy-MM-dd’) to a date */ +@TransformFunction(names = {"to_date"}) public class ToDateFunction implements ValueParser { private ValueParser stringParser1; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ToTimestampFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ToTimestampFunction.java index 45f51511f1..1b97263324 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ToTimestampFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/ToTimestampFunction.java @@ -41,6 +41,7 @@ import java.util.List; * to_timestamp(string1[, string2])--converts date time string string1 in format string2 * (by default: yyyy-MM-dd HH:mm:ss if not specified) under the ‘UTC+0’ time zone to a timestamp */ +@TransformFunction(names = {"to_timestamp"}) public class ToTimestampFunction implements ValueParser { private ValueParser stringParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/NowFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/TransformFunction.java similarity index 56% copy from inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/NowFunction.java copy to inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/TransformFunction.java index 3857f22147..b78d2b31f9 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/NowFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/TransformFunction.java @@ -17,33 +17,15 @@ package org.apache.inlong.sdk.transform.process.function; -import org.apache.inlong.sdk.transform.decode.SourceData; -import org.apache.inlong.sdk.transform.process.Context; -import org.apache.inlong.sdk.transform.process.parser.ValueParser; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; -import net.sf.jsqlparser.expression.Function; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; -/** - * NowFunction - * - */ -public class NowFunction implements ValueParser { - - /** - * Constructor - * @param expr - */ - public NowFunction(Function expr) { - } +@Retention(RUNTIME) +@Target(TYPE) +public @interface TransformFunction { - /** - * parse - * @param sourceData - * @param rowIndex - * @return - */ - @Override - public Object parse(SourceData sourceData, int rowIndex, Context context) { - return String.valueOf(System.currentTimeMillis()); - } + String[] names(); } diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/TranslateFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/TranslateFunction.java index ce05eb0fc3..87920b8619 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/TranslateFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/TranslateFunction.java @@ -49,6 +49,7 @@ import java.util.Map; * case1: translate(email, '@', '.') -> original_expression: ha...@inlong.com target_expression: harry.inlong.com * case2: translate(hello WorD, 'WD', 'wd') -> original_expression: hello WorD target_expression: hello word */ +@TransformFunction(names = {"translate"}) public class TranslateFunction implements ValueParser { private ValueParser originalStrParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/TrimFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/TrimFunction.java index b3fbaf26dc..7727d6dd52 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/TrimFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/TrimFunction.java @@ -28,6 +28,7 @@ import net.sf.jsqlparser.expression.Function; * TrimFunction * description: trim(string)--Remove Spaces before and after the string. */ +@TransformFunction(names = {"trim"}) public class TrimFunction implements ValueParser { private ValueParser stringParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/UnixTimestampFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/UnixTimestampFunction.java index 518fb6a646..9737ff2a10 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/UnixTimestampFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/UnixTimestampFunction.java @@ -38,6 +38,7 @@ import java.util.List; * unix_timestamp(string1[, string2]): converts date time string string1 in format string2 * (by default: yyyy-MM-dd HH:mm:ss if not specified) to Unix timestamp (in seconds) */ +@TransformFunction(names = {"unix_timestamp"}) public class UnixTimestampFunction implements ValueParser { private ValueParser stringParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/UpperFunction.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/UpperFunction.java index 393b1abde4..45eead1380 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/UpperFunction.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/function/UpperFunction.java @@ -28,6 +28,7 @@ import net.sf.jsqlparser.expression.Function; * UpperFunction * description: UPPER(s): Convert a string to uppercase */ +@TransformFunction(names = {"upper"}) public class UpperFunction implements ValueParser { private ValueParser stringParser; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/operator/OperatorTools.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/operator/OperatorTools.java index eb39599b47..90405d687c 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/operator/OperatorTools.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/operator/OperatorTools.java @@ -17,52 +17,7 @@ package org.apache.inlong.sdk.transform.process.operator; -import org.apache.inlong.sdk.transform.process.function.AbsFunction; -import org.apache.inlong.sdk.transform.process.function.AcosFunction; -import org.apache.inlong.sdk.transform.process.function.BinFunction; -import org.apache.inlong.sdk.transform.process.function.CeilFunction; -import org.apache.inlong.sdk.transform.process.function.ConcatFunction; -import org.apache.inlong.sdk.transform.process.function.CosFunction; -import org.apache.inlong.sdk.transform.process.function.DateExtractFunction; -import org.apache.inlong.sdk.transform.process.function.DateExtractFunction.DateExtractFunctionType; -import org.apache.inlong.sdk.transform.process.function.DateFormatFunction; -import org.apache.inlong.sdk.transform.process.function.ExpFunction; -import org.apache.inlong.sdk.transform.process.function.FloorFunction; -import org.apache.inlong.sdk.transform.process.function.FromUnixTimeFunction; -import org.apache.inlong.sdk.transform.process.function.LeftFunction; -import org.apache.inlong.sdk.transform.process.function.LengthFunction; -import org.apache.inlong.sdk.transform.process.function.LnFunction; -import org.apache.inlong.sdk.transform.process.function.LocalTimeFunction; -import org.apache.inlong.sdk.transform.process.function.LocateFunction; -import org.apache.inlong.sdk.transform.process.function.Log10Function; -import org.apache.inlong.sdk.transform.process.function.Log2Function; -import org.apache.inlong.sdk.transform.process.function.LogFunction; -import org.apache.inlong.sdk.transform.process.function.LowerFunction; -import org.apache.inlong.sdk.transform.process.function.Md5Function; -import org.apache.inlong.sdk.transform.process.function.ModuloFunction; -import org.apache.inlong.sdk.transform.process.function.NowFunction; -import org.apache.inlong.sdk.transform.process.function.PowerFunction; -import org.apache.inlong.sdk.transform.process.function.RandFunction; -import org.apache.inlong.sdk.transform.process.function.ReplaceFunction; -import org.apache.inlong.sdk.transform.process.function.ReplicateFunction; -import org.apache.inlong.sdk.transform.process.function.ReverseFunction; -import org.apache.inlong.sdk.transform.process.function.RightFunction; -import org.apache.inlong.sdk.transform.process.function.RoundFunction; -import org.apache.inlong.sdk.transform.process.function.SignFunction; -import org.apache.inlong.sdk.transform.process.function.SinFunction; -import org.apache.inlong.sdk.transform.process.function.SinhFunction; -import org.apache.inlong.sdk.transform.process.function.SqrtFunction; -import org.apache.inlong.sdk.transform.process.function.SubstringFunction; -import org.apache.inlong.sdk.transform.process.function.TanFunction; -import org.apache.inlong.sdk.transform.process.function.TimestampAddFunction; -import org.apache.inlong.sdk.transform.process.function.TimestampExtractFunction; -import org.apache.inlong.sdk.transform.process.function.ToBase64Function; -import org.apache.inlong.sdk.transform.process.function.ToDateFunction; -import org.apache.inlong.sdk.transform.process.function.ToTimestampFunction; -import org.apache.inlong.sdk.transform.process.function.TranslateFunction; -import org.apache.inlong.sdk.transform.process.function.TrimFunction; -import org.apache.inlong.sdk.transform.process.function.UnixTimestampFunction; -import org.apache.inlong.sdk.transform.process.function.UpperFunction; +import org.apache.inlong.sdk.transform.process.function.FunctionTools; import org.apache.inlong.sdk.transform.process.parser.AdditionParser; import org.apache.inlong.sdk.transform.process.parser.ColumnParser; import org.apache.inlong.sdk.transform.process.parser.DateParser; @@ -107,12 +62,10 @@ import org.apache.commons.lang.ObjectUtils; import java.math.BigDecimal; import java.sql.Date; import java.sql.Timestamp; -import java.util.HashMap; -import java.util.Map; /** * OperatorTools - * + * */ public class OperatorTools { @@ -120,70 +73,6 @@ public class OperatorTools { public static final String CHILD_KEY = "$child"; - private static final Map<String, java.util.function.Function<Function, ValueParser>> functionMap = new HashMap<>(); - - static { - functionMap.put("concat", ConcatFunction::new); - functionMap.put("now", NowFunction::new); - functionMap.put("localtime", LocalTimeFunction::new); - functionMap.put("currenttime", LocalTimeFunction::new); - functionMap.put("power", PowerFunction::new); - functionMap.put("abs", AbsFunction::new); - functionMap.put("sqrt", SqrtFunction::new); - functionMap.put("ln", LnFunction::new); - functionMap.put("log10", Log10Function::new); - functionMap.put("log2", Log2Function::new); - functionMap.put("log", LogFunction::new); - functionMap.put("exp", ExpFunction::new); - functionMap.put("reverse", ReverseFunction::new); - functionMap.put("substring", SubstringFunction::new); - functionMap.put("trim", TrimFunction::new); - functionMap.put("sign", SignFunction::new); - functionMap.put("replicate", ReplicateFunction::new); - functionMap.put("locate", LocateFunction::new); - functionMap.put("to_date", ToDateFunction::new); - functionMap.put("date_format", DateFormatFunction::new); - functionMap.put("ceil", CeilFunction::new); - functionMap.put("rand", RandFunction::new); - functionMap.put("floor", FloorFunction::new); - functionMap.put("sin", SinFunction::new); - functionMap.put("sinh", SinhFunction::new); - functionMap.put("cos", CosFunction::new); - functionMap.put("acos", AcosFunction::new); - functionMap.put("tan", TanFunction::new); - functionMap.put("bin", BinFunction::new); - functionMap.put("year", func -> new DateExtractFunction(DateExtractFunctionType.YEAR, func)); - functionMap.put("quarter", func -> new DateExtractFunction(DateExtractFunctionType.QUARTER, func)); - functionMap.put("month", func -> new DateExtractFunction(DateExtractFunctionType.MONTH, func)); - functionMap.put("week", func -> new DateExtractFunction(DateExtractFunctionType.WEEK, func)); - functionMap.put("dayofyear", func -> new DateExtractFunction(DateExtractFunctionType.DAY_OF_YEAR, func)); - functionMap.put("dayofmonth", func -> new DateExtractFunction(DateExtractFunctionType.DAY_OF_MONTH, func)); - functionMap.put("dayofweek", func -> new DateExtractFunction(DateExtractFunctionType.DAY_OF_WEEK, func)); - functionMap.put("hour", - func -> new TimestampExtractFunction(TimestampExtractFunction.TimestampExtractFunctionType.HOUR, func)); - functionMap.put("minute", - func -> new TimestampExtractFunction(TimestampExtractFunction.TimestampExtractFunctionType.MINUTE, - func)); - functionMap.put("second", - func -> new TimestampExtractFunction(TimestampExtractFunction.TimestampExtractFunctionType.SECOND, - func)); - functionMap.put("round", RoundFunction::new); - functionMap.put("from_unixtime", FromUnixTimeFunction::new); - functionMap.put("unix_timestamp", UnixTimestampFunction::new); - functionMap.put("to_timestamp", ToTimestampFunction::new); - functionMap.put("mod", ModuloFunction::new); - functionMap.put("to_base64", ToBase64Function::new); - functionMap.put("lower", LowerFunction::new); - functionMap.put("upper", UpperFunction::new); - functionMap.put("length", LengthFunction::new); - functionMap.put("replace", ReplaceFunction::new); - functionMap.put("left", LeftFunction::new); - functionMap.put("right", RightFunction::new); - functionMap.put("timestampadd", TimestampAddFunction::new); - functionMap.put("md5", Md5Function::new); - functionMap.put("translate", TranslateFunction::new); - } - public static ExpressionOperator buildOperator(Expression expr) { if (expr instanceof AndExpression) { return new AndOperator((AndExpression) expr); @@ -241,15 +130,7 @@ public class OperatorTools { if (exprString.startsWith(ROOT_KEY) || exprString.startsWith(CHILD_KEY)) { return new ColumnParser((Function) expr); } else { - // TODO - Function func = (Function) expr; - java.util.function.Function<Function, ValueParser> valueParserConstructor = - functionMap.get(func.getName().toLowerCase()); - if (valueParserConstructor != null) { - return valueParserConstructor.apply(func); - } else { - return new ColumnParser(func); - } + return FunctionTools.getTransformFunction((Function) expr); } } return null; diff --git a/inlong-sdk/transform-sdk/src/test/java/org/apache/inlong/sdk/transform/process/TestTransformTemporalFunctionsProcessor.java b/inlong-sdk/transform-sdk/src/test/java/org/apache/inlong/sdk/transform/process/TestTransformTemporalFunctionsProcessor.java index 8c99b2a6bd..e0830dd72e 100644 --- a/inlong-sdk/transform-sdk/src/test/java/org/apache/inlong/sdk/transform/process/TestTransformTemporalFunctionsProcessor.java +++ b/inlong-sdk/transform-sdk/src/test/java/org/apache/inlong/sdk/transform/process/TestTransformTemporalFunctionsProcessor.java @@ -186,7 +186,7 @@ public class TestTransformTemporalFunctionsProcessor { Assert.assertEquals(1, output4.size()); Assert.assertEquals(output4.get(0), "result=9"); - String transformSql5 = "select dayofyear(string1) from source"; + String transformSql5 = "select day_of_year(string1) from source"; TransformConfig config5 = new TransformConfig(transformSql5); TransformProcessor<String, String> processor5 = TransformProcessor .create(config5, SourceDecoderFactory.createCsvDecoder(csvSource), @@ -196,7 +196,7 @@ public class TestTransformTemporalFunctionsProcessor { Assert.assertEquals(1, output5.size()); Assert.assertEquals(output5.get(0), "result=60"); - String transformSql6 = "select dayofmonth(string1) from source"; + String transformSql6 = "select day_of_month(string1) from source"; TransformConfig config6 = new TransformConfig(transformSql6); TransformProcessor<String, String> processor6 = TransformProcessor .create(config6, SourceDecoderFactory.createCsvDecoder(csvSource), @@ -206,7 +206,7 @@ public class TestTransformTemporalFunctionsProcessor { Assert.assertEquals(1, output6.size()); Assert.assertEquals(output6.get(0), "result=29"); - String transformSql7 = "select dayofweek(string1) from source"; + String transformSql7 = "select day_of_week(string1) from source"; TransformConfig config7 = new TransformConfig(transformSql7); TransformProcessor<String, String> processor7 = TransformProcessor .create(config7, SourceDecoderFactory.createCsvDecoder(csvSource), @@ -252,42 +252,42 @@ public class TestTransformTemporalFunctionsProcessor { @Test public void testFromUnixTimeFunction() throws Exception { - String transformSql1 = "select from_unixtime(numeric1) from source"; + String transformSql1 = "select from_unix_time(numeric1) from source"; TransformConfig config1 = new TransformConfig(transformSql1); TransformProcessor<String, String> processor1 = TransformProcessor .create(config1, SourceDecoderFactory.createCsvDecoder(csvSource), SinkEncoderFactory.createKvEncoder(kvSink)); - // case1: from_unixtime(44) + // case1: from_unix_time(44) List<String> output1 = processor1.transform("can|apple|cloud|44|1|3", new HashMap<>()); Assert.assertEquals(1, output1.size()); Assert.assertEquals(output1.get(0), "result=1970-01-01 08:00:44"); - String transformSql2 = "select from_unixtime(numeric1, 'yyyy/MM/dd HH:mm:ss') from source"; + String transformSql2 = "select from_unix_time(numeric1, 'yyyy/MM/dd HH:mm:ss') from source"; TransformConfig config2 = new TransformConfig(transformSql2); TransformProcessor<String, String> processor2 = TransformProcessor .create(config2, SourceDecoderFactory.createCsvDecoder(csvSource), SinkEncoderFactory.createKvEncoder(kvSink)); - // case2: from_unixtime(44, 'yyyy/MM/dd HH:mm:ss') + // case2: from_unix_time(44, 'yyyy/MM/dd HH:mm:ss') List<String> output2 = processor2.transform("can|apple|cloud|44|1|3", new HashMap<>()); Assert.assertEquals(1, output2.size()); Assert.assertEquals(output2.get(0), "result=1970/01/01 08:00:44"); - String transformSql3 = "select from_unixtime(numeric1, 'MMdd-yyyy') from source"; + String transformSql3 = "select from_unix_time(numeric1, 'MMdd-yyyy') from source"; TransformConfig config3 = new TransformConfig(transformSql3); TransformProcessor<String, String> processor3 = TransformProcessor .create(config3, SourceDecoderFactory.createCsvDecoder(csvSource), SinkEncoderFactory.createKvEncoder(kvSink)); - // case3: from_unixtime(44, 'MMdd-yyyy') + // case3: from_unix_time(44, 'MMdd-yyyy') List<String> output3 = processor3.transform("can|apple|cloud|44|1|3", new HashMap<>()); Assert.assertEquals(1, output3.size()); Assert.assertEquals(output3.get(0), "result=0101-1970"); - String transformSql4 = "select from_unixtime(numeric1, 'yyyyMMddHHss') from source"; + String transformSql4 = "select from_unix_time(numeric1, 'yyyyMMddHHss') from source"; TransformConfig config4 = new TransformConfig(transformSql4); TransformProcessor<String, String> processor4 = TransformProcessor .create(config4, SourceDecoderFactory.createCsvDecoder(csvSource), SinkEncoderFactory.createKvEncoder(kvSink)); - // case4: from_unixtime(44, 'yyyyMMddHHss') + // case4: from_unix_time(44, 'yyyyMMddHHss') List<String> output4 = processor4.transform("can|apple|cloud|44|1|3", new HashMap<>()); Assert.assertEquals(1, output4.size()); Assert.assertEquals(output4.get(0), "result=197001010844"); @@ -380,7 +380,7 @@ public class TestTransformTemporalFunctionsProcessor { @Test public void testLocalTimeFunction() throws Exception { - String transformSql1 = "select localTime() from source"; + String transformSql1 = "select localtime() from source"; TransformConfig config1 = new TransformConfig(transformSql1); TransformProcessor<String, String> processor1 = TransformProcessor .create(config1, SourceDecoderFactory.createCsvDecoder(csvSource), @@ -395,7 +395,7 @@ public class TestTransformTemporalFunctionsProcessor { Assert.assertTrue(duration1.getSeconds() < 1); // case2: currentTime("UTC") - String transformSql2 = "select currentTime('UTC') from source"; + String transformSql2 = "select current_time('UTC') from source"; TransformConfig config2 = new TransformConfig(transformSql2); TransformProcessor<String, String> processor2 = TransformProcessor .create(config2, SourceDecoderFactory.createCsvDecoder(csvSource), @@ -408,7 +408,7 @@ public class TestTransformTemporalFunctionsProcessor { Assert.assertTrue(duration2.getSeconds() < 1); // case 3: localTime("America/New_York") - String transformSql3 = "select localTime('America/New_York') from source"; + String transformSql3 = "select localtime('America/New_York') from source"; TransformConfig config3 = new TransformConfig(transformSql3); TransformProcessor<String, String> processor3 = TransformProcessor .create(config3, SourceDecoderFactory.createCsvDecoder(csvSource), @@ -423,38 +423,38 @@ public class TestTransformTemporalFunctionsProcessor { @Test public void testTimestampAdd() throws Exception { - String transformSql1 = "select timestampadd('day',string2,string1) from source"; + String transformSql1 = "select timestamp_add('day',string2,string1) from source"; TransformConfig config1 = new TransformConfig(transformSql1); TransformProcessor<String, String> processor1 = TransformProcessor .create(config1, SourceDecoderFactory.createCsvDecoder(csvSource), SinkEncoderFactory.createKvEncoder(kvSink)); - // case1: timestampadd('day',3,'1970-01-01') + // case1: timestamp_add('day',3,'1970-01-01') List<String> output1 = processor1.transform("1970-01-01|3", new HashMap<>()); Assert.assertEquals(1, output1.size()); Assert.assertEquals("result=1970-01-04", output1.get(0)); - // case2: timestampadd('day',-3,'1970-01-01 00:00:44') + // case2: timestamp_add('day',-3,'1970-01-01 00:00:44') List<String> output2 = processor1.transform("1970-01-01 00:00:44|-3", new HashMap<>()); Assert.assertEquals(1, output2.size()); Assert.assertEquals("result=1969-12-29 00:00:44", output2.get(0)); - String transformSql2 = "select timestampadd('MINUTE',string2,string1) from source"; + String transformSql2 = "select timestamp_add('MINUTE',string2,string1) from source"; TransformConfig config2 = new TransformConfig(transformSql2); TransformProcessor<String, String> processor2 = TransformProcessor .create(config2, SourceDecoderFactory.createCsvDecoder(csvSource), SinkEncoderFactory.createKvEncoder(kvSink)); - // case3: timestampadd('MINUTE',3,'1970-01-01 00:00:44') + // case3: timestamp_add('MINUTE',3,'1970-01-01 00:00:44') List<String> output3 = processor2.transform("1970-01-01 00:00:44|3", new HashMap<>()); Assert.assertEquals(1, output3.size()); Assert.assertEquals("result=1970-01-01 00:03:44", output3.get(0)); - // case4: timestampadd('MINUTE',-3,'1970-01-01 00:00:44') + // case4: timestamp_add('MINUTE',-3,'1970-01-01 00:00:44') List<String> output4 = processor2.transform("1970-01-01 00:00:44|-3", new HashMap<>()); Assert.assertEquals(1, output4.size()); Assert.assertEquals("result=1969-12-31 23:57:44", output4.get(0)); - // case5: timestampadd('MINUTE',-3,'1970-01-01') + // case5: timestamp_add('MINUTE',-3,'1970-01-01') List<String> output5 = processor2.transform("1970-01-01|-3", new HashMap<>()); Assert.assertEquals(1, output5.size()); Assert.assertEquals("result=1969-12-31 23:57:00", output5.get(0));