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 c4cbc1071f [INLONG-11139][SDK] Transform support Not Between And operator (#11140) c4cbc1071f is described below commit c4cbc1071fd05eed7dea4f978fa4056108eab61d Author: Xincheng Huang <60057611+ying-...@users.noreply.github.com> AuthorDate: Thu Sep 19 11:21:13 2024 +0800 [INLONG-11139][SDK] Transform support Not Between And operator (#11140) --- .../process/operator/BetweenAndOperator.java | 6 ++- .../transform/process/TestBetweenAndOperator.java | 47 ++++++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/operator/BetweenAndOperator.java b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/operator/BetweenAndOperator.java index d6d4b45c27..bd90fef135 100644 --- a/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/operator/BetweenAndOperator.java +++ b/inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/process/operator/BetweenAndOperator.java @@ -34,11 +34,13 @@ public class BetweenAndOperator implements ExpressionOperator { private final ValueParser left; private final ValueParser start; private final ValueParser end; + private final boolean isNot; public BetweenAndOperator(Between expr) { this.left = OperatorTools.buildParser(expr.getLeftExpression()); this.start = OperatorTools.buildParser(expr.getBetweenExpressionStart()); this.end = OperatorTools.buildParser(expr.getBetweenExpressionEnd()); + this.isNot = expr.isNot(); } @SuppressWarnings("rawtypes") @@ -48,7 +50,9 @@ public class BetweenAndOperator implements ExpressionOperator { Comparable startValue = (Comparable) this.start.parse(sourceData, rowIndex, context); Comparable endValue = (Comparable) this.end.parse(sourceData, rowIndex, context); - return OperatorTools.compareValue(leftValue, startValue) >= 0 && + boolean result = OperatorTools.compareValue(leftValue, startValue) >= 0 && OperatorTools.compareValue(leftValue, endValue) <= 0; + + return this.isNot != result; } } \ No newline at end of file diff --git a/inlong-sdk/transform-sdk/src/test/java/org/apache/inlong/sdk/transform/process/TestBetweenAndOperator.java b/inlong-sdk/transform-sdk/src/test/java/org/apache/inlong/sdk/transform/process/TestBetweenAndOperator.java index 23b9693bca..159e833d6f 100644 --- a/inlong-sdk/transform-sdk/src/test/java/org/apache/inlong/sdk/transform/process/TestBetweenAndOperator.java +++ b/inlong-sdk/transform-sdk/src/test/java/org/apache/inlong/sdk/transform/process/TestBetweenAndOperator.java @@ -99,4 +99,51 @@ public class TestBetweenAndOperator { Assert.assertEquals(1, output1.size()); Assert.assertEquals(output8.get(0), "result=0"); } + + @Test + public void testNotBetweenAndOperator() throws Exception { + String transformSql = "select if(string2 not between 3 and 5,1,0) from source"; + TransformConfig config = new TransformConfig(transformSql); + // case1: '3a' not between '3' and '5' -> 0 + TransformProcessor<String, String> processor = TransformProcessor + .create(config, SourceDecoderFactory.createCsvDecoder(csvSource), + SinkEncoderFactory.createKvEncoder(kvSink)); + List<String> output1 = processor.transform("3.14159265358979323846|3a|4|8"); + Assert.assertEquals(1, output1.size()); + Assert.assertEquals(output1.get(0), "result=0"); + // case2: '4a' not between '3' and '5' -> 0 + List<String> output2 = processor.transform("3.14159265358979323846|4a|4|8"); + Assert.assertEquals(1, output1.size()); + Assert.assertEquals(output2.get(0), "result=0"); + // case3: '6' not between '3' and '5' -> 1 + List<String> output3 = processor.transform("3.14159265358979323846|6|4|8"); + Assert.assertEquals(1, output1.size()); + Assert.assertEquals(output3.get(0), "result=1"); + // case4: '3e2' not between '3' and '5' -> 1 + List<String> output4 = processor.transform("3.14159265358979323846|3e2|4|8"); + Assert.assertEquals(1, output1.size()); + Assert.assertEquals(output4.get(0), "result=1"); + + transformSql = "select if(numeric3 not between 3 and 5,1,0) from source"; + config = new TransformConfig(transformSql); + // case5: 4 not between 3 and 5 -> 0 + processor = TransformProcessor + .create(config, SourceDecoderFactory.createCsvDecoder(csvSource), + SinkEncoderFactory.createKvEncoder(kvSink)); + List<String> output5 = processor.transform("3.14159265358979323846|4|4|8"); + Assert.assertEquals(1, output1.size()); + Assert.assertEquals(output5.get(0), "result=0"); + // case6: 3 not between 3 and 5 -> 0 + List<String> output6 = processor.transform("3.14159265358979323846|4|3|8"); + Assert.assertEquals(1, output1.size()); + Assert.assertEquals(output6.get(0), "result=0"); + // case7: 5 not between 3 and 5 -> 0 + List<String> output7 = processor.transform("3.14159265358979323846|4|5|8"); + Assert.assertEquals(1, output1.size()); + Assert.assertEquals(output7.get(0), "result=0"); + // case8: 3e2 not between 3 and 5 -> 1 + List<String> output8 = processor.transform("3.14159265358979323846|4|3e2|8"); + Assert.assertEquals(1, output1.size()); + Assert.assertEquals(output8.get(0), "result=1"); + } } \ No newline at end of file