From 49335ad0f84f256f890be3544cb52d67e7dcd10d Mon Sep 17 00:00:00 2001 From: kanghailin <1227734668@qq.com> Date: Wed, 30 Aug 2023 17:17:36 +0800 Subject: [PATCH] Optimize ResultFlag --- .../builder/MapperBuilderAssistant.java | 13 ++- .../annotation/MapperAnnotationBuilder.java | 10 +- .../ibatis/builder/xml/XMLMapperBuilder.java | 14 +-- .../org/apache/ibatis/mapping/ResultFlag.java | 14 ++- .../org/apache/ibatis/mapping/ResultMap.java | 4 +- .../apache/ibatis/mapping/ResultMapping.java | 9 +- .../ibatis/executor/ExecutorTestHelper.java | 94 ++++--------------- 7 files changed, 52 insertions(+), 106 deletions(-) diff --git a/src/main/java/org/apache/ibatis/builder/MapperBuilderAssistant.java b/src/main/java/org/apache/ibatis/builder/MapperBuilderAssistant.java index e272f8b1d8c..8d136e40e25 100644 --- a/src/main/java/org/apache/ibatis/builder/MapperBuilderAssistant.java +++ b/src/main/java/org/apache/ibatis/builder/MapperBuilderAssistant.java @@ -166,13 +166,13 @@ public ResultMap addResultMap(String id, Class type, String extend, Discrimin // Remove parent constructor if this resultMap declares a constructor. boolean declaresConstructor = false; for (ResultMapping resultMapping : resultMappings) { - if (resultMapping.getFlags().contains(ResultFlag.CONSTRUCTOR)) { + if (ResultFlag.containsConstructor(resultMapping.getFlags())) { declaresConstructor = true; break; } } if (declaresConstructor) { - extendedResultMappings.removeIf(resultMapping -> resultMapping.getFlags().contains(ResultFlag.CONSTRUCTOR)); + extendedResultMappings.removeIf(resultMapping -> ResultFlag.containsConstructor(resultMapping.getFlags())); } resultMappings.addAll(extendedResultMappings); } @@ -185,7 +185,7 @@ public ResultMap addResultMap(String id, Class type, String extend, Discrimin public Discriminator buildDiscriminator(Class resultType, String column, Class javaType, JdbcType jdbcType, Class> typeHandler, Map discriminatorMap) { ResultMapping resultMapping = buildResultMapping(resultType, null, column, javaType, jdbcType, null, null, null, - null, typeHandler, new ArrayList<>(), null, null, false); + null, typeHandler, ResultFlag.NO_FLAG, null, null, false); Map namespaceDiscriminatorMap = new HashMap<>(); for (Map.Entry e : discriminatorMap.entrySet()) { String resultMap = e.getValue(); @@ -334,8 +334,7 @@ private List getStatementResultMaps(String resultMap, Class result public ResultMapping buildResultMapping(Class resultType, String property, String column, Class javaType, JdbcType jdbcType, String nestedSelect, String nestedResultMap, String notNullColumn, String columnPrefix, - Class> typeHandler, List flags, String resultSet, String foreignColumn, - boolean lazy) { + Class> typeHandler, byte flags, String resultSet, String foreignColumn, boolean lazy) { Class javaTypeClass = resolveResultJavaType(resultType, property, javaType); TypeHandler typeHandlerInstance = resolveTypeHandler(javaTypeClass, typeHandler); List composites; @@ -347,7 +346,7 @@ public ResultMapping buildResultMapping(Class resultType, String property, St return new ResultMapping.Builder(configuration, property, column, javaTypeClass).jdbcType(jdbcType) .nestedQueryId(applyCurrentNamespace(nestedSelect, true)) .nestedResultMapId(applyCurrentNamespace(nestedResultMap, true)).resultSet(resultSet) - .typeHandler(typeHandlerInstance).flags(flags == null ? new ArrayList<>() : flags).composites(composites) + .typeHandler(typeHandlerInstance).flags(flags).composites(composites) .notNullColumns(parseMultipleColumnNames(notNullColumn)).columnPrefix(columnPrefix).foreignColumn(foreignColumn) .lazy(lazy).build(); } @@ -382,7 +381,7 @@ public ResultMapping buildResultMapping(Class resultType, String property, St */ public ResultMapping buildResultMapping(Class resultType, String property, String column, Class javaType, JdbcType jdbcType, String nestedSelect, String nestedResultMap, String notNullColumn, String columnPrefix, - Class> typeHandler, List flags) { + Class> typeHandler, byte flags) { return buildResultMapping(resultType, property, column, javaType, jdbcType, nestedSelect, nestedResultMap, notNullColumn, columnPrefix, typeHandler, flags, null, null, configuration.isLazyLoadingEnabled()); } diff --git a/src/main/java/org/apache/ibatis/builder/annotation/MapperAnnotationBuilder.java b/src/main/java/org/apache/ibatis/builder/annotation/MapperAnnotationBuilder.java index 61c62ad360d..c32644cd729 100644 --- a/src/main/java/org/apache/ibatis/builder/annotation/MapperAnnotationBuilder.java +++ b/src/main/java/org/apache/ibatis/builder/annotation/MapperAnnotationBuilder.java @@ -457,9 +457,9 @@ private static Class getReturnType(Method method, Class type) { private void applyResults(Result[] results, Class resultType, List resultMappings) { for (Result result : results) { - List flags = new ArrayList<>(); + byte flags = ResultFlag.NO_FLAG; if (result.id()) { - flags.add(ResultFlag.ID); + flags |= ResultFlag.ID; } @SuppressWarnings("unchecked") Class> typeHandler = (Class>) (result @@ -531,10 +531,10 @@ private boolean hasNestedSelect(Result result) { private void applyConstructorArgs(Arg[] args, Class resultType, List resultMappings) { for (Arg arg : args) { - List flags = new ArrayList<>(); - flags.add(ResultFlag.CONSTRUCTOR); + byte flags = ResultFlag.NO_FLAG; + flags |= ResultFlag.CONSTRUCTOR; if (arg.id()) { - flags.add(ResultFlag.ID); + flags |= ResultFlag.ID; } @SuppressWarnings("unchecked") Class> typeHandler = (Class>) (arg diff --git a/src/main/java/org/apache/ibatis/builder/xml/XMLMapperBuilder.java b/src/main/java/org/apache/ibatis/builder/xml/XMLMapperBuilder.java index 72055331050..2fe95f07273 100644 --- a/src/main/java/org/apache/ibatis/builder/xml/XMLMapperBuilder.java +++ b/src/main/java/org/apache/ibatis/builder/xml/XMLMapperBuilder.java @@ -280,9 +280,9 @@ private ResultMap resultMapElement(XNode resultMapNode, List addi } else if ("discriminator".equals(resultChild.getName())) { discriminator = processDiscriminatorElement(resultChild, typeClass, resultMappings); } else { - List flags = new ArrayList<>(); + byte flags = ResultFlag.NO_FLAG; if ("id".equals(resultChild.getName())) { - flags.add(ResultFlag.ID); + flags |= ResultFlag.ID; } resultMappings.add(buildResultMappingFromContext(resultChild, typeClass, flags)); } @@ -316,10 +316,10 @@ protected Class inheritEnclosingType(XNode resultMapNode, Class enclosingT private void processConstructorElement(XNode resultChild, Class resultType, List resultMappings) { List argChildren = resultChild.getChildren(); for (XNode argChild : argChildren) { - List flags = new ArrayList<>(); - flags.add(ResultFlag.CONSTRUCTOR); + byte flags = ResultFlag.NO_FLAG; + flags |= ResultFlag.CONSTRUCTOR; if ("idArg".equals(argChild.getName())) { - flags.add(ResultFlag.ID); + flags |= ResultFlag.ID; } resultMappings.add(buildResultMappingFromContext(argChild, resultType, flags)); } @@ -378,9 +378,9 @@ private boolean databaseIdMatchesCurrent(String id, String databaseId, String re return context.getStringAttribute("databaseId") == null; } - private ResultMapping buildResultMappingFromContext(XNode context, Class resultType, List flags) { + private ResultMapping buildResultMappingFromContext(XNode context, Class resultType, byte flags) { String property; - if (flags.contains(ResultFlag.CONSTRUCTOR)) { + if (ResultFlag.containsConstructor(flags)) { property = context.getStringAttribute("name"); } else { property = context.getStringAttribute("property"); diff --git a/src/main/java/org/apache/ibatis/mapping/ResultFlag.java b/src/main/java/org/apache/ibatis/mapping/ResultFlag.java index 48ebdf8249b..0aca279e6c7 100644 --- a/src/main/java/org/apache/ibatis/mapping/ResultFlag.java +++ b/src/main/java/org/apache/ibatis/mapping/ResultFlag.java @@ -18,10 +18,18 @@ /** * @author Clinton Begin */ -public enum ResultFlag { +public class ResultFlag { - ID, + public static final byte NO_FLAG = 0; + public static final byte ID = 1; + public static final byte CONSTRUCTOR = 2; - CONSTRUCTOR + public static boolean containsId(byte flags) { + return (flags & ID) == ID; + } + + public static boolean containsConstructor(byte flags) { + return (flags & CONSTRUCTOR) == CONSTRUCTOR; + } } diff --git a/src/main/java/org/apache/ibatis/mapping/ResultMap.java b/src/main/java/org/apache/ibatis/mapping/ResultMap.java index a4f7d4ae57a..c6e1c0eeccd 100644 --- a/src/main/java/org/apache/ibatis/mapping/ResultMap.java +++ b/src/main/java/org/apache/ibatis/mapping/ResultMap.java @@ -109,7 +109,7 @@ public ResultMap build() { if (property != null) { resultMap.mappedProperties.add(property); } - if (resultMapping.getFlags().contains(ResultFlag.CONSTRUCTOR)) { + if (ResultFlag.containsConstructor(resultMapping.getFlags())) { resultMap.constructorResultMappings.add(resultMapping); if (resultMapping.getProperty() != null) { constructorArgNames.add(resultMapping.getProperty()); @@ -117,7 +117,7 @@ public ResultMap build() { } else { resultMap.propertyResultMappings.add(resultMapping); } - if (resultMapping.getFlags().contains(ResultFlag.ID)) { + if (ResultFlag.containsId(resultMapping.getFlags())) { resultMap.idResultMappings.add(resultMapping); } } diff --git a/src/main/java/org/apache/ibatis/mapping/ResultMapping.java b/src/main/java/org/apache/ibatis/mapping/ResultMapping.java index ffa715c596f..0a3487e9ac1 100644 --- a/src/main/java/org/apache/ibatis/mapping/ResultMapping.java +++ b/src/main/java/org/apache/ibatis/mapping/ResultMapping.java @@ -40,7 +40,7 @@ public class ResultMapping { private String nestedQueryId; private Set notNullColumns; private String columnPrefix; - private List flags; + private byte flags; private List composites; private String resultSet; private String foreignColumn; @@ -67,7 +67,7 @@ public Builder(Configuration configuration, String property, String column, Clas public Builder(Configuration configuration, String property) { resultMapping.configuration = configuration; resultMapping.property = property; - resultMapping.flags = new ArrayList<>(); + resultMapping.flags = ResultFlag.NO_FLAG; resultMapping.composites = new ArrayList<>(); resultMapping.lazy = configuration.isLazyLoadingEnabled(); } @@ -112,7 +112,7 @@ public Builder columnPrefix(String columnPrefix) { return this; } - public Builder flags(List flags) { + public Builder flags(byte flags) { resultMapping.flags = flags; return this; } @@ -134,7 +134,6 @@ public Builder lazy(boolean lazy) { public ResultMapping build() { // lock down collections - resultMapping.flags = Collections.unmodifiableList(resultMapping.flags); resultMapping.composites = Collections.unmodifiableList(resultMapping.composites); resolveTypeHandler(); validate(); @@ -223,7 +222,7 @@ public String getColumnPrefix() { return columnPrefix; } - public List getFlags() { + public byte getFlags() { return flags; } diff --git a/src/test/java/org/apache/ibatis/executor/ExecutorTestHelper.java b/src/test/java/org/apache/ibatis/executor/ExecutorTestHelper.java index c0900f01784..e874660414d 100644 --- a/src/test/java/org/apache/ibatis/executor/ExecutorTestHelper.java +++ b/src/test/java/org/apache/ibatis/executor/ExecutorTestHelper.java @@ -218,12 +218,7 @@ static MappedStatement prepareSelectOneAuthorMappedStatementWithConstructorResul private static final long serialVersionUID = 1L; { add(new ResultMapping.Builder(config, null, "id", registry.getTypeHandler(Integer.class)) - .javaType(int.class).flags(new ArrayList() { - private static final long serialVersionUID = 1L; - { - add(ResultFlag.CONSTRUCTOR); - } - }).build()); + .javaType(int.class).flags(ResultFlag.CONSTRUCTOR).build()); add(new ResultMapping.Builder(config, "username", "username", registry.getTypeHandler(String.class)) .build()); add(new ResultMapping.Builder(config, "password", "password", registry.getTypeHandler(String.class)) @@ -388,13 +383,8 @@ static MappedStatement prepareComplexSelectBlogMappedStatement(final Configurati new ArrayList() { private static final long serialVersionUID = 1L; { - add(new ResultMapping.Builder(config, "id", "id", registry.getTypeHandler(int.class)) - .flags(new ArrayList() { - private static final long serialVersionUID = 1L; - { - add(ResultFlag.ID); - } - }).build()); + add(new ResultMapping.Builder(config, "id", "id", registry.getTypeHandler(int.class)).flags(ResultFlag.ID) + .build()); add(new ResultMapping.Builder(config, "title", "title", registry.getTypeHandler(String.class)).build()); add(new ResultMapping.Builder(config, "author.id", "author_id", registry.getTypeHandler(int.class)) .build()); @@ -436,13 +426,8 @@ static MappedStatement prepareSelectBlogByIdAndAuthor(final Configuration config new ArrayList() { private static final long serialVersionUID = 1L; { - add(new ResultMapping.Builder(config, "id", "id", registry.getTypeHandler(int.class)) - .flags(new ArrayList() { - private static final long serialVersionUID = 1L; - { - add(ResultFlag.ID); - } - }).build()); + add(new ResultMapping.Builder(config, "id", "id", registry.getTypeHandler(int.class)).flags(ResultFlag.ID) + .build()); add(new ResultMapping.Builder(config, "title", "title", registry.getTypeHandler(String.class)).build()); add(new ResultMapping.Builder(config, "author.id", "author_id", registry.getTypeHandler(int.class)) .build()); @@ -487,12 +472,7 @@ static MappedStatement prepareSelectPostsForBlogMappedStatement(final Configurat private static final long serialVersionUID = 1L; { add(new ResultMapping.Builder(config, "id", "tag_id", registry.getTypeHandler(int.class)) - .flags(new ArrayList() { - private static final long serialVersionUID = 1L; - { - add(ResultFlag.ID); - } - }).build()); + .flags(ResultFlag.ID).build()); add(new ResultMapping.Builder(config, "name", "tag_name", registry.getTypeHandler(String.class)).build()); } }).build(); @@ -501,12 +481,7 @@ static MappedStatement prepareSelectPostsForBlogMappedStatement(final Configurat private static final long serialVersionUID = 1L; { add(new ResultMapping.Builder(config, "id", "comment_id", registry.getTypeHandler(int.class)) - .flags(new ArrayList() { - private static final long serialVersionUID = 1L; - { - add(ResultFlag.ID); - } - }).build()); + .flags(ResultFlag.ID).build()); add(new ResultMapping.Builder(config, "name", "comment_name", registry.getTypeHandler(String.class)) .build()); add(new ResultMapping.Builder(config, "comment", "comment", registry.getTypeHandler(String.class)).build()); @@ -518,13 +493,8 @@ static MappedStatement prepareSelectPostsForBlogMappedStatement(final Configurat new ArrayList() { private static final long serialVersionUID = 1L; { - add(new ResultMapping.Builder(config, "id", "id", registry.getTypeHandler(int.class)) - .flags(new ArrayList() { - private static final long serialVersionUID = 1L; - { - add(ResultFlag.ID); - } - }).build()); + add(new ResultMapping.Builder(config, "id", "id", registry.getTypeHandler(int.class)).flags(ResultFlag.ID) + .build()); add(new ResultMapping.Builder(config, "blog", "blog_id", registry.getTypeHandler(int.class)) .javaType(Blog.class).nestedQueryId("selectBlogById").build()); add(new ResultMapping.Builder(config, "createdOn", "created_on", registry.getTypeHandler(Date.class)) @@ -565,12 +535,7 @@ static MappedStatement prepareSelectPostMappedStatement(final Configuration conf private static final long serialVersionUID = 1L; { add(new ResultMapping.Builder(config, "id", "tag_id", registry.getTypeHandler(int.class)) - .flags(new ArrayList() { - private static final long serialVersionUID = 1L; - { - add(ResultFlag.ID); - } - }).build()); + .flags(ResultFlag.ID).build()); add(new ResultMapping.Builder(config, "name", "tag_name", registry.getTypeHandler(String.class)).build()); } }).build(); @@ -579,12 +544,7 @@ static MappedStatement prepareSelectPostMappedStatement(final Configuration conf private static final long serialVersionUID = 1L; { add(new ResultMapping.Builder(config, "id", "comment_id", registry.getTypeHandler(int.class)) - .flags(new ArrayList() { - private static final long serialVersionUID = 1L; - { - add(ResultFlag.ID); - } - }).build()); + .flags(ResultFlag.ID).build()); add(new ResultMapping.Builder(config, "name", "comment_name", registry.getTypeHandler(String.class)) .build()); add(new ResultMapping.Builder(config, "comment", "comment", registry.getTypeHandler(String.class)).build()); @@ -595,13 +555,8 @@ static MappedStatement prepareSelectPostMappedStatement(final Configuration conf final ResultMap postResultMap = new ResultMap.Builder(config, "", Post.class, new ArrayList() { private static final long serialVersionUID = 1L; { - add(new ResultMapping.Builder(config, "id", "id", registry.getTypeHandler(int.class)) - .flags(new ArrayList() { - private static final long serialVersionUID = 1L; - { - add(ResultFlag.ID); - } - }).build()); + add(new ResultMapping.Builder(config, "id", "id", registry.getTypeHandler(int.class)).flags(ResultFlag.ID) + .build()); add(new ResultMapping.Builder(config, "blog", "blog_id", registry.getTypeHandler(int.class)) .javaType(Blog.class).nestedQueryId("selectBlogById").build()); add(new ResultMapping.Builder(config, "createdOn", "created_on", registry.getTypeHandler(Date.class)).build()); @@ -641,12 +596,7 @@ static MappedStatement prepareSelectPostWithBlogByAuthorMappedStatement(final Co private static final long serialVersionUID = 1L; { add(new ResultMapping.Builder(config, "id", "tag_id", registry.getTypeHandler(int.class)) - .flags(new ArrayList() { - private static final long serialVersionUID = 1L; - { - add(ResultFlag.ID); - } - }).build()); + .flags(ResultFlag.ID).build()); add(new ResultMapping.Builder(config, "name", "tag_name", registry.getTypeHandler(String.class)).build()); } }).build(); @@ -655,12 +605,7 @@ static MappedStatement prepareSelectPostWithBlogByAuthorMappedStatement(final Co private static final long serialVersionUID = 1L; { add(new ResultMapping.Builder(config, "id", "comment_id", registry.getTypeHandler(int.class)) - .flags(new ArrayList() { - private static final long serialVersionUID = 1L; - { - add(ResultFlag.ID); - } - }).build()); + .flags(ResultFlag.ID).build()); add(new ResultMapping.Builder(config, "name", "comment_name", registry.getTypeHandler(String.class)) .build()); add(new ResultMapping.Builder(config, "comment", "comment", registry.getTypeHandler(String.class)).build()); @@ -672,13 +617,8 @@ static MappedStatement prepareSelectPostWithBlogByAuthorMappedStatement(final Co new ArrayList() { private static final long serialVersionUID = 1L; { - add(new ResultMapping.Builder(config, "id", "id", registry.getTypeHandler(int.class)) - .flags(new ArrayList() { - private static final long serialVersionUID = 1L; - { - add(ResultFlag.ID); - } - }).build()); + add(new ResultMapping.Builder(config, "id", "id", registry.getTypeHandler(int.class)).flags(ResultFlag.ID) + .build()); add(new ResultMapping.Builder(config, "blog").nestedQueryId("selectBlogByIdAndAuthor") .composites(new ArrayList() {