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

Reply via email to