Author: cbegin
Date: Mon Sep 14 04:05:16 2009
New Revision: 814470
URL: http://svn.apache.org/viewvc?rev=814470&view=rev
Log:
Most tests passing with new result handler
Modified:
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/executor/resultset/NewResultSetHandler.java
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/reflection/wrapper/MapWrapper.java
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/log4j.properties
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/executor/BaseExecutorTest.java
Modified:
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/executor/resultset/NewResultSetHandler.java
URL:
http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/executor/resultset/NewResultSetHandler.java?rev=814470&r1=814469&r2=814470&view=diff
==============================================================================
---
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/executor/resultset/NewResultSetHandler.java
(original)
+++
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/executor/resultset/NewResultSetHandler.java
Mon Sep 14 04:05:16 2009
@@ -22,7 +22,7 @@
public class NewResultSetHandler implements ResultSetHandler {
- private Executor executor;
+ private final Executor executor;
private final Configuration configuration;
private final MappedStatement mappedStatement;
private final RowLimit rowLimit;
@@ -98,6 +98,7 @@
}
rs = getNextResultSet(stmt);
count++;
+ nestedResultObjects.clear();
}
return collapseSingleResultList(multipleResults);
}
@@ -112,20 +113,26 @@
private void handleResultSet(ResultSet rs, ResultMap resultMap,
ResultHandler resultHandler, RowLimit rowLimit) throws SQLException {
final DefaultResultContext resultContext = new DefaultResultContext();
- final List<String> mappedColumnNames = new ArrayList<String>();
- final List<String> unmappedColumnNames = new ArrayList<String>();
skipRows(rs, rowLimit);
while (shouldProcessMoreRows(rs, resultContext.getResultCount(),
rowLimit)) {
- final ResultMap discriminatedResultMap =
resolveDiscriminatedResultMap(rs, resultMap);
- final ResultLoaderRegistry lazyLoader =
instantiateResultLoaderRegistry();
- final Object resultObject = createResultObject(rs,
discriminatedResultMap, lazyLoader);
- if (!typeHandlerRegistry.hasTypeHandler(resultMap.getType())) {
- final MetaObject metaObject = MetaObject.forObject(resultObject);
- getMappedAndUnmappedColumnNames(rs, discriminatedResultMap,
mappedColumnNames, unmappedColumnNames);
- applyPropertyMappings(rs, discriminatedResultMap, mappedColumnNames,
metaObject, lazyLoader);
- applyAutomaticMappings(rs, unmappedColumnNames, metaObject);
- processNestedJoinResults(rs, resultMap, resultObject);
- }
+ loadObject(rs, resultMap, resultHandler, resultContext);
+ }
+ }
+
+ private void loadObject(ResultSet rs, ResultMap resultMap, ResultHandler
resultHandler, DefaultResultContext resultContext) throws SQLException {
+ final List<String> mappedColumnNames = new ArrayList<String>();
+ final List<String> unmappedColumnNames = new ArrayList<String>();
+ final ResultMap discriminatedResultMap = resolveDiscriminatedResultMap(rs,
resultMap);
+ final ResultLoaderRegistry lazyLoader = instantiateResultLoaderRegistry();
+ Object resultObject = createResultObject(rs, discriminatedResultMap,
lazyLoader);
+ if (!typeHandlerRegistry.hasTypeHandler(resultMap.getType())) {
+ final MetaObject metaObject = MetaObject.forObject(resultObject);
+ getMappedAndUnmappedColumnNames(rs, discriminatedResultMap,
mappedColumnNames, unmappedColumnNames);
+ applyPropertyMappings(rs, discriminatedResultMap, mappedColumnNames,
metaObject, lazyLoader);
+ applyAutomaticMappings(rs, unmappedColumnNames, metaObject);
+ resultObject = processNestedJoinResults(rs, resultMap, resultObject);
+ }
+ if (resultObject != NO_VALUE) {
resultContext.nextResultObject(resultObject);
resultHandler.handleResult(resultContext);
}
@@ -190,7 +197,9 @@
final String column = propertyMapping.getColumn();
final String property = propertyMapping.getProperty();
final Object value = typeHandler.getResult(rs, column);
- metaObject.setValue(property, value);
+ if (value != null) {
+ metaObject.setValue(property, value);
+ }
}
private void applyNestedQueryMapping(ResultSet rs, MetaObject
metaResultObject, ResultMap resultMap, ResultMapping propertyMapping,
ResultLoaderRegistry lazyLoader) throws SQLException {
@@ -214,9 +223,7 @@
}
}
}
- if (typeHandlerRegistry.hasTypeHandler(resultMap.getType())) {
- //resultObject = value;
- } else if (value != null) {
+ if (value != null) {
metaResultObject.setValue(property, value);
}
}
@@ -405,7 +412,7 @@
final Reference<Boolean> foundValues = new Reference(false);
final DefaultResultHandler defaultResultHandler = new
DefaultResultHandler();
- handleResultSet(rs, nestedResultMap, defaultResultHandler, new
RowLimit());
+ loadObject(rs, nestedResultMap, defaultResultHandler, new
DefaultResultContext());
final List nestedResults = defaultResultHandler.getResultList();
if (propertyValue != null && propertyValue instanceof Collection) {
@@ -416,7 +423,7 @@
if (nestedResults.size() == 1) {
final Object nestedResultObject = nestedResults.get(0);
metaObject.setValue(resultMapping.getProperty(),
nestedResultObject);
- } else {
+ } else if (nestedResults.size() > 1) {
throw new ExecutorException("Expected exactly 1 or 0 results for
'" + resultMapping.getProperty() + "', but found "+nestedResults.size()+".");
}
}
@@ -479,19 +486,42 @@
private void updateCacheKeyForComplexResultObject(ResultMap resultMap,
Object resultObject, CacheKey cacheKey) {
final MetaObject metaResultObject = MetaObject.forObject(resultObject);
- for (ResultMapping resultMapping : resultMap.getIdResultMappings()) {
+ final List<ResultMapping> idMappings = resultMap.getIdResultMappings();
+ if (idMappings.size() > 0) {
+ updateCacheKeyFromIDMappings(cacheKey, metaResultObject, idMappings);
+ } else {
+ updateCacheKeyFromAllAvailableProperties(cacheKey, metaResultObject);
+ }
+ }
+
+ private void updateCacheKeyFromIDMappings(CacheKey cacheKey, MetaObject
metaResultObject, List<ResultMapping> idMappings) {
+ for (ResultMapping resultMapping : idMappings) {
if (resultMapping.getNestedQueryId() == null &&
resultMapping.getNestedResultMapId() == null) {
- final String propName = resultMapping.getProperty();
- if (propName != null) {
- final Object value = metaResultObject.getValue(propName);
- if (value != null) {
- cacheKey.update(propName);
- cacheKey.update(value);
+ if (resultMapping.getProperty() != null) {
+ final String propName =
metaResultObject.findProperty(resultMapping.getProperty());
+ if (propName != null) {
+ final Object value = metaResultObject.getValue(propName);
+ if (value != null) {
+ cacheKey.update(propName);
+ cacheKey.update(value);
+ }
}
}
}
}
}
+ private void updateCacheKeyFromAllAvailableProperties(CacheKey cacheKey,
MetaObject metaResultObject) {
+ for (String propName : metaResultObject.getGetterNames()) {
+ if (propName != null) {
+ final Object value = metaResultObject.getValue(propName);
+ if (value != null) {
+ cacheKey.update(propName);
+ cacheKey.update(value);
+ }
+ }
+ }
+ }
+
}
Modified:
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/reflection/wrapper/MapWrapper.java
URL:
http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/reflection/wrapper/MapWrapper.java?rev=814470&r1=814469&r2=814470&view=diff
==============================================================================
---
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/reflection/wrapper/MapWrapper.java
(original)
+++
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/reflection/wrapper/MapWrapper.java
Mon Sep 14 04:05:16 2009
@@ -9,10 +9,13 @@
public class MapWrapper extends BaseWrapper {
private Map map;
+ private Object[] keyArray;
+
public MapWrapper(MetaObject metaObject, Map map) {
super(metaObject);
this.map = map;
+ updateKeyArray();
}
public Object get(PropertyTokenizer prop) {
@@ -31,9 +34,19 @@
} else {
map.put(prop.getName(), value);
}
+ updateKeyArray();
}
public String findProperty(String name) {
+ updateKeyArray();
+ final int index = Arrays.binarySearch(keyArray, name, new Comparator() {
+ public int compare(Object o1, Object o2) {
+ return
((String)o1).toLowerCase().compareTo(((String)o2).toLowerCase());
+ }
+ });
+ if (index > -1) {
+ return (String)keyArray[index];
+ }
return name;
}
@@ -108,4 +121,10 @@
set(prop, map);
return MetaObject.forObject(map);
}
+
+ private void updateKeyArray() {
+ keyArray = map.keySet().toArray();
+ Arrays.sort(keyArray);
+ }
+
}
Modified:
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/log4j.properties
URL:
http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/log4j.properties?rev=814470&r1=814469&r2=814470&view=diff
==============================================================================
--- ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/log4j.properties
(original)
+++ ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/log4j.properties Mon
Sep 14 04:05:16 2009
@@ -3,12 +3,8 @@
### Uncomment ALL for iBATIS logging
log4j.logger.org.apache.ibatis=DEBUG
-
log4j.logger.java.sql=DEBUG
-### For Testing
-log4j.logger.java.lang.Object=DEBUG
-
### Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
Modified:
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/executor/BaseExecutorTest.java
URL:
http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/executor/BaseExecutorTest.java?rev=814470&r1=814469&r2=814470&view=diff
==============================================================================
---
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/executor/BaseExecutorTest.java
(original)
+++
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/executor/BaseExecutorTest.java
Mon Sep 14 04:05:16 2009
@@ -2,6 +2,7 @@
import domain.blog.*;
import org.apache.ibatis.BaseDataTest;
+import org.apache.ibatis.logging.jdbc.ConnectionLogger;
import org.apache.ibatis.mapping.*;
import org.apache.ibatis.transaction.Transaction;
import org.apache.ibatis.transaction.jdbc.JdbcTransaction;
@@ -284,6 +285,7 @@
public void shouldFetchPostsForBlog() throws Exception {
DataSource ds = createBlogDataSource();
Connection connection = ds.getConnection();
+ connection = ConnectionLogger.newInstance(connection);
try {
Executor executor = createExecutor(new JdbcTransaction(connection,
false));
MappedStatement selectBlog =
ExecutorTestHelper.prepareComplexSelectBlogMappedStatement(config);