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 2009/03/01 23:15:50 UTC

svn commit: r749137 - in /ibatis/trunk/java/ibatis-3/ibatis-3-core/src: main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java test/java/org/apache/ibatis/binding/BindingTest.java

Author: cbegin
Date: Sun Mar  1 22:15:50 2009
New Revision: 749137

URL: http://svn.apache.org/viewvc?rev=749137&view=rev
Log:
Fixed nested join mapping bug mentioned in last commit.

Modified:
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BindingTest.java

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java?rev=749137&r1=749136&r2=749137&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java Sun Mar  1 22:15:50 2009
@@ -37,8 +37,6 @@
 
   private ResultHandler resultHandler;
 
-  private Reference<Boolean> foundValues;
-
   public DefaultResultSetHandler(Configuration configuration, Executor executor, MappedStatement mappedStatement, ParameterHandler parameterHandler, int rowOffset, int rowLimit, ResultHandler resultHandler) {
     this.configuration = configuration;
     this.executor = executor;
@@ -50,7 +48,6 @@
     this.parameterObject = parameterHandler.getParameterObject();
     this.nestedResultObjects = new HashMap();
     this.resultHandler = resultHandler;
-    this.foundValues = new Reference<Boolean>(false);
   }
 
   public List handleResultSets(Statement statement) throws SQLException {
@@ -121,7 +118,7 @@
       while ((maxResults == Executor.NO_ROW_LIMIT || resultsFetched < maxResults) && rs.next()) {
         currentNestedKey = null;
         ResultMap rm = resolveSubMap(rs, resultMap);
-        Object resultObject = loadResultObject(rs, rm);
+        Object resultObject = loadResultObject(rs, rm, new Reference(false));
         if (resultObject != NO_VALUE) {
           if (resultObject instanceof PlatformTypeHolder) {
             resultObject = ((PlatformTypeHolder) resultObject).get(null);
@@ -133,7 +130,7 @@
     }
   }
 
-  private Object loadResultObject(ResultSet rs, ResultMap rm) throws SQLException {
+  private Object loadResultObject(ResultSet rs, ResultMap rm, Reference<Boolean> foundValues) throws SQLException {
     if (rm.getType() == null) {
       throw new ExecutorException("The result class was null when trying to get results for ResultMap.");
     }
@@ -145,15 +142,13 @@
       resultObject = ResultObjectProxy.createProxy(rm.getType(), resultObject, lazyLoader);
     }
 
-    // Rethink this implementation of foundValues.  It's the only volatile state on the class...
-    foundValues = new Reference<Boolean>(false);
     List<ResultMapping> appliedResultMappings = new ArrayList<ResultMapping>();
-    resultObject = mapResults(rs, rm, lazyLoader, resultObject, appliedResultMappings);
+    resultObject = mapResults(rs, rm, lazyLoader, resultObject, appliedResultMappings, foundValues);
     resultObject = processNestedJoinResults(rs, appliedResultMappings, resultObject);
     return resultObject;
   }
 
-  private Object mapResults(ResultSet rs, ResultMap rm, ResultLoaderRegistry lazyLoader, Object resultObject, List<ResultMapping> appliedResultMappings) throws SQLException {
+  private Object mapResults(ResultSet rs, ResultMap rm, ResultLoaderRegistry lazyLoader, Object resultObject, List<ResultMapping> appliedResultMappings, Reference<Boolean> foundValues) throws SQLException {
     MetaObject metaResultObject = MetaObject.forObject(resultObject);
     Set<String> propSet = new HashSet<String>();
     Set<String> colSet = new HashSet<String>();
@@ -181,14 +176,14 @@
       colName = colName == null ? null : colName.toUpperCase();
       autoMappings.remove(propName);
       if (colName == null || colSet.contains(colName)) {
-        resultObject = processResult(rs, rm, resultMapping, lazyLoader, resultObject);
+        resultObject = processResult(rs, rm, resultMapping, lazyLoader, resultObject, foundValues);
         appliedResultMappings.add(resultMapping);
       }
     }
     // Automap remaining results
     for (String key : autoMappings.keySet()) {
       ResultMapping autoMapping = autoMappings.get(key);
-      resultObject = processResult(rs, rm, autoMapping, lazyLoader, resultObject);
+      resultObject = processResult(rs, rm, autoMapping, lazyLoader, resultObject,foundValues);
       appliedResultMappings.add(autoMapping);
     }
     return resultObject;
@@ -204,7 +199,7 @@
       List<Class> argTypes = new ArrayList<Class>();
       List<Object> argValues = new ArrayList<Object>();
       for (ResultMapping resultMapping : rm.getConstructorResultMappings()) {
-        Object value = processResult(rs, rm, resultMapping, null, constructorArgs);
+        Object value = processResult(rs, rm, resultMapping, null, constructorArgs, new Reference(false));
         argTypes.add(resultMapping.getJavaType());
         argValues.add(value);
       }
@@ -243,7 +238,7 @@
     return resultObject;
   }
 
-  private Object processResult(ResultSet rs, ResultMap rm, ResultMapping resultMapping, ResultLoaderRegistry lazyLoader, Object resultObject) throws SQLException {
+  private Object processResult(ResultSet rs, ResultMap rm, ResultMapping resultMapping, ResultLoaderRegistry lazyLoader, Object resultObject, Reference<Boolean> foundValues) throws SQLException {
     if (resultMapping.getNestedQueryId() != null) {
       Configuration configuration = mappedStatement.getConfiguration();
       MappedStatement nestedQuery = configuration.getMappedStatement(resultMapping.getNestedQueryId());
@@ -251,12 +246,12 @@
       Object parameterObject = prepareNestedParameterObject(rs, resultMapping, parameterType);
       resultObject = processNestedSelectResult(nestedQuery, rm, resultMapping, lazyLoader, parameterObject, resultObject);
     } else if (resultMapping.getNestedResultMapId() == null) {
-      resultObject = processSimpleResult(rs, rm, resultMapping, resultObject);
+      resultObject = processSimpleResult(rs, rm, resultMapping, resultObject, foundValues);
     }
     return resultObject;
   }
 
-  private Object processSimpleResult(ResultSet rs, ResultMap rm, ResultMapping resultMapping, Object resultObject) throws SQLException {
+  private Object processSimpleResult(ResultSet rs, ResultMap rm, ResultMapping resultMapping, Object resultObject, Reference<Boolean> foundValues) throws SQLException {
     MetaObject metaResultObject = MetaObject.forObject(resultObject);
     Object value = getPrimitiveResultMappingValue(rs, resultMapping);
     String property = resultMapping.getProperty();
@@ -296,8 +291,8 @@
               String propertyName = resultMapping.getProperty();
 
               MetaObject metaObject = MetaObject.forObject(knownResultObject);
-              Object obj = metaObject.getValue(propertyName);
-              if (obj == null) {
+              Object propertyValue = metaObject.getValue(propertyName);
+              if (propertyValue == null) {
                 if (type == null) {
                   type = metaObject.getSetterType(propertyName);
                 }
@@ -307,22 +302,23 @@
                   // then we will just set the property to the object created
                   // in processing the nested result map
                   if (Collection.class.isAssignableFrom(type)) {
-                    obj = objectFactory.create(type);
-                    metaObject.setValue(propertyName, obj);
+                    propertyValue = objectFactory.create(type);
+                    metaObject.setValue(propertyName, propertyValue);
                   }
                 } catch (Exception e) {
                   throw new ExecutorException("Error instantiating collection property for result '" + resultMapping.getProperty() + "'.  Cause: " + e, e);
                 }
               }
 
-              Object o = loadResultObject(rs, nestedResultMap);
-              if (o != null && o != NO_VALUE) {
-                if (obj != null && obj instanceof Collection) {
+              Reference<Boolean> foundValues = new Reference(false);
+              Object nestedResultObject = loadResultObject(rs, nestedResultMap, foundValues);
+              if (nestedResultObject != null && nestedResultObject != NO_VALUE) {
+                if (propertyValue != null && propertyValue instanceof Collection) {
                   if (foundValues.get()) {
-                    ((Collection) obj).add(o);
+                    ((Collection) propertyValue).add(nestedResultObject);
                   }
                 } else {
-                  metaObject.setValue(propertyName, o);
+                  metaObject.setValue(propertyName, nestedResultObject);
                 }
               }
             } catch (SQLException e) {
@@ -487,4 +483,5 @@
       this.value = value;
     }
   }
+
 }

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BindingTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BindingTest.java?rev=749137&r1=749136&r2=749137&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BindingTest.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BindingTest.java Sun Mar  1 22:15:50 2009
@@ -45,31 +45,15 @@
     try {
       BoundBlogMapper mapper = session.getMapper(BoundBlogMapper.class);
       List<Blog> blogs = mapper.selectBlogWithAssociations(1);
-      for (Blog blog : blogs) {
-        System.out.println(blog);
-        for (Post post : blog.getPosts()) {
-          System.out.println("    " + post);
-          if (post.getComments() != null) {
-            for (Comment comment : post.getComments()) {
-              System.out.println("        " + comment);
-            }
-          }
-          if (post.getTags() != null) {
-            for (Tag tag : post.getTags()) {
-              System.out.println("        " + tag);
-            }
-          }
-        }
-      }
       assertEquals(1, blogs.size());
       Blog blog = blogs.get(0);
       assertEquals(2, blog.getPosts().size());
       Post firstPost = blog.getPosts().get(0);
-      assertEquals(2, firstPost.getComments().size());
       assertEquals(3, firstPost.getTags().size());
+      assertEquals(2, firstPost.getComments().size());
       Post secondPost = blog.getPosts().get(1);
-      assertEquals(0, secondPost.getComments().size());
       assertEquals(1, secondPost.getTags().size());
+      assertEquals(0, secondPost.getComments().size());
     } finally {
       session.close();
     }