Author: cbegin Date: Mon May 3 02:59:10 2010 New Revision: 940351 URL: http://svn.apache.org/viewvc?rev=940351&view=rev Log: iBATIS-782 Non-mapped associations in discriminator sub-maps do not work
Modified: ibatis/java/ibatis-3/trunk/src/main/java/org/apache/ibatis/mapping/ResultMap.java ibatis/java/ibatis-3/trunk/src/main/java/org/apache/ibatis/session/Configuration.java ibatis/java/ibatis-3/trunk/src/test/java/org/apache/ibatis/builder/BlogMapper.xml ibatis/java/ibatis-3/trunk/src/test/java/org/apache/ibatis/session/SqlSessionTest.java Modified: ibatis/java/ibatis-3/trunk/src/main/java/org/apache/ibatis/mapping/ResultMap.java URL: http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/src/main/java/org/apache/ibatis/mapping/ResultMap.java?rev=940351&r1=940350&r2=940351&view=diff ============================================================================== --- ibatis/java/ibatis-3/trunk/src/main/java/org/apache/ibatis/mapping/ResultMap.java (original) +++ ibatis/java/ibatis-3/trunk/src/main/java/org/apache/ibatis/mapping/ResultMap.java Mon May 3 02:59:10 2010 @@ -114,4 +114,8 @@ public class ResultMap { return discriminator; } + public void forceNestedResultMaps() { + hasNestedResultMaps = true; + } + } Modified: ibatis/java/ibatis-3/trunk/src/main/java/org/apache/ibatis/session/Configuration.java URL: http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/src/main/java/org/apache/ibatis/session/Configuration.java?rev=940351&r1=940350&r2=940351&view=diff ============================================================================== --- ibatis/java/ibatis-3/trunk/src/main/java/org/apache/ibatis/session/Configuration.java (original) +++ ibatis/java/ibatis-3/trunk/src/main/java/org/apache/ibatis/session/Configuration.java Mon May 3 02:59:10 2010 @@ -292,6 +292,8 @@ public class Configuration { public void addResultMap(ResultMap rm) { resultMaps.put(rm.getId(), rm); + checkLocallyForDiscriminatedNestedResultMaps(rm); + checkGloballyForDiscriminatedNestedResultMaps(rm); } public Collection<String> getResultMapNames() { @@ -366,6 +368,39 @@ public class Configuration { return mappedStatements.containsKey(statementName); } + //Slow but a one time cost. A better solution is welcome. + protected void checkGloballyForDiscriminatedNestedResultMaps(ResultMap rm) { + if (rm.hasNestedResultMaps()) { + for (Map.Entry entry : resultMaps.entrySet()) { + Object value = entry.getValue(); + if (value instanceof ResultMap) { + ResultMap entryResultMap = (ResultMap) value; + if (!entryResultMap.hasNestedResultMaps() && entryResultMap.getDiscriminator() != null) { + Collection<String> discriminatedResultMapNames = entryResultMap.getDiscriminator().getDiscriminatorMap().values(); + if (discriminatedResultMapNames.contains(rm.getId())) { + entryResultMap.forceNestedResultMaps(); + } + } + } + } + } + } + + //Slow but a one time cost. A better solution is welcome. + protected void checkLocallyForDiscriminatedNestedResultMaps(ResultMap rm) { + if (!rm.hasNestedResultMaps() && rm.getDiscriminator() != null) { + for (Map.Entry entry : rm.getDiscriminator().getDiscriminatorMap().entrySet()) { + String discriminatedResultMapName = (String)entry.getValue(); + if(hasResultMap(discriminatedResultMapName)) { + ResultMap discriminatedResultMap = resultMaps.get(discriminatedResultMapName); + if (discriminatedResultMap.hasNestedResultMaps()) { + rm.forceNestedResultMaps(); + break; + } + } + } + } + } protected static class StrictMap<J extends String, K extends Object> extends HashMap<J, K> { Modified: ibatis/java/ibatis-3/trunk/src/test/java/org/apache/ibatis/builder/BlogMapper.xml URL: http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/src/test/java/org/apache/ibatis/builder/BlogMapper.xml?rev=940351&r1=940350&r2=940351&view=diff ============================================================================== --- ibatis/java/ibatis-3/trunk/src/test/java/org/apache/ibatis/builder/BlogMapper.xml (original) +++ ibatis/java/ibatis-3/trunk/src/test/java/org/apache/ibatis/builder/BlogMapper.xml Mon May 3 02:59:10 2010 @@ -6,6 +6,18 @@ <mapper namespace="domain.blog.mappers.BlogMapper"> + <resultMap id="earlyNestedDiscriminatorPost" type="domain.blog.Post"> + <id property="id" column="post_id"/> + <result property="subject" column="post_subject"/> + <discriminator javaType="int" column="draft"> + <case value="1"> + <association property="author" column="post_author_id" resultMap="joinedAuthor"/> + <collection property="comments" column="post_id" resultMap="joinedComment"/> + <collection property="tags" column="post_id" resultMap="joinedTag"/> + </case> + </discriminator> + </resultMap> + <resultMap id="blogWithPosts" type="Blog"> <id property="id" column="id"/> <result property="title" column="title"/> @@ -64,6 +76,18 @@ <collection property="posts" resultMap="joinedPost"/> </resultMap> + <resultMap id="lateNestedDiscriminatorPost" type="domain.blog.Post"> + <id property="id" column="post_id"/> + <result property="subject" column="post_subject"/> + <discriminator javaType="int" column="draft"> + <case value="1"> + <association property="author" column="post_author_id" resultMap="joinedAuthor"/> + <collection property="comments" column="post_id" resultMap="joinedComment"/> + <collection property="tags" column="post_id" resultMap="joinedTag"/> + </case> + </discriminator> + </resultMap> + <select id="selectBlogJoinedWithPostsAndAuthor" parameterType="int" resultMap="blogJoinedWithPostsAndAuthor"> select B.id as blog_id, Modified: ibatis/java/ibatis-3/trunk/src/test/java/org/apache/ibatis/session/SqlSessionTest.java URL: http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/src/test/java/org/apache/ibatis/session/SqlSessionTest.java?rev=940351&r1=940350&r2=940351&view=diff ============================================================================== --- ibatis/java/ibatis-3/trunk/src/test/java/org/apache/ibatis/session/SqlSessionTest.java (original) +++ ibatis/java/ibatis-3/trunk/src/test/java/org/apache/ibatis/session/SqlSessionTest.java Mon May 3 02:59:10 2010 @@ -112,6 +112,18 @@ public class SqlSessionTest extends Base } @Test + public void shouldEnsureThatBothEarlyAndLateResolutionOfNesteDiscriminatorsResolesToUseNestedResultSetHandler() throws Exception { + SqlSession session = sqlMapper.openSession(); + try { + Configuration configuration = sqlMapper.getConfiguration(); + assertTrue(configuration.getResultMap("domain.blog.mappers.BlogMapper.earlyNestedDiscriminatorPost").hasNestedResultMaps()); + assertTrue(configuration.getResultMap("domain.blog.mappers.BlogMapper.lateNestedDiscriminatorPost").hasNestedResultMaps()); + } finally { + session.close(); + } + } + + @Test public void shouldSelectOneAuthor() throws Exception { SqlSession session = sqlMapper.openSession(); try {