|
@@ -75,6 +75,11 @@ public class ESSyncService {
|
|
|
|
|
|
public void sync(ESSyncConfig config, Dml dml) {
|
|
|
try {
|
|
|
+ // 如果是按时间戳定时更新则返回
|
|
|
+ if (config.getEsMapping().isSyncByTimestamp()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
long begin = System.currentTimeMillis();
|
|
|
|
|
|
String type = dml.getType();
|
|
@@ -98,91 +103,6 @@ public class ESSyncService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void delete(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;
|
|
|
- }
|
|
|
-
|
|
|
- ESMapping mapping = config.getEsMapping();
|
|
|
-
|
|
|
- // ------是主表------
|
|
|
- if (schemaItem.getMainTable().getTableName().equalsIgnoreCase(dml.getTable())) {
|
|
|
- FieldItem idFieldItem = schemaItem.getIdFieldItem(mapping);
|
|
|
- // 主键为简单字段
|
|
|
- if (!idFieldItem.isMethod() && !idFieldItem.isBinaryOp()) {
|
|
|
- Object idVal = esTemplate.getValFromData(mapping,
|
|
|
- data,
|
|
|
- idFieldItem.getFieldName(),
|
|
|
- idFieldItem.getColumn().getColumnName());
|
|
|
-
|
|
|
- if (logger.isTraceEnabled()) {
|
|
|
- logger.trace("Main table delete es index, destination:{}, table: {}, index: {}, id: {}",
|
|
|
- config.getDestination(),
|
|
|
- dml.getTable(),
|
|
|
- mapping.get_index(),
|
|
|
- idVal);
|
|
|
- }
|
|
|
- boolean result = esTemplate.delete(mapping, idVal);
|
|
|
- if (!result) {
|
|
|
- logger.error("Main table delete es index error, destination:{}, table: {}, index: {}, id: {}",
|
|
|
- config.getDestination(),
|
|
|
- dml.getTable(),
|
|
|
- mapping.get_index(),
|
|
|
- idVal);
|
|
|
- }
|
|
|
- } else {
|
|
|
- // ------主键带函数, 查询sql获取主键删除------
|
|
|
- mainTableDelete(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()) {
|
|
|
- // ------关联表简单字段更新为null------
|
|
|
- Map<String, Object> esFieldData = new LinkedHashMap<>();
|
|
|
- for (FieldItem fieldItem : tableItem.getRelationSelectFieldItems()) {
|
|
|
- esFieldData.put(fieldItem.getFieldName(), null);
|
|
|
- }
|
|
|
- joinTableSimpleFieldOperation(config, dml, data, tableItem, esFieldData);
|
|
|
- } else {
|
|
|
- // ------关联子表简单字段更新------
|
|
|
- subTableSimpleFieldOperation(config, dml, data, null, tableItem);
|
|
|
- }
|
|
|
- } else {
|
|
|
- // ------关联子表复杂字段更新 执行全sql更新es------
|
|
|
- jonTableWholeSqlOperation(config, dml, data, null, tableItem);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* 插入操作dml
|
|
|
*
|
|
@@ -246,7 +166,7 @@ public class ESSyncService {
|
|
|
}
|
|
|
} else {
|
|
|
// ------关联子表复杂字段插入 执行全sql更新es------
|
|
|
- jonTableWholeSqlOperation(config, dml, data, null, tableItem);
|
|
|
+ wholeSqlOperation(config, dml, data, null, tableItem);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -282,6 +202,7 @@ public class ESSyncService {
|
|
|
ESMapping mapping = config.getEsMapping();
|
|
|
String idFieldName = mapping.get_id() == null ? mapping.getPk() : mapping.get_id();
|
|
|
FieldItem idFieldItem = schemaItem.getSelectFields().get(idFieldName);
|
|
|
+
|
|
|
boolean idFieldSimple = true;
|
|
|
if (idFieldItem.isMethod() || idFieldItem.isBinaryOp()) {
|
|
|
idFieldSimple = false;
|
|
@@ -298,8 +219,36 @@ public class ESSyncService {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ // 不支持主键更新!!
|
|
|
+
|
|
|
+ // 判断是否有外键更新
|
|
|
+ boolean fkChanged = false;
|
|
|
+ for (TableItem tableItem : schemaItem.getAliasTableItems().values()) {
|
|
|
+ if (tableItem.isMain()) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ boolean changed = false;
|
|
|
+ for (List<FieldItem> fieldItems : tableItem.getRelationTableFields().values()) {
|
|
|
+ for (FieldItem fieldItem : fieldItems) {
|
|
|
+ if (old.containsKey(fieldItem.getColumn().getColumnName())) {
|
|
|
+ fkChanged = true;
|
|
|
+ changed = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 如果外键有修改,则更新所对应该表的所有查询条件数据
|
|
|
+ if (changed) {
|
|
|
+ for (FieldItem fieldItem : tableItem.getRelationSelectFieldItems()) {
|
|
|
+ fieldItem.getColumnItems()
|
|
|
+ .forEach(columnItem -> old.put(columnItem.getColumnName(), null));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
// 判断主键和所更新的字段是否全为简单字段
|
|
|
- if (idFieldSimple && allUpdateFieldSimple) {
|
|
|
+ if (idFieldSimple && allUpdateFieldSimple && !fkChanged) {
|
|
|
singleTableSimpleFiledUpdate(config, dml, data, old);
|
|
|
} else {
|
|
|
mainTableUpdate(config, dml, data, old);
|
|
@@ -346,7 +295,7 @@ public class ESSyncService {
|
|
|
}
|
|
|
} else {
|
|
|
// ------关联子表复杂字段更新 执行全sql更新es------
|
|
|
- jonTableWholeSqlOperation(config, dml, data, old, tableItem);
|
|
|
+ wholeSqlOperation(config, dml, data, old, tableItem);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -355,6 +304,97 @@ public class ESSyncService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 删除操作dml
|
|
|
+ *
|
|
|
+ * @param config es配置
|
|
|
+ * @param dml dml数据
|
|
|
+ */
|
|
|
+ private void delete(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;
|
|
|
+ }
|
|
|
+
|
|
|
+ ESMapping mapping = config.getEsMapping();
|
|
|
+
|
|
|
+ // ------是主表------
|
|
|
+ if (schemaItem.getMainTable().getTableName().equalsIgnoreCase(dml.getTable())) {
|
|
|
+ FieldItem idFieldItem = schemaItem.getIdFieldItem(mapping);
|
|
|
+ // 主键为简单字段
|
|
|
+ if (!idFieldItem.isMethod() && !idFieldItem.isBinaryOp()) {
|
|
|
+ Object idVal = esTemplate.getValFromData(mapping,
|
|
|
+ data,
|
|
|
+ idFieldItem.getFieldName(),
|
|
|
+ idFieldItem.getColumn().getColumnName());
|
|
|
+
|
|
|
+ if (logger.isTraceEnabled()) {
|
|
|
+ logger.trace("Main table delete es index, destination:{}, table: {}, index: {}, id: {}",
|
|
|
+ config.getDestination(),
|
|
|
+ dml.getTable(),
|
|
|
+ mapping.get_index(),
|
|
|
+ idVal);
|
|
|
+ }
|
|
|
+ boolean result = esTemplate.delete(mapping, idVal);
|
|
|
+ if (!result) {
|
|
|
+ logger.error("Main table delete es index error, destination:{}, table: {}, index: {}, id: {}",
|
|
|
+ config.getDestination(),
|
|
|
+ dml.getTable(),
|
|
|
+ mapping.get_index(),
|
|
|
+ idVal);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // ------主键带函数, 查询sql获取主键删除------
|
|
|
+ mainTableDelete(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()) {
|
|
|
+ // ------关联表简单字段更新为null------
|
|
|
+ Map<String, Object> esFieldData = new LinkedHashMap<>();
|
|
|
+ for (FieldItem fieldItem : tableItem.getRelationSelectFieldItems()) {
|
|
|
+ esFieldData.put(fieldItem.getFieldName(), null);
|
|
|
+ }
|
|
|
+ joinTableSimpleFieldOperation(config, dml, data, tableItem, esFieldData);
|
|
|
+ } else {
|
|
|
+ // ------关联子表简单字段更新------
|
|
|
+ subTableSimpleFieldOperation(config, dml, data, null, tableItem);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // ------关联子表复杂字段更新 执行全sql更新es------
|
|
|
+ wholeSqlOperation(config, dml, data, null, tableItem);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 单表简单字段insert
|
|
|
*
|
|
@@ -633,8 +673,8 @@ public class ESSyncService {
|
|
|
* @param data 单行dml数据
|
|
|
* @param tableItem 当前表配置
|
|
|
*/
|
|
|
- private void jonTableWholeSqlOperation(ESSyncConfig config, Dml dml, Map<String, Object> data,
|
|
|
- Map<String, Object> old, TableItem tableItem) {
|
|
|
+ private void wholeSqlOperation(ESSyncConfig config, Dml dml, Map<String, Object> data, Map<String, Object> old,
|
|
|
+ TableItem tableItem) {
|
|
|
ESMapping mapping = config.getEsMapping();
|
|
|
StringBuilder sql = new StringBuilder(mapping.getSql() + " WHERE ");
|
|
|
|