Skip to content

Commit 9e9260e

Browse files
author
wanghaun
committed
feature/module_split 回表查询优化
1 parent 5d4a226 commit 9e9260e

File tree

2 files changed

+51
-6
lines changed

2 files changed

+51
-6
lines changed

elasticsearch-engine-base/src/main/java/com/elasticsearch/engine/base/common/parse/sql/SqlParserHelper.java

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
package com.elasticsearch.engine.base.common.parse.sql;
22

33
import com.elasticsearch.engine.base.common.utils.CaseFormatUtils;
4-
import com.elasticsearch.engine.base.model.exception.EsEngineQueryException;
54
import com.elasticsearch.engine.base.config.EsEngineConfig;
65
import com.elasticsearch.engine.base.model.annotion.EsQueryIndex;
76
import com.elasticsearch.engine.base.model.domain.BackDto;
7+
import com.elasticsearch.engine.base.model.exception.EsEngineQueryException;
88
import com.google.common.collect.Lists;
9+
import com.google.common.collect.Maps;
910
import net.sf.jsqlparser.JSQLParserException;
1011
import net.sf.jsqlparser.expression.*;
1112
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
@@ -22,6 +23,7 @@
2223
import java.io.StringReader;
2324
import java.lang.reflect.Method;
2425
import java.util.List;
26+
import java.util.Map;
2527
import java.util.Objects;
2628

2729
/**
@@ -79,7 +81,7 @@ public static String rewriteBackSql(String oldSql, BackDto backDto, List<?> esRe
7981
CCJSqlParserManager parserManager = new CCJSqlParserManager();
8082
Select select = (Select) parserManager.parse(new StringReader(oldSql));
8183
PlainSelect plain = (PlainSelect) select.getSelectBody();
82-
//where 别名清除
84+
//where 添加回表条件
8385
setBackWhereItem(plain, backDto, esResult);
8486
// plain.setGroupByElement(null);
8587
// plain.setHaving(null);
@@ -96,7 +98,7 @@ public static String rewriteBackSql(String oldSql, BackDto backDto, List<?> esRe
9698
* @throws Exception
9799
*/
98100
private static void setBackWhereItem(PlainSelect plain, BackDto backDto, List<?> esResult) throws Exception {
99-
String tableName = StringUtils.isEmpty(backDto.getTableName()) ? getTableName(plain) : backDto.getTableName();
101+
String tableName = getBackTableName(plain, backDto);
100102
//ColumnName es驼峰 转 mysql下划线
101103
String backColumn = backDto.getBackColumn();
102104
if (!EsEngineConfig.isNamingStrategy()) {
@@ -113,12 +115,31 @@ private static void setBackWhereItem(PlainSelect plain, BackDto backDto, List<?>
113115
}
114116

115117
/**
116-
* 获取表名(关联查询时 表名为主表表名)
118+
* 回去回表查询表名
119+
* @param plain
120+
* @param backDto
121+
* @return
122+
*/
123+
private static String getBackTableName(PlainSelect plain, BackDto backDto) {
124+
String tableName;
125+
if (StringUtils.isNotEmpty(backDto.getTableName())) {
126+
tableName = getJoinTableName(plain).get(backDto.getTableName());
127+
} else {
128+
tableName = getDefaultFromTableName(plain);
129+
}
130+
if (StringUtils.isEmpty(tableName)) {
131+
throw new EsEngineQueryException("回表查询指定的表名不存在: " + backDto.getTableName());
132+
}
133+
return tableName;
134+
}
135+
136+
/**
137+
* 获取表名(关联查询时 默认表名为主表表名)
117138
*
118139
* @param plain
119140
* @return
120141
*/
121-
public static String getTableName(PlainSelect plain) {
142+
private static String getDefaultFromTableName(PlainSelect plain) {
122143
FromItem fromItem = plain.getFromItem();
123144
String fromItemName = "";
124145
if (fromItem instanceof Table) {
@@ -127,6 +148,30 @@ public static String getTableName(PlainSelect plain) {
127148
return fromItem.getAlias() == null ? fromItemName : fromItem.getAlias().getName();
128149
}
129150

151+
/**
152+
* 获取表名(主表表名,及关联表表名, key为原始表名, value为原始表名或别名)
153+
*
154+
* @param plain
155+
* @return
156+
*/
157+
private static Map<String, String> getJoinTableName(PlainSelect plain) {
158+
List<FromItem> fromItems = Lists.newArrayList();
159+
Map<String, String> tableNames = Maps.newHashMap();
160+
fromItems.add(plain.getFromItem());
161+
if (CollectionUtils.isNotEmpty(plain.getJoins())) {
162+
plain.getJoins().forEach(item -> fromItems.add(item.getRightItem()));
163+
}
164+
165+
fromItems.forEach(fromItem -> {
166+
String fromItemName = "";
167+
if (fromItem instanceof Table) {
168+
fromItemName = ((Table) fromItem).getName().replaceAll("`", "");
169+
}
170+
tableNames.put(fromItemName, fromItem.getAlias() == null ? fromItemName : fromItem.getAlias().getName());
171+
});
172+
return tableNames;
173+
}
174+
130175
/**
131176
* TODO 获取索引名的方法抽取通用方法
132177
* 替换表名

elasticsearch-engine-jooq/src/main/java/com/elasticsearch/engine/jooq/listener/JooqEsQueryExecuteListener.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public void renderEnd(ExecuteContext ctx) {
7070
*/
7171
@Override
7272
public void executeEnd(ExecuteContext ctx) {
73-
// log.info("jooq回表执行sql: " + ctx.sql());
73+
log.info("jooq回表执行sql: " + ctx.sql());
7474
}
7575

7676
@Override

0 commit comments

Comments
 (0)