This is an automated email from the ASF dual-hosted git repository.
davidzollo pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/seatunnel.git
The following commit(s) were added to refs/heads/dev by this push:
new 2587daa10f [Fix][Transform-V2] Support decimal range bounds (#11855)
2587daa10f is described below
commit 2587daa10fd03ceec437e8e674bc28eaa8d03dc7
Author: Jast <[email protected]>
AuthorDate: Fri Aug 21 10:12:30 2026 +0800
[Fix][Transform-V2] Support decimal range bounds (#11855)
Co-authored-by: zhangshenghang
<[email protected]>
---
.../validator/rule/RangeValidationRule.java | 13 +++++++--
.../validator/DataValidatorTransformTest.java | 32 ++++++++++++++++++++++
2 files changed, 43 insertions(+), 2 deletions(-)
diff --git
a/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/validator/rule/RangeValidationRule.java
b/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/validator/rule/RangeValidationRule.java
index 03c8158244..5ad9b2f1d1 100644
---
a/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/validator/rule/RangeValidationRule.java
+++
b/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/validator/rule/RangeValidationRule.java
@@ -26,6 +26,8 @@ import
org.apache.seatunnel.transform.validator.ValidationResult;
import lombok.Data;
import lombok.NoArgsConstructor;
+import java.math.BigDecimal;
+
/** Validation rule to check if a numeric value is within a specified range. */
@Data
@NoArgsConstructor
@@ -62,7 +64,7 @@ public class RangeValidationRule implements ValidationRule {
// Check minimum value
if (minValue != null) {
- int minComparison = comparableValue.compareTo(minValue);
+ int minComparison = compare(comparableValue, minValue);
if (minInclusive ? minComparison < 0 : minComparison <= 0) {
return ValidationResult.failure(
customMessage != null
@@ -73,7 +75,7 @@ public class RangeValidationRule implements ValidationRule {
// Check maximum value
if (maxValue != null) {
- int maxComparison = comparableValue.compareTo(maxValue);
+ int maxComparison = compare(comparableValue, maxValue);
if (maxInclusive ? maxComparison > 0 : maxComparison >= 0) {
return ValidationResult.failure(
customMessage != null
@@ -85,6 +87,13 @@ public class RangeValidationRule implements ValidationRule {
return ValidationResult.success();
}
+ private int compare(Comparable value, Comparable bound) {
+ if (value instanceof BigDecimal && bound instanceof Number) {
+ return ((BigDecimal) value).compareTo(new
BigDecimal(bound.toString()));
+ }
+ return value.compareTo(bound);
+ }
+
@Override
public String getRuleName() {
return "RANGE";
diff --git
a/seatunnel-transforms-v2/src/test/java/org/apache/seatunnel/transform/validator/DataValidatorTransformTest.java
b/seatunnel-transforms-v2/src/test/java/org/apache/seatunnel/transform/validator/DataValidatorTransformTest.java
index 3687d095cf..c7ef26b72c 100644
---
a/seatunnel-transforms-v2/src/test/java/org/apache/seatunnel/transform/validator/DataValidatorTransformTest.java
+++
b/seatunnel-transforms-v2/src/test/java/org/apache/seatunnel/transform/validator/DataValidatorTransformTest.java
@@ -23,12 +23,14 @@ import
org.apache.seatunnel.api.configuration.ReadonlyConfig;
import org.apache.seatunnel.api.table.catalog.CatalogTable;
import org.apache.seatunnel.api.table.catalog.CatalogTableUtil;
import org.apache.seatunnel.api.table.type.BasicType;
+import org.apache.seatunnel.api.table.type.DecimalType;
import org.apache.seatunnel.api.table.type.SeaTunnelDataType;
import org.apache.seatunnel.api.table.type.SeaTunnelRow;
import org.apache.seatunnel.api.table.type.SeaTunnelRowType;
import org.junit.jupiter.api.Test;
+import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
@@ -140,4 +142,34 @@ public class DataValidatorTransformTest {
assertEquals("db1.source",
producedTables.get(0).getTablePath().toString());
assertEquals("db2.ffp",
producedTables.get(1).getTablePath().toString());
}
+
+ @Test
+ void rangeRuleShouldValidateDecimalFieldAgainstIntegerBounds() {
+ SeaTunnelRowType inputRowType =
+ new SeaTunnelRowType(
+ new String[] {"amount"}, new SeaTunnelDataType[] {new
DecimalType(10, 2)});
+ CatalogTable inputCatalogTable =
+ CatalogTableUtil.getCatalogTable("catalog", "db1", null,
"source", inputRowType);
+ ReadonlyConfig config =
+ ReadonlyConfig.fromMap(
+ ImmutableMap.of(
+ "field_rules",
+ Arrays.asList(
+ ImmutableMap.of(
+ "field_name",
+ "amount",
+ "rules",
+ Arrays.asList(
+ ImmutableMap.of(
+ "rule_type",
+ "RANGE",
+ "min_value",
+ 0,
+ "max_value",
+ 1000))))));
+ DataValidatorTransform transform = new DataValidatorTransform(config,
inputCatalogTable);
+ SeaTunnelRow row = new SeaTunnelRow(new Object[] {new
BigDecimal("99.99")});
+
+ assertEquals(row, transform.map(row));
+ }
}