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