提交 02e94996 编写于 作者: T terrymanu

simplify SQLBuilder

上级 f5238de7
......@@ -21,71 +21,69 @@ import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
/**
* SQL构建器.
*
* @author gaohongtao
* @author zhangliang
*/
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public final class SQLBuilder {
private final List<Object> segments;
private final Map<String, SQLBuilderToken> tokenMap;
private StringBuilder currentSegment;
public SQLBuilder() {
this(new LinkedList<>(), new HashMap<String, SQLBuilderToken>());
segments = new LinkedList<>();
currentSegment = new StringBuilder();
segments.add(currentSegment);
}
/**
* 追加字面量.
*
* @param literals 字面量
*/
public void append(final String literals) {
currentSegment.append(literals);
}
/**
* 追加占位符.
*
* @param token 占位符
*/
public void append(final SQLBuilderToken token) {
if (!tokenMap.containsKey(token.getLabel())) {
tokenMap.put(token.getLabel(), token);
}
tokenMap.get(token.getLabel()).getIndexes().add(segments.size());
segments.add(tokenMap.get(token.getLabel()));
segments.add(token);
currentSegment = new StringBuilder();
segments.add(currentSegment);
}
/**
* 追加字面量.
*
* @param literals 字面量
*/
public void append(final String literals) {
currentSegment.append(literals);
}
/**
* 用实际的值替代占位符,并返回新的构建器.
*
*
* @param tokens 占位符集合
* @return 新SQL构建器
*/
public SQLBuilder createNewSQLBuilder(final Collection<SQLBuilderToken> tokens) {
SQLBuilder result = new SQLBuilder(segments, tokenMap);
for (Object each : segments) {
if (each instanceof SQLBuilderToken) {
setToken((SQLBuilderToken) each, tokens);
}
}
return new SQLBuilder(segments);
}
private void setToken(final SQLBuilderToken targetToken, final Collection<SQLBuilderToken> tokens) {
for (SQLBuilderToken each : tokens) {
SQLBuilderToken originalToken = tokenMap.get(each.getLabel());
result.tokenMap.put(each.getLabel(), each);
for (Integer index : originalToken.getIndexes()) {
result.segments.set(index, each);
if (targetToken.getLabel().equals(each.getLabel())) {
targetToken.setValue(each.getValue());
}
}
return result;
}
/**
......@@ -101,6 +99,7 @@ public final class SQLBuilder {
return result.toString();
}
// TODO remove
@Override
public String toString() {
StringBuilder result = new StringBuilder();
......
package com.dangdang.ddframe.rdb.sharding.rewrite;
import com.google.common.base.Joiner;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import java.util.LinkedList;
import java.util.List;
import lombok.Setter;
/**
* SQL构建器占位符.
*
* @author zhangliang
*/
@AllArgsConstructor
@RequiredArgsConstructor
@Getter
@Setter
public final class SQLBuilderToken {
private final String label;
private final String value;
private final List<Integer> indexes = new LinkedList<>();
private String value;
String toToken() {
if (null == value) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册