Skip to content

Commit f84b464

Browse files
committed
refactor: 优化
1 parent 6e3c198 commit f84b464

File tree

10 files changed

+141
-39
lines changed

10 files changed

+141
-39
lines changed

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

+5-5
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@ public interface NestConditional<T extends TermTypeConditionalSupport> extends L
1414

1515
T end();
1616

17-
NestConditional<NestConditional<T>> nest();
17+
NestConditional<? extends NestConditional<T>> nest();
1818

19-
NestConditional<NestConditional<T>> nest(String column, Object value);
19+
NestConditional<? extends NestConditional<T>> nest(String column, Object value);
2020

21-
NestConditional<NestConditional<T>> orNest();
21+
NestConditional<? extends NestConditional<T>> orNest();
2222

23-
NestConditional<NestConditional<T>> orNest(String column, Object value);
23+
NestConditional<? extends NestConditional<T>> orNest(String column, Object value);
2424

2525
NestConditional<T> and();
2626

@@ -161,7 +161,7 @@ default <B> NestConditional<T> is(StaticMethodReferenceColumn<B> column, Object
161161
default <B> NestConditional<T> is(MethodReferenceColumn<B> column) {
162162
return accept(column, TermType.eq);
163163
}
164-
164+
165165
default <B> NestConditional<T> like(StaticMethodReferenceColumn<B> column, Object value) {
166166
return accept(column, TermType.like, value);
167167
}

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

+8-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
import java.util.*;
1313
import java.util.concurrent.ConcurrentHashMap;
14+
import java.util.concurrent.locks.Lock;
15+
import java.util.concurrent.locks.ReentrantLock;
1416
import java.util.function.Function;
1517
import java.util.function.Supplier;
1618

@@ -37,6 +39,8 @@ public abstract class AbstractSchemaMetadata implements SchemaMetadata {
3739
@Getter
3840
private Map<String, Feature> features = new ConcurrentHashMap<>();
3941

42+
private final Lock lock = new ReentrantLock();
43+
4044
@Override
4145
public abstract List<ObjectType> getAllObjectType();
4246

@@ -186,7 +190,8 @@ public <T extends ObjectMetadata> Optional<T> getObject(ObjectType type, String
186190

187191
ObjectMetadata metadata = getLoadedObject0(mapping, name);
188192
if (metadata == null && autoLoad) {
189-
synchronized (this) {
193+
try {
194+
lock.lock();
190195
metadata = getLoadedObject0(mapping, name);
191196
if (metadata != null) {
192197
return Optional.of(CastUtil.cast(metadata));
@@ -195,6 +200,8 @@ public <T extends ObjectMetadata> Optional<T> getObject(ObjectType type, String
195200
if (null != metadata) {
196201
mapping.put(name, metadata);
197202
}
203+
}finally {
204+
lock.unlock();
198205
}
199206
}
200207
return Optional.ofNullable(CastUtil.cast(metadata));

hsweb-easy-orm-core/src/main/java/org/hswebframework/ezorm/core/utils/StringUtils.java

+40-2
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,33 @@
22

33
import io.netty.util.concurrent.FastThreadLocal;
44

5+
import java.util.ArrayList;
56
import java.util.Collection;
7+
import java.util.List;
68
import java.util.Map;
79

810
public class StringUtils {
911

10-
static FastThreadLocal<StringBuilder> SHARE = new FastThreadLocal<StringBuilder>() {
12+
private static final FastThreadLocal<StringBuilder> SHARE = new FastThreadLocal<StringBuilder>() {
1113
@Override
1214
protected StringBuilder initialValue() throws Exception {
1315
return new StringBuilder();
1416
}
1517
};
1618

19+
private static final FastThreadLocal<List<String>> SHARE_SPLIT = new FastThreadLocal<List<String>>() {
20+
@Override
21+
protected List<String> initialValue() {
22+
return new ArrayList<>(8);
23+
}
24+
};
25+
1726
public static boolean isNullOrEmpty(Object arg) {
1827
if (arg == null) {
1928
return true;
2029
}
2130
if (arg instanceof String) {
22-
return (String.valueOf(arg)).length() == 0;
31+
return (String.valueOf(arg)).isEmpty();
2332
}
2433
if (arg instanceof Collection) {
2534
return ((Collection<?>) arg).isEmpty();
@@ -68,6 +77,35 @@ public static String toLowerCaseFirstOne(String str) {
6877
}
6978
}
7079

80+
public static String[] split(String str, char c) {
81+
List<String> list = SHARE_SPLIT.get();
82+
StringBuilder builder = SHARE.get();
83+
try {
84+
int len = str.length();
85+
int total = 0;
86+
87+
for (int i = 0; i < len; i++) {
88+
char ch = str.charAt(i);
89+
if (ch == c) {
90+
list.add(builder.toString());
91+
builder.setLength(0);
92+
total++;
93+
} else {
94+
builder.append(ch);
95+
}
96+
}
97+
98+
if (builder.length() > 0) {
99+
list.add(builder.toString());
100+
total++;
101+
}
102+
103+
return list.toArray(new String[total]);
104+
} finally {
105+
builder.setLength(0);
106+
list.clear();
107+
}
108+
}
71109

72110
public static String[] getPlainName(String[] name) {
73111
for (int i = 0; i < name.length; i++) {

hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/mapping/DefaultEntityColumnMapping.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import lombok.Getter;
44
import lombok.Setter;
55
import lombok.SneakyThrows;
6+
import org.hswebframework.ezorm.core.utils.StringUtils;
67
import org.hswebframework.ezorm.rdb.metadata.RDBColumnMetadata;
78
import org.hswebframework.ezorm.rdb.metadata.TableOrViewMetadata;
89

@@ -46,7 +47,7 @@ public DefaultEntityColumnMapping(TableOrViewMetadata table, Class<?> entityType
4647
@Override
4748
public Optional<RDBColumnMetadata> getColumnByProperty(String property) {
4849
if (property.contains(".")) {
49-
String[] key = property.split("[.]");
50+
String[] key = StringUtils.split(property,'.');
5051

5152
return table
5253
.getForeignKey(key[0])
@@ -67,7 +68,7 @@ public Optional<String> getPropertyByColumnName(String columnName) {
6768
@Override
6869
public Optional<RDBColumnMetadata> getColumnByName(String columnName) {
6970
if (columnName.contains(".")) {
70-
String[] key = columnName.split("[.]");
71+
String[] key = StringUtils.split(columnName,'.');
7172

7273
return table.getForeignKey(key[0])
7374
.flatMap(keyMetadata -> keyMetadata.getTarget().getColumn(key[1]));

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

+39-20
Original file line numberDiff line numberDiff line change
@@ -137,27 +137,34 @@ public RDBSchemaMetadata getSchema() {
137137
return schema;
138138
}
139139

140-
public void addColumn(RDBColumnMetadata column) {
140+
private List<RDBColumnMetadata> columnCache;
141141

142+
public void addColumn(RDBColumnMetadata column) {
143+
columnCache = null;
142144
column.setOwner(this);
143145
allColumns.put(column.getName(), column);
144146
allColumns.put(column.getAlias(), column);
145-
allColumns.put(column.getRealName(),column);
147+
allColumns.put(column.getRealName(), column);
146148
if (onColumnAdded != null) {
147149
onColumnAdded.accept(column);
148150
}
149151
}
150152

151-
152153
@Override
153154
public List<RDBColumnMetadata> getColumns() {
154-
return new ArrayList<>(
155-
allColumns
156-
.values()
157-
.stream()
158-
.sorted()
159-
.collect(Collectors.toMap(RDBColumnMetadata::getName, Function.identity(), (_1, _2) -> _1, LinkedHashMap::new))
160-
.values());
155+
if (columnCache == null) {
156+
columnCache =
157+
Collections.unmodifiableList(
158+
new ArrayList<>(
159+
allColumns
160+
.values()
161+
.stream()
162+
.sorted()
163+
.collect(Collectors.toMap(RDBColumnMetadata::getName, Function.identity(), (_1, _2) -> _1, LinkedHashMap::new))
164+
.values())
165+
);
166+
}
167+
return columnCache;
161168
}
162169

163170
@Override
@@ -184,10 +191,17 @@ public Optional<RDBColumnMetadata> getColumn(String name) {
184191

185192
@Override
186193
public Optional<RDBColumnMetadata> findColumn(String name) {
187-
return ofNullable(name)
188-
.map(this::getColumn)
189-
.filter(Optional::isPresent)
190-
.orElseGet(() -> findNestColumn(name));
194+
if (name == null) {
195+
return Optional.empty();
196+
}
197+
Optional<RDBColumnMetadata> col = this.getColumn(name);
198+
199+
if(col.isPresent()){
200+
return col;
201+
}
202+
203+
return findNestColumn(name);
204+
191205
}
192206

193207
private Optional<RDBColumnMetadata> findNestColumn(String name) {
@@ -196,7 +210,7 @@ private Optional<RDBColumnMetadata> findNestColumn(String name) {
196210
}
197211

198212
if (name.contains(".")) {
199-
String[] arr = StringUtils.getPlainName(name.split("[.]"));
213+
String[] arr = StringUtils.getPlainName(StringUtils.split(name,'.'));
200214
if (arr.length == 2) { //table.name
201215
return findColumnFromSchema(schema, arr[0], arr[1]);
202216

@@ -224,11 +238,15 @@ public ForeignKeyMetadata addForeignKey(ForeignKeyBuilder builder) {
224238
}
225239

226240
private Optional<RDBColumnMetadata> findColumnFromSchema(RDBSchemaMetadata schema, String tableName, String column) {
227-
return of(schema.getTableOrView(tableName)
228-
.flatMap(meta -> meta.getColumn(column)))
229-
.filter(Optional::isPresent)
230-
.orElseGet(() -> getForeignKey(tableName) //查找外键关联信息
231-
.flatMap(key -> key.getTarget().getColumn(column)));
241+
Optional<RDBColumnMetadata> col =
242+
schema.getTableOrView(tableName)
243+
.flatMap(meta -> meta.getColumn(column));
244+
if(col.isPresent()){
245+
return col;
246+
}
247+
return getForeignKey(tableName) //查找外键关联信息
248+
.flatMap(key -> key.getTarget().getColumn(column));
249+
232250
}
233251

234252
@Override
@@ -293,6 +311,7 @@ public void replace(TableOrViewMetadata metadata) {
293311
foreignKey.clear();
294312
features.clear();
295313
allColumns.clear();
314+
columnCache = null;
296315
merge(metadata);
297316
}
298317
}

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

+2-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package org.hswebframework.ezorm.rdb.operator.builder.fragments;
22

33
import org.hswebframework.ezorm.core.param.Term;
4+
import org.hswebframework.ezorm.core.utils.StringUtils;
45
import org.hswebframework.ezorm.rdb.metadata.RDBColumnMetadata;
5-
import org.hswebframework.ezorm.rdb.metadata.RDBTableMetadata;
66
import org.hswebframework.ezorm.rdb.metadata.TableOrViewMetadata;
77
import org.hswebframework.ezorm.rdb.metadata.key.ForeignKeyMetadata;
88
import org.hswebframework.ezorm.rdb.operator.builder.fragments.term.ForeignKeyTermFragmentBuilder;
@@ -11,8 +11,6 @@
1111
import java.util.LinkedList;
1212
import java.util.List;
1313

14-
import static org.hswebframework.ezorm.rdb.operator.builder.fragments.TermFragmentBuilder.createFeatureId;
15-
1614

1715
public class SimpleTermsFragmentBuilder extends AbstractTermsFragmentBuilder<TableOrViewMetadata> {
1816

@@ -47,7 +45,7 @@ public static SqlFragments createByTable(TableOrViewMetadata table, Term term) {
4745
}
4846

4947
if (columnName.contains(".")) {
50-
String[] arr = columnName.split("[.]");
48+
String[] arr = StringUtils.split(columnName,'.');
5149
if (table.equalsNameOrAlias(arr[0])) {
5250
columnName = arr[1];
5351
} else {

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ public SqlFragments createFragments(QueryOperatorParameter parameter, SelectColu
229229
RDBColumnMetadata columnMetadata;
230230

231231
if (columnStr != null && columnStr.contains(".")) {//关联表 table.column
232-
String[] arr = columnStr.split("[.]");
232+
String[] arr = StringUtils.split(columnStr,'.');
233233
return parameter
234234
.findJoin(arr[0])
235235
.flatMap(join -> metadata

hsweb-easy-orm-rdb/src/test/java/org/hswebframework/ezorm/rdb/supports/h2/H2BasicTest.java

+33-1
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
import org.hswebframework.ezorm.rdb.TestSyncSqlExecutor;
44
import org.hswebframework.ezorm.rdb.exception.DuplicateKeyException;
55
import org.hswebframework.ezorm.rdb.executor.SyncSqlExecutor;
6+
import org.hswebframework.ezorm.rdb.mapping.defaults.record.Record;
67
import org.hswebframework.ezorm.rdb.metadata.RDBSchemaMetadata;
78
import org.hswebframework.ezorm.rdb.metadata.dialect.Dialect;
89
import org.hswebframework.ezorm.rdb.supports.BasicCommonTests;
910
import org.hswebframework.ezorm.rdb.supports.BasicTestEntity;
11+
import org.junit.Ignore;
1012
import org.junit.Test;
1113
import reactor.core.publisher.Flux;
1214
import reactor.test.StepVerifier;
@@ -35,6 +37,36 @@ public void test() {
3537
.fetch();
3638
}
3739

40+
@Ignore
41+
@Test
42+
public void testPerform() {
43+
// for (int i = 0; i < 100; i++) {
44+
// addressRepository.insert(
45+
// Record
46+
// .newRecord()
47+
// .putValue("id", "joinTest_" + i)
48+
// .putValue("name", "testPerform"));
49+
// }
50+
//
51+
for (int i = 0; i < 1000; i++) {
52+
addressRepository
53+
.createQuery()
54+
.where("name", "testPerform")
55+
.fetch();
56+
}
57+
58+
59+
long time = System.currentTimeMillis();
60+
for (int i = 0; i < 10_000; i++) {
61+
addressRepository
62+
.createQuery()
63+
.where("name", "testPerform")
64+
.fetch();
65+
}
66+
67+
System.out.println(System.currentTimeMillis() - time);
68+
}
69+
3870
@Test
3971
public void errorTest() {
4072
BasicTestEntity e = new BasicTestEntity();
@@ -45,7 +77,7 @@ public void errorTest() {
4577
try {
4678
repository.insert(e);
4779
throw new IllegalStateException();
48-
}catch (DuplicateKeyException ignore){
80+
} catch (DuplicateKeyException ignore) {
4981

5082
}
5183
}

hsweb-easy-orm-rdb/src/test/java/org/hswebframework/ezorm/rdb/utils/FlatListTest.java

+8-3
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,24 @@ public class FlatListTest {
1212

1313
@Test
1414
public void test() {
15-
List<Integer> list = new FlatList<>(
15+
FlatList<Integer> list = new FlatList<>(
1616
Arrays.asList(
1717
Arrays.asList(1, 2, 3),
1818
Arrays.asList(4, 5, 6),
1919
Arrays.asList(7, 8, 9)
2020
)
2121
);
22-
list.forEach(System.out::println);
22+
list.listIterator(3).forEachRemaining(System.out::println);
2323

2424
assertEquals(Integer.valueOf(1), list.get(0));
2525
assertEquals(Integer.valueOf(2), list.get(1));
2626

27-
assertArrayEquals(list.toArray(), new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9});
27+
assertEquals(4, list.get(3).intValue());
28+
assertEquals(7, list.get(6).intValue());
29+
30+
assertEquals(Arrays.asList(3, 4, 5), list.subList(2, 5));
31+
32+
assertArrayEquals(new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9}, list.toArray());
2833

2934
}
3035
}

0 commit comments

Comments
 (0)