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();
}