Skip to content

Commit ca2bb19

Browse files
committed
refactor: 优化构造SQL性能
自定义条件时, 建议根据情况使用 `BatchSqlFragments`或者`SqlFragments#single,of` 或者 `SimpleSqlFragments.of`
1 parent d77de93 commit ca2bb19

File tree

48 files changed

+1144
-567
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+1144
-567
lines changed

hsweb-easy-orm-core/src/main/java/org/hswebframework/ezorm/core/meta/FeatureSupportedMetadata.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.hswebframework.ezorm.core.FeatureType;
77

88
import java.util.*;
9+
import java.util.function.Function;
910
import java.util.function.Supplier;
1011
import java.util.stream.Collectors;
1112

hsweb-easy-orm-rdb/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,12 @@
156156
<scope>test</scope>
157157
</dependency>
158158

159+
<dependency>
160+
<groupId>com.google.guava</groupId>
161+
<artifactId>guava</artifactId>
162+
<version>32.0.0-jre</version>
163+
</dependency>
164+
159165
</dependencies>
160166

161167
<repositories>

hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/metadata/AbstractTableOrViewMetadata.java

Lines changed: 37 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.hswebframework.ezorm.rdb.metadata;
22

3+
import lombok.AccessLevel;
34
import lombok.Getter;
45
import lombok.Setter;
56
import lombok.SneakyThrows;
@@ -76,6 +77,19 @@ public AbstractTableOrViewMetadata() {
7677

7778
}
7879

80+
@Setter(AccessLevel.PRIVATE)
81+
private String quoteName, fullName;
82+
83+
@Override
84+
public String getQuoteName() {
85+
return quoteName == null ? quoteName = TableOrViewMetadata.super.getQuoteName() : quoteName;
86+
}
87+
88+
@Override
89+
public String getFullName() {
90+
return fullName == null ? fullName = TableOrViewMetadata.super.getFullName() : fullName;
91+
}
92+
7993
public boolean isTable() {
8094
return this instanceof RDBTableMetadata;
8195
}
@@ -110,25 +124,25 @@ public void addColumn(RDBColumnMetadata column) {
110124
@Override
111125
public List<RDBColumnMetadata> getColumns() {
112126
return new ArrayList<>(allColumns
113-
.values()
114-
.stream()
115-
.sorted()
116-
.collect(Collectors.toMap(RDBColumnMetadata::getName, Function.identity(), (_1, _2) -> _1, LinkedHashMap::new))
117-
.values());
127+
.values()
128+
.stream()
129+
.sorted()
130+
.collect(Collectors.toMap(RDBColumnMetadata::getName, Function.identity(), (_1, _2) -> _1, LinkedHashMap::new))
131+
.values());
118132
}
119133

120134
@Override
121135
public List<RDBColumnMetadata> findColumns() {
122136
return allColumns
123-
.values()
137+
.values()
138+
.stream()
139+
.flatMap(c -> getForeignKey()
124140
.stream()
125-
.flatMap(c -> getForeignKey()
126-
.stream()
127-
.map(ForeignKeyMetadata::getTarget)
128-
.map(TableOrViewMetadata::getColumns)
129-
.flatMap(Collection::stream))
130-
.sorted()
131-
.collect(Collectors.toList());
141+
.map(ForeignKeyMetadata::getTarget)
142+
.map(TableOrViewMetadata::getColumns)
143+
.flatMap(Collection::stream))
144+
.sorted()
145+
.collect(Collectors.toList());
132146
}
133147

134148
@Override
@@ -142,9 +156,9 @@ public Optional<RDBColumnMetadata> getColumn(String name) {
142156
@Override
143157
public Optional<RDBColumnMetadata> findColumn(String name) {
144158
return ofNullable(name)
145-
.map(this::getColumn)
146-
.filter(Optional::isPresent)
147-
.orElseGet(() -> findNestColumn(name));
159+
.map(this::getColumn)
160+
.filter(Optional::isPresent)
161+
.orElseGet(() -> findNestColumn(name));
148162
}
149163

150164
private Optional<RDBColumnMetadata> findNestColumn(String name) {
@@ -183,9 +197,9 @@ public ForeignKeyMetadata addForeignKey(ForeignKeyBuilder builder) {
183197
private Optional<RDBColumnMetadata> findColumnFromSchema(RDBSchemaMetadata schema, String tableName, String column) {
184198
return of(schema.getTableOrView(tableName)
185199
.flatMap(meta -> meta.getColumn(column)))
186-
.filter(Optional::isPresent)
187-
.orElseGet(() -> getForeignKey(tableName) //查找外键关联信息
188-
.flatMap(key -> key.getTarget().getColumn(column)));
200+
.filter(Optional::isPresent)
201+
.orElseGet(() -> getForeignKey(tableName) //查找外键关联信息
202+
.flatMap(key -> key.getTarget().getColumn(column)));
189203
}
190204

191205
@Override
@@ -196,9 +210,9 @@ public List<ForeignKeyMetadata> getForeignKeys() {
196210
@Override
197211
public Optional<ForeignKeyMetadata> getForeignKey(String targetName) {
198212
return foreignKey
199-
.stream()
200-
.filter(key -> key.getTarget().equalsNameOrAlias(targetName) || key.equalsNameOrAlias(targetName))
201-
.findFirst();
213+
.stream()
214+
.filter(key -> key.getTarget().equalsNameOrAlias(targetName) || key.equalsNameOrAlias(targetName))
215+
.findFirst();
202216
}
203217

204218
public void addFeature(Feature feature) {
@@ -208,7 +222,7 @@ public void addFeature(Feature feature) {
208222
@Override
209223
public Dialect getDialect() {
210224
return getSchema()
211-
.getDialect();
225+
.getDialect();
212226
}
213227

214228
@Override

hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/metadata/RDBColumnMetadata.java

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -114,13 +114,23 @@ public class RDBColumnMetadata extends AbstractColumnMetadata implements ColumnM
114114
*/
115115
private String previousName;
116116

117+
@Setter(AccessLevel.PRIVATE)
118+
private String quoteName, fullName, fullTableName;
119+
120+
public String getFullName() {
121+
return fullName == null ? fullName = createFullName0(getOwner().getName()) : fullName;
122+
}
123+
124+
public String getFullTableName() {
125+
return fullTableName == null ? fullTableName = createFullName0(getOwner().getFullName()) : fullTableName;
126+
}
117127

118128
public Dialect getDialect() {
119129
return getOwner().getDialect();
120130
}
121131

122132
public String getQuoteName() {
123-
return getDialect().quote(getName());
133+
return quoteName == null ? quoteName = getDialect().quote(getName()) : quoteName;
124134
}
125135

126136
public void setJdbcType(SQLType jdbcType, Class<?> javaType) {
@@ -254,21 +264,20 @@ public List<Feature> findFeatures(Predicate<Feature> predicate) {
254264
.collect(Collectors.toList());
255265
}
256266

267+
public String createFullName0(String ownerName) {
268+
return getDialect().buildColumnFullName(ownerName, getName());
269+
}
270+
257271
public String getFullName(String ownerName) {
258272
if (ownerName == null || ownerName.isEmpty()) {
259273
ownerName = getOwner().getName();
260274
}
275+
if (Objects.equals(ownerName, getOwner().getName())) {
276+
return getFullName();
277+
}
261278
return getDialect().buildColumnFullName(ownerName, getName());
262279
}
263280

264-
public String getFullName() {
265-
return getFullName(getOwner().getName());
266-
}
267-
268-
public String getFullTableName() {
269-
return getFullName(getOwner().getFullName());
270-
}
271-
272281
public boolean ddlModifiable(RDBColumnMetadata after) {
273282
if (!this.getName().equals(this.getPreviousName())) {
274283
return true;

hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/operator/builder/DefaultQuerySqlBuilder.java

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,8 @@ protected Optional<SqlFragments> orderBy(QueryOperatorParameter parameter, Table
5858
}
5959

6060
protected SqlFragments from(TableOrViewMetadata metadata, QueryOperatorParameter parameter) {
61-
return PrepareSqlFragments
62-
.of()
63-
.addSql("from")
64-
.addSql(metadata.getFullName())
65-
.addSql(parameter.getFromAlias());
61+
return SqlFragments
62+
.of("from", metadata.getFullName(), parameter.getFromAlias());
6663
}
6764

6865
protected Optional<SqlFragments> groupBy(QueryOperatorParameter parameter, TableOrViewMetadata metadata) {
@@ -75,7 +72,7 @@ protected Optional<SqlFragments> groupBy(QueryOperatorParameter parameter, Table
7572
for (SelectColumn column : groupBy) {
7673
if (column instanceof NativeSql) {
7774
sql.addSql(((NativeSql) column).getSql())
78-
.addParameter(((NativeSql) column).getParameters());
75+
.addParameter(((NativeSql) column).getParameters());
7976
} else {
8077
RDBColumnMetadata columnMetadata = metadata
8178
.getColumn(column.getColumn())
@@ -102,11 +99,17 @@ protected Optional<SqlFragments> groupBy(QueryOperatorParameter parameter, Table
10299
return Optional.of(sql);
103100
}
104101

102+
protected static final SqlFragments SELECT = SqlFragments.single("select");
103+
protected static final SqlFragments WHERE = SqlFragments.single("where");
104+
protected static final SqlFragments GROUP_BY = SqlFragments.single("group by");
105+
protected static final SqlFragments ORDER_BY = SqlFragments.single("order by");
106+
protected static final SqlFragments FOR_UPDATE = SqlFragments.single("for update");
107+
105108

106109
protected SqlRequest build(TableOrViewMetadata metadata, QueryOperatorParameter parameter) {
107110
BlockSqlFragments fragments = BlockSqlFragments.of();
108111

109-
fragments.addBlock(FragmentBlock.before, "select");
112+
fragments.addBlock(FragmentBlock.before, SELECT);
110113

111114
fragments.addBlock(FragmentBlock.selectColumn, select(parameter, metadata)
112115
.orElseGet(() -> PrepareSqlFragments.of().addSql("*")));
@@ -120,23 +123,23 @@ protected SqlRequest build(TableOrViewMetadata metadata, QueryOperatorParameter
120123

121124
where(parameter, metadata)
122125
.ifPresent(where ->
123-
fragments.addBlock(FragmentBlock.where, "where")
126+
fragments.addBlock(FragmentBlock.where, WHERE)
124127
.addBlock(FragmentBlock.where, where));
125128

126129
//group by
127130
groupBy(parameter, metadata)
128131
.ifPresent(groupBy ->
129-
fragments.addBlock(FragmentBlock.groupBy, "group by")
132+
fragments.addBlock(FragmentBlock.groupBy, GROUP_BY)
130133
.addBlock(FragmentBlock.groupBy, groupBy));
131134
//having
132135

133136
//order by
134137
orderBy(parameter, metadata)
135-
.ifPresent(order -> fragments.addBlock(FragmentBlock.orderBy, "order by")
138+
.ifPresent(order -> fragments.addBlock(FragmentBlock.orderBy, ORDER_BY)
136139
.addBlock(FragmentBlock.orderBy, order));
137140

138141
if (Boolean.TRUE.equals(parameter.getForUpdate())) {
139-
fragments.addBlock(FragmentBlock.after, PrepareSqlFragments.of().addSql("for update"));
142+
fragments.addBlock(FragmentBlock.after, FOR_UPDATE);
140143
}
141144
//分页
142145
else if (parameter.getPageIndex() != null && parameter.getPageSize() != null) {

hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/operator/builder/fragments/AbstractTermsFragmentBuilder.java

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.hswebframework.ezorm.rdb.operator.builder.FragmentBlock;
88
import org.hswebframework.ezorm.rdb.utils.PropertiesUtils;
99

10+
import java.util.Collections;
1011
import java.util.List;
1112

1213
/**
@@ -46,10 +47,9 @@ private BlockSqlFragments createBlockFragments(T parameter, List<Term> terms) {
4647
index++;
4748
SqlFragments termFragments;
4849
if (term instanceof SqlTerm) {
49-
termFragments = PrepareSqlFragments
50-
.of()
51-
.addSql(((SqlTerm) term).getSql())
52-
.addParameter(PropertiesUtils.convertList(term.getValue()));
50+
termFragments = SimpleSqlFragments
51+
.of(Collections.singletonList(((SqlTerm) term).getSql()),
52+
PropertiesUtils.convertList(term.getValue()));
5353
} else {
5454
termFragments = term.getValue() == null ? EmptySqlFragments.INSTANCE : createTermFragments(parameter, term);
5555
}
@@ -78,9 +78,9 @@ private BlockSqlFragments createBlockFragments(T parameter, List<Term> terms) {
7878
if (termAvailable || lastTermAvailable) {
7979
nestBlock.addBlock(FragmentBlock.before, term.getType().name());
8080
}
81-
nestBlock.addBlock(FragmentBlock.before, "(");
81+
nestBlock.addBlock(FragmentBlock.before, SqlFragments.LEFT_BRACKET);
8282
nestBlock.addBlock(FragmentBlock.term, nestFragments);
83-
nestBlock.addBlock(FragmentBlock.after, ")");
83+
nestBlock.addBlock(FragmentBlock.after, SqlFragments.RIGHT_BRACKET);
8484

8585
fragments.addBlock(FragmentBlock.term, nestBlock);
8686
lastTermAvailable = true;
@@ -102,8 +102,8 @@ private BlockSqlFragments createBlockFragments(T parameter, List<Term> terms) {
102102
* @return BlockSqlFragments
103103
* @see PrepareSqlFragments
104104
*/
105-
private PrepareSqlFragments createPrepareFragments(T parameter, List<Term> terms) {
106-
PrepareSqlFragments fragments = PrepareSqlFragments.of();
105+
private SqlFragments createPrepareFragments(T parameter, List<Term> terms) {
106+
BatchSqlFragments fragments = new BatchSqlFragments(terms.size() * 2, terms.size());
107107

108108
int index = 0;
109109
boolean termAvailable;
@@ -113,10 +113,9 @@ private PrepareSqlFragments createPrepareFragments(T parameter, List<Term> terms
113113
SqlFragments termFragments;
114114
//原生SQL
115115
if (term instanceof SqlTerm) {
116-
termFragments = PrepareSqlFragments
117-
.of()
118-
.addSql(((SqlTerm) term).getSql())
119-
.addParameter(PropertiesUtils.convertList(term.getValue()));
116+
termFragments = SimpleSqlFragments
117+
.of(Collections.singletonList(((SqlTerm) term).getSql()),
118+
PropertiesUtils.convertList(term.getValue()));
120119
} else {
121120
//值为null时忽略条件
122121
termFragments = term.getValue() == null ? EmptySqlFragments.INSTANCE : createTermFragments(parameter, term);
@@ -126,9 +125,11 @@ private PrepareSqlFragments createPrepareFragments(T parameter, List<Term> terms
126125
if (termAvailable) {
127126
if (index != 1 && lastTermAvailable) {
128127
//and or
129-
fragments.addSql(term.getType().name());
128+
fragments.add(term.getType() == Term.Type.and
129+
? SqlFragments.AND
130+
: SqlFragments.OR);
130131
}
131-
fragments.addFragments(termFragments);
132+
fragments.add(termFragments);
132133
lastTermAvailable = termAvailable;
133134
}
134135

@@ -140,11 +141,13 @@ private PrepareSqlFragments createPrepareFragments(T parameter, List<Term> terms
140141
if (nestFragments.isNotEmpty()) {
141142
//and or
142143
if (termAvailable || lastTermAvailable) {
143-
fragments.addSql(term.getType().name());
144+
fragments.add(term.getType() == Term.Type.and
145+
? SqlFragments.AND
146+
: SqlFragments.OR);
144147
}
145-
fragments.addSql("(");
146-
fragments.addFragments(nestFragments);
147-
fragments.addSql(")");
148+
fragments.add(SqlFragments.LEFT_BRACKET);
149+
fragments.add(nestFragments);
150+
fragments.add(SqlFragments.RIGHT_BRACKET);
148151
lastTermAvailable = true;
149152
continue;
150153
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package org.hswebframework.ezorm.rdb.operator.builder.fragments;
2+
3+
import java.util.Collection;
4+
5+
public interface AppendableSqlFragments extends SqlFragments {
6+
7+
AppendableSqlFragments addSql(String... sql);
8+
9+
AppendableSqlFragments addSql(Collection<String> sql);
10+
11+
AppendableSqlFragments addParameter(Object... parameter);
12+
13+
AppendableSqlFragments addParameter(Collection<?> parameter);
14+
15+
AppendableSqlFragments addFragments(SqlFragments fragments);
16+
17+
default AppendableSqlFragments add(SqlFragments fragments) {
18+
return addFragments(fragments);
19+
}
20+
21+
}

0 commit comments

Comments
 (0)