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


Reply via email to