This is an automated email from the ASF dual-hosted git repository.

wanghailin 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 d308e27733 [Improve][connector-assert]support 'DECIMAL' type and fix 
'Number' type precision issue (#5479)
d308e27733 is described below

commit d308e2773321ca7c6b0c27be51ad122a06b23ea9
Author: Nick <[email protected]>
AuthorDate: Thu Sep 14 17:06:34 2023 +0800

    [Improve][connector-assert]support 'DECIMAL' type and fix 'Number' type 
precision issue (#5479)
---
 .github/workflows/backend.yml                      | 118 +++++++++++++++------
 .../assertion/excecutor/AssertExecutor.java        |  68 +++++++-----
 .../exception/AssertConnectorErrorCode.java        |   3 +-
 .../seatunnel/assertion/rule/AssertRuleParser.java |   2 +
 4 files changed, 133 insertions(+), 58 deletions(-)

diff --git a/.github/workflows/backend.yml b/.github/workflows/backend.yml
index bdf29edb9b..1643b32da3 100644
--- a/.github/workflows/backend.yml
+++ b/.github/workflows/backend.yml
@@ -309,7 +309,7 @@ jobs:
       - name: run updated modules integration test (part-1)
         if: needs.changes.outputs.api == 'false' && 
needs.changes.outputs.it-modules != ''
         run: |
-          sub_modules=`python 
tools/update_modules_check/update_modules_check.py sub_update_it_module 
${{needs.changes.outputs.it-modules}} 5 0`
+          sub_modules=`python 
tools/update_modules_check/update_modules_check.py sub_update_it_module 
${{needs.changes.outputs.it-modules}} 7 0`
           ./mvnw -T 1C -B verify -DskipUT=true -DskipIT=false 
-D"license.skipAddThirdParty"=true --no-snapshot-updates -pl $sub_modules -am 
-Pci
         env:
           MAVEN_OPTS: -Xmx2048m
@@ -334,7 +334,7 @@ jobs:
       - name: run updated modules integration test (part-2)
         if: needs.changes.outputs.api == 'false' && 
needs.changes.outputs.it-modules != ''
         run: |
-          sub_modules=`python 
tools/update_modules_check/update_modules_check.py sub_update_it_module 
${{needs.changes.outputs.it-modules}} 5 1`
+          sub_modules=`python 
tools/update_modules_check/update_modules_check.py sub_update_it_module 
${{needs.changes.outputs.it-modules}} 7 1`
           if [ ! -z $sub_modules ]; then
             ./mvnw -T 1C -B verify -DskipUT=true -DskipIT=false 
-D"license.skipAddThirdParty"=true --no-snapshot-updates -pl $sub_modules -am 
-Pci
           else
@@ -363,7 +363,7 @@ jobs:
       - name: run updated modules integration test (part-3)
         if: needs.changes.outputs.api == 'false' && 
needs.changes.outputs.it-modules != ''
         run: |
-          sub_modules=`python 
tools/update_modules_check/update_modules_check.py sub_update_it_module 
${{needs.changes.outputs.it-modules}} 5 2`
+          sub_modules=`python 
tools/update_modules_check/update_modules_check.py sub_update_it_module 
${{needs.changes.outputs.it-modules}} 7 2`
           if [ ! -z $sub_modules ]; then
             ./mvnw -T 1C -B verify -DskipUT=true -DskipIT=false 
-D"license.skipAddThirdParty"=true --no-snapshot-updates -pl $sub_modules -am 
-Pci
           else
@@ -392,7 +392,7 @@ jobs:
       - name: run updated modules integration test (part-4)
         if: needs.changes.outputs.api == 'false' && 
needs.changes.outputs.it-modules != ''
         run: |
-          sub_modules=`python 
tools/update_modules_check/update_modules_check.py sub_update_it_module 
${{needs.changes.outputs.it-modules}} 5 3`
+          sub_modules=`python 
tools/update_modules_check/update_modules_check.py sub_update_it_module 
${{needs.changes.outputs.it-modules}} 7 3`
           if [ ! -z $sub_modules ]; then
             ./mvnw -T 1C -B verify -DskipUT=true -DskipIT=false 
-D"license.skipAddThirdParty"=true --no-snapshot-updates -pl $sub_modules -am 
-Pci
           else
@@ -401,33 +401,89 @@ jobs:
         env:
           MAVEN_OPTS: -Xmx2048m
   updated-modules-integration-test-part-5:
-      needs: [ changes, sanity-check ]
-      if: needs.changes.outputs.api == 'false' && 
needs.changes.outputs.it-modules != ''
-      runs-on: ${{ matrix.os }}
-      strategy:
-        matrix:
-          java: [ '8', '11' ]
-          os: [ 'ubuntu-latest' ]
-      timeout-minutes: 90
-      steps:
-        - uses: actions/checkout@v2
-        - name: Set up JDK ${{ matrix.java }}
-          uses: actions/setup-java@v3
-          with:
-            java-version: ${{ matrix.java }}
-            distribution: 'temurin'
-            cache: 'maven'
-        - name: run updated modules integration test (part-5)
-          if: needs.changes.outputs.api == 'false' && 
needs.changes.outputs.it-modules != ''
-          run: |
-            sub_modules=`python 
tools/update_modules_check/update_modules_check.py sub_update_it_module 
${{needs.changes.outputs.it-modules}} 5 4`
-            if [ ! -z $sub_modules ]; then
-              ./mvnw -T 1C -B verify -DskipUT=true -DskipIT=false 
-D"license.skipAddThirdParty"=true --no-snapshot-updates -pl $sub_modules -am 
-Pci
-            else
-              echo "sub modules is empty, skipping"
-            fi
-          env:
-            MAVEN_OPTS: -Xmx2048m
+    needs: [ changes, sanity-check ]
+    if: needs.changes.outputs.api == 'false' && 
needs.changes.outputs.it-modules != ''
+    runs-on: ${{ matrix.os }}
+    strategy:
+      matrix:
+        java: [ '8', '11' ]
+        os: [ 'ubuntu-latest' ]
+    timeout-minutes: 90
+    steps:
+      - uses: actions/checkout@v2
+      - name: Set up JDK ${{ matrix.java }}
+        uses: actions/setup-java@v3
+        with:
+          java-version: ${{ matrix.java }}
+          distribution: 'temurin'
+          cache: 'maven'
+      - name: run updated modules integration test (part-5)
+        if: needs.changes.outputs.api == 'false' && 
needs.changes.outputs.it-modules != ''
+        run: |
+          sub_modules=`python 
tools/update_modules_check/update_modules_check.py sub_update_it_module 
${{needs.changes.outputs.it-modules}} 7 4`
+          if [ ! -z $sub_modules ]; then
+            ./mvnw -T 1C -B verify -DskipUT=true -DskipIT=false 
-D"license.skipAddThirdParty"=true --no-snapshot-updates -pl $sub_modules -am 
-Pci
+          else
+            echo "sub modules is empty, skipping"
+          fi
+        env:
+          MAVEN_OPTS: -Xmx2048m
+  updated-modules-integration-test-part-6:
+    needs: [ changes, sanity-check ]
+    if: needs.changes.outputs.api == 'false' && 
needs.changes.outputs.it-modules != ''
+    runs-on: ${{ matrix.os }}
+    strategy:
+      matrix:
+        java: [ '8', '11' ]
+        os: [ 'ubuntu-latest' ]
+    timeout-minutes: 90
+    steps:
+      - uses: actions/checkout@v2
+      - name: Set up JDK ${{ matrix.java }}
+        uses: actions/setup-java@v3
+        with:
+          java-version: ${{ matrix.java }}
+          distribution: 'temurin'
+          cache: 'maven'
+      - name: run updated modules integration test (part-6)
+        if: needs.changes.outputs.api == 'false' && 
needs.changes.outputs.it-modules != ''
+        run: |
+          sub_modules=`python 
tools/update_modules_check/update_modules_check.py sub_update_it_module 
${{needs.changes.outputs.it-modules}} 7 5`
+          if [ ! -z $sub_modules ]; then
+            ./mvnw -T 1C -B verify -DskipUT=true -DskipIT=false 
-D"license.skipAddThirdParty"=true --no-snapshot-updates -pl $sub_modules -am 
-Pci
+          else
+            echo "sub modules is empty, skipping"
+          fi
+        env:
+          MAVEN_OPTS: -Xmx2048m
+  updated-modules-integration-test-part-7:
+    needs: [ changes, sanity-check ]
+    if: needs.changes.outputs.api == 'false' && 
needs.changes.outputs.it-modules != ''
+    runs-on: ${{ matrix.os }}
+    strategy:
+      matrix:
+        java: [ '8', '11' ]
+        os: [ 'ubuntu-latest' ]
+    timeout-minutes: 90
+    steps:
+      - uses: actions/checkout@v2
+      - name: Set up JDK ${{ matrix.java }}
+        uses: actions/setup-java@v3
+        with:
+          java-version: ${{ matrix.java }}
+          distribution: 'temurin'
+          cache: 'maven'
+      - name: run updated modules integration test (part-7)
+        if: needs.changes.outputs.api == 'false' && 
needs.changes.outputs.it-modules != ''
+        run: |
+          sub_modules=`python 
tools/update_modules_check/update_modules_check.py sub_update_it_module 
${{needs.changes.outputs.it-modules}} 7 6`
+          if [ ! -z $sub_modules ]; then
+            ./mvnw -T 1C -B verify -DskipUT=true -DskipIT=false 
-D"license.skipAddThirdParty"=true --no-snapshot-updates -pl $sub_modules -am 
-Pci
+          else
+            echo "sub modules is empty, skipping"
+          fi
+        env:
+          MAVEN_OPTS: -Xmx2048m
   engine-v2-it:
     needs: [ changes, sanity-check ]
     if: needs.changes.outputs.api == 'true'
diff --git 
a/seatunnel-connectors-v2/connector-assert/src/main/java/org/apache/seatunnel/connectors/seatunnel/assertion/excecutor/AssertExecutor.java
 
b/seatunnel-connectors-v2/connector-assert/src/main/java/org/apache/seatunnel/connectors/seatunnel/assertion/excecutor/AssertExecutor.java
index c8666cd9a5..5868fba912 100644
--- 
a/seatunnel-connectors-v2/connector-assert/src/main/java/org/apache/seatunnel/connectors/seatunnel/assertion/excecutor/AssertExecutor.java
+++ 
b/seatunnel-connectors-v2/connector-assert/src/main/java/org/apache/seatunnel/connectors/seatunnel/assertion/excecutor/AssertExecutor.java
@@ -20,6 +20,8 @@ package 
org.apache.seatunnel.connectors.seatunnel.assertion.excecutor;
 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.apache.seatunnel.connectors.seatunnel.assertion.exception.AssertConnectorErrorCode;
+import 
org.apache.seatunnel.connectors.seatunnel.assertion.exception.AssertConnectorException;
 import 
org.apache.seatunnel.connectors.seatunnel.assertion.rule.AssertFieldRule;
 
 import org.apache.commons.lang3.StringUtils;
@@ -27,6 +29,7 @@ import org.apache.commons.lang3.StringUtils;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 
+import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
@@ -108,33 +111,8 @@ public class AssertExecutor {
             return ((Number) value).doubleValue() >= valueRule.getRuleValue();
         }
         if (valueRule.getEqualTo() != null) {
-            if (value instanceof String) {
-                return value.equals(valueRule.getEqualTo());
-            }
-            if (value instanceof Number) {
-                return ((Number) value).doubleValue() == 
Double.parseDouble(valueRule.getEqualTo());
-            }
-            if (value instanceof Boolean) {
-                return 
value.equals(Boolean.parseBoolean(valueRule.getEqualTo()));
-            }
-            if (value instanceof LocalDateTime) {
-                TemporalAccessor parsedTimestamp =
-                        
DateTimeFormatter.ISO_LOCAL_DATE_TIME.parse(valueRule.getEqualTo());
-                LocalTime localTime = 
parsedTimestamp.query(TemporalQueries.localTime());
-                LocalDate localDate = 
parsedTimestamp.query(TemporalQueries.localDate());
-                return ((LocalDateTime) 
value).isEqual(LocalDateTime.of(localDate, localTime));
-            }
-            if (value instanceof LocalDate) {
-                DateTimeFormatter fmt = 
DateTimeFormatter.ofPattern("yyyy-MM-dd");
-                return ((LocalDate) 
value).isEqual(LocalDate.parse(valueRule.getEqualTo(), fmt));
-            }
-            if (value instanceof LocalTime) {
-                DateTimeFormatter fmt = 
DateTimeFormatter.ofPattern("HH:mm:ss");
-                return value.equals(LocalTime.parse(valueRule.getEqualTo(), 
fmt));
-            }
-            return false;
+            return compareValue(value, valueRule);
         }
-
         String valueStr = Objects.isNull(value) ? StringUtils.EMPTY : 
String.valueOf(value);
         if 
(AssertFieldRule.AssertRuleType.MAX_LENGTH.equals(valueRule.getRuleType())) {
             return valueStr.length() <= valueRule.getRuleValue();
@@ -146,6 +124,44 @@ public class AssertExecutor {
         return Boolean.TRUE;
     }
 
+    private boolean compareValue(Object value, AssertFieldRule.AssertRule 
valueRule) {
+        if (value instanceof String) {
+            return value.equals(valueRule.getEqualTo());
+        } else if (value instanceof Integer) {
+            return value.equals(Integer.parseInt(valueRule.getEqualTo()));
+        } else if (value instanceof Long) {
+            return value.equals(Long.parseLong(valueRule.getEqualTo()));
+        } else if (value instanceof Short) {
+            return value.equals(Short.parseShort(valueRule.getEqualTo()));
+        } else if (value instanceof Float) {
+            return value.equals((Float.parseFloat(valueRule.getEqualTo())));
+        } else if (value instanceof Byte) {
+            return value.equals((Byte.parseByte(valueRule.getEqualTo())));
+        } else if (value instanceof Double) {
+            return value.equals(Double.parseDouble(valueRule.getEqualTo()));
+        } else if (value instanceof BigDecimal) {
+            return value.equals(new BigDecimal(valueRule.getEqualTo()));
+        } else if (value instanceof Boolean) {
+            return value.equals(Boolean.parseBoolean(valueRule.getEqualTo()));
+        } else if (value instanceof LocalDateTime) {
+            TemporalAccessor parsedTimestamp =
+                    
DateTimeFormatter.ISO_LOCAL_DATE_TIME.parse(valueRule.getEqualTo());
+            LocalTime localTime = 
parsedTimestamp.query(TemporalQueries.localTime());
+            LocalDate localDate = 
parsedTimestamp.query(TemporalQueries.localDate());
+            return ((LocalDateTime) value).isEqual(LocalDateTime.of(localDate, 
localTime));
+        } else if (value instanceof LocalDate) {
+            DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+            return ((LocalDate) 
value).isEqual(LocalDate.parse(valueRule.getEqualTo(), fmt));
+        } else if (value instanceof LocalTime) {
+            DateTimeFormatter fmt = DateTimeFormatter.ofPattern("HH:mm:ss");
+            return value.equals(LocalTime.parse(valueRule.getEqualTo(), fmt));
+        } else {
+            throw new AssertConnectorException(
+                    AssertConnectorErrorCode.TYPES_NOT_SUPPORTED_FAILED,
+                    String.format(" %s types not supported yet", 
value.getClass().getSimpleName()));
+        }
+    }
+
     private Boolean checkType(Object value, SeaTunnelDataType<?> fieldType) {
         return value.getClass().equals(fieldType.getTypeClass());
     }
diff --git 
a/seatunnel-connectors-v2/connector-assert/src/main/java/org/apache/seatunnel/connectors/seatunnel/assertion/exception/AssertConnectorErrorCode.java
 
b/seatunnel-connectors-v2/connector-assert/src/main/java/org/apache/seatunnel/connectors/seatunnel/assertion/exception/AssertConnectorErrorCode.java
index abb085e283..16ae8aed1c 100644
--- 
a/seatunnel-connectors-v2/connector-assert/src/main/java/org/apache/seatunnel/connectors/seatunnel/assertion/exception/AssertConnectorErrorCode.java
+++ 
b/seatunnel-connectors-v2/connector-assert/src/main/java/org/apache/seatunnel/connectors/seatunnel/assertion/exception/AssertConnectorErrorCode.java
@@ -20,7 +20,8 @@ package 
org.apache.seatunnel.connectors.seatunnel.assertion.exception;
 import org.apache.seatunnel.common.exception.SeaTunnelErrorCode;
 
 public enum AssertConnectorErrorCode implements SeaTunnelErrorCode {
-    RULE_VALIDATION_FAILED("ASSERT-01", "Rule validate failed");
+    RULE_VALIDATION_FAILED("ASSERT-01", "Rule validate failed"),
+    TYPES_NOT_SUPPORTED_FAILED("ASSERT-02", "Types not supported");
 
     private final String code;
     private final String description;
diff --git 
a/seatunnel-connectors-v2/connector-assert/src/main/java/org/apache/seatunnel/connectors/seatunnel/assertion/rule/AssertRuleParser.java
 
b/seatunnel-connectors-v2/connector-assert/src/main/java/org/apache/seatunnel/connectors/seatunnel/assertion/rule/AssertRuleParser.java
index f479dfa5c9..eccf2c6845 100644
--- 
a/seatunnel-connectors-v2/connector-assert/src/main/java/org/apache/seatunnel/connectors/seatunnel/assertion/rule/AssertRuleParser.java
+++ 
b/seatunnel-connectors-v2/connector-assert/src/main/java/org/apache/seatunnel/connectors/seatunnel/assertion/rule/AssertRuleParser.java
@@ -20,6 +20,7 @@ package 
org.apache.seatunnel.connectors.seatunnel.assertion.rule;
 import org.apache.seatunnel.shade.com.typesafe.config.Config;
 
 import org.apache.seatunnel.api.table.type.BasicType;
+import org.apache.seatunnel.api.table.type.DecimalType;
 import org.apache.seatunnel.api.table.type.LocalTimeType;
 import org.apache.seatunnel.api.table.type.SeaTunnelDataType;
 
@@ -105,5 +106,6 @@ public class AssertRuleParser {
         TYPES.put("datetime", LocalTimeType.LOCAL_DATE_TIME_TYPE);
         TYPES.put("date", LocalTimeType.LOCAL_DATE_TYPE);
         TYPES.put("time", LocalTimeType.LOCAL_TIME_TYPE);
+        TYPES.put("decimal", new DecimalType(38, 18));
     }
 }

Reply via email to