This is an automated email from the ASF dual-hosted git repository. dockerzhang 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 2f1c1d8f07 [INLONG-11243][SDK] Enhance the functionality of the substring function in Transform SQL (#11277) 2f1c1d8f07 is described below commit 2f1c1d8f077796c6ee8440b5be5f8704c22d526f Author: Zkplo <87751516+zk...@users.noreply.github.com> AuthorDate: Tue Oct 8 12:48:02 2024 +0800 [INLONG-11243][SDK] Enhance the functionality of the substring function in Transform SQL (#11277) Co-authored-by: ZKpLo <14148880+zk...@user.noreply.gitee.com> --- .../process/function/SubstringFunction.java | 28 ++++++---------- .../function/string/TestSubstringFunction.java | 39 ++++++++++++++++++++++ 2 files changed, 50 insertions(+), 17 deletions(-) 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 727c0484b4..3504faf624 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 @@ -24,13 +24,14 @@ import org.apache.inlong.sdk.transform.process.parser.ValueParser; import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.Function; +import net.sf.jsqlparser.expression.operators.relational.ExpressionList; import java.util.List; /** - * SubstringFunction - * description: substring(string FROM INT1 [ FOR INT2 ])--returns a substring of STRING starting from position INT1 with - * length INT2 (to the end by default) + * SubstringFunction -> substring(string FROM INT1 [ FOR INT2 ]) + * description: + * return a substring of STRING starting from position INT1 with length INT2 (to the end by default) */ @TransformFunction(names = {"substring", "substr"}) public class SubstringFunction implements ValueParser { @@ -39,14 +40,14 @@ public class SubstringFunction implements ValueParser { private ValueParser startPositionParser; private ValueParser lengthParser; - /** - * Constructor - * - * @param expr - */ public SubstringFunction(Function expr) { - List<Expression> expressions = expr.getParameters().getExpressions(); - // Determine the number of arguments and build parser + ExpressionList parameters = expr.getParameters(); + List<Expression> expressions; + if (parameters != null) { + expressions = parameters.getExpressions(); + } else { + expressions = expr.getNamedParameters().getExpressions(); + } stringParser = OperatorTools.buildParser(expressions.get(0)); startPositionParser = OperatorTools.buildParser(expressions.get(1)); if (expressions.size() == 3) { @@ -54,13 +55,6 @@ public class SubstringFunction implements ValueParser { } } - /** - * parse - * - * @param sourceData - * @param rowIndex - * @return - */ @Override public Object parse(SourceData sourceData, int rowIndex, Context context) { Object stringObj = stringParser.parse(sourceData, rowIndex, context); diff --git a/inlong-sdk/transform-sdk/src/test/java/org/apache/inlong/sdk/transform/process/function/string/TestSubstringFunction.java b/inlong-sdk/transform-sdk/src/test/java/org/apache/inlong/sdk/transform/process/function/string/TestSubstringFunction.java index e8931dec52..7d6c03983b 100644 --- a/inlong-sdk/transform-sdk/src/test/java/org/apache/inlong/sdk/transform/process/function/string/TestSubstringFunction.java +++ b/inlong-sdk/transform-sdk/src/test/java/org/apache/inlong/sdk/transform/process/function/string/TestSubstringFunction.java @@ -32,6 +32,11 @@ public class TestSubstringFunction extends AbstractFunctionStringTestBase { @Test public void testSubstringFunction() throws Exception { + String transformSql = null, data = null; + TransformConfig config = null; + TransformProcessor<String, String> processor = null; + List<String> output = null; + String transformSql1 = "select substring(string2, numeric1) from source"; TransformConfig config1 = new TransformConfig(transformSql1); TransformProcessor<String, String> processor1 = TransformProcessor @@ -41,6 +46,7 @@ public class TestSubstringFunction extends AbstractFunctionStringTestBase { List<String> output1 = processor1.transform("apple|banana|cloud|2|1|3", new HashMap<>()); Assert.assertEquals(1, output1.size()); Assert.assertEquals(output1.get(0), "result=anana"); + String transformSql2 = "select substring(string1, numeric1, numeric3) from source"; TransformConfig config2 = new TransformConfig(transformSql2); TransformProcessor<String, String> processor2 = TransformProcessor @@ -54,5 +60,38 @@ public class TestSubstringFunction extends AbstractFunctionStringTestBase { List<String> output3 = processor2.transform("apple|banana|cloud|2|1|9", new HashMap<>()); Assert.assertEquals(1, output3.size()); Assert.assertEquals(output3.get(0), "result=pple"); + + transformSql = "select substring(string1 from numeric1) from source"; + config = new TransformConfig(transformSql); + processor = TransformProcessor + .create(config, SourceDecoderFactory.createCsvDecoder(csvSource), + SinkEncoderFactory.createKvEncoder(kvSink)); + // case4: substring('hello world' from 7) + data = "hello world|||7|3|3"; + output = processor.transform(data, new HashMap<>()); + Assert.assertEquals(1, output.size()); + Assert.assertEquals("result=world", output.get(0)); + + transformSql = "select substring(string1 from numeric1 for numeric2) from source"; + config = new TransformConfig(transformSql); + processor = TransformProcessor + .create(config, SourceDecoderFactory.createCsvDecoder(csvSource), + SinkEncoderFactory.createKvEncoder(kvSink)); + // case5: substring('hello world' from 7 for 3) + data = "hello world|||7|3|3"; + output = processor.transform(data, new HashMap<>()); + Assert.assertEquals(1, output.size()); + Assert.assertEquals("result=wor", output.get(0)); + + transformSql = "select substring(string1 from numericx for numericx) from source"; + config = new TransformConfig(transformSql); + processor = TransformProcessor + .create(config, SourceDecoderFactory.createCsvDecoder(csvSource), + SinkEncoderFactory.createKvEncoder(kvSink)); + // case6: substring('hello world' from null for null) + data = "hello world|||||"; + output = processor.transform(data, new HashMap<>()); + Assert.assertEquals(1, output.size()); + Assert.assertEquals("result=", output.get(0)); } }