Skip to content

Commit 49335ad

Browse files
committed
Optimize ResultFlag
1 parent ead5a1d commit 49335ad

File tree

7 files changed

+52
-106
lines changed

7 files changed

+52
-106
lines changed

src/main/java/org/apache/ibatis/builder/MapperBuilderAssistant.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -166,13 +166,13 @@ public ResultMap addResultMap(String id, Class<?> type, String extend, Discrimin
166166
// Remove parent constructor if this resultMap declares a constructor.
167167
boolean declaresConstructor = false;
168168
for (ResultMapping resultMapping : resultMappings) {
169-
if (resultMapping.getFlags().contains(ResultFlag.CONSTRUCTOR)) {
169+
if (ResultFlag.containsConstructor(resultMapping.getFlags())) {
170170
declaresConstructor = true;
171171
break;
172172
}
173173
}
174174
if (declaresConstructor) {
175-
extendedResultMappings.removeIf(resultMapping -> resultMapping.getFlags().contains(ResultFlag.CONSTRUCTOR));
175+
extendedResultMappings.removeIf(resultMapping -> ResultFlag.containsConstructor(resultMapping.getFlags()));
176176
}
177177
resultMappings.addAll(extendedResultMappings);
178178
}
@@ -185,7 +185,7 @@ public ResultMap addResultMap(String id, Class<?> type, String extend, Discrimin
185185
public Discriminator buildDiscriminator(Class<?> resultType, String column, Class<?> javaType, JdbcType jdbcType,
186186
Class<? extends TypeHandler<?>> typeHandler, Map<String, String> discriminatorMap) {
187187
ResultMapping resultMapping = buildResultMapping(resultType, null, column, javaType, jdbcType, null, null, null,
188-
null, typeHandler, new ArrayList<>(), null, null, false);
188+
null, typeHandler, ResultFlag.NO_FLAG, null, null, false);
189189
Map<String, String> namespaceDiscriminatorMap = new HashMap<>();
190190
for (Map.Entry<String, String> e : discriminatorMap.entrySet()) {
191191
String resultMap = e.getValue();
@@ -334,8 +334,7 @@ private List<ResultMap> getStatementResultMaps(String resultMap, Class<?> result
334334

335335
public ResultMapping buildResultMapping(Class<?> resultType, String property, String column, Class<?> javaType,
336336
JdbcType jdbcType, String nestedSelect, String nestedResultMap, String notNullColumn, String columnPrefix,
337-
Class<? extends TypeHandler<?>> typeHandler, List<ResultFlag> flags, String resultSet, String foreignColumn,
338-
boolean lazy) {
337+
Class<? extends TypeHandler<?>> typeHandler, byte flags, String resultSet, String foreignColumn, boolean lazy) {
339338
Class<?> javaTypeClass = resolveResultJavaType(resultType, property, javaType);
340339
TypeHandler<?> typeHandlerInstance = resolveTypeHandler(javaTypeClass, typeHandler);
341340
List<ResultMapping> composites;
@@ -347,7 +346,7 @@ public ResultMapping buildResultMapping(Class<?> resultType, String property, St
347346
return new ResultMapping.Builder(configuration, property, column, javaTypeClass).jdbcType(jdbcType)
348347
.nestedQueryId(applyCurrentNamespace(nestedSelect, true))
349348
.nestedResultMapId(applyCurrentNamespace(nestedResultMap, true)).resultSet(resultSet)
350-
.typeHandler(typeHandlerInstance).flags(flags == null ? new ArrayList<>() : flags).composites(composites)
349+
.typeHandler(typeHandlerInstance).flags(flags).composites(composites)
351350
.notNullColumns(parseMultipleColumnNames(notNullColumn)).columnPrefix(columnPrefix).foreignColumn(foreignColumn)
352351
.lazy(lazy).build();
353352
}
@@ -382,7 +381,7 @@ public ResultMapping buildResultMapping(Class<?> resultType, String property, St
382381
*/
383382
public ResultMapping buildResultMapping(Class<?> resultType, String property, String column, Class<?> javaType,
384383
JdbcType jdbcType, String nestedSelect, String nestedResultMap, String notNullColumn, String columnPrefix,
385-
Class<? extends TypeHandler<?>> typeHandler, List<ResultFlag> flags) {
384+
Class<? extends TypeHandler<?>> typeHandler, byte flags) {
386385
return buildResultMapping(resultType, property, column, javaType, jdbcType, nestedSelect, nestedResultMap,
387386
notNullColumn, columnPrefix, typeHandler, flags, null, null, configuration.isLazyLoadingEnabled());
388387
}

src/main/java/org/apache/ibatis/builder/annotation/MapperAnnotationBuilder.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -457,9 +457,9 @@ private static Class<?> getReturnType(Method method, Class<?> type) {
457457

458458
private void applyResults(Result[] results, Class<?> resultType, List<ResultMapping> resultMappings) {
459459
for (Result result : results) {
460-
List<ResultFlag> flags = new ArrayList<>();
460+
byte flags = ResultFlag.NO_FLAG;
461461
if (result.id()) {
462-
flags.add(ResultFlag.ID);
462+
flags |= ResultFlag.ID;
463463
}
464464
@SuppressWarnings("unchecked")
465465
Class<? extends TypeHandler<?>> typeHandler = (Class<? extends TypeHandler<?>>) (result
@@ -531,10 +531,10 @@ private boolean hasNestedSelect(Result result) {
531531

532532
private void applyConstructorArgs(Arg[] args, Class<?> resultType, List<ResultMapping> resultMappings) {
533533
for (Arg arg : args) {
534-
List<ResultFlag> flags = new ArrayList<>();
535-
flags.add(ResultFlag.CONSTRUCTOR);
534+
byte flags = ResultFlag.NO_FLAG;
535+
flags |= ResultFlag.CONSTRUCTOR;
536536
if (arg.id()) {
537-
flags.add(ResultFlag.ID);
537+
flags |= ResultFlag.ID;
538538
}
539539
@SuppressWarnings("unchecked")
540540
Class<? extends TypeHandler<?>> typeHandler = (Class<? extends TypeHandler<?>>) (arg

src/main/java/org/apache/ibatis/builder/xml/XMLMapperBuilder.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -280,9 +280,9 @@ private ResultMap resultMapElement(XNode resultMapNode, List<ResultMapping> addi
280280
} else if ("discriminator".equals(resultChild.getName())) {
281281
discriminator = processDiscriminatorElement(resultChild, typeClass, resultMappings);
282282
} else {
283-
List<ResultFlag> flags = new ArrayList<>();
283+
byte flags = ResultFlag.NO_FLAG;
284284
if ("id".equals(resultChild.getName())) {
285-
flags.add(ResultFlag.ID);
285+
flags |= ResultFlag.ID;
286286
}
287287
resultMappings.add(buildResultMappingFromContext(resultChild, typeClass, flags));
288288
}
@@ -316,10 +316,10 @@ protected Class<?> inheritEnclosingType(XNode resultMapNode, Class<?> enclosingT
316316
private void processConstructorElement(XNode resultChild, Class<?> resultType, List<ResultMapping> resultMappings) {
317317
List<XNode> argChildren = resultChild.getChildren();
318318
for (XNode argChild : argChildren) {
319-
List<ResultFlag> flags = new ArrayList<>();
320-
flags.add(ResultFlag.CONSTRUCTOR);
319+
byte flags = ResultFlag.NO_FLAG;
320+
flags |= ResultFlag.CONSTRUCTOR;
321321
if ("idArg".equals(argChild.getName())) {
322-
flags.add(ResultFlag.ID);
322+
flags |= ResultFlag.ID;
323323
}
324324
resultMappings.add(buildResultMappingFromContext(argChild, resultType, flags));
325325
}
@@ -378,9 +378,9 @@ private boolean databaseIdMatchesCurrent(String id, String databaseId, String re
378378
return context.getStringAttribute("databaseId") == null;
379379
}
380380

381-
private ResultMapping buildResultMappingFromContext(XNode context, Class<?> resultType, List<ResultFlag> flags) {
381+
private ResultMapping buildResultMappingFromContext(XNode context, Class<?> resultType, byte flags) {
382382
String property;
383-
if (flags.contains(ResultFlag.CONSTRUCTOR)) {
383+
if (ResultFlag.containsConstructor(flags)) {
384384
property = context.getStringAttribute("name");
385385
} else {
386386
property = context.getStringAttribute("property");

src/main/java/org/apache/ibatis/mapping/ResultFlag.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,18 @@
1818
/**
1919
* @author Clinton Begin
2020
*/
21-
public enum ResultFlag {
21+
public class ResultFlag {
2222

23-
ID,
23+
public static final byte NO_FLAG = 0;
24+
public static final byte ID = 1;
25+
public static final byte CONSTRUCTOR = 2;
2426

25-
CONSTRUCTOR
27+
public static boolean containsId(byte flags) {
28+
return (flags & ID) == ID;
29+
}
30+
31+
public static boolean containsConstructor(byte flags) {
32+
return (flags & CONSTRUCTOR) == CONSTRUCTOR;
33+
}
2634

2735
}

src/main/java/org/apache/ibatis/mapping/ResultMap.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,15 +109,15 @@ public ResultMap build() {
109109
if (property != null) {
110110
resultMap.mappedProperties.add(property);
111111
}
112-
if (resultMapping.getFlags().contains(ResultFlag.CONSTRUCTOR)) {
112+
if (ResultFlag.containsConstructor(resultMapping.getFlags())) {
113113
resultMap.constructorResultMappings.add(resultMapping);
114114
if (resultMapping.getProperty() != null) {
115115
constructorArgNames.add(resultMapping.getProperty());
116116
}
117117
} else {
118118
resultMap.propertyResultMappings.add(resultMapping);
119119
}
120-
if (resultMapping.getFlags().contains(ResultFlag.ID)) {
120+
if (ResultFlag.containsId(resultMapping.getFlags())) {
121121
resultMap.idResultMappings.add(resultMapping);
122122
}
123123
}

src/main/java/org/apache/ibatis/mapping/ResultMapping.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public class ResultMapping {
4040
private String nestedQueryId;
4141
private Set<String> notNullColumns;
4242
private String columnPrefix;
43-
private List<ResultFlag> flags;
43+
private byte flags;
4444
private List<ResultMapping> composites;
4545
private String resultSet;
4646
private String foreignColumn;
@@ -67,7 +67,7 @@ public Builder(Configuration configuration, String property, String column, Clas
6767
public Builder(Configuration configuration, String property) {
6868
resultMapping.configuration = configuration;
6969
resultMapping.property = property;
70-
resultMapping.flags = new ArrayList<>();
70+
resultMapping.flags = ResultFlag.NO_FLAG;
7171
resultMapping.composites = new ArrayList<>();
7272
resultMapping.lazy = configuration.isLazyLoadingEnabled();
7373
}
@@ -112,7 +112,7 @@ public Builder columnPrefix(String columnPrefix) {
112112
return this;
113113
}
114114

115-
public Builder flags(List<ResultFlag> flags) {
115+
public Builder flags(byte flags) {
116116
resultMapping.flags = flags;
117117
return this;
118118
}
@@ -134,7 +134,6 @@ public Builder lazy(boolean lazy) {
134134

135135
public ResultMapping build() {
136136
// lock down collections
137-
resultMapping.flags = Collections.unmodifiableList(resultMapping.flags);
138137
resultMapping.composites = Collections.unmodifiableList(resultMapping.composites);
139138
resolveTypeHandler();
140139
validate();
@@ -223,7 +222,7 @@ public String getColumnPrefix() {
223222
return columnPrefix;
224223
}
225224

226-
public List<ResultFlag> getFlags() {
225+
public byte getFlags() {
227226
return flags;
228227
}
229228

src/test/java/org/apache/ibatis/executor/ExecutorTestHelper.java

Lines changed: 17 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -218,12 +218,7 @@ static MappedStatement prepareSelectOneAuthorMappedStatementWithConstructorResul
218218
private static final long serialVersionUID = 1L;
219219
{
220220
add(new ResultMapping.Builder(config, null, "id", registry.getTypeHandler(Integer.class))
221-
.javaType(int.class).flags(new ArrayList<ResultFlag>() {
222-
private static final long serialVersionUID = 1L;
223-
{
224-
add(ResultFlag.CONSTRUCTOR);
225-
}
226-
}).build());
221+
.javaType(int.class).flags(ResultFlag.CONSTRUCTOR).build());
227222
add(new ResultMapping.Builder(config, "username", "username", registry.getTypeHandler(String.class))
228223
.build());
229224
add(new ResultMapping.Builder(config, "password", "password", registry.getTypeHandler(String.class))
@@ -388,13 +383,8 @@ static MappedStatement prepareComplexSelectBlogMappedStatement(final Configurati
388383
new ArrayList<ResultMapping>() {
389384
private static final long serialVersionUID = 1L;
390385
{
391-
add(new ResultMapping.Builder(config, "id", "id", registry.getTypeHandler(int.class))
392-
.flags(new ArrayList<ResultFlag>() {
393-
private static final long serialVersionUID = 1L;
394-
{
395-
add(ResultFlag.ID);
396-
}
397-
}).build());
386+
add(new ResultMapping.Builder(config, "id", "id", registry.getTypeHandler(int.class)).flags(ResultFlag.ID)
387+
.build());
398388
add(new ResultMapping.Builder(config, "title", "title", registry.getTypeHandler(String.class)).build());
399389
add(new ResultMapping.Builder(config, "author.id", "author_id", registry.getTypeHandler(int.class))
400390
.build());
@@ -436,13 +426,8 @@ static MappedStatement prepareSelectBlogByIdAndAuthor(final Configuration config
436426
new ArrayList<ResultMapping>() {
437427
private static final long serialVersionUID = 1L;
438428
{
439-
add(new ResultMapping.Builder(config, "id", "id", registry.getTypeHandler(int.class))
440-
.flags(new ArrayList<ResultFlag>() {
441-
private static final long serialVersionUID = 1L;
442-
{
443-
add(ResultFlag.ID);
444-
}
445-
}).build());
429+
add(new ResultMapping.Builder(config, "id", "id", registry.getTypeHandler(int.class)).flags(ResultFlag.ID)
430+
.build());
446431
add(new ResultMapping.Builder(config, "title", "title", registry.getTypeHandler(String.class)).build());
447432
add(new ResultMapping.Builder(config, "author.id", "author_id", registry.getTypeHandler(int.class))
448433
.build());
@@ -487,12 +472,7 @@ static MappedStatement prepareSelectPostsForBlogMappedStatement(final Configurat
487472
private static final long serialVersionUID = 1L;
488473
{
489474
add(new ResultMapping.Builder(config, "id", "tag_id", registry.getTypeHandler(int.class))
490-
.flags(new ArrayList<ResultFlag>() {
491-
private static final long serialVersionUID = 1L;
492-
{
493-
add(ResultFlag.ID);
494-
}
495-
}).build());
475+
.flags(ResultFlag.ID).build());
496476
add(new ResultMapping.Builder(config, "name", "tag_name", registry.getTypeHandler(String.class)).build());
497477
}
498478
}).build();
@@ -501,12 +481,7 @@ static MappedStatement prepareSelectPostsForBlogMappedStatement(final Configurat
501481
private static final long serialVersionUID = 1L;
502482
{
503483
add(new ResultMapping.Builder(config, "id", "comment_id", registry.getTypeHandler(int.class))
504-
.flags(new ArrayList<ResultFlag>() {
505-
private static final long serialVersionUID = 1L;
506-
{
507-
add(ResultFlag.ID);
508-
}
509-
}).build());
484+
.flags(ResultFlag.ID).build());
510485
add(new ResultMapping.Builder(config, "name", "comment_name", registry.getTypeHandler(String.class))
511486
.build());
512487
add(new ResultMapping.Builder(config, "comment", "comment", registry.getTypeHandler(String.class)).build());
@@ -518,13 +493,8 @@ static MappedStatement prepareSelectPostsForBlogMappedStatement(final Configurat
518493
new ArrayList<ResultMapping>() {
519494
private static final long serialVersionUID = 1L;
520495
{
521-
add(new ResultMapping.Builder(config, "id", "id", registry.getTypeHandler(int.class))
522-
.flags(new ArrayList<ResultFlag>() {
523-
private static final long serialVersionUID = 1L;
524-
{
525-
add(ResultFlag.ID);
526-
}
527-
}).build());
496+
add(new ResultMapping.Builder(config, "id", "id", registry.getTypeHandler(int.class)).flags(ResultFlag.ID)
497+
.build());
528498
add(new ResultMapping.Builder(config, "blog", "blog_id", registry.getTypeHandler(int.class))
529499
.javaType(Blog.class).nestedQueryId("selectBlogById").build());
530500
add(new ResultMapping.Builder(config, "createdOn", "created_on", registry.getTypeHandler(Date.class))
@@ -565,12 +535,7 @@ static MappedStatement prepareSelectPostMappedStatement(final Configuration conf
565535
private static final long serialVersionUID = 1L;
566536
{
567537
add(new ResultMapping.Builder(config, "id", "tag_id", registry.getTypeHandler(int.class))
568-
.flags(new ArrayList<ResultFlag>() {
569-
private static final long serialVersionUID = 1L;
570-
{
571-
add(ResultFlag.ID);
572-
}
573-
}).build());
538+
.flags(ResultFlag.ID).build());
574539
add(new ResultMapping.Builder(config, "name", "tag_name", registry.getTypeHandler(String.class)).build());
575540
}
576541
}).build();
@@ -579,12 +544,7 @@ static MappedStatement prepareSelectPostMappedStatement(final Configuration conf
579544
private static final long serialVersionUID = 1L;
580545
{
581546
add(new ResultMapping.Builder(config, "id", "comment_id", registry.getTypeHandler(int.class))
582-
.flags(new ArrayList<ResultFlag>() {
583-
private static final long serialVersionUID = 1L;
584-
{
585-
add(ResultFlag.ID);
586-
}
587-
}).build());
547+
.flags(ResultFlag.ID).build());
588548
add(new ResultMapping.Builder(config, "name", "comment_name", registry.getTypeHandler(String.class))
589549
.build());
590550
add(new ResultMapping.Builder(config, "comment", "comment", registry.getTypeHandler(String.class)).build());
@@ -595,13 +555,8 @@ static MappedStatement prepareSelectPostMappedStatement(final Configuration conf
595555
final ResultMap postResultMap = new ResultMap.Builder(config, "", Post.class, new ArrayList<ResultMapping>() {
596556
private static final long serialVersionUID = 1L;
597557
{
598-
add(new ResultMapping.Builder(config, "id", "id", registry.getTypeHandler(int.class))
599-
.flags(new ArrayList<ResultFlag>() {
600-
private static final long serialVersionUID = 1L;
601-
{
602-
add(ResultFlag.ID);
603-
}
604-
}).build());
558+
add(new ResultMapping.Builder(config, "id", "id", registry.getTypeHandler(int.class)).flags(ResultFlag.ID)
559+
.build());
605560
add(new ResultMapping.Builder(config, "blog", "blog_id", registry.getTypeHandler(int.class))
606561
.javaType(Blog.class).nestedQueryId("selectBlogById").build());
607562
add(new ResultMapping.Builder(config, "createdOn", "created_on", registry.getTypeHandler(Date.class)).build());
@@ -641,12 +596,7 @@ static MappedStatement prepareSelectPostWithBlogByAuthorMappedStatement(final Co
641596
private static final long serialVersionUID = 1L;
642597
{
643598
add(new ResultMapping.Builder(config, "id", "tag_id", registry.getTypeHandler(int.class))
644-
.flags(new ArrayList<ResultFlag>() {
645-
private static final long serialVersionUID = 1L;
646-
{
647-
add(ResultFlag.ID);
648-
}
649-
}).build());
599+
.flags(ResultFlag.ID).build());
650600
add(new ResultMapping.Builder(config, "name", "tag_name", registry.getTypeHandler(String.class)).build());
651601
}
652602
}).build();
@@ -655,12 +605,7 @@ static MappedStatement prepareSelectPostWithBlogByAuthorMappedStatement(final Co
655605
private static final long serialVersionUID = 1L;
656606
{
657607
add(new ResultMapping.Builder(config, "id", "comment_id", registry.getTypeHandler(int.class))
658-
.flags(new ArrayList<ResultFlag>() {
659-
private static final long serialVersionUID = 1L;
660-
{
661-
add(ResultFlag.ID);
662-
}
663-
}).build());
608+
.flags(ResultFlag.ID).build());
664609
add(new ResultMapping.Builder(config, "name", "comment_name", registry.getTypeHandler(String.class))
665610
.build());
666611
add(new ResultMapping.Builder(config, "comment", "comment", registry.getTypeHandler(String.class)).build());
@@ -672,13 +617,8 @@ static MappedStatement prepareSelectPostWithBlogByAuthorMappedStatement(final Co
672617
new ArrayList<ResultMapping>() {
673618
private static final long serialVersionUID = 1L;
674619
{
675-
add(new ResultMapping.Builder(config, "id", "id", registry.getTypeHandler(int.class))
676-
.flags(new ArrayList<ResultFlag>() {
677-
private static final long serialVersionUID = 1L;
678-
{
679-
add(ResultFlag.ID);
680-
}
681-
}).build());
620+
add(new ResultMapping.Builder(config, "id", "id", registry.getTypeHandler(int.class)).flags(ResultFlag.ID)
621+
.build());
682622

683623
add(new ResultMapping.Builder(config, "blog").nestedQueryId("selectBlogByIdAndAuthor")
684624
.composites(new ArrayList<ResultMapping>() {

0 commit comments

Comments
 (0)