Pārlūkot izejas kodu

定义标准数据类型

穿云 6 mēneši atpakaļ
vecāks
revīzija
bdf69dd7be
20 mainītis faili ar 141 papildinājumiem un 149 dzēšanām
  1. 6 30
      dbsyncer-connector/dbsyncer-connector-mysql/src/main/java/org/dbsyncer/connector/mysql/schema/MySQLSchemaResolver.java
  2. 35 0
      dbsyncer-connector/dbsyncer-connector-mysql/src/main/java/org/dbsyncer/connector/mysql/schema/support/MySQLStringType.java
  3. 35 101
      dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/AbstractDataType.java
  4. 44 0
      dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/AbstractSchemaResolver.java
  5. 3 2
      dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/DataType.java
  6. 4 2
      dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/SchemaResolver.java
  7. 1 1
      dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/support/ArrayType.java
  8. 1 1
      dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/support/BooleanType.java
  9. 1 1
      dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/support/ByteType.java
  10. 1 1
      dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/support/BytesType.java
  11. 1 1
      dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/support/DateType.java
  12. 1 1
      dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/support/DecimalType.java
  13. 1 1
      dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/support/DoubleType.java
  14. 1 1
      dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/support/FloatType.java
  15. 1 1
      dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/support/IntType.java
  16. 1 1
      dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/support/LongType.java
  17. 1 1
      dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/support/ShortType.java
  18. 1 1
      dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/support/StringType.java
  19. 1 1
      dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/support/TimeType.java
  20. 1 1
      dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/support/TimestampType.java

+ 6 - 30
dbsyncer-connector/dbsyncer-connector-mysql/src/main/java/org/dbsyncer/connector/mysql/schema/MySQLSchemaResolver.java

@@ -3,14 +3,10 @@
  */
 package org.dbsyncer.connector.mysql.schema;
 
-import org.dbsyncer.sdk.SdkException;
-import org.dbsyncer.sdk.enums.DataTypeEnum;
-import org.dbsyncer.sdk.model.Field;
+import org.dbsyncer.connector.mysql.schema.support.MySQLStringType;
+import org.dbsyncer.sdk.schema.AbstractSchemaResolver;
 import org.dbsyncer.sdk.schema.DataType;
-import org.dbsyncer.sdk.schema.SchemaResolver;
-import org.dbsyncer.sdk.schema.support.StringType;
 
-import java.util.LinkedHashMap;
 import java.util.Map;
 
 /**
@@ -21,33 +17,13 @@ import java.util.Map;
  * @Version 1.0.0
  * @Date 2024-11-25 22:08
  */
-public final class MySQLSchemaResolver implements SchemaResolver {
-
-    private final Map<DataTypeEnum, DataType> STANDARD_TYPES = new LinkedHashMap<>();
-    private final Map<String, DataType> DATA_TYPES = new LinkedHashMap<>();
-
-    private MySQLSchemaResolver() {
-        DATA_TYPES.putIfAbsent("VARCHAR", new StringType());
-        // TODO
-    }
+public final class MySQLSchemaResolver extends AbstractSchemaResolver {
 
     @Override
-    public Object convert(Object val, Field field) {
-        if (DATA_TYPES.containsKey(field.getTypeName())) {
-            DataType dataType = DATA_TYPES.get(field.getTypeName());
-            if (STANDARD_TYPES.containsKey(dataType.getType())) {
-                return STANDARD_TYPES.get(dataType.getType()).convert(val);
-            }
-        }
-        throw new SdkException(String.format("%s does not support type [%s] convert to [%s], val [%s]", getClass().getSimpleName(), val.getClass(), field.getTypeName(), val));
-    }
+    protected void initDataTypes(Map<String, DataType> map) {
+        map.put("VARCHAR", new MySQLStringType());
+        // TODO
 
-    @Override
-    public Object convertValue(Object val, Field field) {
-        if (DATA_TYPES.containsKey(field.getTypeName())) {
-            return DATA_TYPES.get(field.getTypeName()).convert(val, field);
-        }
-        throw new SdkException(String.format("%s does not support type [%s] convert to [%s], val [%s]", getClass().getSimpleName(), val.getClass(), field.getTypeName(), val));
     }
 
 }

+ 35 - 0
dbsyncer-connector/dbsyncer-connector-mysql/src/main/java/org/dbsyncer/connector/mysql/schema/support/MySQLStringType.java

@@ -0,0 +1,35 @@
+/**
+ * DBSyncer Copyright 2020-2024 All Rights Reserved.
+ */
+package org.dbsyncer.connector.mysql.schema.support;
+
+import org.dbsyncer.sdk.model.Field;
+import org.dbsyncer.sdk.schema.support.StringType;
+
+/**
+ * @Author 穿云
+ * @Version 1.0.0
+ * @Date 2024-11-26 22:24
+ */
+public class MySQLStringType extends StringType {
+    @Override
+    protected String merge(Object val, Field field) {
+        return throwUnsupportedException(val, field);
+    }
+
+    @Override
+    protected String convert(Object val, Field field) {
+        return throwUnsupportedException(val, field);
+    }
+
+    @Override
+    protected String getDefaultMergedVal() {
+        return "";
+    }
+
+    @Override
+    protected Object getDefaultConvertedVal() {
+        return null;
+    }
+
+}

+ 35 - 101
dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/AbstractDataType.java

@@ -24,127 +24,61 @@ public abstract class AbstractDataType<T> implements DataType {
     }
 
     /**
-     * 获取默认值
+     * 转换为标准数据类型
      *
-     * @return null
+     * @param val
+     * @param field
+     * @return
      */
-    protected T getDefaultVal() {
-        return null;
-    }
-
-    protected T convertString(Object val) {
-        return throwUnsupportedException(val);
-    }
-
-    protected T convertByte(Object val) {
-        return throwUnsupportedException(val);
-    }
-
-    protected T convertShort(Object val) {
-        return throwUnsupportedException(val);
-    }
-
-    protected T convertInt(Object val) {
-        return throwUnsupportedException(val);
-    }
-
-    protected T convertLong(Object val) {
-        return throwUnsupportedException(val);
-    }
-
-    protected T convertDecimal(Object val) {
-        return throwUnsupportedException(val);
-    }
-
-    protected T convertDouble(Object val) {
-        return throwUnsupportedException(val);
-    }
-
-    protected T convertFloat(Object val) {
-        return throwUnsupportedException(val);
-    }
-
-    protected T convertBoolean(Object val) {
-        return throwUnsupportedException(val);
-    }
-
-    protected T convertDate(Object val) {
-        return throwUnsupportedException(val);
-    }
+    protected abstract T merge(Object val, Field field);
 
-    protected T convertTime(Object val) {
-        return throwUnsupportedException(val);
-    }
-
-    protected T convertTimeStamp(Object val) {
-        return throwUnsupportedException(val);
-    }
-
-    protected T convertBytes(Object val) {
-        return throwUnsupportedException(val);
-    }
+    /**
+     * 转换为指定数据类型
+     *
+     * @param val
+     * @param field
+     * @return
+     */
+    protected abstract T convert(Object val, Field field);
 
-    protected T convertArray(Object val) {
-        return throwUnsupportedException(val);
-    }
+    /**
+     * 获取默认合并值
+     *
+     * @return
+     */
+    protected abstract T getDefaultMergedVal();
 
-    protected T throwUnsupportedException(Object val) {
-        throw new SdkException(String.format("%s does not support type [%s] convert to [%s], val [%s]", getClass().getSimpleName(), val.getClass(), getType(), val));
-    }
+    /**
+     * 获取默认转换值
+     *
+     * @return
+     */
+    protected abstract Object getDefaultConvertedVal();
 
     protected T throwUnsupportedException(Object val, Field field) {
         throw new SdkException(String.format("%s does not support type [%s] convert to [%s], val [%s]", getClass().getSimpleName(), val.getClass(), field.getTypeName(), val));
     }
 
     @Override
-    public Object convert(Object val) {
-        if (val == null) {
-            return getDefaultVal();
+    public Object mergeValue(Object val, Field field) {
+        if (val == null || field == null) {
+            return getDefaultMergedVal();
         }
-
         // 数据类型匹配
         if (val.getClass().equals(parameterClazz)) {
             return val;
         }
-
         // 异构数据类型转换
-        switch (getType()) {
-            case STRING:
-                return convertString(val);
-            case BYTE:
-                return convertByte(val);
-            case SHORT:
-                return convertShort(val);
-            case INT:
-                return convertInt(val);
-            case LONG:
-                return convertLong(val);
-            case DECIMAL:
-                return convertDecimal(val);
-            case DOUBLE:
-                return convertDouble(val);
-            case FLOAT:
-                return convertFloat(val);
-            case BOOLEAN:
-                return convertBoolean(val);
-            case DATE:
-                return convertDate(val);
-            case TIME:
-                return convertTime(val);
-            case TIMESTAMP:
-                return convertTimeStamp(val);
-            case BYTES:
-                return convertBytes(val);
-            case ARRAY:
-                return convertArray(val);
-            default:
-                return getDefaultVal();
-        }
+        return merge(val, field);
     }
 
     @Override
-    public T convert(Object val, Field field) {
-        return throwUnsupportedException(val, field);
+    public Object convertValue(Object val, Field field) {
+        if (val == null || field == null) {
+            return getDefaultConvertedVal();
+        }
+        // 异构数据类型转换
+        return convert(val, field);
     }
 
     public ConnectorInstance getConnectorInstance() {

+ 44 - 0
dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/AbstractSchemaResolver.java

@@ -0,0 +1,44 @@
+/**
+ * DBSyncer Copyright 2020-2024 All Rights Reserved.
+ */
+package org.dbsyncer.sdk.schema;
+
+import org.dbsyncer.sdk.SdkException;
+import org.dbsyncer.sdk.model.Field;
+import org.springframework.util.Assert;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * @Author 穿云
+ * @Version 1.0.0
+ * @Date 2024-11-26 20:50
+ */
+public abstract class AbstractSchemaResolver implements SchemaResolver {
+
+    private final Map<String, DataType> map = new LinkedHashMap<>();
+
+    public AbstractSchemaResolver() {
+        initDataTypes(map);
+        Assert.notEmpty(map, "At least one data type is required.");
+    }
+
+    protected abstract void initDataTypes(Map<String, DataType> map);
+
+    @Override
+    public Object merge(Object val, Field field) {
+        if (map.containsKey(field.getTypeName())) {
+            return map.get(field.getTypeName()).mergeValue(val, field);
+        }
+        throw new SdkException(String.format("%s does not support type [%s] merge into [%s], val [%s]", getClass().getSimpleName(), val.getClass(), field.getTypeName(), val));
+    }
+
+    @Override
+    public Object convert(Object val, Field field) {
+        if (map.containsKey(field.getTypeName())) {
+            return map.get(field.getTypeName()).convertValue(val, field);
+        }
+        throw new SdkException(String.format("%s does not support type [%s] convert to [%s], val [%s]", getClass().getSimpleName(), val.getClass(), field.getTypeName(), val));
+    }
+}

+ 3 - 2
dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/DataType.java

@@ -17,9 +17,10 @@ public interface DataType {
      * 转换为标准数据类型
      *
      * @param val 转换值
+     * @param field 数据类型
      * @return Object
      */
-    Object convert(Object val);
+    Object mergeValue(Object val, Field field);
 
     /**
      * 转换为指定数据类型
@@ -28,7 +29,7 @@ public interface DataType {
      * @param field 数据类型
      * @return Object
      */
-    Object convert(Object val, Field field);
+    Object convertValue(Object val, Field field);
 
     /**
      * 返回数据类型

+ 4 - 2
dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/SchemaResolver.java

@@ -6,6 +6,8 @@ package org.dbsyncer.sdk.schema;
 import org.dbsyncer.sdk.model.Field;
 
 /**
+ * 数据类型解析器
+ *
  * @Author 穿云
  * @Version 1.0.0
  * @Date 2024-11-25 22:48
@@ -19,7 +21,7 @@ public interface SchemaResolver {
      * @param field 数据类型
      * @return Object
      */
-    Object convert(Object val, Field field);
+    Object merge(Object val, Field field);
 
     /**
      * 转换为指定数据类型
@@ -28,6 +30,6 @@ public interface SchemaResolver {
      * @param field 数据类型
      * @return Object
      */
-    Object convertValue(Object val, Field field);
+    Object convert(Object val, Field field);
 
 }

+ 1 - 1
dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/support/ArrayType.java

@@ -11,7 +11,7 @@ import org.dbsyncer.sdk.schema.AbstractDataType;
  * @Version 1.0.0
  * @Date 2024-11-21 23:56
  */
-public class ArrayType extends AbstractDataType<Object[]> {
+public abstract class ArrayType extends AbstractDataType<Object[]> {
 
     @Override
     public DataTypeEnum getType() {

+ 1 - 1
dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/support/BooleanType.java

@@ -11,7 +11,7 @@ import org.dbsyncer.sdk.schema.AbstractDataType;
  * @Version 1.0.0
  * @Date 2024-11-21 23:56
  */
-public class BooleanType extends AbstractDataType<Boolean> {
+public abstract class BooleanType extends AbstractDataType<Boolean> {
 
     @Override
     public DataTypeEnum getType() {

+ 1 - 1
dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/support/ByteType.java

@@ -11,7 +11,7 @@ import org.dbsyncer.sdk.schema.AbstractDataType;
  * @Version 1.0.0
  * @Date 2024-11-21 23:56
  */
-public class ByteType extends AbstractDataType<Byte> {
+public abstract class ByteType extends AbstractDataType<Byte> {
 
     @Override
     public DataTypeEnum getType() {

+ 1 - 1
dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/support/BytesType.java

@@ -11,7 +11,7 @@ import org.dbsyncer.sdk.schema.AbstractDataType;
  * @Version 1.0.0
  * @Date 2024-11-21 23:56
  */
-public class BytesType extends AbstractDataType<Byte[]> {
+public abstract class BytesType extends AbstractDataType<Byte[]> {
 
     @Override
     public DataTypeEnum getType() {

+ 1 - 1
dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/support/DateType.java

@@ -13,7 +13,7 @@ import java.sql.Date;
  * @Version 1.0.0
  * @Date 2024-11-21 23:56
  */
-public class DateType extends AbstractDataType<Date> {
+public abstract class DateType extends AbstractDataType<Date> {
 
     @Override
     public DataTypeEnum getType() {

+ 1 - 1
dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/support/DecimalType.java

@@ -13,7 +13,7 @@ import java.math.BigDecimal;
  * @Version 1.0.0
  * @Date 2024-11-21 23:56
  */
-public class DecimalType extends AbstractDataType<BigDecimal> {
+public abstract class DecimalType extends AbstractDataType<BigDecimal> {
 
     // 精度:表示数值的总位数,包括小数点前后的位数。例如,数值 123.45 的精度是 5,因为它有 5 位数字。
     private final int precision;

+ 1 - 1
dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/support/DoubleType.java

@@ -11,7 +11,7 @@ import org.dbsyncer.sdk.schema.AbstractDataType;
  * @Version 1.0.0
  * @Date 2024-11-21 23:56
  */
-public class DoubleType extends AbstractDataType<Double> {
+public abstract class DoubleType extends AbstractDataType<Double> {
 
     @Override
     public DataTypeEnum getType() {

+ 1 - 1
dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/support/FloatType.java

@@ -11,7 +11,7 @@ import org.dbsyncer.sdk.schema.AbstractDataType;
  * @Version 1.0.0
  * @Date 2024-11-21 23:56
  */
-public class FloatType extends AbstractDataType<Float> {
+public abstract class FloatType extends AbstractDataType<Float> {
 
     @Override
     public DataTypeEnum getType() {

+ 1 - 1
dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/support/IntType.java

@@ -11,7 +11,7 @@ import org.dbsyncer.sdk.schema.AbstractDataType;
  * @Version 1.0.0
  * @Date 2024-11-21 23:56
  */
-public class IntType extends AbstractDataType<Integer> {
+public abstract class IntType extends AbstractDataType<Integer> {
 
     @Override
     public DataTypeEnum getType() {

+ 1 - 1
dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/support/LongType.java

@@ -11,7 +11,7 @@ import org.dbsyncer.sdk.schema.AbstractDataType;
  * @Version 1.0.0
  * @Date 2024-11-21 23:56
  */
-public class LongType extends AbstractDataType<Long> {
+public abstract class LongType extends AbstractDataType<Long> {
 
     @Override
     public DataTypeEnum getType() {

+ 1 - 1
dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/support/ShortType.java

@@ -11,7 +11,7 @@ import org.dbsyncer.sdk.schema.AbstractDataType;
  * @Version 1.0.0
  * @Date 2024-11-21 23:56
  */
-public class ShortType extends AbstractDataType<Short> {
+public abstract class ShortType extends AbstractDataType<Short> {
 
     @Override
     public DataTypeEnum getType() {

+ 1 - 1
dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/support/StringType.java

@@ -11,7 +11,7 @@ import org.dbsyncer.sdk.schema.AbstractDataType;
  * @Version 1.0.0
  * @Date 2024-11-21 23:56
  */
-public class StringType extends AbstractDataType<String> {
+public abstract class StringType extends AbstractDataType<String> {
 
     @Override
     public DataTypeEnum getType() {

+ 1 - 1
dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/support/TimeType.java

@@ -13,7 +13,7 @@ import java.sql.Time;
  * @Version 1.0.0
  * @Date 2024-11-21 23:56
  */
-public class TimeType extends AbstractDataType<Time> {
+public abstract class TimeType extends AbstractDataType<Time> {
 
     @Override
     public DataTypeEnum getType() {

+ 1 - 1
dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/schema/support/TimestampType.java

@@ -13,7 +13,7 @@ import java.sql.Timestamp;
  * @Version 1.0.0
  * @Date 2024-11-21 23:56
  */
-public class TimestampType extends AbstractDataType<Timestamp> {
+public abstract class TimestampType extends AbstractDataType<Timestamp> {
 
     @Override
     public DataTypeEnum getType() {