Author: cbegin
Date: Tue Sep  8 02:23:53 2009
New Revision: 812321

URL: http://svn.apache.org/viewvc?rev=812321&view=rev
Log:
re-implemented nested query support
Introduced ExecutionPlaceholder enumeration
Ditched enhancementEnabled property
Improved base data test hierarchy

Added:
    
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/executor/ExecutionPlaceholder.java
Removed:
    
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/executor/SimpleExecutorTest.java
Modified:
    
ibatis/java/ibatis-3/trunk/ibatis-3-compat/src/main/java/com/ibatis/sqlmap/engine/builder/XmlSqlMapConfigParser.java
    
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/XMLConfigBuilder.java
    
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/executor/BaseExecutor.java
    
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java
    
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/mapping/Configuration.java
    
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/binding/IbatisConfig.java
    
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/builder/MapperConfig.xml
    
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-compat/src/main/java/com/ibatis/sqlmap/engine/builder/XmlSqlMapConfigParser.java
URL: 
http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-compat/src/main/java/com/ibatis/sqlmap/engine/builder/XmlSqlMapConfigParser.java?rev=812321&r1=812320&r2=812321&view=diff
==============================================================================
--- 
ibatis/java/ibatis-3/trunk/ibatis-3-compat/src/main/java/com/ibatis/sqlmap/engine/builder/XmlSqlMapConfigParser.java
 (original)
+++ 
ibatis/java/ibatis-3/trunk/ibatis-3-compat/src/main/java/com/ibatis/sqlmap/engine/builder/XmlSqlMapConfigParser.java
 Tue Sep  8 02:23:53 2009
@@ -98,9 +98,6 @@
     boolean lazyLoadingEnabled = 
context.getBooleanAttribute("lazyLoadingEnabled", true);
     config.setLazyLoadingEnabled(lazyLoadingEnabled);
 
-    boolean enhancementEnabled = 
context.getBooleanAttribute("enhancementEnabled", true);
-    config.setEnhancementEnabled(enhancementEnabled);
-
     boolean statementCachingEnabled = 
context.getBooleanAttribute("statementCachingEnabled", true);
     if (statementCachingEnabled) {
       config.setDefaultExecutorType(ExecutorType.REUSE);

Modified: 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/XMLConfigBuilder.java
URL: 
http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/XMLConfigBuilder.java?rev=812321&r1=812320&r2=812321&view=diff
==============================================================================
--- 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/XMLConfigBuilder.java
 (original)
+++ 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/XMLConfigBuilder.java
 Tue Sep  8 02:23:53 2009
@@ -138,10 +138,9 @@
         }
       }
       
configuration.setCacheEnabled(booleanValueOf(props.getProperty("cacheEnabled"), 
true));
-      
configuration.setLazyLoadingEnabled(booleanValueOf(props.getProperty("lazyLoadingEnabled"),
 true));
+      
configuration.setLazyLoadingEnabled(booleanValueOf(props.getProperty("lazyLoadingEnabled"),
 false));
       
configuration.setMultipleResultSetsEnabled(booleanValueOf(props.getProperty("multipleResultSetsEnabled"),
 true));
       
configuration.setUseColumnLabel(booleanValueOf(props.getProperty("useColumnLabel"),
 true));
-      
configuration.setEnhancementEnabled(booleanValueOf(props.getProperty("enhancementEnabled"),
 false));
       
configuration.setUseGeneratedKeys(booleanValueOf(props.getProperty("useGeneratedKeys"),
 false));
       
configuration.setDefaultExecutorType(ExecutorType.valueOf(stringValueOf(props.getProperty("defaultExecutorType"),
 "SIMPLE")));
       
configuration.setDefaultStatementTimeout(integerValueOf(props.getProperty("defaultStatementTimeout"),
 null));

Modified: 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/executor/BaseExecutor.java
URL: 
http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/executor/BaseExecutor.java?rev=812321&r1=812320&r2=812321&view=diff
==============================================================================
--- 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/executor/BaseExecutor.java
 (original)
+++ 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/executor/BaseExecutor.java
 Tue Sep  8 02:23:53 2009
@@ -7,14 +7,13 @@
 import org.apache.ibatis.reflection.MetaObject;
 import org.apache.ibatis.transaction.Transaction;
 import org.apache.ibatis.type.TypeHandlerRegistry;
+import static org.apache.ibatis.executor.ExecutionPlaceholder.*;
 
 import java.sql.*;
 import java.util.*;
 
 public abstract class BaseExecutor implements Executor {
 
-  private static final Object EXECUTION_PLACEHOLDER = new Object();
-
   protected Transaction transaction;
 
   protected List<DeferredLoad> deferredLoads;

Added: 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/executor/ExecutionPlaceholder.java
URL: 
http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/executor/ExecutionPlaceholder.java?rev=812321&view=auto
==============================================================================
--- 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/executor/ExecutionPlaceholder.java
 (added)
+++ 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/executor/ExecutionPlaceholder.java
 Tue Sep  8 02:23:53 2009
@@ -0,0 +1,5 @@
+package org.apache.ibatis.executor;
+
+public enum ExecutionPlaceholder {
+  EXECUTION_PLACEHOLDER
+}

Modified: 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java
URL: 
http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java?rev=812321&r1=812320&r2=812321&view=diff
==============================================================================
--- 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java
 (original)
+++ 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java
 Tue Sep  8 02:23:53 2009
@@ -130,7 +130,7 @@
     }
     Object resultObject = createResultObject(rs, rm);
     ResultLoaderRegistry lazyLoader = null;
-    if (this.mappedStatement.getConfiguration().isEnhancementEnabled()) {
+    if (this.mappedStatement.getConfiguration().isLazyLoadingEnabled()) {
       lazyLoader = new ResultLoaderRegistry();
       resultObject = ResultObjectProxy.createProxy(rm.getType(), resultObject, 
lazyLoader);
     }

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=812321&r1=812320&r2=812321&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
 Tue Sep  8 02:23:53 2009
@@ -6,10 +6,15 @@
 import org.apache.ibatis.reflection.factory.ObjectFactory;
 import org.apache.ibatis.reflection.MetaObject;
 import org.apache.ibatis.executor.ExecutorException;
+import org.apache.ibatis.executor.Executor;
+import org.apache.ibatis.executor.loader.ResultLoader;
+import org.apache.ibatis.executor.loader.ResultLoaderRegistry;
+import org.apache.ibatis.executor.loader.ResultObjectProxy;
 import org.apache.ibatis.executor.parameter.ParameterHandler;
 import org.apache.ibatis.executor.result.DefaultResultHandler;
 import org.apache.ibatis.executor.result.ResultHandler;
 import org.apache.ibatis.executor.result.DefaultResultContext;
+import org.apache.ibatis.cache.CacheKey;
 
 import java.util.List;
 import java.util.ArrayList;
@@ -19,6 +24,7 @@
 
 public class NewResultSetHandler implements ResultSetHandler {
 
+  private Executor executor;
   private final Configuration configuration;
   private final MappedStatement mappedStatement;
   private final RowLimit rowLimit;
@@ -28,7 +34,8 @@
   private final TypeHandlerRegistry typeHandlerRegistry;
   private final ObjectFactory objectFactory;
 
-  public NewResultSetHandler(MappedStatement mappedStatement, ParameterHandler 
parameterHandler, ResultHandler resultHandler, BoundSql boundSql, int offset, 
int limit) {
+  public NewResultSetHandler(Executor executor, MappedStatement 
mappedStatement, ParameterHandler parameterHandler, ResultHandler 
resultHandler, BoundSql boundSql, int offset, int limit) {
+    this.executor = executor;
     this.configuration = mappedStatement.getConfiguration();
     this.mappedStatement = mappedStatement;
     this.rowLimit = new RowLimit(offset, limit);
@@ -112,10 +119,11 @@
     skipRows(rs, rowLimit);
     while (shouldProcessMoreRows(rs, resultContext.getResultCount(), 
rowLimit)) {
       final ResultMap discriminatedResultMap = 
resolveDiscriminatedResultMap(rs, resultMap);
-      final Object resultObject = createResultObject(rs, 
discriminatedResultMap );
+      final ResultLoaderRegistry lazyLoader = new ResultLoaderRegistry();
+      final Object resultObject = createResultObject(rs, 
discriminatedResultMap, lazyLoader);
       final MetaObject metaObject = MetaObject.forObject(resultObject);
       getMappedAndUnmappedColumnNames(rs, discriminatedResultMap, 
mappedColumnNames, unmappedColumnNames);
-      applyPropertyMappings(rs, discriminatedResultMap , mappedColumnNames, 
metaObject);
+      applyPropertyMappings(rs, discriminatedResultMap , mappedColumnNames, 
metaObject, lazyLoader);
       applyAutomaticMappings(rs, unmappedColumnNames, metaObject);
       resultContext.nextResultObject(resultObject);
       resultHandler.handleResult(resultContext);
@@ -153,21 +161,55 @@
   // PROPERTY MAPPINGS
   //
 
-  private void applyPropertyMappings(ResultSet rs, ResultMap resultMap, 
List<String> mappedColumnNames, MetaObject metaObject) throws SQLException {
+  private void applyPropertyMappings(ResultSet rs, ResultMap resultMap, 
List<String> mappedColumnNames, MetaObject metaObject, ResultLoaderRegistry 
lazyLoader) throws SQLException {
     final List<ResultMapping> propertyMappings = 
resultMap.getPropertyResultMappings();
     for (ResultMapping propertyMapping : propertyMappings) {
-      final TypeHandler typeHandler = propertyMapping.getTypeHandler();
-      if (propertyMapping.getNestedQueryId() != null) {
+      final String column = propertyMapping.getColumn();
+      if (column != null && mappedColumnNames.contains(column.toUpperCase())) {
+        final TypeHandler typeHandler = propertyMapping.getTypeHandler();
+        if (propertyMapping.getNestedQueryId() != null) {
+          applyNestedQueryMapping(rs, metaObject, resultMap, propertyMapping, 
lazyLoader);
+        } else if (typeHandler != null) {
+          applySimplePropertyMapping(rs, metaObject, propertyMapping);
+        }
+      }
+    }
+  }
 
-      } else if (typeHandler != null) {
-        final String property = propertyMapping.getProperty();
-        final String column = propertyMapping.getColumn();
-        if (mappedColumnNames.contains(column.toUpperCase())) {
-          final Object value = typeHandler.getResult(rs, column);
-          metaObject.setValue(property, value);
+  private void applySimplePropertyMapping(ResultSet rs, MetaObject metaObject, 
ResultMapping propertyMapping) throws SQLException {
+    final TypeHandler typeHandler = propertyMapping.getTypeHandler();
+    final String column = propertyMapping.getColumn();
+    final String property = propertyMapping.getProperty();
+    final Object value = typeHandler.getResult(rs, column);
+    metaObject.setValue(property, value);
+  }
+
+  private void applyNestedQueryMapping(ResultSet rs, MetaObject 
metaResultObject, ResultMap resultMap, ResultMapping propertyMapping, 
ResultLoaderRegistry lazyLoader) throws SQLException {
+    final String nestedQueryId = propertyMapping.getNestedQueryId();
+    final String property = propertyMapping.getProperty();
+    final MappedStatement nestedQuery = 
configuration.getMappedStatement(nestedQueryId);
+    final Class nestedQueryParameterType = 
nestedQuery.getParameterMap().getType();
+    final Object nestedQueryParameterObject = 
prepareParameterForNestedQuery(rs, propertyMapping, nestedQueryParameterType);
+
+    Object value = null;
+    if (nestedQueryParameterObject != null) {
+      final CacheKey key = executor.createCacheKey(nestedQuery, 
nestedQueryParameterObject, RowLimit.NO_ROW_OFFSET, RowLimit.NO_ROW_LIMIT);
+      if (executor.isCached(nestedQuery, key)) {
+        executor.deferLoad(nestedQuery, metaResultObject, property, key);
+      } else {
+        final ResultLoader resultLoader = new ResultLoader(configuration, 
executor, nestedQuery, nestedQueryParameterObject, 
propertyMapping.getJavaType());
+        if (configuration.isLazyLoadingEnabled()) {
+          lazyLoader.registerLoader(property, metaResultObject, resultLoader);
+        } else {
+          value = resultLoader.loadResult();
         }
       }
     }
+    if (typeHandlerRegistry.hasTypeHandler(resultMap.getType())) {
+      //resultObject = value;
+    } else if (value != null) {
+      metaResultObject.setValue(property, value);
+    }
   }
 
   private void applyAutomaticMappings(ResultSet rs, List<String> 
unmappedColumnNames, MetaObject metaObject) throws SQLException {
@@ -205,6 +247,14 @@
   // INSTANTIATION & CONSTRUCTOR MAPPING
   //
 
+  private Object createResultObject(ResultSet rs, ResultMap resultMap, 
ResultLoaderRegistry lazyLoader) throws SQLException {
+    final Object resultObject = createResultObject(rs, resultMap);
+    if (configuration.isLazyLoadingEnabled()) {
+      return ResultObjectProxy.createProxy(resultMap.getType(), resultObject, 
lazyLoader);
+    }
+    return resultObject;
+  }
+
   private Object createResultObject(ResultSet rs, ResultMap resultMap) throws 
SQLException {
     final Class resultType = resultMap.getType();
     final List<ResultMapping> constructorMappings = 
resultMap.getConstructorResultMappings();

Modified: 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/mapping/Configuration.java
URL: 
http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/mapping/Configuration.java?rev=812321&r1=812320&r2=812321&view=diff
==============================================================================
--- 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/mapping/Configuration.java
 (original)
+++ 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/mapping/Configuration.java
 Tue Sep  8 02:23:53 2009
@@ -29,7 +29,6 @@
   private Environment environment;
 
   private boolean lazyLoadingEnabled = true;
-  private boolean enhancementEnabled = false;
   private boolean multipleResultSetsEnabled = true;
   private boolean useGeneratedKeys = false;
   private boolean useColumnLabel = true;
@@ -95,14 +94,6 @@
     this.lazyLoadingEnabled = lazyLoadingEnabled;
   }
 
-  public boolean isEnhancementEnabled() {
-    return enhancementEnabled;
-  }
-
-  public void setEnhancementEnabled(boolean enhancementEnabled) {
-    this.enhancementEnabled = enhancementEnabled;
-  }
-
   public boolean isMultipleResultSetsEnabled() {
     return multipleResultSetsEnabled;
   }
@@ -182,7 +173,7 @@
   }
 
   public ResultSetHandler newResultSetHandler(Executor executor, 
MappedStatement mappedStatement, int rowOffset, int rowLimit, ParameterHandler 
parameterHandler, ResultHandler resultHandler, BoundSql boundSql) {
-    ResultSetHandler resultSetHandler = new DefaultResultSetHandler(this, 
executor, mappedStatement, parameterHandler, rowOffset, rowLimit, 
resultHandler, boundSql);
+    ResultSetHandler resultSetHandler = new NewResultSetHandler(executor, 
mappedStatement, parameterHandler, resultHandler, boundSql, rowOffset, 
rowLimit);
     resultSetHandler = (ResultSetHandler) 
interceptorChain.pluginAll(resultSetHandler);
     return resultSetHandler;
   }

Modified: 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/binding/IbatisConfig.java
URL: 
http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/binding/IbatisConfig.java?rev=812321&r1=812320&r2=812321&view=diff
==============================================================================
--- 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/binding/IbatisConfig.java
 (original)
+++ 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/binding/IbatisConfig.java
 Tue Sep  8 02:23:53 2009
@@ -23,7 +23,6 @@
       Environment environment = new Environment("Production", 
transactionFactory, dataSource);
       Configuration configuration = new Configuration(environment);
       configuration.setLazyLoadingEnabled(true);
-      configuration.setEnhancementEnabled(true);
       configuration.getTypeAliasRegistry().registerAlias(Blog.class);
       configuration.getTypeAliasRegistry().registerAlias(Post.class);
       configuration.getTypeAliasRegistry().registerAlias(Author.class);

Modified: 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/builder/MapperConfig.xml
URL: 
http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/builder/MapperConfig.xml?rev=812321&r1=812320&r2=812321&view=diff
==============================================================================
--- 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/builder/MapperConfig.xml
 (original)
+++ 
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/builder/MapperConfig.xml
 Tue Sep  8 02:23:53 2009
@@ -12,11 +12,10 @@
 
   <settings>
     <setting name="cacheEnabled" value="true"/>
-    <setting name="lazyLoadingEnabled" value="true"/>
+    <setting name="lazyLoadingEnabled" value="false"/>
     <setting name="multipleResultSetsEnabled" value="true"/>
     <setting name="useColumnLabel" value="true"/>
     <setting name="useGeneratedKeys" value="false"/>
-    <setting name="enhancementEnabled" value="false"/>
     <setting name="defaultExecutorType" value="SIMPLE"/>
     <setting name="defaultStatementTimeout" value="25000"/>
   </settings>

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=812321&r1=812320&r2=812321&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
 Tue Sep  8 02:23:53 2009
@@ -13,12 +13,11 @@
 import java.sql.Connection;
 import java.util.*;
 
-public abstract class BaseExecutorTest extends BaseDataTest {
+public class BaseExecutorTest extends BaseDataTest {
   private final Configuration config;
 
-  protected BaseExecutorTest() {
+  public BaseExecutorTest() {
     config = new Configuration();
-    config.setEnhancementEnabled(true);
     config.setLazyLoadingEnabled(true);
     config.setUseGeneratedKeys(false);
     config.setMultipleResultSetsEnabled(true);
@@ -359,7 +358,7 @@
       MappedStatement selectPosts = 
ExecutorTestHelper.prepareSelectPostsForBlogMappedStatement(config);
       config.addMappedStatement(selectBlog);
       config.addMappedStatement(selectPosts);
-      config.setLazyLoadingEnabled(false);
+      config.setLazyLoadingEnabled(true);
       List<Blog> blogs = executor.query(selectBlog, 1, Executor.NO_ROW_OFFSET, 
Executor.NO_ROW_LIMIT, Executor.NO_RESULT_HANDLER);
       executor.flushStatements();
       assertEquals(1, blogs.size());
@@ -393,6 +392,8 @@
     }
   }
 
-  protected abstract Executor createExecutor(Transaction transaction);
+  protected Executor createExecutor(Transaction transaction) {
+    return new SimpleExecutor(transaction);
+  }
 
 }


Reply via email to