You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ibatis.apache.org by cb...@apache.org on 2010/05/03 04:59:10 UTC
svn commit: r940351 - in /ibatis/java/ibatis-3/trunk/src:
main/java/org/apache/ibatis/mapping/ main/java/org/apache/ibatis/session/
test/java/org/apache/ibatis/builder/ test/java/org/apache/ibatis/session/
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 {