浏览代码

简化代码

AE86 1 年之前
父节点
当前提交
23504071d6
共有 16 个文件被更改,包括 212 次插入337 次删除
  1. 4 4
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/config/DDLConfig.java
  2. 6 3
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/enums/DDLOperationEnum.java
  3. 3 5
      dbsyncer-listener/src/main/java/org/dbsyncer/listener/mysql/MySQLExtractor.java
  4. 17 4
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/ddl/AlterStrategy.java
  5. 18 6
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/ddl/DDLParser.java
  6. 20 17
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/ddl/alter/AddStrategy.java
  7. 0 65
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/ddl/alter/AlterStrategy.java
  8. 10 11
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/ddl/alter/ChangeStrategy.java
  9. 12 11
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/ddl/alter/DropStrategy.java
  10. 12 10
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/ddl/alter/ModifyStrategy.java
  11. 0 50
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/ddl/factory/ParserFactory.java
  12. 90 8
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/ddl/impl/DDLParserImpl.java
  13. 0 40
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/ddl/jsql/JsqParserFactory.java
  14. 0 13
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/ddl/strategy/JsqlParserStrategy.java
  15. 0 5
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/ddl/strategy/Strategy.java
  16. 20 85
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/flush/impl/GeneralBufferActuator.java

+ 4 - 4
dbsyncer-connector/src/main/java/org/dbsyncer/connector/config/DDLConfig.java

@@ -1,11 +1,11 @@
 package org.dbsyncer.connector.config;
 
-import java.util.LinkedList;
-import java.util.List;
-import net.sf.jsqlparser.statement.alter.AlterOperation;
 import org.dbsyncer.connector.enums.DDLOperationEnum;
 import org.dbsyncer.connector.model.Field;
 
+import java.util.LinkedList;
+import java.util.List;
+
 public class DDLConfig {
     /**
      * 执行命令
@@ -71,4 +71,4 @@ public class DDLConfig {
     public void setDdlOperationEnum(DDLOperationEnum ddlOperationEnum) {
         this.ddlOperationEnum = ddlOperationEnum;
     }
-}
+}

+ 6 - 3
dbsyncer-connector/src/main/java/org/dbsyncer/connector/enums/DDLOperationEnum.java

@@ -2,12 +2,15 @@ package org.dbsyncer.connector.enums;
 
 
 /**
- * @author life
+ * 支持同步的DDL命令
+ *
+ * @version 1.0.0
+ * @Author life
+ * @Date 2023-09-24 14:24
  */
-
 public enum DDLOperationEnum {
     ALTER_MODIFY,
     ALTER_ADD,
     ALTER_DROP,
     ALTER_CHANGE;
-}
+}

+ 3 - 5
dbsyncer-listener/src/main/java/org/dbsyncer/listener/mysql/MySQLExtractor.java

@@ -312,18 +312,16 @@ public class MySQLExtractor extends AbstractDatabaseExtractor {
         private void parseDDL(QueryEventData data) {
             if (StringUtil.startsWith(data.getSql(), ConnectorConstant.OPERTION_ALTER)) {
                 try {
-                    Alter alter = (Alter) CCJSqlParserUtil.parse(data.getSql());
-                    String tableName =alter.getTable().getName();
-                    tableName = StringUtil.replace(tableName,"`","");
                     // ALTER TABLE `test`.`my_user` MODIFY COLUMN `name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL AFTER `id`
+                    Alter alter = (Alter) CCJSqlParserUtil.parse(data.getSql());
+                    String tableName = StringUtil.replace(alter.getTable().getName(),"`","");
                     if (isFilterTable(data.getDatabase(), tableName)) {
                         logger.info("sql:{}", data.getSql());
                         changeEvent(new DDLChangedEvent(data.getDatabase(), tableName, ConnectorConstant.OPERTION_ALTER, data.getSql(), client.getBinlogFilename(), client.getBinlogPosition()));
                     }
                 } catch (JSQLParserException e) {
-                    throw new RuntimeException(e);
+                    logger.error(e.getMessage(), e);
                 }
-
             }
         }
 

+ 17 - 4
dbsyncer-parser/src/main/java/org/dbsyncer/parser/ddl/alter/ExpressionStrategy.java → dbsyncer-parser/src/main/java/org/dbsyncer/parser/ddl/AlterStrategy.java

@@ -1,13 +1,26 @@
-package org.dbsyncer.parser.ddl.alter;
+package org.dbsyncer.parser.ddl;
 
-import java.util.List;
 import net.sf.jsqlparser.statement.alter.AlterExpression;
 import org.dbsyncer.connector.config.DDLConfig;
 import org.dbsyncer.parser.model.FieldMapping;
 
+import java.util.List;
+
 /**
- * @author life
+ * Alter策略
+ *
+ * @version 1.0.0
+ * @Author life
+ * @Date 2023-09-24 14:24
  */
-public interface ExpressionStrategy {
+public interface AlterStrategy {
+
+    /**
+     * 解析DDLConfig
+     *
+     * @param expression
+     * @param ddlConfig
+     * @param fieldMappingList
+     */
     void parse(AlterExpression expression, DDLConfig ddlConfig, List<FieldMapping> fieldMappingList);
 }

+ 18 - 6
dbsyncer-parser/src/main/java/org/dbsyncer/parser/ddl/DDLParser.java

@@ -1,19 +1,31 @@
 package org.dbsyncer.parser.ddl;
 
-import java.util.List;
 import org.dbsyncer.connector.config.DDLConfig;
+import org.dbsyncer.connector.model.MetaInfo;
 import org.dbsyncer.parser.model.FieldMapping;
 
+import java.util.List;
+
 public interface DDLParser {
 
     /**
      * 解析DDL配置
      *
-     * @param sql 源表ALTER语句
-     * @param targetConnectorType 目标连接器类型
-     * @param targetTableName 目标表
+     * @param sql                   源表ALTER语句
+     * @param targetConnectorType   目标连接器类型
+     * @param targetTableName       目标表
+     * @param originalFieldMappings 字段映射关系
      * @return
      */
-    DDLConfig parseDDlConfig(String sql, String targetConnectorType, String targetTableName,
-            List<FieldMapping> fieldMappings);
+    DDLConfig parseDDlConfig(String sql, String targetConnectorType, String targetTableName, List<FieldMapping> originalFieldMappings);
+
+    /**
+     * 刷新字段映射关系(根据原来的映射关系和更改的字段进行新关系的映射组合)
+     *
+     * @param originalFieldMappings
+     * @param originMetaInfo
+     * @param targetMetaInfo
+     * @param targetDDLConfig
+     */
+    List<FieldMapping> refreshFiledMappings(List<FieldMapping> originalFieldMappings, MetaInfo originMetaInfo, MetaInfo targetMetaInfo, DDLConfig targetDDLConfig);
 }

+ 20 - 17
dbsyncer-parser/src/main/java/org/dbsyncer/parser/ddl/alter/AddStrategy.java

@@ -1,48 +1,51 @@
 package org.dbsyncer.parser.ddl.alter;
 
-import java.util.LinkedList;
-import java.util.List;
 import net.sf.jsqlparser.statement.alter.AlterExpression;
 import org.dbsyncer.common.util.StringUtil;
 import org.dbsyncer.connector.config.DDLConfig;
+import org.dbsyncer.connector.enums.DDLOperationEnum;
 import org.dbsyncer.connector.model.Field;
+import org.dbsyncer.parser.ddl.AlterStrategy;
 import org.dbsyncer.parser.model.FieldMapping;
 
+import java.util.LinkedList;
+import java.util.List;
+
 /**
- * 解析add的属性
+ * 解析add的属性(新增字段,只需要替换表名不需要替换sql)
  * exampleSql: ALTER TABLE cost ADD duan INT after(before) `tmp`;
+ *
  * @author life
  */
-public class AddStrategy implements ExpressionStrategy{
+public class AddStrategy implements AlterStrategy {
 
     @Override
-    public void parse(AlterExpression expression, DDLConfig ddlConfig,
-            List<FieldMapping> fieldMappingList) {
+    public void parse(AlterExpression expression, DDLConfig ddlConfig, List<FieldMapping> originalFieldMappings) {
         for (AlterExpression.ColumnDataType columnDataType : expression.getColDataTypeList()) {
             boolean findColumn = false;
             List<String> columnSpecs = new LinkedList<>();
-            for (String spe:columnDataType.getColumnSpecs()) {//对一before,after进行处理
-                spe = StringUtil.replace(spe,"`","");
-                if (findColumn){
-                    //对before(after)字段进行映射
+            // 对一before,after进行处理
+            for (String spe : columnDataType.getColumnSpecs()) {
+                spe = StringUtil.replace(spe, "`", "");
+                if (findColumn) {
+                    // 对before(after)字段进行映射
                     String finalSpe = spe;
-                    FieldMapping fieldMapping = fieldMappingList.stream().filter(x->x.getSource().getName().equals(
-                            finalSpe)).findFirst().get();
+                    FieldMapping fieldMapping = originalFieldMappings.stream().filter(x -> StringUtil.equals(x.getSource().getName(), finalSpe)).findFirst().get();
                     columnSpecs.add(fieldMapping.getTarget().getName());
                     findColumn = false;
                     continue;
                 }
 
-                if (StringUtil.equalsIgnoreCase(spe,"before") || StringUtil.equalsIgnoreCase(spe,"after")){
-                    findColumn =true;
+                if (StringUtil.equalsIgnoreCase(spe, "before") || StringUtil.equalsIgnoreCase(spe, "after")) {
+                    findColumn = true;
                 }
                 columnSpecs.add(spe);
             }
             columnDataType.setColumnSpecs(columnSpecs);
-            String columName = columnDataType.getColumnName();
-            columName = StringUtil.replace(columName, "`", "");
-            Field field = new Field(columName,columnDataType.getColDataType().getDataType(),0);//感觉不需要都行,只需要名称,后续可以自己刷新
+            String columnName = StringUtil.replace(columnDataType.getColumnName(), "`", "");
+            Field field = new Field(columnName, columnDataType.getColDataType().getDataType(), 0);//感觉不需要都行,只需要名称,后续可以自己刷新
             ddlConfig.getAddFields().add(field);
         }
+        ddlConfig.setDdlOperationEnum(DDLOperationEnum.ALTER_ADD);
     }
 }

+ 0 - 65
dbsyncer-parser/src/main/java/org/dbsyncer/parser/ddl/alter/AlterStrategy.java

@@ -1,65 +0,0 @@
-package org.dbsyncer.parser.ddl.alter;
-
-import java.util.LinkedList;
-import java.util.List;
-import net.sf.jsqlparser.statement.alter.Alter;
-import net.sf.jsqlparser.statement.alter.AlterExpression;
-import net.sf.jsqlparser.statement.alter.AlterOperation;
-import org.dbsyncer.common.util.StringUtil;
-import org.dbsyncer.connector.config.DDLConfig;
-import org.dbsyncer.connector.enums.DDLOperationEnum;
-import org.dbsyncer.connector.model.Field;
-import org.dbsyncer.parser.ddl.strategy.JsqlParserStrategy;
-import org.dbsyncer.parser.model.FieldMapping;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * @author life
- */
-public class AlterStrategy implements JsqlParserStrategy {
-
-    private final Logger logger = LoggerFactory.getLogger(getClass());
-
-    Alter alter;
-
-    DDLConfig ddlConfig;
-
-    List<FieldMapping> fieldMappingList;
-
-    String targetName;
-
-    public AlterStrategy(Alter alter, DDLConfig ddlConfig, List<FieldMapping> fieldMappingList,
-            String targetName) {
-        this.alter = alter;
-        this.ddlConfig = ddlConfig;
-        this.fieldMappingList = fieldMappingList;
-        this.targetName = targetName;
-    }
-
-    @Override
-    public void parser() {
-        // 替换成目标表名
-        alter.getTable().setName(targetName);
-        for (AlterExpression expression : alter.getAlterExpressions()) {
-            AlterOperation alterOperation = expression.getOperation();
-            ExpressionStrategy expressionStrategy = null;
-            if (alterOperation == AlterOperation.MODIFY) {//修改属性
-                ddlConfig.setDdlOperationEnum(DDLOperationEnum.ALTER_MODIFY);
-                expressionStrategy = new ModifyStrategy();
-            } else if (AlterOperation.ADD == alterOperation) {//新增字段,只需要替换表名不需要替换sql
-                ddlConfig.setDdlOperationEnum(DDLOperationEnum.ALTER_ADD);
-                expressionStrategy =new AddStrategy();
-            }else if (AlterOperation.CHANGE == alterOperation){
-                ddlConfig.setDdlOperationEnum(DDLOperationEnum.ALTER_CHANGE);
-                expressionStrategy = new ChangeStrategy();
-            }else if (AlterOperation.DROP == alterOperation){
-                ddlConfig.setDdlOperationEnum(DDLOperationEnum.ALTER_DROP);
-                expressionStrategy = new DropStrategy();
-            }
-            expressionStrategy.parse(expression,ddlConfig,fieldMappingList);
-            ddlConfig.setSql(alter.toString());
-        }
-
-    }
-}

+ 10 - 11
dbsyncer-parser/src/main/java/org/dbsyncer/parser/ddl/alter/ChangeStrategy.java

@@ -1,34 +1,33 @@
 package org.dbsyncer.parser.ddl.alter;
 
-import java.util.List;
 import net.sf.jsqlparser.statement.alter.AlterExpression;
 import org.dbsyncer.common.util.StringUtil;
 import org.dbsyncer.connector.config.DDLConfig;
+import org.dbsyncer.connector.enums.DDLOperationEnum;
+import org.dbsyncer.parser.ddl.AlterStrategy;
 import org.dbsyncer.parser.model.FieldMapping;
 
+import java.util.List;
+
 /**
  * 解析change属性
  * exampleSql: ALTER TABLE test_table CHANGE duan1  duan2 INT(10)
+ *
  * @author life
  */
-public class ChangeStrategy implements ExpressionStrategy{
-
+public class ChangeStrategy implements AlterStrategy {
 
     @Override
-    public void parse(AlterExpression expression, DDLConfig ddlConfig,
-            List<FieldMapping> fieldMappingList) {
-        String oldColumnName = expression.getColumnOldName();
-        oldColumnName = StringUtil.replace(oldColumnName,"`","");
+    public void parse(AlterExpression expression, DDLConfig ddlConfig, List<FieldMapping> originalFieldMappings) {
+        String oldColumnName = StringUtil.replace(expression.getColumnOldName(), "`", "");
         ddlConfig.setSourceColumnName(oldColumnName);
-        String finalOldColumnName = oldColumnName;
-        FieldMapping fieldMapping = fieldMappingList.stream().filter(x->x.getSource().getName().equals(
-                finalOldColumnName)).findFirst().orElse(null);
+        FieldMapping fieldMapping = originalFieldMappings.stream().filter(x -> StringUtil.equals(x.getSource().getName(), oldColumnName)).findFirst().orElse(null);
         if (fieldMapping != null) {
             expression.setColumnOldName(fieldMapping.getTarget().getName());
             for (AlterExpression.ColumnDataType columnDataType : expression.getColDataTypeList()) {
                 ddlConfig.setChangedColumnName(columnDataType.getColumnName());
             }
         }
-
+        ddlConfig.setDdlOperationEnum(DDLOperationEnum.ALTER_CHANGE);
     }
 }

+ 12 - 11
dbsyncer-parser/src/main/java/org/dbsyncer/parser/ddl/alter/DropStrategy.java

@@ -1,31 +1,32 @@
 package org.dbsyncer.parser.ddl.alter;
 
-import java.util.List;
 import net.sf.jsqlparser.statement.alter.AlterExpression;
 import org.dbsyncer.common.util.StringUtil;
 import org.dbsyncer.connector.config.DDLConfig;
+import org.dbsyncer.connector.enums.DDLOperationEnum;
 import org.dbsyncer.connector.model.Field;
+import org.dbsyncer.parser.ddl.AlterStrategy;
 import org.dbsyncer.parser.model.FieldMapping;
 
+import java.util.List;
+
 /**
  * 解析drop
  * example: ALTER TABLE test_table DROP dis;
+ *
  * @author life
  */
-public class DropStrategy implements ExpressionStrategy{
+public class DropStrategy implements AlterStrategy {
 
     @Override
-    public void parse(AlterExpression expression, DDLConfig ddlConfig,
-            List<FieldMapping> fieldMappingList) {
-        String columName = expression.getColumnName();
-        columName = StringUtil.replace(columName, "`", "");
-        Field field = new Field(columName,null,0);
+    public void parse(AlterExpression expression, DDLConfig ddlConfig, List<FieldMapping> originalFieldMappings) {
+        String columnName = StringUtil.replace(expression.getColumnName(), "`", "");
+        Field field = new Field(columnName, null, 0);
         //需要把列替换成目标的列名
-        String finalColumName = columName;
-        fieldMappingList.stream().filter(x -> x.getSource().getName().equals(
-                finalColumName)).findFirst().ifPresent(
+        originalFieldMappings.stream().filter(x -> StringUtil.equals(x.getSource().getName(), columnName)).findFirst().ifPresent(
                 fieldMapping -> expression.setColumnName(fieldMapping.getTarget().getName()));
         //加入还是原名
         ddlConfig.getRemoveFields().add(field);
+        ddlConfig.setDdlOperationEnum(DDLOperationEnum.ALTER_DROP);
     }
-}
+}

+ 12 - 10
dbsyncer-parser/src/main/java/org/dbsyncer/parser/ddl/alter/ModifyStrategy.java

@@ -1,36 +1,38 @@
 package org.dbsyncer.parser.ddl.alter;
 
-import java.util.List;
 import net.sf.jsqlparser.statement.alter.AlterExpression;
 import org.dbsyncer.common.util.StringUtil;
 import org.dbsyncer.connector.config.DDLConfig;
+import org.dbsyncer.connector.enums.DDLOperationEnum;
+import org.dbsyncer.parser.ddl.AlterStrategy;
 import org.dbsyncer.parser.model.FieldMapping;
 
+import java.util.List;
+
 /**
  * 解析modify的属性
  * exampleSql: ALTER TABLE `test`.`test_table` MODIFY COLUMN `test` varchar(251) NULL DEFAULT NULL
  * alter modify parser
+ *
  * @author life
  */
-public class ModifyStrategy implements ExpressionStrategy{
+public class ModifyStrategy implements AlterStrategy {
 
     @Override
-    public void parse(AlterExpression expression, DDLConfig ddlConfig,
-            List<FieldMapping> fieldMappingList) {
+    public void parse(AlterExpression expression, DDLConfig ddlConfig, List<FieldMapping> originalFieldMappings) {
         //先查找到当前的表和目标的表对应的字段
         for (AlterExpression.ColumnDataType columnDataType : expression.getColDataTypeList()) {
-            String columName = columnDataType.getColumnName();
-            columName = StringUtil.replace(columName, "`", "");
-            for (FieldMapping fieldMapping : fieldMappingList) {
-                if (StringUtil.equals(fieldMapping.getSource().getName(), columName)) {
+            String columnName = StringUtil.replace(columnDataType.getColumnName(), "`", "");
+            for (FieldMapping fieldMapping : originalFieldMappings) {
+                if (StringUtil.equals(fieldMapping.getSource().getName(), columnName)) {
                     //TODO life 找到目标的表名,先是alter进行属性替换,然后config记录新的
-                    columnDataType.setColumnName(
-                            fieldMapping.getTarget().getName());//alter语法树进行替换
+                    columnDataType.setColumnName(fieldMapping.getTarget().getName());
                     //因为只是修改属性,所以表名称没有变化
                     ddlConfig.setSourceColumnName(fieldMapping.getSource().getName());
                     ddlConfig.setChangedColumnName(fieldMapping.getSource().getName());
                 }
             }
         }
+        ddlConfig.setDdlOperationEnum(DDLOperationEnum.ALTER_MODIFY);
     }
 }

+ 0 - 50
dbsyncer-parser/src/main/java/org/dbsyncer/parser/ddl/factory/ParserFactory.java

@@ -1,50 +0,0 @@
-package org.dbsyncer.parser.ddl.factory;
-
-import java.util.List;
-import org.dbsyncer.connector.Connector;
-import org.dbsyncer.connector.ConnectorFactory;
-import org.dbsyncer.connector.config.DDLConfig;
-import org.dbsyncer.connector.database.Database;
-import org.dbsyncer.parser.ParserException;
-import org.dbsyncer.parser.model.FieldMapping;
-
-/**
- * @author life
- */
-public abstract class ParserFactory {
-
-    public DDLConfig ddlConfig;
-
-    public List<FieldMapping> fieldMappingList;
-
-    ConnectorFactory connectorFactory;
-
-    String targetConnectorType;
-
-    String targetTableName;
-
-    public ParserFactory(DDLConfig ddlConfig, List<FieldMapping> fieldMappingList,
-            ConnectorFactory connectorFactory, String targetConnectorType, String targetTableName) {
-        this.ddlConfig = ddlConfig;
-        this.fieldMappingList = fieldMappingList;
-        this.connectorFactory = connectorFactory;
-        this.targetConnectorType = targetConnectorType;
-        this.targetTableName = targetTableName;
-    }
-
-    public void parser(String sql){
-        Connector connector = connectorFactory.getConnector(targetConnectorType);
-        // 暂支持关系型数据库解析
-        if (!(connector instanceof Database)) {
-            throw new ParserException("暂支持关系型数据库解析");
-        }
-        Database database = (Database) connector;
-        String quotation = database.buildSqlWithQuotation();
-        String tableName = new StringBuilder(quotation).append(targetTableName).append(quotation).toString();
-        parser(sql,tableName);
-    }
-
-
-    public abstract void parser(String sql,String targetName);
-
-}

+ 90 - 8
dbsyncer-parser/src/main/java/org/dbsyncer/parser/ddl/impl/DDLParserImpl.java

@@ -1,6 +1,5 @@
 package org.dbsyncer.parser.ddl.impl;
 
-import java.util.List;
 import net.sf.jsqlparser.JSQLParserException;
 import net.sf.jsqlparser.parser.CCJSqlParserUtil;
 import net.sf.jsqlparser.statement.Statement;
@@ -12,16 +11,26 @@ import org.dbsyncer.connector.Connector;
 import org.dbsyncer.connector.ConnectorFactory;
 import org.dbsyncer.connector.config.DDLConfig;
 import org.dbsyncer.connector.database.Database;
-import org.dbsyncer.parser.ParserException;
+import org.dbsyncer.connector.enums.DDLOperationEnum;
+import org.dbsyncer.connector.model.Field;
+import org.dbsyncer.connector.model.MetaInfo;
+import org.dbsyncer.parser.ddl.AlterStrategy;
 import org.dbsyncer.parser.ddl.DDLParser;
-import org.dbsyncer.parser.ddl.factory.ParserFactory;
-import org.dbsyncer.parser.ddl.jsql.JsqParserFactory;
+import org.dbsyncer.parser.ddl.alter.AddStrategy;
+import org.dbsyncer.parser.ddl.alter.ChangeStrategy;
+import org.dbsyncer.parser.ddl.alter.DropStrategy;
+import org.dbsyncer.parser.ddl.alter.ModifyStrategy;
 import org.dbsyncer.parser.model.FieldMapping;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
 
+import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * alter情况
@@ -42,14 +51,87 @@ public class DDLParserImpl implements DDLParser {
     @Resource
     private ConnectorFactory connectorFactory;
 
+    private final Map<AlterOperation, AlterStrategy> STRATEGIES = new ConcurrentHashMap();
+
+    @PostConstruct
+    private void init() {
+        STRATEGIES.putIfAbsent(AlterOperation.MODIFY, new ModifyStrategy());
+        STRATEGIES.putIfAbsent(AlterOperation.ADD, new AddStrategy());
+        STRATEGIES.putIfAbsent(AlterOperation.CHANGE, new ChangeStrategy());
+        STRATEGIES.putIfAbsent(AlterOperation.DROP, new DropStrategy());
+    }
+
     @Override
-    public DDLConfig parseDDlConfig(String sql, String targetConnectorType, String targetTableName,
-            List<FieldMapping> fieldMappingList) {
+    public DDLConfig parseDDlConfig(String sql, String targetConnectorType, String targetTableName, List<FieldMapping> originalFieldMappings) {
+        Connector connector = connectorFactory.getConnector(targetConnectorType);
         // 替换为目标库执行SQL
         DDLConfig ddlConfig = new DDLConfig();
-        ParserFactory parserFactory = new JsqParserFactory(ddlConfig,fieldMappingList,connectorFactory,targetConnectorType,targetTableName);
-        parserFactory.parser(sql);
+        try {
+            Statement statement = CCJSqlParserUtil.parse(sql);
+            if (statement instanceof Alter) {
+                Alter alter = (Alter) statement;
+                Database database = (Database) connector;
+                String quotation = database.buildSqlWithQuotation();
+                // 替换成目标表名
+                alter.getTable().setName(new StringBuilder(quotation).append(targetTableName).append(quotation).toString());
+                ddlConfig.setSql(alter.toString());
+                for (AlterExpression expression : alter.getAlterExpressions()) {
+                    if (STRATEGIES.containsKey(expression.getOperation())) {
+                        STRATEGIES.get(expression.getOperation()).parse(expression, ddlConfig, originalFieldMappings);
+                    }
+                }
+            }
+        } catch (JSQLParserException e) {
+            logger.error(e.getMessage(), e);
+        }
         return ddlConfig;
     }
 
+    @Override
+    public List<FieldMapping> refreshFiledMappings(List<FieldMapping> originalFieldMappings, MetaInfo originMetaInfo, MetaInfo targetMetaInfo, DDLConfig targetDDLConfig) {
+        List<FieldMapping> newTargetMappingList = new LinkedList<>();
+        //处理映射关系
+        for (FieldMapping fieldMapping : originalFieldMappings) {
+            String fieldSourceName = fieldMapping.getSource().getName();
+            String filedTargetName = fieldMapping.getTarget().getName();
+            //找到更改的源表的名称,也就是找到了对应的映射关系,这样就可以从源表找到更改后的名称进行对应,
+            if (fieldSourceName.equals(targetDDLConfig.getSourceColumnName())) {
+                // 说明字段名没有改变,只是改变了属性
+                if (targetDDLConfig.getDdlOperationEnum() == DDLOperationEnum.ALTER_MODIFY) {
+                    Field source = originMetaInfo.getColumn().stream().filter(x -> StringUtil.equals(x.getName(), fieldSourceName)).findFirst().get();
+                    Field target = targetMetaInfo.getColumn().stream().filter(x -> StringUtil.equals(x.getName(), filedTargetName)).findFirst().get();
+                    //替换
+                    newTargetMappingList.add(new FieldMapping(source, target));
+                    continue;
+                } else if (targetDDLConfig.getDdlOperationEnum() == DDLOperationEnum.ALTER_CHANGE) {
+                    Field source = originMetaInfo.getColumn().stream().filter(x -> StringUtil.equals(x.getName(), targetDDLConfig.getChangedColumnName())).findFirst().get();
+                    Field target = targetMetaInfo.getColumn().stream().filter(x -> StringUtil.equals(x.getName(), targetDDLConfig.getChangedColumnName())).findFirst().get();
+                    //替换
+                    newTargetMappingList.add(new FieldMapping(source, target));
+                    continue;
+                }
+            }
+            newTargetMappingList.add(fieldMapping);
+        }
+
+        if (DDLOperationEnum.ALTER_ADD == targetDDLConfig.getDdlOperationEnum()) {
+            //处理新增的映射关系
+            List<Field> addFields = targetDDLConfig.getAddFields();
+            for (Field field : addFields) {
+                Field source = originMetaInfo.getColumn().stream().filter(x -> StringUtil.equals(x.getName(), field.getName())).findFirst().get();
+                Field target = targetMetaInfo.getColumn().stream().filter(x -> StringUtil.equals(x.getName(), field.getName())).findFirst().get();
+                newTargetMappingList.add(new FieldMapping(source, target));
+            }
+        }
+
+        if (DDLOperationEnum.ALTER_DROP == targetDDLConfig.getDdlOperationEnum()) {
+            //处理删除字段的映射关系
+            List<Field> removeFields = targetDDLConfig.getRemoveFields();
+            for (Field field : removeFields) {
+                newTargetMappingList.removeIf(x -> StringUtil.equals(x.getSource().getName(), field.getName()));
+            }
+        }
+        return newTargetMappingList;
+    }
+
 }

+ 0 - 40
dbsyncer-parser/src/main/java/org/dbsyncer/parser/ddl/jsql/JsqParserFactory.java

@@ -1,40 +0,0 @@
-package org.dbsyncer.parser.ddl.jsql;
-
-import java.util.List;
-import net.sf.jsqlparser.JSQLParserException;
-import net.sf.jsqlparser.parser.CCJSqlParserUtil;
-import net.sf.jsqlparser.statement.Statement;
-import net.sf.jsqlparser.statement.alter.Alter;
-import org.dbsyncer.connector.ConnectorFactory;
-import org.dbsyncer.connector.config.DDLConfig;
-import org.dbsyncer.parser.ddl.alter.AlterStrategy;
-import org.dbsyncer.parser.ddl.factory.ParserFactory;
-import org.dbsyncer.parser.model.FieldMapping;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * @author life
- */
-public class JsqParserFactory extends ParserFactory {
-
-    private final Logger logger = LoggerFactory.getLogger(getClass());
-    public JsqParserFactory(DDLConfig ddlConfig, List<FieldMapping> fieldMappingList,
-            ConnectorFactory connectorFactory, String targetConnectorType, String targetTableName) {
-        super(ddlConfig, fieldMappingList, connectorFactory, targetConnectorType, targetTableName);
-    }
-
-    @Override
-    public void parser(String sql, String targetName) {
-        try {
-            Statement statement = CCJSqlParserUtil.parse(sql);
-            if (statement instanceof Alter) {
-                AlterStrategy alterStrategy = new AlterStrategy((Alter) statement,ddlConfig,fieldMappingList,targetName);
-                alterStrategy.parser();
-            }
-        } catch (JSQLParserException e) {
-            logger.error(e.getMessage(), e);
-        }
-    }
-
-}

+ 0 - 13
dbsyncer-parser/src/main/java/org/dbsyncer/parser/ddl/strategy/JsqlParserStrategy.java

@@ -1,13 +0,0 @@
-package org.dbsyncer.parser.ddl.strategy;
-
-import java.util.List;
-import org.dbsyncer.connector.config.DDLConfig;
-import org.dbsyncer.parser.model.FieldMapping;
-
-/**
- * @author life
- */
-public interface JsqlParserStrategy extends Strategy{
-
-    public void parser();
-}

+ 0 - 5
dbsyncer-parser/src/main/java/org/dbsyncer/parser/ddl/strategy/Strategy.java

@@ -1,5 +0,0 @@
-package org.dbsyncer.parser.ddl.strategy;
-
-public interface Strategy {
-
-}

+ 20 - 85
dbsyncer-parser/src/main/java/org/dbsyncer/parser/flush/impl/GeneralBufferActuator.java

@@ -1,7 +1,5 @@
 package org.dbsyncer.parser.flush.impl;
 
-import java.util.Date;
-import java.util.LinkedList;
 import org.dbsyncer.cache.CacheService;
 import org.dbsyncer.common.config.GeneralBufferConfig;
 import org.dbsyncer.common.event.RefreshOffsetEvent;
@@ -15,11 +13,8 @@ import org.dbsyncer.connector.ConnectorFactory;
 import org.dbsyncer.connector.config.DDLConfig;
 import org.dbsyncer.connector.constant.ConnectorConstant;
 import org.dbsyncer.connector.enums.ConnectorEnum;
-import org.dbsyncer.connector.enums.DDLOperationEnum;
-import org.dbsyncer.connector.model.Field;
 import org.dbsyncer.connector.model.MetaInfo;
 import org.dbsyncer.parser.Parser;
-import org.dbsyncer.parser.ParserFactory;
 import org.dbsyncer.parser.ddl.DDLParser;
 import org.dbsyncer.parser.flush.AbstractBufferActuator;
 import org.dbsyncer.parser.model.BatchWriter;
@@ -40,13 +35,13 @@ import org.dbsyncer.storage.StorageService;
 import org.dbsyncer.storage.enums.StorageEnum;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationContext;
 import org.springframework.stereotype.Component;
 import org.springframework.util.Assert;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.Executor;
@@ -84,7 +79,7 @@ public class GeneralBufferActuator extends AbstractBufferActuator<WriterRequest,
     @Resource
     private CacheService cacheService;
 
-    @Autowired
+    @Resource
     private StorageService storageService;
 
     @Resource
@@ -196,7 +191,8 @@ public class GeneralBufferActuator extends AbstractBufferActuator<WriterRequest,
             // 0.生成目标表执行SQL(暂支持MySQL) fixme AE86 暂内测MySQL作为试运行版本
             if (StringUtil.equals(sConnType, tConnType) && StringUtil.equals(ConnectorEnum.MYSQL.getType(), tConnType)) {
                 String targetTableName = tableGroup.getTargetTable().getName();
-                DDLConfig targetDDLConfig = ddlParser.parseDDlConfig(response.getSql(), tConnType, targetTableName,tableGroup.getFieldMapping());
+                List<FieldMapping> originalFieldMappings = tableGroup.getFieldMapping();
+                DDLConfig targetDDLConfig = ddlParser.parseDDlConfig(response.getSql(), tConnType, targetTableName, originalFieldMappings);
                 final ConnectorMapper tConnectorMapper = connectorFactory.connect(tConnConfig);
                 Result result = connectorFactory.writerDDL(tConnectorMapper, targetDDLConfig);
                 result.setTableGroupId(tableGroup.getId());
@@ -205,7 +201,7 @@ public class GeneralBufferActuator extends AbstractBufferActuator<WriterRequest,
                 // TODO life
                 // 1.获取目标表最新的属性字段
                 MetaInfo targetMetaInfo = parser.getMetaInfo(mapping.getTargetConnectorId(), targetTableName);
-                MetaInfo originMetaInfo = parser.getMetaInfo(mapping.getSourceConnectorId(),tableGroup.getSourceTable().getName());
+                MetaInfo originMetaInfo = parser.getMetaInfo(mapping.getSourceConnectorId(), tableGroup.getSourceTable().getName());
                 // 1.1 参考 org.dbsyncer.biz.checker.impl.tablegroup.TableGroupChecker.refreshTableFields
                 //上面已经是刷新了
 
@@ -217,14 +213,10 @@ public class GeneralBufferActuator extends AbstractBufferActuator<WriterRequest,
                 tableGroup.getTargetTable().setColumn(targetMetaInfo.getColumn());
 
                 // 3.更新表字段映射(根据保留的更改的属性,进行更改)
-                List<FieldMapping> fieldMappingList = tableGroup.getFieldMapping(); // 获得刚开始filedMapping
-                List<FieldMapping> targetMappingList = new LinkedList<>();//替换完成后的filedMapping
-                refreshFiledMapping(targetMappingList,fieldMappingList,originMetaInfo,targetMetaInfo,targetDDLConfig);
-
-                tableGroup.setFieldMapping(targetMappingList);
+                tableGroup.setFieldMapping(ddlParser.refreshFiledMappings(originalFieldMappings, originMetaInfo, targetMetaInfo, targetDDLConfig));
                 // 4.合并驱动配置 & 更新TableGroup.command 合并驱动应该不需要了,我只是把该替换的地方替换掉了,原来的还是保持一致,应该需要更新TableGroup.command
                 // 4.1 参考 org.dbsyncer.biz.checker.impl.tablegroup.TableGroupChecker.mergeConfig
-                Map<String, String>  commands =  parser.getCommand(mapping,tableGroup);
+                Map<String, String> commands = parser.getCommand(mapping, tableGroup);
                 tableGroup.setCommand(commands);
                 // 5.持久化存储 & 更新缓存
                 // 5.1 参考 org.dbsyncer.manager.ManagerFactory.editConfigModel
@@ -232,65 +224,12 @@ public class GeneralBufferActuator extends AbstractBufferActuator<WriterRequest,
                 flushCache(tableGroup);
                 applicationContext.publishEvent(new RefreshOffsetEvent(applicationContext, response.getOffsetList()));
                 flushStrategy.flushIncrementData(mapping.getMetaId(), result, response.getEvent());
+                return;
             }
         } catch (Exception e) {
             logger.error(e.getMessage(), e);
         }
-    }
-
-
-    //根据原来的映射关系和更改的字段进行新关系的映射组合
-    private void refreshFiledMapping(List<FieldMapping> targetMappingList, List<FieldMapping> fieldMappingList,MetaInfo originMetaInfo,
-            MetaInfo targetMetaInfo,DDLConfig targetDDLConfig) {
-        //处理映射关系
-        for (FieldMapping fieldMapping:fieldMappingList) {
-            String fieldSourceName = fieldMapping.getSource().getName();
-            String filedTargetName = fieldMapping.getTarget().getName();
-            //找到更改的源表的名称,也就是找到了对应的映射关系,这样就可以从源表找到更改后的名称进行对应,
-            if (fieldSourceName.equals(targetDDLConfig.getSourceColumnName())){
-                //找到源表的字段
-                if (targetDDLConfig.getDdlOperationEnum() == DDLOperationEnum.ALTER_MODIFY){//说明字段名没有改变,只是改变了属性
-                    Field source = originMetaInfo.getColumn().stream()
-                            .filter(x->x.getName().equals(fieldSourceName)).findFirst().get();
-                    Field target = targetMetaInfo.getColumn().stream()
-                            .filter(x->x.getName().equals(filedTargetName)).findFirst().get();
-                    //替换
-                    targetMappingList.add(new FieldMapping(source,target)) ;
-                    continue;
-                }else if (targetDDLConfig.getDdlOperationEnum() == DDLOperationEnum.ALTER_CHANGE){//改变名称
-                    Field source = originMetaInfo.getColumn().stream()
-                            .filter(x->x.getName().equals(targetDDLConfig.getChangedColumnName())).findFirst().get();
-                    Field target = targetMetaInfo.getColumn().stream()
-                            .filter(x->x.getName().equals(targetDDLConfig.getChangedColumnName())).findFirst().get();
-                    //替换
-                    targetMappingList.add(new FieldMapping(source,target)) ;
-                    continue;
-                }
-            }
-            targetMappingList.add(fieldMapping);
-        }
-
-        if (DDLOperationEnum.ALTER_ADD == targetDDLConfig.getDdlOperationEnum()){
-            //处理新增的映射关系
-            List<Field> addFields = targetDDLConfig.getAddFields();
-            for (Field field:addFields) {
-                Field source = originMetaInfo.getColumn().stream()
-                        .filter(x->x.getName().equals(field.getName())).findFirst().get();
-                Field target = targetMetaInfo.getColumn().stream()
-                        .filter(x->x.getName().equals(field.getName())).findFirst().get();
-                FieldMapping fieldMapping =new FieldMapping(source,target);
-                targetMappingList.add(fieldMapping);
-            }
-        }
-
-        if (DDLOperationEnum.ALTER_DROP == targetDDLConfig.getDdlOperationEnum()){
-            //处理删除字段的映射关系
-            List<Field> removeFields = targetDDLConfig.getRemoveFields();
-            for (Field field:removeFields) {
-                targetMappingList.removeIf(x->x.getSource().getName().equals(field.getName()));
-            }
-        }
-
+        logger.warn("暂只支持MYSQL解析DDL");
     }
 
     /**
@@ -306,11 +245,12 @@ public class GeneralBufferActuator extends AbstractBufferActuator<WriterRequest,
         return conn.getConfig();
     }
 
-    public void setGeneralExecutor(Executor generalExecutor) {
-        this.generalExecutor = generalExecutor;
-    }
-
-    public void flushCache(TableGroup tableGroup){
+    /**
+     * 持久化驱动配置
+     *
+     * @param tableGroup
+     */
+    private void flushCache(TableGroup tableGroup) {
         // 1、解析配置
         ConfigModel model = tableGroup;
         model.setCreateTime(new Date().getTime());
@@ -323,17 +263,12 @@ public class GeneralBufferActuator extends AbstractBufferActuator<WriterRequest,
         storageService.edit(StorageEnum.CONFIG, params);
 
         // 3、缓存
-        // 1、缓存
         Assert.notNull(model, "ConfigModel can not be null.");
-        String id = model.getId();
-        cacheService.put(id, model);
-
-        // 2、分组
-//        String groupId = tableGroup.getId();
-//        cacheService.putIfAbsent(groupId, new Group());
-//        Group group = cacheService.get(groupId, Group.class);
-//        group.addIfAbsent(id);
-//        logger.debug("Put the model [{}] for {} group into cache.", id, groupId);
+        cacheService.put(model.getId(), model);
+    }
+
+    public void setGeneralExecutor(Executor generalExecutor) {
+        this.generalExecutor = generalExecutor;
     }
 
 }