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