提交 39345bbe 编写于 作者: T terrymanu

refactor append for SQLBuilder

上级 468e5a1f
......@@ -49,51 +49,37 @@ public final class SQLBuilder {
}
/**
* 增加占位符.
*
* @param token 占位符
* 追加字面量.
*
* @param literals 字面量
*/
public void appendToken(final String token) {
appendToken(token, token);
public void append(final String literals) {
currentSegment.append(literals);
}
/**
* 加占位符.
* 加占位符.
*
* @param label 占位符标签
* @param token 占位符
*/
public void appendToken(final String label, final String token) {
SQLBuilderToken stringToken;
if (tokenMap.containsKey(label)) {
stringToken = tokenMap.get(label);
} else {
stringToken = new SQLBuilderToken(label, token);
tokenMap.put(label, stringToken);
public void append(final SQLBuilderToken token) {
if (!tokenMap.containsKey(token.getLabel())) {
tokenMap.put(token.getLabel(), token);
}
stringToken.getIndexes().add(segments.size());
segments.add(stringToken);
tokenMap.get(token.getLabel()).getIndexes().add(segments.size());
segments.add(tokenMap.get(token.getLabel()));
currentSegment = new StringBuilder();
segments.add(currentSegment);
}
/**
* 追加字面量.
*
* @param literals 字面量
*/
public void append(final String literals) {
currentSegment.append(literals);
}
/**
* 用实际的值替代占位符,并返回新的构建器.
*
* @return 新SQL构建器
*/
public SQLBuilder createNewSQLBuilder(final Collection<SQLBuilderToken> stringTokens) {
public SQLBuilder createNewSQLBuilder(final Collection<SQLBuilderToken> tokens) {
SQLBuilder result = new SQLBuilder(this);
for (SQLBuilderToken each : stringTokens) {
for (SQLBuilderToken each : tokens) {
SQLBuilderToken origin = tokenMap.get(each.getLabel());
result.tokenMap.put(each.getLabel(), each);
for (Integer index : origin.getIndexes()) {
......
......@@ -103,7 +103,7 @@ public final class SQLRewriteEngine {
private void appendTableToken(final SQLBuilder sqlBuilder, final TableToken tableToken, final int count, final List<SQLToken> sqlTokens) {
String tableName = tableNames.contains(tableToken.getTableName()) ? tableToken.getTableName() : tableToken.getOriginalLiterals();
sqlBuilder.appendToken(tableName);
sqlBuilder.append(new SQLBuilderToken(tableName, tableName));
int beginPosition = tableToken.getBeginPosition() + tableToken.getOriginalLiterals().length();
int endPosition = sqlTokens.size() - 1 == count ? originalSQL.length() : sqlTokens.get(count + 1).getBeginPosition();
sqlBuilder.append(originalSQL.substring(beginPosition, endPosition));
......@@ -121,7 +121,7 @@ public final class SQLRewriteEngine {
private void appendLimitRowCount(final SQLBuilder sqlBuilder, final RowCountLimitToken rowCountLimitToken, final int count, final List<SQLToken> sqlTokens, final boolean isRewrite) {
String rowCount = isRewrite ? String.valueOf(rowCountLimitToken.getRowCount() + limit.getOffset()) : String.valueOf(rowCountLimitToken.getRowCount());
sqlBuilder.appendToken(RowCountLimitToken.COUNT_NAME, rowCount);
sqlBuilder.append(new SQLBuilderToken(RowCountLimitToken.COUNT_NAME, rowCount));
int beginPosition = rowCountLimitToken.getBeginPosition() + String.valueOf(rowCountLimitToken.getRowCount()).length();
int endPosition = sqlTokens.size() - 1 == count ? originalSQL.length() : sqlTokens.get(count + 1).getBeginPosition();
sqlBuilder.append(originalSQL.substring(beginPosition, endPosition));
......@@ -129,7 +129,7 @@ public final class SQLRewriteEngine {
private void appendLimitOffsetToken(final SQLBuilder sqlBuilder, final OffsetLimitToken offsetLimitToken, final int count, final List<SQLToken> sqlTokens, final boolean isRewrite) {
String offset = isRewrite ? "0" : String.valueOf(offsetLimitToken.getOffset());
sqlBuilder.appendToken(OffsetLimitToken.OFFSET_NAME, offset);
sqlBuilder.append(new SQLBuilderToken(OffsetLimitToken.OFFSET_NAME, offset));
int beginPosition = offsetLimitToken.getBeginPosition() + String.valueOf(offsetLimitToken.getOffset()).length();
int endPosition = sqlTokens.size() - 1 == count ? originalSQL.length() : sqlTokens.get(count + 1).getBeginPosition();
sqlBuilder.append(originalSQL.substring(beginPosition, endPosition));
......@@ -144,13 +144,13 @@ public final class SQLRewriteEngine {
* @return SQL构建器
*/
public SQLBuilder rewriteTable(final TableUnit tableUnit, final SQLBuilder sqlBuilder, final ShardingRule shardingRule) {
Collection<SQLBuilderToken> stringTokens = new LinkedList<>();
stringTokens.add(new SQLBuilderToken(tableUnit.getLogicTableName(), tableUnit.getActualTableName()));
Collection<SQLBuilderToken> tokens = new LinkedList<>();
tokens.add(new SQLBuilderToken(tableUnit.getLogicTableName(), tableUnit.getActualTableName()));
Optional<BindingTableRule> bindingTableRule = shardingRule.findBindingTableRule(tableUnit.getLogicTableName());
if (bindingTableRule.isPresent()) {
stringTokens.addAll(getBindingTableTokens(tableUnit, sqlBuilder, bindingTableRule.get()));
tokens.addAll(getBindingTableTokens(tableUnit, bindingTableRule.get()));
}
return sqlBuilder.createNewSQLBuilder(stringTokens);
return sqlBuilder.createNewSQLBuilder(tokens);
}
/**
......@@ -162,18 +162,18 @@ public final class SQLRewriteEngine {
* @return SQL构建器
*/
public SQLBuilder rewriteTable(final CartesianTableReference cartesianTableReference, final SQLBuilder sqlBuilder, final ShardingRule shardingRule) {
Collection<SQLBuilderToken> stringTokens = new LinkedList<>();
Collection<SQLBuilderToken> tokens = new LinkedList<>();
for (TableUnit each : cartesianTableReference.getTableUnits()) {
stringTokens.add(new SQLBuilderToken(each.getLogicTableName(), each.getActualTableName()));
tokens.add(new SQLBuilderToken(each.getLogicTableName(), each.getActualTableName()));
Optional<BindingTableRule> bindingTableRule = shardingRule.findBindingTableRule(each.getLogicTableName());
if (bindingTableRule.isPresent()) {
stringTokens.addAll(getBindingTableTokens(each, sqlBuilder, bindingTableRule.get()));
tokens.addAll(getBindingTableTokens(each, bindingTableRule.get()));
}
}
return sqlBuilder.createNewSQLBuilder(stringTokens);
return sqlBuilder.createNewSQLBuilder(tokens);
}
private Collection<SQLBuilderToken> getBindingTableTokens(final TableUnit tableUnit, final SQLBuilder sqlBuilder, final BindingTableRule bindingTableRule) {
private Collection<SQLBuilderToken> getBindingTableTokens(final TableUnit tableUnit, final BindingTableRule bindingTableRule) {
Collection<SQLBuilderToken> result = new LinkedList<>();
for (String eachTable : tableNames) {
if (!eachTable.equalsIgnoreCase(tableUnit.getLogicTableName()) && bindingTableRule.hasLogicTable(eachTable)) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册