diff --git a/client-adapter/elasticsearch/src/main/java/com/alibaba/otter/canal/client/adapter/es/config/SqlParser.java b/client-adapter/elasticsearch/src/main/java/com/alibaba/otter/canal/client/adapter/es/config/SqlParser.java index e0c23e7b..b5f12b39 100644 --- a/client-adapter/elasticsearch/src/main/java/com/alibaba/otter/canal/client/adapter/es/config/SqlParser.java +++ b/client-adapter/elasticsearch/src/main/java/com/alibaba/otter/canal/client/adapter/es/config/SqlParser.java @@ -9,11 +9,7 @@ import java.util.stream.Collectors; import com.alibaba.fastsql.sql.SQLUtils; import com.alibaba.fastsql.sql.ast.SQLExpr; -import com.alibaba.fastsql.sql.ast.expr.SQLBinaryOpExpr; -import com.alibaba.fastsql.sql.ast.expr.SQLCaseExpr; -import com.alibaba.fastsql.sql.ast.expr.SQLIdentifierExpr; -import com.alibaba.fastsql.sql.ast.expr.SQLMethodInvokeExpr; -import com.alibaba.fastsql.sql.ast.expr.SQLPropertyExpr; +import com.alibaba.fastsql.sql.ast.expr.*; import com.alibaba.fastsql.sql.ast.statement.SQLExprTableSource; import com.alibaba.fastsql.sql.ast.statement.SQLJoinTableSource; import com.alibaba.fastsql.sql.ast.statement.SQLSelectStatement; @@ -130,6 +126,23 @@ public class SqlParser { SQLCaseExpr sqlCaseExpr = (SQLCaseExpr) expr; fieldItem.setMethod(true); sqlCaseExpr.getItems().forEach(item-> visitColumn(item.getConditionExpr(), fieldItem)); + }else if(expr instanceof SQLCharExpr) { + SQLCharExpr sqlCharExpr = (SQLCharExpr) expr; + String owner = null; + String columnName = null; + if (sqlCharExpr.getParent() instanceof SQLCaseExpr.Item) { + owner = ((SQLPropertyExpr) ((SQLCaseExpr.Item) sqlCharExpr.getParent()).getValueExpr()).getOwnernName(); + columnName = ((SQLPropertyExpr) ((SQLCaseExpr.Item) sqlCharExpr.getParent()).getValueExpr()).getName(); + } + if (fieldItem.getFieldName() == null) { + fieldItem.setFieldName(columnName); + fieldItem.setExpr(sqlCharExpr.toString()); + } + ColumnItem columnItem = new ColumnItem(); + columnItem.setColumnName(columnName); + columnItem.setOwner(owner); + fieldItem.getOwners().add(owner); + fieldItem.addColumn(columnItem); } } diff --git a/client-adapter/elasticsearch/src/main/java/com/alibaba/otter/canal/client/adapter/es/service/ESSyncService.java b/client-adapter/elasticsearch/src/main/java/com/alibaba/otter/canal/client/adapter/es/service/ESSyncService.java index ac80a197..e1c73735 100644 --- a/client-adapter/elasticsearch/src/main/java/com/alibaba/otter/canal/client/adapter/es/service/ESSyncService.java +++ b/client-adapter/elasticsearch/src/main/java/com/alibaba/otter/canal/client/adapter/es/service/ESSyncService.java @@ -1,9 +1,6 @@ package com.alibaba.otter.canal.client.adapter.es.service; -import java.util.Collection; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import javax.sql.DataSource; @@ -677,7 +674,17 @@ public class ESSyncService { private void wholeSqlOperation(ESSyncConfig config, Dml dml, Map data, Map old, TableItem tableItem) { ESMapping mapping = config.getEsMapping(); - StringBuilder sql = new StringBuilder(mapping.getSql() + " WHERE "); + //防止最后出现groupby 导致sql解析异常 + String[] sqlSplit = mapping.getSql().split("GROUP\\ BY(?!(.*)ON)"); + String sqlNoWhere = sqlSplit[0]; + + String sqlGroupBy = ""; + + if(sqlSplit.length > 1){ + sqlGroupBy = "GROUP BY "+ sqlSplit[1]; + } + + StringBuilder sql = new StringBuilder(sqlNoWhere + " WHERE "); for (FieldItem fkFieldItem : tableItem.getRelationTableFields().keySet()) { String columnName = fkFieldItem.getColumn().getColumnName(); @@ -686,6 +693,8 @@ public class ESSyncService { } int len = sql.length(); sql.delete(len - 5, len); + sql.append(sqlGroupBy); + DataSource ds = DatasourceConfig.DATA_SOURCES.get(config.getDataSourceKey()); if (logger.isTraceEnabled()) { logger.trace("Join table update es index by query whole sql, destination:{}, table: {}, index: {}, sql: {}",