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 d8a09abac2 [INLONG-10944][SDK] Support Inlong Transform parser annotation (#10945) d8a09abac2 is described below commit d8a09abac25615e66f7893e90858b726a6c0fa61 Author: emptyOVO <118812562+empty...@users.noreply.github.com> AuthorDate: Sat Aug 31 18:45:36 2024 +0800 [INLONG-10944][SDK] Support Inlong Transform parser annotation (#10945) * [INLONG-10944][SDK] Support Inlong Transform parser annotation * fix: naming notations * fix: remove the check of class==null * fix: code standard check * fix: naming Convention --- .../transform/process/operator/OperatorTools.java | 55 +-------------- .../transform/process/parser/AdditionParser.java | 1 + .../sdk/transform/process/parser/ColumnParser.java | 1 + .../sdk/transform/process/parser/DateParser.java | 1 + .../transform/process/parser/DivisionParser.java | 1 + .../sdk/transform/process/parser/DoubleParser.java | 1 + .../sdk/transform/process/parser/LongParser.java | 1 + .../sdk/transform/process/parser/ModuloParser.java | 1 + .../process/parser/MultiplicationParser.java | 1 + .../process/parser/ParenthesisParser.java | 1 + .../sdk/transform/process/parser/ParserTools.java | 79 ++++++++++++++++++++++ .../sdk/transform/process/parser/SignParser.java | 1 + .../sdk/transform/process/parser/StringParser.java | 1 + .../process/parser/SubtractionParser.java | 1 + .../transform/process/parser/TimestampParser.java | 1 + .../{DoubleParser.java => TransformParser.java} | 27 +++----- 16 files changed, 105 insertions(+), 69 deletions(-) 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 90405d687c..dbe12ff814 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 @@ -18,36 +18,14 @@ package org.apache.inlong.sdk.transform.process.operator; 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; -import org.apache.inlong.sdk.transform.process.parser.DivisionParser; -import org.apache.inlong.sdk.transform.process.parser.DoubleParser; -import org.apache.inlong.sdk.transform.process.parser.LongParser; -import org.apache.inlong.sdk.transform.process.parser.ModuloParser; -import org.apache.inlong.sdk.transform.process.parser.MultiplicationParser; -import org.apache.inlong.sdk.transform.process.parser.ParenthesisParser; -import org.apache.inlong.sdk.transform.process.parser.SignParser; -import org.apache.inlong.sdk.transform.process.parser.StringParser; -import org.apache.inlong.sdk.transform.process.parser.SubtractionParser; -import org.apache.inlong.sdk.transform.process.parser.TimestampParser; +import org.apache.inlong.sdk.transform.process.parser.ParserTools; import org.apache.inlong.sdk.transform.process.parser.ValueParser; -import net.sf.jsqlparser.expression.DateValue; -import net.sf.jsqlparser.expression.DoubleValue; import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.Function; -import net.sf.jsqlparser.expression.LongValue; import net.sf.jsqlparser.expression.NotExpression; import net.sf.jsqlparser.expression.Parenthesis; -import net.sf.jsqlparser.expression.SignedExpression; -import net.sf.jsqlparser.expression.StringValue; -import net.sf.jsqlparser.expression.TimestampValue; -import net.sf.jsqlparser.expression.operators.arithmetic.Addition; -import net.sf.jsqlparser.expression.operators.arithmetic.Division; -import net.sf.jsqlparser.expression.operators.arithmetic.Modulo; -import net.sf.jsqlparser.expression.operators.arithmetic.Multiplication; -import net.sf.jsqlparser.expression.operators.arithmetic.Subtraction; import net.sf.jsqlparser.expression.operators.conditional.AndExpression; import net.sf.jsqlparser.expression.operators.conditional.OrExpression; import net.sf.jsqlparser.expression.operators.relational.EqualsTo; @@ -56,7 +34,6 @@ import net.sf.jsqlparser.expression.operators.relational.GreaterThanEquals; import net.sf.jsqlparser.expression.operators.relational.MinorThan; import net.sf.jsqlparser.expression.operators.relational.MinorThanEquals; import net.sf.jsqlparser.expression.operators.relational.NotEqualsTo; -import net.sf.jsqlparser.schema.Column; import org.apache.commons.lang.ObjectUtils; import java.math.BigDecimal; @@ -99,33 +76,7 @@ public class OperatorTools { } public static ValueParser buildParser(Expression expr) { - if (expr instanceof Column) { - return new ColumnParser((Column) expr); - } else if (expr instanceof StringValue) { - return new StringParser((StringValue) expr); - } else if (expr instanceof LongValue) { - return new LongParser((LongValue) expr); - } else if (expr instanceof DoubleValue) { - return new DoubleParser((DoubleValue) expr); - } else if (expr instanceof SignedExpression) { - return new SignParser((SignedExpression) expr); - } else if (expr instanceof Parenthesis) { - return new ParenthesisParser((Parenthesis) expr); - } else if (expr instanceof Addition) { - return new AdditionParser((Addition) expr); - } else if (expr instanceof Subtraction) { - return new SubtractionParser((Subtraction) expr); - } else if (expr instanceof Multiplication) { - return new MultiplicationParser((Multiplication) expr); - } else if (expr instanceof Division) { - return new DivisionParser((Division) expr); - } else if (expr instanceof Modulo) { - return new ModuloParser((Modulo) expr); - } else if (expr instanceof DateValue) { - return new DateParser((DateValue) expr); - } else if (expr instanceof TimestampValue) { - return new TimestampParser((TimestampValue) expr); - } else if (expr instanceof Function) { + if (expr instanceof Function) { String exprString = expr.toString(); if (exprString.startsWith(ROOT_KEY) || exprString.startsWith(CHILD_KEY)) { return new ColumnParser((Function) expr); @@ -133,7 +84,7 @@ public class OperatorTools { return FunctionTools.getTransformFunction((Function) expr); } } - return null; + return ParserTools.getTransformParser(expr); } /** diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/AdditionParser.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/AdditionParser.java index 08474fe81f..13536be30d 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/AdditionParser.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/AdditionParser.java @@ -29,6 +29,7 @@ import java.math.BigDecimal; * AdditionParser * */ +@TransformParser(values = Addition.class) public class AdditionParser implements ValueParser { private final ValueParser left; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/ColumnParser.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/ColumnParser.java index 3a5000a57f..ebec767375 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/ColumnParser.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/ColumnParser.java @@ -27,6 +27,7 @@ import net.sf.jsqlparser.schema.Column; * ColumnParser * */ +@TransformParser(values = Column.class) public class ColumnParser implements ValueParser { private final String fieldName; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/DateParser.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/DateParser.java index 0f0da4345d..4ded1cafd9 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/DateParser.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/DateParser.java @@ -28,6 +28,7 @@ import java.sql.Date; * DateParser * description: parse the sql expression to a java.sql.Date object */ +@TransformParser(values = DateValue.class) public class DateParser implements ValueParser { private final Date dateValue; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/DivisionParser.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/DivisionParser.java index 61cf1bb82f..343481372e 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/DivisionParser.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/DivisionParser.java @@ -29,6 +29,7 @@ import java.math.BigDecimal; * DivisionParser * */ +@TransformParser(values = Division.class) public class DivisionParser implements ValueParser { private ValueParser left; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/DoubleParser.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/DoubleParser.java index 2f50b5311b..ad39558a11 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/DoubleParser.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/DoubleParser.java @@ -25,6 +25,7 @@ import net.sf.jsqlparser.expression.DoubleValue; /** * LongParser */ +@TransformParser(values = DoubleValue.class) public class DoubleParser implements ValueParser { private final Double value; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/LongParser.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/LongParser.java index 7abb8af77c..acad3cf91c 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/LongParser.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/LongParser.java @@ -26,6 +26,7 @@ import net.sf.jsqlparser.expression.LongValue; * LongParser * */ +@TransformParser(values = LongValue.class) public class LongParser implements ValueParser { private final Long value; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/ModuloParser.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/ModuloParser.java index ca0a841170..e995a6535c 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/ModuloParser.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/ModuloParser.java @@ -29,6 +29,7 @@ import java.math.BigDecimal; * ModuloParser * description: analyze the % expression */ +@TransformParser(values = Modulo.class) public class ModuloParser implements ValueParser { private ValueParser left; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/MultiplicationParser.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/MultiplicationParser.java index f7299dcf8c..af71b8b240 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/MultiplicationParser.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/MultiplicationParser.java @@ -29,6 +29,7 @@ import java.math.BigDecimal; * MultiplicationParser * */ +@TransformParser(values = Multiplication.class) public class MultiplicationParser implements ValueParser { private final ValueParser left; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/ParenthesisParser.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/ParenthesisParser.java index 1899017087..bb046aff5f 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/ParenthesisParser.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/ParenthesisParser.java @@ -27,6 +27,7 @@ import net.sf.jsqlparser.expression.Parenthesis; * ParenthesisParser * */ +@TransformParser(values = Parenthesis.class) public class ParenthesisParser implements ValueParser { private final ValueParser node; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/ParserTools.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/ParserTools.java new file mode 100644 index 0000000000..a68259e3c9 --- /dev/null +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/ParserTools.java @@ -0,0 +1,79 @@ +/* + * 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.parser; + +import com.google.common.collect.Maps; +import lombok.extern.slf4j.Slf4j; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.schema.Column; +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 ParserTools { + + private static final String PARSER_PATH = "org.apache.inlong.sdk.transform.process.parser"; + private final static Map<Class<? extends Expression>, Class<?>> parserMap = Maps.newConcurrentMap(); + + static { + init(); + } + private static void init() { + Reflections reflections = new Reflections(PARSER_PATH, Scanners.TypesAnnotated); + Set<Class<?>> clazzSet = reflections.getTypesAnnotatedWith(TransformParser.class); + for (Class<?> clazz : clazzSet) { + if (ValueParser.class.isAssignableFrom(clazz)) { + TransformParser annotation = clazz.getAnnotation(TransformParser.class); + if (annotation == null) { + continue; + } + Class<? extends Expression>[] values = annotation.values(); + for (Class<? extends Expression> value : values) { + parserMap.compute(value, (key, former) -> { + if (former != null) { + log.warn("find a conflict for parser class [{}], the former one is [{}], new one is [{}]", + key, former.getName(), clazz.getName()); + } + return clazz; + }); + } + } + } + } + + public static ValueParser getTransformParser(Expression expr) { + Class<?> clazz = parserMap.get(expr.getClass()); + if (clazz == null) { + return new ColumnParser((Column) expr); + } + try { + Constructor<?> constructor = clazz.getDeclaredConstructor(expr.getClass()); + return (ValueParser) constructor.newInstance(expr); + } catch (NoSuchMethodException e) { + log.error("transform parser {} needs one constructor that accept one params whose type is {}", + clazz.getName(), expr.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/parser/SignParser.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/SignParser.java index 360fc0d0f6..ff97aadfdb 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/SignParser.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/SignParser.java @@ -29,6 +29,7 @@ import java.math.BigDecimal; * SignParser * */ +@TransformParser(values = SignedExpression.class) public class SignParser implements ValueParser { private final Integer sign; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/StringParser.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/StringParser.java index 9ce0646cc9..934d99c42e 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/StringParser.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/StringParser.java @@ -26,6 +26,7 @@ import net.sf.jsqlparser.expression.StringValue; * StringParser * */ +@TransformParser(values = StringValue.class) public class StringParser implements ValueParser { private final String stringValue; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/SubtractionParser.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/SubtractionParser.java index 15d534d50f..140a1dc995 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/SubtractionParser.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/SubtractionParser.java @@ -29,6 +29,7 @@ import java.math.BigDecimal; * SubtractionParser * */ +@TransformParser(values = Subtraction.class) public class SubtractionParser implements ValueParser { private ValueParser left; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/TimestampParser.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/TimestampParser.java index 1971ba722a..3bb22e076a 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/TimestampParser.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/TimestampParser.java @@ -28,6 +28,7 @@ import java.sql.Timestamp; * DateParser * description: parse the sql expression to a java.sql.Timestamp object */ +@TransformParser(values = TimestampValue.class) public class TimestampParser implements ValueParser { private final Timestamp timestampValue; diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/DoubleParser.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/TransformParser.java similarity index 64% copy from inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/DoubleParser.java copy to inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/TransformParser.java index 2f50b5311b..4af20d8e56 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/DoubleParser.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/parser/TransformParser.java @@ -17,24 +17,17 @@ package org.apache.inlong.sdk.transform.process.parser; -import org.apache.inlong.sdk.transform.decode.SourceData; -import org.apache.inlong.sdk.transform.process.Context; +import net.sf.jsqlparser.expression.Expression; -import net.sf.jsqlparser.expression.DoubleValue; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; -/** - * LongParser - */ -public class DoubleParser implements ValueParser { - - private final Double value; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; - public DoubleParser(DoubleValue expr) { - this.value = expr.getValue(); - } +@Retention(RUNTIME) +@Target(TYPE) +public @interface TransformParser { - @Override - public Object parse(SourceData sourceData, int rowIndex, Context context) { - return value; - } -} \ No newline at end of file + Class<? extends Expression>[] values(); +}