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 <[email protected]>
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