Class DefaultResultSetHandler
- java.lang.Object
-
- org.apache.ibatis.executor.resultset.DefaultResultSetHandler
-
- All Implemented Interfaces:
ResultSetHandler
public class DefaultResultSetHandler extends java.lang.Object implements ResultSetHandler
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static class
DefaultResultSetHandler.PendingRelation
private static class
DefaultResultSetHandler.UnMappedColumnAutoMapping
-
Field Summary
Fields Modifier and Type Field Description private java.util.Map<java.lang.String,java.lang.Object>
ancestorObjects
private java.util.Map<java.lang.String,java.util.List<DefaultResultSetHandler.UnMappedColumnAutoMapping>>
autoMappingsCache
private BoundSql
boundSql
private Configuration
configuration
private static java.lang.Object
DEFERRED
private Executor
executor
private MappedStatement
mappedStatement
private java.util.Map<CacheKey,java.lang.Object>
nestedResultObjects
private java.util.Map<java.lang.String,ResultMapping>
nextResultMaps
private ObjectFactory
objectFactory
private ParameterHandler
parameterHandler
private java.util.Map<CacheKey,java.util.List<DefaultResultSetHandler.PendingRelation>>
pendingRelations
private java.lang.Object
previousRowValue
private ReflectorFactory
reflectorFactory
private ResultHandler<?>
resultHandler
private RowBounds
rowBounds
private TypeHandlerRegistry
typeHandlerRegistry
private boolean
useConstructorMappings
-
Constructor Summary
Constructors Constructor Description DefaultResultSetHandler(Executor executor, MappedStatement mappedStatement, ParameterHandler parameterHandler, ResultHandler<?> resultHandler, BoundSql boundSql, RowBounds rowBounds)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description private void
addPendingChildRelation(java.sql.ResultSet rs, MetaObject metaResultObject, ResultMapping parentMapping)
private boolean
allowedConstructorUsingTypeHandlers(java.lang.reflect.Constructor<?> constructor, java.util.List<JdbcType> jdbcTypes)
private boolean
anyNotNullColumnHasValue(ResultMapping resultMapping, java.lang.String columnPrefix, ResultSetWrapper rsw)
private boolean
applyAutomaticMappings(ResultSetWrapper rsw, ResultMap resultMap, MetaObject metaObject, java.lang.String columnPrefix)
private boolean
applyNestedResultMappings(ResultSetWrapper rsw, ResultMap resultMap, MetaObject metaObject, java.lang.String parentPrefix, CacheKey parentRowKey, boolean newObject)
private boolean
applyPropertyMappings(ResultSetWrapper rsw, ResultMap resultMap, MetaObject metaObject, ResultLoaderMap lazyLoader, java.lang.String columnPrefix)
private void
callResultHandler(ResultHandler<?> resultHandler, DefaultResultContext<java.lang.Object> resultContext, java.lang.Object rowValue)
protected void
checkResultHandler()
private void
cleanUpAfterHandlingResultSet()
private void
closeResultSet(java.sql.ResultSet rs)
private java.util.List<java.lang.Object>
collapseSingleResultList(java.util.List<java.lang.Object> multipleResults)
private CacheKey
combineKeys(CacheKey rowKey, CacheKey parentRowKey)
private java.util.List<DefaultResultSetHandler.UnMappedColumnAutoMapping>
createAutomaticMappings(ResultSetWrapper rsw, ResultMap resultMap, MetaObject metaObject, java.lang.String columnPrefix)
private java.lang.Object
createByConstructorSignature(ResultSetWrapper rsw, java.lang.Class<?> resultType, java.util.List<java.lang.Class<?>> constructorArgTypes, java.util.List<java.lang.Object> constructorArgs)
private CacheKey
createKeyForMultipleResults(java.sql.ResultSet rs, ResultMapping resultMapping, java.lang.String names, java.lang.String columns)
(package private) java.lang.Object
createParameterizedResultObject(ResultSetWrapper rsw, java.lang.Class<?> resultType, java.util.List<ResultMapping> constructorMappings, java.util.List<java.lang.Class<?>> constructorArgTypes, java.util.List<java.lang.Object> constructorArgs, java.lang.String columnPrefix)
private java.lang.Object
createPrimitiveResultObject(ResultSetWrapper rsw, ResultMap resultMap, java.lang.String columnPrefix)
private java.lang.Object
createResultObject(ResultSetWrapper rsw, ResultMap resultMap, java.util.List<java.lang.Class<?>> constructorArgTypes, java.util.List<java.lang.Object> constructorArgs, java.lang.String columnPrefix)
private java.lang.Object
createResultObject(ResultSetWrapper rsw, ResultMap resultMap, ResultLoaderMap lazyLoader, java.lang.String columnPrefix)
private CacheKey
createRowKey(ResultMap resultMap, ResultSetWrapper rsw, java.lang.String columnPrefix)
private void
createRowKeyForMap(ResultSetWrapper rsw, CacheKey cacheKey)
private void
createRowKeyForMappedProperties(ResultMap resultMap, ResultSetWrapper rsw, CacheKey cacheKey, java.util.List<ResultMapping> resultMappings, java.lang.String columnPrefix)
private void
createRowKeyForUnmappedProperties(ResultMap resultMap, ResultSetWrapper rsw, CacheKey cacheKey, java.lang.String columnPrefix)
private java.lang.Object
createUsingConstructor(ResultSetWrapper rsw, java.lang.Class<?> resultType, java.util.List<java.lang.Class<?>> constructorArgTypes, java.util.List<java.lang.Object> constructorArgs, java.lang.reflect.Constructor<?> constructor)
private void
ensureNoRowBounds()
private java.lang.reflect.Constructor<?>
findDefaultConstructor(java.lang.reflect.Constructor<?>[] constructors)
private java.lang.String
getColumnPrefix(java.lang.String parentPrefix, ResultMapping resultMapping)
private java.lang.Object
getDiscriminatorValue(java.sql.ResultSet rs, Discriminator discriminator, java.lang.String columnPrefix)
private ResultSetWrapper
getFirstResultSet(java.sql.Statement stmt)
private java.lang.Object
getNestedQueryConstructorValue(java.sql.ResultSet rs, ResultMapping constructorMapping, java.lang.String columnPrefix)
private java.lang.Object
getNestedQueryMappingValue(java.sql.ResultSet rs, MetaObject metaResultObject, ResultMapping propertyMapping, ResultLoaderMap lazyLoader, java.lang.String columnPrefix)
private ResultMap
getNestedResultMap(java.sql.ResultSet rs, java.lang.String nestedResultMapId, java.lang.String columnPrefix)
private ResultSetWrapper
getNextResultSet(java.sql.Statement stmt)
private java.lang.Object
getPropertyMappingValue(java.sql.ResultSet rs, MetaObject metaResultObject, ResultMapping propertyMapping, ResultLoaderMap lazyLoader, java.lang.String columnPrefix)
private java.util.List<ResultMapping>
getResultMappingsForRowKey(ResultMap resultMap)
private java.lang.Object
getRowValue(ResultSetWrapper rsw, ResultMap resultMap, java.lang.String columnPrefix)
private java.lang.Object
getRowValue(ResultSetWrapper rsw, ResultMap resultMap, CacheKey combinedKey, java.lang.String columnPrefix, java.lang.Object partialObject)
<E> Cursor<E>
handleCursorResultSets(java.sql.Statement stmt)
void
handleOutputParameters(java.sql.CallableStatement cs)
private void
handleRefCursorOutputParameter(java.sql.ResultSet rs, ParameterMapping parameterMapping, MetaObject metaParam)
private void
handleResultSet(ResultSetWrapper rsw, ResultMap resultMap, java.util.List<java.lang.Object> multipleResults, ResultMapping parentMapping)
java.util.List<java.lang.Object>
handleResultSets(java.sql.Statement stmt)
void
handleRowValues(ResultSetWrapper rsw, ResultMap resultMap, ResultHandler<?> resultHandler, RowBounds rowBounds, ResultMapping parentMapping)
private void
handleRowValuesForNestedResultMap(ResultSetWrapper rsw, ResultMap resultMap, ResultHandler<?> resultHandler, RowBounds rowBounds, ResultMapping parentMapping)
private void
handleRowValuesForSimpleResultMap(ResultSetWrapper rsw, ResultMap resultMap, ResultHandler<?> resultHandler, RowBounds rowBounds, ResultMapping parentMapping)
private boolean
hasTypeHandlerForResultObject(ResultSetWrapper rsw, java.lang.Class<?> resultType)
private java.lang.Object
instantiateCollectionPropertyIfAppropriate(ResultMapping resultMapping, MetaObject metaObject)
private java.lang.Object
instantiateParameterObject(java.lang.Class<?> parameterType)
private void
linkObjects(MetaObject metaObject, ResultMapping resultMapping, java.lang.Object rowValue)
private void
linkToParents(java.sql.ResultSet rs, ResultMapping parentMapping, java.lang.Object rowValue)
private java.lang.Object
prepareCompositeKeyParameter(java.sql.ResultSet rs, ResultMapping resultMapping, java.lang.Class<?> parameterType, java.lang.String columnPrefix)
private java.lang.Object
prepareParameterForNestedQuery(java.sql.ResultSet rs, ResultMapping resultMapping, java.lang.Class<?> parameterType, java.lang.String columnPrefix)
private java.lang.Object
prepareSimpleKeyParameter(java.sql.ResultSet rs, ResultMapping resultMapping, java.lang.Class<?> parameterType, java.lang.String columnPrefix)
private java.lang.String
prependPrefix(java.lang.String columnName, java.lang.String prefix)
private void
putAncestor(java.lang.Object resultObject, java.lang.String resultMapId)
ResultMap
resolveDiscriminatedResultMap(java.sql.ResultSet rs, ResultMap resultMap, java.lang.String columnPrefix)
private boolean
shouldApplyAutomaticMappings(ResultMap resultMap, boolean isNested)
private boolean
shouldProcessMoreRows(ResultContext<?> context, RowBounds rowBounds)
private void
skipRows(java.sql.ResultSet rs, RowBounds rowBounds)
private void
storeObject(ResultHandler<?> resultHandler, DefaultResultContext<java.lang.Object> resultContext, java.lang.Object rowValue, ResultMapping parentMapping, java.sql.ResultSet rs)
private void
validateResultMapsCount(ResultSetWrapper rsw, int resultMapCount)
-
-
-
Field Detail
-
DEFERRED
private static final java.lang.Object DEFERRED
-
executor
private final Executor executor
-
configuration
private final Configuration configuration
-
mappedStatement
private final MappedStatement mappedStatement
-
rowBounds
private final RowBounds rowBounds
-
parameterHandler
private final ParameterHandler parameterHandler
-
resultHandler
private final ResultHandler<?> resultHandler
-
boundSql
private final BoundSql boundSql
-
typeHandlerRegistry
private final TypeHandlerRegistry typeHandlerRegistry
-
objectFactory
private final ObjectFactory objectFactory
-
reflectorFactory
private final ReflectorFactory reflectorFactory
-
nestedResultObjects
private final java.util.Map<CacheKey,java.lang.Object> nestedResultObjects
-
ancestorObjects
private final java.util.Map<java.lang.String,java.lang.Object> ancestorObjects
-
previousRowValue
private java.lang.Object previousRowValue
-
nextResultMaps
private final java.util.Map<java.lang.String,ResultMapping> nextResultMaps
-
pendingRelations
private final java.util.Map<CacheKey,java.util.List<DefaultResultSetHandler.PendingRelation>> pendingRelations
-
autoMappingsCache
private final java.util.Map<java.lang.String,java.util.List<DefaultResultSetHandler.UnMappedColumnAutoMapping>> autoMappingsCache
-
useConstructorMappings
private boolean useConstructorMappings
-
-
Constructor Detail
-
DefaultResultSetHandler
public DefaultResultSetHandler(Executor executor, MappedStatement mappedStatement, ParameterHandler parameterHandler, ResultHandler<?> resultHandler, BoundSql boundSql, RowBounds rowBounds)
-
-
Method Detail
-
handleOutputParameters
public void handleOutputParameters(java.sql.CallableStatement cs) throws java.sql.SQLException
- Specified by:
handleOutputParameters
in interfaceResultSetHandler
- Throws:
java.sql.SQLException
-
handleRefCursorOutputParameter
private void handleRefCursorOutputParameter(java.sql.ResultSet rs, ParameterMapping parameterMapping, MetaObject metaParam) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
handleResultSets
public java.util.List<java.lang.Object> handleResultSets(java.sql.Statement stmt) throws java.sql.SQLException
- Specified by:
handleResultSets
in interfaceResultSetHandler
- Throws:
java.sql.SQLException
-
handleCursorResultSets
public <E> Cursor<E> handleCursorResultSets(java.sql.Statement stmt) throws java.sql.SQLException
- Specified by:
handleCursorResultSets
in interfaceResultSetHandler
- Throws:
java.sql.SQLException
-
getFirstResultSet
private ResultSetWrapper getFirstResultSet(java.sql.Statement stmt) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
getNextResultSet
private ResultSetWrapper getNextResultSet(java.sql.Statement stmt)
-
closeResultSet
private void closeResultSet(java.sql.ResultSet rs)
-
cleanUpAfterHandlingResultSet
private void cleanUpAfterHandlingResultSet()
-
validateResultMapsCount
private void validateResultMapsCount(ResultSetWrapper rsw, int resultMapCount)
-
handleResultSet
private void handleResultSet(ResultSetWrapper rsw, ResultMap resultMap, java.util.List<java.lang.Object> multipleResults, ResultMapping parentMapping) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
collapseSingleResultList
private java.util.List<java.lang.Object> collapseSingleResultList(java.util.List<java.lang.Object> multipleResults)
-
handleRowValues
public void handleRowValues(ResultSetWrapper rsw, ResultMap resultMap, ResultHandler<?> resultHandler, RowBounds rowBounds, ResultMapping parentMapping) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
ensureNoRowBounds
private void ensureNoRowBounds()
-
checkResultHandler
protected void checkResultHandler()
-
handleRowValuesForSimpleResultMap
private void handleRowValuesForSimpleResultMap(ResultSetWrapper rsw, ResultMap resultMap, ResultHandler<?> resultHandler, RowBounds rowBounds, ResultMapping parentMapping) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
storeObject
private void storeObject(ResultHandler<?> resultHandler, DefaultResultContext<java.lang.Object> resultContext, java.lang.Object rowValue, ResultMapping parentMapping, java.sql.ResultSet rs) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
callResultHandler
private void callResultHandler(ResultHandler<?> resultHandler, DefaultResultContext<java.lang.Object> resultContext, java.lang.Object rowValue)
-
shouldProcessMoreRows
private boolean shouldProcessMoreRows(ResultContext<?> context, RowBounds rowBounds)
-
skipRows
private void skipRows(java.sql.ResultSet rs, RowBounds rowBounds) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
getRowValue
private java.lang.Object getRowValue(ResultSetWrapper rsw, ResultMap resultMap, java.lang.String columnPrefix) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
getRowValue
private java.lang.Object getRowValue(ResultSetWrapper rsw, ResultMap resultMap, CacheKey combinedKey, java.lang.String columnPrefix, java.lang.Object partialObject) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
putAncestor
private void putAncestor(java.lang.Object resultObject, java.lang.String resultMapId)
-
shouldApplyAutomaticMappings
private boolean shouldApplyAutomaticMappings(ResultMap resultMap, boolean isNested)
-
applyPropertyMappings
private boolean applyPropertyMappings(ResultSetWrapper rsw, ResultMap resultMap, MetaObject metaObject, ResultLoaderMap lazyLoader, java.lang.String columnPrefix) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
getPropertyMappingValue
private java.lang.Object getPropertyMappingValue(java.sql.ResultSet rs, MetaObject metaResultObject, ResultMapping propertyMapping, ResultLoaderMap lazyLoader, java.lang.String columnPrefix) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
createAutomaticMappings
private java.util.List<DefaultResultSetHandler.UnMappedColumnAutoMapping> createAutomaticMappings(ResultSetWrapper rsw, ResultMap resultMap, MetaObject metaObject, java.lang.String columnPrefix) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
applyAutomaticMappings
private boolean applyAutomaticMappings(ResultSetWrapper rsw, ResultMap resultMap, MetaObject metaObject, java.lang.String columnPrefix) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
linkToParents
private void linkToParents(java.sql.ResultSet rs, ResultMapping parentMapping, java.lang.Object rowValue) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
addPendingChildRelation
private void addPendingChildRelation(java.sql.ResultSet rs, MetaObject metaResultObject, ResultMapping parentMapping) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
createKeyForMultipleResults
private CacheKey createKeyForMultipleResults(java.sql.ResultSet rs, ResultMapping resultMapping, java.lang.String names, java.lang.String columns) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
createResultObject
private java.lang.Object createResultObject(ResultSetWrapper rsw, ResultMap resultMap, ResultLoaderMap lazyLoader, java.lang.String columnPrefix) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
createResultObject
private java.lang.Object createResultObject(ResultSetWrapper rsw, ResultMap resultMap, java.util.List<java.lang.Class<?>> constructorArgTypes, java.util.List<java.lang.Object> constructorArgs, java.lang.String columnPrefix) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
createParameterizedResultObject
java.lang.Object createParameterizedResultObject(ResultSetWrapper rsw, java.lang.Class<?> resultType, java.util.List<ResultMapping> constructorMappings, java.util.List<java.lang.Class<?>> constructorArgTypes, java.util.List<java.lang.Object> constructorArgs, java.lang.String columnPrefix)
-
createByConstructorSignature
private java.lang.Object createByConstructorSignature(ResultSetWrapper rsw, java.lang.Class<?> resultType, java.util.List<java.lang.Class<?>> constructorArgTypes, java.util.List<java.lang.Object> constructorArgs) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
createUsingConstructor
private java.lang.Object createUsingConstructor(ResultSetWrapper rsw, java.lang.Class<?> resultType, java.util.List<java.lang.Class<?>> constructorArgTypes, java.util.List<java.lang.Object> constructorArgs, java.lang.reflect.Constructor<?> constructor) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
findDefaultConstructor
private java.lang.reflect.Constructor<?> findDefaultConstructor(java.lang.reflect.Constructor<?>[] constructors)
-
allowedConstructorUsingTypeHandlers
private boolean allowedConstructorUsingTypeHandlers(java.lang.reflect.Constructor<?> constructor, java.util.List<JdbcType> jdbcTypes)
-
createPrimitiveResultObject
private java.lang.Object createPrimitiveResultObject(ResultSetWrapper rsw, ResultMap resultMap, java.lang.String columnPrefix) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
getNestedQueryConstructorValue
private java.lang.Object getNestedQueryConstructorValue(java.sql.ResultSet rs, ResultMapping constructorMapping, java.lang.String columnPrefix) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
getNestedQueryMappingValue
private java.lang.Object getNestedQueryMappingValue(java.sql.ResultSet rs, MetaObject metaResultObject, ResultMapping propertyMapping, ResultLoaderMap lazyLoader, java.lang.String columnPrefix) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
prepareParameterForNestedQuery
private java.lang.Object prepareParameterForNestedQuery(java.sql.ResultSet rs, ResultMapping resultMapping, java.lang.Class<?> parameterType, java.lang.String columnPrefix) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
prepareSimpleKeyParameter
private java.lang.Object prepareSimpleKeyParameter(java.sql.ResultSet rs, ResultMapping resultMapping, java.lang.Class<?> parameterType, java.lang.String columnPrefix) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
prepareCompositeKeyParameter
private java.lang.Object prepareCompositeKeyParameter(java.sql.ResultSet rs, ResultMapping resultMapping, java.lang.Class<?> parameterType, java.lang.String columnPrefix) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
instantiateParameterObject
private java.lang.Object instantiateParameterObject(java.lang.Class<?> parameterType)
-
resolveDiscriminatedResultMap
public ResultMap resolveDiscriminatedResultMap(java.sql.ResultSet rs, ResultMap resultMap, java.lang.String columnPrefix) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
getDiscriminatorValue
private java.lang.Object getDiscriminatorValue(java.sql.ResultSet rs, Discriminator discriminator, java.lang.String columnPrefix) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
prependPrefix
private java.lang.String prependPrefix(java.lang.String columnName, java.lang.String prefix)
-
handleRowValuesForNestedResultMap
private void handleRowValuesForNestedResultMap(ResultSetWrapper rsw, ResultMap resultMap, ResultHandler<?> resultHandler, RowBounds rowBounds, ResultMapping parentMapping) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
applyNestedResultMappings
private boolean applyNestedResultMappings(ResultSetWrapper rsw, ResultMap resultMap, MetaObject metaObject, java.lang.String parentPrefix, CacheKey parentRowKey, boolean newObject)
-
getColumnPrefix
private java.lang.String getColumnPrefix(java.lang.String parentPrefix, ResultMapping resultMapping)
-
anyNotNullColumnHasValue
private boolean anyNotNullColumnHasValue(ResultMapping resultMapping, java.lang.String columnPrefix, ResultSetWrapper rsw) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
getNestedResultMap
private ResultMap getNestedResultMap(java.sql.ResultSet rs, java.lang.String nestedResultMapId, java.lang.String columnPrefix) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
createRowKey
private CacheKey createRowKey(ResultMap resultMap, ResultSetWrapper rsw, java.lang.String columnPrefix) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
getResultMappingsForRowKey
private java.util.List<ResultMapping> getResultMappingsForRowKey(ResultMap resultMap)
-
createRowKeyForMappedProperties
private void createRowKeyForMappedProperties(ResultMap resultMap, ResultSetWrapper rsw, CacheKey cacheKey, java.util.List<ResultMapping> resultMappings, java.lang.String columnPrefix) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
createRowKeyForUnmappedProperties
private void createRowKeyForUnmappedProperties(ResultMap resultMap, ResultSetWrapper rsw, CacheKey cacheKey, java.lang.String columnPrefix) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
createRowKeyForMap
private void createRowKeyForMap(ResultSetWrapper rsw, CacheKey cacheKey) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
linkObjects
private void linkObjects(MetaObject metaObject, ResultMapping resultMapping, java.lang.Object rowValue)
-
instantiateCollectionPropertyIfAppropriate
private java.lang.Object instantiateCollectionPropertyIfAppropriate(ResultMapping resultMapping, MetaObject metaObject)
-
hasTypeHandlerForResultObject
private boolean hasTypeHandlerForResultObject(ResultSetWrapper rsw, java.lang.Class<?> resultType)
-
-