瀏覽代碼

优化复合主键映射关系先后顺序

Signed-off-by: AE86 <836391306@qq.com>
AE86 2 年之前
父節點
當前提交
362515c048

+ 8 - 14
dbsyncer-biz/src/main/java/org/dbsyncer/biz/checker/impl/tablegroup/TableGroupChecker.java

@@ -26,11 +26,9 @@ import org.springframework.util.Assert;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
-import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 /**
  * @author AE86
@@ -139,22 +137,18 @@ public class TableGroupChecker extends AbstractChecker {
         MetaInfo metaInfo = manager.getMetaInfo(connectorId, tableName);
         Assert.notNull(metaInfo, "无法获取连接器表信息:" + tableName);
         // 自定义主键
-        List<String> primaryKeys = new ArrayList<>();
-        if (StringUtil.isNotBlank(primaryKeyStr)) {
+        if (StringUtil.isNotBlank(primaryKeyStr) && !CollectionUtils.isEmpty(metaInfo.getColumn())) {
             String[] pks = StringUtil.split(primaryKeyStr, ",");
-            Set<String> keys = new LinkedHashSet<>(Arrays.asList(pks));
-            primaryKeys.addAll(keys);
-        }
-        if (!CollectionUtils.isEmpty(primaryKeys) && !CollectionUtils.isEmpty(metaInfo.getColumn())) {
-            primaryKeys.forEach(pk ->
-                metaInfo.getColumn().forEach(field -> {
-                    if(StringUtil.equalsIgnoreCase(field.getName(), pk)){
+            Arrays.asList(pks).stream().forEach(pk -> {
+                for (Field field : metaInfo.getColumn()) {
+                    if (StringUtil.equalsIgnoreCase(field.getName(), pk)) {
                         field.setPk(true);
+                        break;
                     }
-                })
-            );
+                }
+            });
         }
-        return new Table(tableName, metaInfo.getTableType(), primaryKeys, metaInfo.getColumn(), metaInfo.getSql());
+        return new Table(tableName, metaInfo.getTableType(), metaInfo.getColumn(), metaInfo.getSql());
     }
 
     private void checkRepeatedTable(String mappingId, String sourceTable, String targetTable) {

+ 1 - 12
dbsyncer-connector/src/main/java/org/dbsyncer/connector/config/CommandConfig.java

@@ -19,20 +19,13 @@ public class CommandConfig {
 
     private Table table;
 
-    private Table originalTable;
-
     private List<Filter> filter;
 
     private AbstractConnectorConfig connectorConfig;
 
-    public CommandConfig(String type, Table table, Table originalTable, AbstractConnectorConfig connectorConfig) {
-        this(type, table, originalTable, connectorConfig, null);
-    }
-
-    public CommandConfig(String type, Table table, Table originalTable, AbstractConnectorConfig connectorConfig, List<Filter> filter) {
+    public CommandConfig(String type, Table table, AbstractConnectorConfig connectorConfig, List<Filter> filter) {
         this.type = type;
         this.table = table;
-        this.originalTable = originalTable;
         this.filter = filter;
         this.connectorConfig = connectorConfig;
     }
@@ -49,10 +42,6 @@ public class CommandConfig {
         return filter;
     }
 
-    public Table getOriginalTable() {
-        return originalTable;
-    }
-
     public AbstractConnectorConfig getConnectorConfig() {
         return connectorConfig;
     }

+ 3 - 3
dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/AbstractDatabaseConnector.java

@@ -224,7 +224,7 @@ public abstract class AbstractDatabaseConnector extends AbstractConnector implem
 
         // 获取查询数据行是否存在
         String tableName = commandConfig.getTable().getName();
-        List<String> primaryKeys = PrimaryKeyUtil.findOriginalTablePrimaryKey(commandConfig.getOriginalTable());
+        List<String> primaryKeys = PrimaryKeyUtil.findTablePrimaryKeys(commandConfig.getTable());
         StringBuilder queryCount = new StringBuilder("SELECT COUNT(1) FROM ").append(schema).append(quotation).append(tableName).append(quotation).append(" WHERE ");
         // id = ? AND uid = ?
         PrimaryKeyUtil.buildSql(queryCount, primaryKeys, quotation, " AND ", " = ? ", true);
@@ -342,7 +342,7 @@ public abstract class AbstractDatabaseConnector extends AbstractConnector implem
      */
     protected String getQueryCountSql(CommandConfig commandConfig, String schema, String quotation, String queryFilterSql) {
         String table = commandConfig.getTable().getName();
-        List<String> primaryKeys = PrimaryKeyUtil.findOriginalTablePrimaryKey(commandConfig.getOriginalTable());
+        List<String> primaryKeys = PrimaryKeyUtil.findTablePrimaryKeys(commandConfig.getTable());
         StringBuilder sql = new StringBuilder();
         sql.append("SELECT COUNT(1) FROM (SELECT 1 FROM ").append(schema).append(quotation).append(table).append(quotation);
         if (StringUtil.isNotBlank(queryFilterSql)) {
@@ -493,7 +493,7 @@ public abstract class AbstractDatabaseConnector extends AbstractConnector implem
             logger.error("Table name can not be empty.");
             throw new ConnectorException("Table name can not be empty.");
         }
-        List<String> primaryKeys = PrimaryKeyUtil.findOriginalTablePrimaryKey(commandConfig.getOriginalTable());
+        List<String> primaryKeys = PrimaryKeyUtil.findTablePrimaryKeys(commandConfig.getTable());
         SqlBuilderConfig config = new SqlBuilderConfig(this, schema, tableName, primaryKeys, fields, queryFilterSQL, buildSqlWithQuotation());
         return SqlBuilderEnum.getSqlBuilder(type).buildSql(config);
     }

+ 2 - 16
dbsyncer-connector/src/main/java/org/dbsyncer/connector/model/Table.java

@@ -21,11 +21,6 @@ public class Table {
      */
     private String type;
 
-    /**
-     * 主键列表
-     */
-    private List<String> primaryKeys;
-
     /**
      * 属性字段
      * 格式:[{"name":"ID","typeName":"INT","type":"4"},{"name":"NAME","typeName":"VARCHAR","type":"12"}]
@@ -48,13 +43,12 @@ public class Table {
     }
 
     public Table(String name, String type) {
-        this(name, type, null, null, null);
+        this(name, type, null, null);
     }
 
-    public Table(String name, String type, List<String> primaryKeys, List<Field> column, String sql) {
+    public Table(String name, String type, List<Field> column, String sql) {
         this.name = name;
         this.type = type;
-        this.primaryKeys = primaryKeys;
         this.column = column;
         this.sql = sql;
     }
@@ -75,14 +69,6 @@ public class Table {
         this.type = type;
     }
 
-    public List<String> getPrimaryKeys() {
-        return primaryKeys;
-    }
-
-    public void setPrimaryKeys(List<String> primaryKeys) {
-        this.primaryKeys = primaryKeys;
-    }
-
     public List<Field> getColumn() {
         return column;
     }

+ 2 - 2
dbsyncer-connector/src/main/java/org/dbsyncer/connector/sql/AbstractDQLConnector.java

@@ -35,7 +35,7 @@ public abstract class AbstractDQLConnector extends AbstractDatabaseConnector {
         List<Table> tables = new ArrayList<>();
         if (!CollectionUtils.isEmpty(sqlTables)) {
             sqlTables.forEach(s ->
-                tables.add(new Table(s.getSqlName(), TableTypeEnum.TABLE.getCode(), Collections.EMPTY_LIST, Collections.EMPTY_LIST, s.getSql()))
+                tables.add(new Table(s.getSqlName(), TableTypeEnum.TABLE.getCode(), Collections.EMPTY_LIST, s.getSql()))
             );
         }
         return tables;
@@ -74,7 +74,7 @@ public abstract class AbstractDQLConnector extends AbstractDatabaseConnector {
         // 获取过滤SQL
         String queryFilterSql = getQueryFilterSql(commandConfig.getFilter());
         Table table = commandConfig.getTable();
-        List<String> primaryKeys = PrimaryKeyUtil.findOriginalTablePrimaryKey(commandConfig.getOriginalTable());
+        List<String> primaryKeys = PrimaryKeyUtil.findTablePrimaryKeys(commandConfig.getTable());
 
         // 获取查询SQL
         Map<String, String> map = new HashMap<>();

+ 6 - 12
dbsyncer-connector/src/main/java/org/dbsyncer/connector/util/PrimaryKeyUtil.java

@@ -22,25 +22,19 @@ public abstract class PrimaryKeyUtil {
      * @param table
      * @return
      */
-    public static List<String> findOriginalTablePrimaryKey(Table table) {
+    public static List<String> findTablePrimaryKeys(Table table) {
         if (null == table) {
             throw new ConnectorException("The table is null.");
         }
 
-        // 获取自定义主键
-        if (!CollectionUtils.isEmpty(table.getPrimaryKeys())) {
-            return Collections.unmodifiableList(table.getPrimaryKeys());
-        }
-
-        // 获取表原始主键
+        // 获取表同步的主键字段
         List<String> primaryKeys = new ArrayList<>();
-        List<Field> column = table.getColumn();
-        if (!CollectionUtils.isEmpty(column)) {
-            for (Field c : column) {
-                if (c.isPk() && !primaryKeys.contains(c.getName())) {
+        if (!CollectionUtils.isEmpty(table.getColumn())) {
+            table.getColumn().forEach(c -> {
+                if (c.isPk()) {
                     primaryKeys.add(c.getName());
                 }
-            }
+            });
         }
 
         if (CollectionUtils.isEmpty(primaryKeys)) {

+ 1 - 1
dbsyncer-listener/src/main/java/org/dbsyncer/listener/AbstractDatabaseExtractor.java

@@ -72,7 +72,7 @@ public abstract class AbstractDatabaseExtractor extends AbstractExtractor {
         for (Table t : sourceTable) {
             String sql = t.getSql();
             String sqlName = t.getName();
-            List<String> primaryKeys = PrimaryKeyUtil.findOriginalTablePrimaryKey(t);
+            List<String> primaryKeys = PrimaryKeyUtil.findTablePrimaryKeys(t);
             String tableName = tableMap.get(sqlName);
             Assert.hasText(sql, "The sql is null.");
             Assert.hasText(tableName, "The tableName is null.");

+ 1 - 1
dbsyncer-manager/src/main/java/org/dbsyncer/manager/puller/IncrementPuller.java

@@ -146,7 +146,7 @@ public class IncrementPuller extends AbstractPuller implements ScheduledTaskJob
         if (ListenerTypeEnum.isTiming(listenerType)) {
             AbstractQuartzExtractor quartzExtractor = listener.getExtractor(ListenerTypeEnum.TIMING, connectorConfig.getConnectorType(), AbstractQuartzExtractor.class);
             quartzExtractor.setCommands(list.stream().map(t -> {
-                List<String> primaryKeys = PrimaryKeyUtil.findOriginalTablePrimaryKey(t.getSourceTable());
+                List<String> primaryKeys = PrimaryKeyUtil.findTablePrimaryKeys(t.getSourceTable());
                 return new TableGroupCommand(primaryKeys, t.getCommand());
             }).collect(Collectors.toList()));
             quartzExtractor.register(new QuartzListener(mapping, list));

+ 5 - 5
dbsyncer-parser/src/main/java/org/dbsyncer/parser/ParserFactory.java

@@ -154,8 +154,8 @@ public class ParserFactory implements Parser {
         AbstractConnectorConfig tConnConfig = getConnectorConfig(mapping.getTargetConnectorId());
         Table sourceTable = tableGroup.getSourceTable();
         Table targetTable = tableGroup.getTargetTable();
-        Table sTable = new Table(sourceTable.getName(), sourceTable.getType(), sourceTable.getPrimaryKeys(), new ArrayList<>(), sourceTable.getSql());
-        Table tTable = new Table(targetTable.getName(), targetTable.getType(), targetTable.getPrimaryKeys(), new ArrayList<>(), sourceTable.getSql());
+        Table sTable = new Table(sourceTable.getName(), sourceTable.getType(), new ArrayList<>(), sourceTable.getSql());
+        Table tTable = new Table(targetTable.getName(), targetTable.getType(), new ArrayList<>(), sourceTable.getSql());
         List<FieldMapping> fieldMapping = tableGroup.getFieldMapping();
         if (!CollectionUtils.isEmpty(fieldMapping)) {
             fieldMapping.forEach(m -> {
@@ -167,8 +167,8 @@ public class ParserFactory implements Parser {
                 }
             });
         }
-        final CommandConfig sourceConfig = new CommandConfig(sConnConfig.getConnectorType(), sTable, sourceTable, sConnConfig, tableGroup.getFilter());
-        final CommandConfig targetConfig = new CommandConfig(tConnConfig.getConnectorType(), tTable, targetTable, tConnConfig);
+        final CommandConfig sourceConfig = new CommandConfig(sConnConfig.getConnectorType(), sTable, sConnConfig, tableGroup.getFilter());
+        final CommandConfig targetConfig = new CommandConfig(tConnConfig.getConnectorType(), tTable, tConnConfig, null);
         // 获取连接器同步参数
         Map<String, String> command = connectorFactory.getCommand(sourceConfig, targetConfig);
         return command;
@@ -249,7 +249,7 @@ public class ParserFactory implements Parser {
         Assert.notEmpty(fieldMapping, String.format("数据源表[%s]同步到目标源表[%s], 映射关系不能为空.", sTableName, tTableName));
         // 获取同步字段
         Picker picker = new Picker(fieldMapping);
-        List<String> primaryKeys = PrimaryKeyUtil.findOriginalTablePrimaryKey(tableGroup.getSourceTable());
+        List<String> primaryKeys = PrimaryKeyUtil.findTablePrimaryKeys(tableGroup.getSourceTable());
 
         int pageSize = mapping.getReadNum();
         int batchSize = mapping.getBatchNum();

+ 2 - 2
dbsyncer-web/src/main/resources/public/mapping/editTable.html

@@ -34,7 +34,7 @@
     <div class="row">
         <!-- 数据源配置 -->
         <div class="col-md-5">
-            <label class="col-sm-3 control-label text-right">标记主键 <i class="fa fa-question-circle fa_gray" aria-hidden="true" title="如果使用的数据源表或视图没有主键,可以自定义主键(大小写必须一致)"></i></label>
+            <label class="col-sm-3 control-label text-right">标记主键 <i class="fa fa-question-circle fa_gray" aria-hidden="true" title="如果使用的数据源表或视图没有主键,可以自定义主键,多个使用英文逗号,拼接"></i></label>
             <div class="col-sm-9">
                 <input id="sourceTablePK" class="form-control" type="text" />
             </div>
@@ -46,7 +46,7 @@
         <!-- 目标源配置 -->
         <div class="col-md-5">
             <div class="form-group">
-                <label class="col-sm-3 control-label text-right">标记主键 <i class="fa fa-question-circle fa_gray" aria-hidden="true" title="如果使用的目标源表或视图没有主键,可以自定义主键(大小写必须一致)"></i></label>
+                <label class="col-sm-3 control-label text-right">标记主键 <i class="fa fa-question-circle fa_gray" aria-hidden="true" title="如果使用的目标源表或视图没有主键,可以自定义主键,多个使用英文逗号,拼接"></i></label>
                 <div class="col-sm-9">
                     <input id="targetTablePK" class="form-control" type="text" />
                 </div>