mirror of
https://github.com/alibaba/canal.git
synced 2026-11-04 00:30:15 +08:00
修改测试完成
This commit is contained in:
@@ -102,6 +102,82 @@ public class ESSyncService {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 插入操作dml
|
||||||
|
*
|
||||||
|
* @param config es配置
|
||||||
|
* @param dml dml数据
|
||||||
|
*/
|
||||||
|
private void insert(ESSyncConfig config, Dml dml) {
|
||||||
|
List<Map<String, Object>> dataList = dml.getData();
|
||||||
|
if (dataList == null || dataList.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
SchemaItem schemaItem = config.getEsMapping().getSchemaItem();
|
||||||
|
for (Map<String, Object> data : dataList) {
|
||||||
|
if (data == null || data.isEmpty()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (schemaItem.getAliasTableItems().size() == 1 && schemaItem.isAllFieldsSimple()) {
|
||||||
|
// ------单表 & 所有字段都为简单字段------
|
||||||
|
singleTableSimpleFiledInsert(config, dml, data);
|
||||||
|
} else {
|
||||||
|
// ------是主表 查询sql来插入------
|
||||||
|
if (schemaItem.getMainTable().getTableName().equalsIgnoreCase(dml.getTable())) {
|
||||||
|
mainTableInsert(config, dml, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 从表的操作
|
||||||
|
for (TableItem tableItem : schemaItem.getAliasTableItems().values()) {
|
||||||
|
if (tableItem.isMain()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!tableItem.getTableName().equals(dml.getTable())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// 关联条件出现在主表查询条件是否为简单字段
|
||||||
|
boolean allFieldsSimple = true;
|
||||||
|
for (FieldItem fieldItem : tableItem.getRelationSelectFieldItems()) {
|
||||||
|
if (fieldItem.isMethod() || fieldItem.isBinaryOp()) {
|
||||||
|
allFieldsSimple = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 所有查询字段均为简单字段
|
||||||
|
if (allFieldsSimple) {
|
||||||
|
// 不是子查询
|
||||||
|
if (!tableItem.isSubQuery()) {
|
||||||
|
// ------关联表简单字段插入------
|
||||||
|
Map<String, Object> esFieldData = new LinkedHashMap<>();
|
||||||
|
for (FieldItem fieldItem : tableItem.getRelationSelectFieldItems()) {
|
||||||
|
Object value = esTemplate.getValFromData(config.getEsMapping(),
|
||||||
|
data,
|
||||||
|
fieldItem.getFieldName(),
|
||||||
|
fieldItem.getColumn().getColumnName());
|
||||||
|
esFieldData.put(fieldItem.getFieldName(), value);
|
||||||
|
}
|
||||||
|
|
||||||
|
joinTableSimpleFieldOperation(config, dml, data, tableItem, esFieldData);
|
||||||
|
} else {
|
||||||
|
// ------关联子表简单字段插入------
|
||||||
|
subTableSimpleFieldOperation(config, dml, data, null, tableItem);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// ------关联子表复杂字段插入 执行全sql更新es------
|
||||||
|
jonTableWholeSqlOperation(config, dml, data, null, tableItem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新操作dml
|
||||||
|
*
|
||||||
|
* @param config es配置
|
||||||
|
* @param dml dml数据
|
||||||
|
*/
|
||||||
private void update(ESSyncConfig config, Dml dml) {
|
private void update(ESSyncConfig config, Dml dml) {
|
||||||
List<Map<String, Object>> dataList = dml.getData();
|
List<Map<String, Object>> dataList = dml.getData();
|
||||||
List<Map<String, Object>> oldList = dml.getOld();
|
List<Map<String, Object>> oldList = dml.getOld();
|
||||||
@@ -198,76 +274,6 @@ public class ESSyncService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 插入dml操作
|
|
||||||
*
|
|
||||||
* @param config es配置
|
|
||||||
* @param dml dml数据
|
|
||||||
*/
|
|
||||||
private void insert(ESSyncConfig config, Dml dml) {
|
|
||||||
List<Map<String, Object>> dataList = dml.getData();
|
|
||||||
if (dataList == null || dataList.isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
SchemaItem schemaItem = config.getEsMapping().getSchemaItem();
|
|
||||||
for (Map<String, Object> data : dataList) {
|
|
||||||
if (data == null || data.isEmpty()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (schemaItem.getAliasTableItems().size() == 1 && schemaItem.isAllFieldsSimple()) {
|
|
||||||
// ------单表 & 所有字段都为简单字段------
|
|
||||||
singleTableSimpleFiledInsert(config, dml, data);
|
|
||||||
} else {
|
|
||||||
// ------是主表 查询sql来插入------
|
|
||||||
if (schemaItem.getMainTable().getTableName().equalsIgnoreCase(dml.getTable())) {
|
|
||||||
mainTableInsert(config, dml, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 从表的操作
|
|
||||||
for (TableItem tableItem : schemaItem.getAliasTableItems().values()) {
|
|
||||||
if (tableItem.isMain()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!tableItem.getTableName().equals(dml.getTable())) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// 关联条件出现在主表查询条件是否为简单字段
|
|
||||||
boolean allFieldsSimple = true;
|
|
||||||
for (FieldItem fieldItem : tableItem.getRelationSelectFieldItems()) {
|
|
||||||
if (fieldItem.isMethod() || fieldItem.isBinaryOp()) {
|
|
||||||
allFieldsSimple = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 所有查询字段均为简单字段
|
|
||||||
if (allFieldsSimple) {
|
|
||||||
// 不是子查询
|
|
||||||
if (!tableItem.isSubQuery()) {
|
|
||||||
// ------关联表简单字段插入------
|
|
||||||
Map<String, Object> esFieldData = new LinkedHashMap<>();
|
|
||||||
for (FieldItem fieldItem : tableItem.getRelationSelectFieldItems()) {
|
|
||||||
Object value = esTemplate.getValFromData(config.getEsMapping(),
|
|
||||||
data,
|
|
||||||
fieldItem.getFieldName(),
|
|
||||||
fieldItem.getColumn().getColumnName());
|
|
||||||
esFieldData.put(fieldItem.getFieldName(), value);
|
|
||||||
}
|
|
||||||
|
|
||||||
joinTableSimpleFieldOperation(config, dml, data, tableItem, esFieldData);
|
|
||||||
} else {
|
|
||||||
// ------关联子表简单字段插入------
|
|
||||||
subTableSimpleFieldOperation(config, dml, data, null, tableItem);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// ------关联子表复杂字段插入 执行全sql更新es------
|
|
||||||
jonTableWholeSqlOperation(config, dml, data, null, tableItem);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 单表简单字段insert
|
* 单表简单字段insert
|
||||||
*
|
*
|
||||||
@@ -412,23 +418,7 @@ public class ESSyncService {
|
|||||||
for (FieldItem fkFieldItem : tableItem.getRelationTableFields().keySet()) {
|
for (FieldItem fkFieldItem : tableItem.getRelationTableFields().keySet()) {
|
||||||
String columnName = fkFieldItem.getColumn().getColumnName();
|
String columnName = fkFieldItem.getColumn().getColumnName();
|
||||||
Object value = esTemplate.getValFromData(mapping, data, fkFieldItem.getFieldName(), columnName);
|
Object value = esTemplate.getValFromData(mapping, data, fkFieldItem.getFieldName(), columnName);
|
||||||
if (value instanceof String) {
|
ESSyncUtil.appendCondition(sql, value, tableItem.getAlias(), columnName);
|
||||||
sql.append(tableItem.getAlias())
|
|
||||||
.append(".")
|
|
||||||
.append(columnName)
|
|
||||||
.append("='")
|
|
||||||
.append(value)
|
|
||||||
.append("' ")
|
|
||||||
.append(" AND ");
|
|
||||||
} else {
|
|
||||||
sql.append(tableItem.getAlias())
|
|
||||||
.append(".")
|
|
||||||
.append(columnName)
|
|
||||||
.append("=")
|
|
||||||
.append(value)
|
|
||||||
.append(" ")
|
|
||||||
.append(" AND ");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
int len = sql.length();
|
int len = sql.length();
|
||||||
sql.delete(len - 5, len);
|
sql.delete(len - 5, len);
|
||||||
@@ -527,23 +517,7 @@ public class ESSyncService {
|
|||||||
for (FieldItem fkFieldItem : tableItem.getRelationTableFields().keySet()) {
|
for (FieldItem fkFieldItem : tableItem.getRelationTableFields().keySet()) {
|
||||||
String columnName = fkFieldItem.getColumn().getColumnName();
|
String columnName = fkFieldItem.getColumn().getColumnName();
|
||||||
Object value = esTemplate.getValFromData(mapping, data, fkFieldItem.getFieldName(), columnName);
|
Object value = esTemplate.getValFromData(mapping, data, fkFieldItem.getFieldName(), columnName);
|
||||||
if (value instanceof String) {
|
ESSyncUtil.appendCondition(sql, value, tableItem.getAlias(), columnName);
|
||||||
sql.append(tableItem.getAlias())
|
|
||||||
.append(".")
|
|
||||||
.append(columnName)
|
|
||||||
.append("='")
|
|
||||||
.append(value)
|
|
||||||
.append("' ")
|
|
||||||
.append(" AND ");
|
|
||||||
} else {
|
|
||||||
sql.append(tableItem.getAlias())
|
|
||||||
.append(".")
|
|
||||||
.append(columnName)
|
|
||||||
.append("=")
|
|
||||||
.append(value)
|
|
||||||
.append(" ")
|
|
||||||
.append(" AND ");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
int len = sql.length();
|
int len = sql.length();
|
||||||
sql.delete(len - 5, len);
|
sql.delete(len - 5, len);
|
||||||
@@ -602,16 +576,14 @@ public class ESSyncService {
|
|||||||
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
|
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
|
||||||
for (Map.Entry<FieldItem, List<FieldItem>> entry : tableItem.getRelationTableFields().entrySet()) {
|
for (Map.Entry<FieldItem, List<FieldItem>> entry : tableItem.getRelationTableFields().entrySet()) {
|
||||||
for (FieldItem fieldItem : entry.getValue()) {
|
for (FieldItem fieldItem : entry.getValue()) {
|
||||||
if (fieldItem.getColumnItems().size() == 1) {
|
Object value = esTemplate
|
||||||
Object value = esTemplate
|
.getValFromRS(mapping, rs, fieldItem.getFieldName(), fieldItem.getFieldName());
|
||||||
.getValFromRS(mapping, rs, fieldItem.getFieldName(), fieldItem.getFieldName());
|
String fieldName = fieldItem.getFieldName();
|
||||||
String fieldName = fieldItem.getFieldName();
|
// 判断是否是主键
|
||||||
// 判断是否是主键
|
if (fieldName.equals(mapping.get_id())) {
|
||||||
if (fieldName.equals(mapping.get_id())) {
|
fieldName = "_id";
|
||||||
fieldName = "_id";
|
|
||||||
}
|
|
||||||
queryBuilder.must(QueryBuilders.termsQuery(fieldName, value));
|
|
||||||
}
|
}
|
||||||
|
queryBuilder.must(QueryBuilders.termsQuery(fieldName, value));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ import com.alibaba.fastjson.JSON;
|
|||||||
import com.alibaba.otter.canal.client.adapter.es.config.ESSyncConfig.ESMapping;
|
import com.alibaba.otter.canal.client.adapter.es.config.ESSyncConfig.ESMapping;
|
||||||
import com.alibaba.otter.canal.client.adapter.es.config.SchemaItem;
|
import com.alibaba.otter.canal.client.adapter.es.config.SchemaItem;
|
||||||
import com.alibaba.otter.canal.client.adapter.es.config.SchemaItem.ColumnItem;
|
import com.alibaba.otter.canal.client.adapter.es.config.SchemaItem.ColumnItem;
|
||||||
import com.alibaba.otter.canal.client.adapter.es.config.SchemaItem.FieldItem;
|
|
||||||
import com.alibaba.otter.canal.client.adapter.es.config.SchemaItem.TableItem;
|
import com.alibaba.otter.canal.client.adapter.es.config.SchemaItem.TableItem;
|
||||||
|
|
||||||
public class ESSyncUtil {
|
public class ESSyncUtil {
|
||||||
@@ -161,7 +160,7 @@ public class ESSyncUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!((String) val).contains(",")) {
|
if (!((String) val).contains(",")) {
|
||||||
logger.error("es type is geo_point, source value not contains ',' spit");
|
logger.error("es type is geo_point, source value not contains ',' separator");
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -225,7 +224,7 @@ public class ESSyncUtil {
|
|||||||
// 拼接condition
|
// 拼接condition
|
||||||
StringBuilder condition = new StringBuilder(" ");
|
StringBuilder condition = new StringBuilder(" ");
|
||||||
for (ColumnItem idColumn : idColumns) {
|
for (ColumnItem idColumn : idColumns) {
|
||||||
Object idVal = data.get(Util.cleanColumn(idColumn.getColumnName()));
|
Object idVal = data.get(idColumn.getColumnName());
|
||||||
if (mainTable.getAlias() != null) condition.append(mainTable.getAlias()).append(".");
|
if (mainTable.getAlias() != null) condition.append(mainTable.getAlias()).append(".");
|
||||||
condition.append(idColumn.getColumnName()).append("=");
|
condition.append(idColumn.getColumnName()).append("=");
|
||||||
if (idVal instanceof String) {
|
if (idVal instanceof String) {
|
||||||
@@ -246,6 +245,14 @@ public class ESSyncUtil {
|
|||||||
return sql + " WHERE " + condition + " ";
|
return sql + " WHERE " + condition + " ";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void appendCondition(StringBuilder sql, Object value, String owner, String columnName) {
|
||||||
|
if (value instanceof String) {
|
||||||
|
sql.append(owner).append(".").append(columnName).append("='").append(value).append("' AND ");
|
||||||
|
} else {
|
||||||
|
sql.append(owner).append(".").append(columnName).append("=").append(value).append(" AND ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 执行查询sql
|
* 执行查询sql
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -1,18 +0,0 @@
|
|||||||
package com.alibaba.otter.canal.client.adapter.es.support;
|
|
||||||
|
|
||||||
public class Util {
|
|
||||||
public static String cleanColumn(String column) {
|
|
||||||
if (column == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
if (column.contains("`")) {
|
|
||||||
column = column.replaceAll("`", "");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (column.contains("'")) {
|
|
||||||
column = column.replaceAll("'", "");
|
|
||||||
}
|
|
||||||
|
|
||||||
return column;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -69,7 +69,7 @@ public class RoleSyncJoinSub2Test {
|
|||||||
List<Map<String, Object>> oldList = new ArrayList<>();
|
List<Map<String, Object>> oldList = new ArrayList<>();
|
||||||
Map<String, Object> old = new LinkedHashMap<>();
|
Map<String, Object> old = new LinkedHashMap<>();
|
||||||
oldList.add(old);
|
oldList.add(old);
|
||||||
old.put("label", "a");
|
old.put("label", "v");
|
||||||
dml.setOld(oldList);
|
dml.setOld(oldList);
|
||||||
|
|
||||||
esAdapter.getEsSyncService().sync(dml);
|
esAdapter.getEsSyncService().sync(dml);
|
||||||
|
|||||||
Reference in New Issue
Block a user