|
@@ -1,24 +1,28 @@
|
|
|
package org.dbsyncer.biz.checker.impl.connector;
|
|
|
|
|
|
import org.apache.commons.lang.StringUtils;
|
|
|
+import org.dbsyncer.biz.enums.OracleIncrementEnum;
|
|
|
import org.dbsyncer.common.util.CollectionUtils;
|
|
|
import org.dbsyncer.connector.config.Field;
|
|
|
+import org.dbsyncer.connector.config.MetaInfo;
|
|
|
+import org.dbsyncer.connector.config.Table;
|
|
|
import org.dbsyncer.manager.Manager;
|
|
|
import org.dbsyncer.parser.model.FieldMapping;
|
|
|
import org.dbsyncer.parser.model.Mapping;
|
|
|
import org.dbsyncer.parser.model.TableGroup;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
+import org.springframework.util.Assert;
|
|
|
|
|
|
+import java.util.ArrayList;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
-import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* <p>1、增量同步时,目标源必须有一个主键字段用于接收ROW_ID值。</p>
|
|
|
- * <p>2、全局可配置目标源ROW_ID字段名称,默认为ROW_ID_NAME。 </p>
|
|
|
- * <p>3、如果配置了接收字段,添加字段映射关系[ROW_ID_NAME] > [ROW_ID_NAME],并将ROW_ID_NAME字段设置为目标源的唯一主键。</p>
|
|
|
- * <p>4、全量同步时,ROW_ID_NAME参数非必须。</p>
|
|
|
+ * <p>2、全局可配置目标源ROW_ID字段名称,默认为ROW_ID_LABEL_NAME。 </p>
|
|
|
+ * <p>3、如果配置了接收字段,添加字段映射关系[ROW_ID_LABEL_NAME] > [ROW_ID_LABEL_NAME],并将ROW_ID_LABEL_NAME字段设置为目标源的唯一主键。</p>
|
|
|
+ * <p>4、全量同步时,ROW_ID_LABEL_NAME参数非必须。</p>
|
|
|
*
|
|
|
* @author AE86
|
|
|
* @version 1.0.0
|
|
@@ -27,57 +31,126 @@ import java.util.stream.Collectors;
|
|
|
@Component
|
|
|
public class OracleConfigChecker extends AbstractDataBaseConfigChecker {
|
|
|
|
|
|
- /**
|
|
|
- * 默认ROWID列名称
|
|
|
- */
|
|
|
- private static final String ROW_ID_NAME = "ORACLE_ROW_ID";
|
|
|
- private static final String ROW_ID = "ROWIDTOCHAR(ROWID)";
|
|
|
-
|
|
|
@Autowired
|
|
|
private Manager manager;
|
|
|
|
|
|
@Override
|
|
|
- public void dealIncrementStrategy(Mapping mapping, TableGroup tableGroup) {
|
|
|
- // TODO 模拟测试
|
|
|
- Map<String, String> params = mapping.getParams();
|
|
|
- mapping.getParams().put(ROW_ID_NAME, "row_id");
|
|
|
-
|
|
|
- // 没有定义目标源ROW_ID字段
|
|
|
- if (CollectionUtils.isEmpty(mapping.getParams()) || !params.containsKey(ROW_ID_NAME)) {
|
|
|
+ public void dealIncrementStrategy(Mapping mapping, TableGroup tableGroup, Map<String, String> params) {
|
|
|
+ String targetRowIdName = params.get(OracleIncrementEnum.ROW_ID_LABEL_NAME.getName());
|
|
|
+ if (CollectionUtils.isEmpty(params) || StringUtils.isBlank(targetRowIdName)) {
|
|
|
+ revert(mapping, tableGroup);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+ // 检查目标源是否支持该自定义字段
|
|
|
+ List<Field> targetColumn = tableGroup.getTargetTable().getColumn();
|
|
|
+ Field targetField = null;
|
|
|
+ for (Field f : targetColumn) {
|
|
|
+ if (StringUtils.equals(f.getName(), targetRowIdName)) {
|
|
|
+ targetField = f;
|
|
|
+ targetField.setPk(true);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ f.setPk(false);
|
|
|
+ }
|
|
|
+ Assert.isTrue(null != targetField,
|
|
|
+ String.format("[%s 同步到 %s],目标源表不存在字段%s", tableGroup.getSourceTable().getName(), tableGroup.getTargetTable().getName(),
|
|
|
+ targetRowIdName));
|
|
|
+
|
|
|
// 检查是否更新
|
|
|
- String targetRowIdName = params.get(ROW_ID_NAME);
|
|
|
for (FieldMapping m : tableGroup.getFieldMapping()) {
|
|
|
- if (StringUtils.equals(m.getSource().getName(), ROW_ID)) {
|
|
|
+ if (null != m.getSource() && OracleIncrementEnum.isRowId(m.getSource().getName())) {
|
|
|
m.getTarget().setName(targetRowIdName);
|
|
|
- m.getTarget().setPk(true);
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- List<Field> sourceColumn = tableGroup.getSourceTable().getColumn();
|
|
|
- List<Field> sFieldList = sourceColumn.stream().filter(f -> StringUtils.endsWithIgnoreCase(f.getName(), ROW_ID)).collect(Collectors.toList());
|
|
|
- Field sourceField = new Field(ROW_ID, "VARCHAR2", 12, false, ROW_ID_NAME, true);
|
|
|
- if(CollectionUtils.isEmpty(sFieldList)){
|
|
|
- sourceColumn.add(0, sourceField);
|
|
|
+ Field sourceField = new Field(OracleIncrementEnum.ROW_ID.getName(), "VARCHAR2", 12, false,
|
|
|
+ OracleIncrementEnum.ROW_ID_LABEL_NAME.getName(), true);
|
|
|
+ tableGroup.getSourceTable().getColumn().add(0, sourceField);
|
|
|
+
|
|
|
+ // 取消主键
|
|
|
+ tableGroup.getFieldMapping().forEach(m -> {
|
|
|
+ if (null != m.getTarget()) {
|
|
|
+ m.getTarget().setPk(false);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ tableGroup.getFieldMapping().add(0, new FieldMapping(sourceField, targetField));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 还原字段和映射关系
|
|
|
+ *
|
|
|
+ * @param mapping
|
|
|
+ * @param tableGroup
|
|
|
+ */
|
|
|
+ private void revert(Mapping mapping, TableGroup tableGroup) {
|
|
|
+ List<FieldMapping> fieldMapping = tableGroup.getFieldMapping();
|
|
|
+ if (CollectionUtils.isEmpty(fieldMapping)) {
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
- List<Field> targetColumn = tableGroup.getTargetTable().getColumn();
|
|
|
- Field targetField = null;
|
|
|
- for(Field f : targetColumn){
|
|
|
- f.setPk(StringUtils.endsWithIgnoreCase(f.getName(), targetRowIdName));
|
|
|
- if(f.isPk()){
|
|
|
- targetField = f;
|
|
|
+ // 还原字段
|
|
|
+ Table sourceTable = tableGroup.getSourceTable();
|
|
|
+ List<Field> sourceColumn = sourceTable.getColumn();
|
|
|
+ List<Field> sourceFields = new ArrayList<>();
|
|
|
+ boolean existRowId = false;
|
|
|
+ for (Field f : sourceColumn) {
|
|
|
+ if (OracleIncrementEnum.isRowId(f.getName())) {
|
|
|
+ existRowId = true;
|
|
|
+ continue;
|
|
|
}
|
|
|
+ sourceFields.add(f);
|
|
|
}
|
|
|
- if(null == targetField){
|
|
|
- targetField = new Field(targetRowIdName, "VARCHAR2", 12, true);
|
|
|
- targetColumn.add(0, targetField);
|
|
|
+ sourceTable.setColumn(sourceFields);
|
|
|
+
|
|
|
+ if (!existRowId) {
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
- tableGroup.getFieldMapping().add(0, new FieldMapping(sourceField, targetField));
|
|
|
+ // 存在自定义主键
|
|
|
+ String pk = null;
|
|
|
+ for (FieldMapping m : tableGroup.getFieldMapping()) {
|
|
|
+ if (null != m.getSource() && OracleIncrementEnum.isRowId(m.getSource().getName())) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (null != m.getTarget() && m.getTarget().isPk()) {
|
|
|
+ pk = m.getTarget().getName();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 没有自定义主键,获取表元信息
|
|
|
+ if (null == pk) {
|
|
|
+ Table targetTable = tableGroup.getTargetTable();
|
|
|
+ MetaInfo metaInfo = manager.getMetaInfo(mapping.getTargetConnectorId(), targetTable.getName());
|
|
|
+ List<Field> targetColumn = metaInfo.getColumn();
|
|
|
+ targetTable.setColumn(targetColumn);
|
|
|
+
|
|
|
+ if (!CollectionUtils.isEmpty(targetColumn)) {
|
|
|
+ for (Field f : targetColumn) {
|
|
|
+ if (f.isPk()) {
|
|
|
+ pk = f.getName();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 剔除映射关系
|
|
|
+ List<FieldMapping> list = new ArrayList<>();
|
|
|
+ for (FieldMapping m : tableGroup.getFieldMapping()) {
|
|
|
+ if (null != m.getSource() && OracleIncrementEnum.isRowId(m.getSource().getName())) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (null != m.getTarget() && StringUtils.equals(m.getTarget().getName(), pk)) {
|
|
|
+ m.getTarget().setPk(true);
|
|
|
+ }
|
|
|
+ list.add(m);
|
|
|
+ }
|
|
|
+ fieldMapping.clear();
|
|
|
+ fieldMapping.addAll(list);
|
|
|
}
|
|
|
|
|
|
}
|