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 {