Author: cbegin
Date: Mon May 18 16:21:22 2009
New Revision: 776003

URL: http://svn.apache.org/viewvc?rev=776003&view=rev
Log:
refactored result handler and added ability to break out of the results 
processing loop.

Added:
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/result/ResultContext.java
Modified:
    ibatis/trunk/java/ibatis-3/TODO
    
ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/main/java/com/ibatis/sqlmap/engine/impl/SqlMapSessionImpl.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/loader/ResultObjectProxy.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/result/DefaultResultHandler.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/result/ResultHandler.java
    
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/TODO
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/TODO?rev=776003&r1=776002&r2=776003&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/TODO (original)
+++ ibatis/trunk/java/ibatis-3/TODO Mon May 18 16:21:22 2009
@@ -2,15 +2,11 @@
 #          TO-DO List             #
 ###################################
 
-Required:
-
-* Allow lazy loading across connection boundaries
-
 Nice to Have:
-* Commit required option at statement level
-* Add resultType automapping option for collections so a resultMap isn' t 
required
-* Auto result/param types detected for bound XML statements
-* Named parameter parsing/merging
-* Break out of ResultHandler
-* Preserve select key id on failed statement (refactor keygenerator interface)
-* http://issues.apache.org/jira/browse/IBATIS-357
\ No newline at end of file
+
+  * Commit required option at statement level
+  * Add resultType automapping option for collections so a resultMap isn't 
required
+  * Auto result/param types detected for bound XML statements
+  * Named parameter parsing/merging
+  * Preserve select key id on failed statement (refactor keygenerator 
interface)
+  * http://issues.apache.org/jira/browse/IBATIS-357
\ No newline at end of file

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/main/java/com/ibatis/sqlmap/engine/impl/SqlMapSessionImpl.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/main/java/com/ibatis/sqlmap/engine/impl/SqlMapSessionImpl.java?rev=776003&r1=776002&r2=776003&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/main/java/com/ibatis/sqlmap/engine/impl/SqlMapSessionImpl.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/main/java/com/ibatis/sqlmap/engine/impl/SqlMapSessionImpl.java
 Mon May 18 16:21:22 2009
@@ -14,7 +14,7 @@
 import org.apache.ibatis.executor.BatchExecutorException;
 import org.apache.ibatis.executor.BatchResult;
 import org.apache.ibatis.executor.Executor;
-import org.apache.ibatis.executor.result.ResultHandler;
+import org.apache.ibatis.executor.result.*;
 import org.apache.ibatis.mapping.MappedStatement;
 import org.apache.ibatis.mapping.ResultMap;
 import org.apache.ibatis.mapping.ResultMapping;
@@ -169,8 +169,8 @@
         MappedStatement ms = configuration.getMappedStatement(id);
         Executor executor = transaction.getExecutor();
         return executor.query(ms, wrapCollection(parameterObject), 
Executor.NO_ROW_OFFSET, Executor.NO_ROW_LIMIT, new ResultHandler() {
-          public void handleResult(Object resultObject) {
-            rowHandler.handleRow(resultObject);
+          public void handleResult(ResultContext context) {
+            rowHandler.handleRow(context.getResultObject());
           }
         });
       }

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/loader/ResultObjectProxy.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/loader/ResultObjectProxy.java?rev=776003&r1=776002&r2=776003&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/loader/ResultObjectProxy.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/loader/ResultObjectProxy.java
 Mon May 18 16:21:22 2009
@@ -2,12 +2,16 @@
 
 import net.sf.cglib.proxy.*;
 import org.apache.ibatis.reflection.*;
+import org.apache.ibatis.mapping.Configuration;
+import org.apache.ibatis.type.TypeHandlerRegistry;
 
 import java.io.Serializable;
 import java.lang.reflect.Method;
 
 public class ResultObjectProxy {
 
+  private static final TypeHandlerRegistry registry = new 
TypeHandlerRegistry();
+
   public static Object createProxy(Class type, Object target, 
ResultLoaderRegistry lazyLoader) {
     return EnhancedResultObjectProxyImpl.createProxy(type, target, lazyLoader);
   }
@@ -23,7 +27,11 @@
     }
 
     public static Object createProxy(Class type, Object target, 
ResultLoaderRegistry lazyLoader) {
-      return Enhancer.create(type, new EnhancedResultObjectProxyImpl(target, 
lazyLoader));
+      if (registry.hasTypeHandler(type)) {
+        return target;
+      } else {
+        return Enhancer.create(type, new EnhancedResultObjectProxyImpl(target, 
lazyLoader));
+      }
     }
 
     public Object invoke(Object o, Method method, Object[] args) throws 
Throwable {

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/result/DefaultResultHandler.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/result/DefaultResultHandler.java?rev=776003&r1=776002&r2=776003&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/result/DefaultResultHandler.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/result/DefaultResultHandler.java
 Mon May 18 16:21:22 2009
@@ -6,8 +6,8 @@
 
   private final List list = new ArrayList();
 
-  public void handleResult(Object resultObject) {
-    list.add(resultObject);
+  public void handleResult(ResultContext context) {
+    list.add(context.getResultObject());
   }
 
   public List getResultList() {

Added: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/result/ResultContext.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/result/ResultContext.java?rev=776003&view=auto
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/result/ResultContext.java
 (added)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/result/ResultContext.java
 Mon May 18 16:21:22 2009
@@ -0,0 +1,37 @@
+package org.apache.ibatis.executor.result;
+
+public class ResultContext {
+
+  private Object resultObject;
+  private int resultCount;
+  private boolean stopped;
+
+  public ResultContext() {
+    resultObject = null;
+    resultCount = 0;
+    stopped = false;
+  }
+
+  public Object getResultObject() {
+    return resultObject;
+  }
+
+  public int getResultCount() {
+    return resultCount;
+  }
+
+  public boolean isStopped() {
+    return stopped;
+  }
+
+  public void nextResultObject(Object resultObject) {
+    resultCount++;
+    this.resultObject = resultObject;
+  }
+
+  public void stop() {
+    this.stopped = true;
+  }
+
+
+}

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/result/ResultHandler.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/result/ResultHandler.java?rev=776003&r1=776002&r2=776003&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/result/ResultHandler.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/result/ResultHandler.java
 Mon May 18 16:21:22 2009
@@ -2,6 +2,6 @@
 
 public interface ResultHandler {
 
-  void handleResult(Object resultObject);
+  void handleResult(ResultContext context);
 
 }

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=776003&r1=776002&r2=776003&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
 Mon May 18 16:21:22 2009
@@ -110,8 +110,9 @@
   private void handleResults(ResultSet rs, ResultMap resultMap, ResultHandler 
resultHandler, int skipResults, int maxResults) throws SQLException {
     if (resultMap != null) {
       skipResults(rs, skipResults);
-      int resultsFetched = 0;
-      while ((maxResults == Executor.NO_ROW_LIMIT || resultsFetched < 
maxResults) && rs.next()) {
+      ResultContext context = new ResultContext();
+      while ((maxResults == Executor.NO_ROW_LIMIT || context.getResultCount() 
< maxResults)
+          && !context.isStopped() && rs.next()) {
         currentNestedKey = null;
         ResultMap rm = resolveSubMap(rs, resultMap);
         Object resultObject = loadResultObject(rs, rm, new Reference(false));
@@ -119,9 +120,9 @@
           if (resultObject instanceof PlatformTypeHolder) {
             resultObject = ((PlatformTypeHolder) resultObject).get(null);
           }
-          resultHandler.handleResult(resultObject);
+          context.nextResultObject(resultObject);
+          resultHandler.handleResult(context);
         }
-        resultsFetched++;
       }
     }
   }

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=776003&r1=776002&r2=776003&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
 Mon May 18 16:21:22 2009
@@ -227,11 +227,14 @@
       BoundBlogMapper mapper = session.getMapper(BoundBlogMapper.class);
       List<Post> posts = mapper.selectPosts();
       assertEquals(5, posts.size());
-      assertEquals(DraftPost.class, posts.get(0).getClass());
-      assertEquals(Post.class, posts.get(1).getClass());
-      assertEquals(DraftPost.class, posts.get(2).getClass());
-      assertEquals(Post.class, posts.get(3).getClass());
-      assertEquals(Post.class, posts.get(4).getClass());
+      assertTrue(posts.get(0) instanceof DraftPost);
+      assertTrue(posts.get(1) instanceof Post);
+      assertFalse(posts.get(1) instanceof DraftPost);
+      assertTrue(posts.get(2) instanceof DraftPost);
+      assertTrue(posts.get(3) instanceof Post);
+      assertFalse(posts.get(3) instanceof DraftPost);
+      assertTrue(posts.get(4) instanceof Post);
+      assertFalse(posts.get(4) instanceof DraftPost);
     } finally {
       session.close();
     }
@@ -244,11 +247,14 @@
       BoundBlogMapper mapper = session.getMapper(BoundBlogMapper.class);
       List<Post> posts = mapper.selectPostsWithResultMap();
       assertEquals(5, posts.size());
-      assertEquals(DraftPost.class, posts.get(0).getClass());
-      assertEquals(Post.class, posts.get(1).getClass());
-      assertEquals(DraftPost.class, posts.get(2).getClass());
-      assertEquals(Post.class, posts.get(3).getClass());
-      assertEquals(Post.class, posts.get(4).getClass());
+      assertTrue(posts.get(0) instanceof DraftPost);
+      assertTrue(posts.get(1) instanceof Post);
+      assertFalse(posts.get(1) instanceof DraftPost);
+      assertTrue(posts.get(2) instanceof DraftPost);
+      assertTrue(posts.get(3) instanceof Post);
+      assertFalse(posts.get(3) instanceof DraftPost);
+      assertTrue(posts.get(4) instanceof Post);
+      assertFalse(posts.get(4) instanceof DraftPost);
     } finally {
       session.close();
     }


Reply via email to