From 02e949966ef15510b2b453e4f8de1b7d52d606d3 Mon Sep 17 00:00:00 2001 From: terrymanu Date: Sat, 3 Jun 2017 01:03:40 +0800 Subject: [PATCH] simplify SQLBuilder --- .../rdb/sharding/rewrite/SQLBuilder.java | 51 +++++++++---------- .../rdb/sharding/rewrite/SQLBuilderToken.java | 11 ++-- 2 files changed, 30 insertions(+), 32 deletions(-) diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/rewrite/SQLBuilder.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/rewrite/SQLBuilder.java index b15a9e470b..2fb8c59cf0 100644 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/rewrite/SQLBuilder.java +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/rewrite/SQLBuilder.java @@ -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 segments; - private final Map tokenMap; - private StringBuilder currentSegment; public SQLBuilder() { - this(new LinkedList<>(), new HashMap()); + 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 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 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(); diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/rewrite/SQLBuilderToken.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/rewrite/SQLBuilderToken.java index aea43e8393..1737cecad4 100644 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/rewrite/SQLBuilderToken.java +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/rewrite/SQLBuilderToken.java @@ -1,26 +1,25 @@ 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 indexes = new LinkedList<>(); + private String value; String toToken() { if (null == value) { -- GitLab