Author: andrey
Date: Mon May 25 07:05:27 2009
New Revision: 778311
URL: http://svn.apache.org/viewvc?rev=778311&view=rev
Log:
CAY-1225 Controlling JDBC Driver setting "fetchSize" in a SelectQuery
Added:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/StatementFetchSizeTest.java
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomainQuery.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/ObjectStore.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLAction.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/ProcedureAction.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/trans/QueryAssembler.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/cache/NestedQueryCache.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/BaseQueryMetadata.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/DefaultQueryMetadata.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/EJBQLQuery.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/ProcedureQuery.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/QueryMetadata.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/QueryMetadataWrapper.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/SQLTemplate.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/SelectQuery.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/remote/IncrementalQuery.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/remote/IncrementalSelectQuery.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/remote/RangeQuery.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/map/SQLTemplateBuilderTest.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/map/SelectQueryBuilderTest.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/MockQueryMetadata.java
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomainQuery.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomainQuery.java?rev=778311&r1=778310&r2=778311&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomainQuery.java
(original)
+++
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomainQuery.java
Mon May 25 07:05:27 2009
@@ -81,6 +81,7 @@
/**
* @deprecated since 3.0 in favor of 'getCacheStrategy'.
*/
+ @Deprecated
public String getCachePolicy() {
return null;
}
@@ -108,6 +109,7 @@
/**
* @deprecated since 3.0
*/
+ @Deprecated
public int getFetchStartIndex() {
return getFetchOffset();
}
@@ -144,4 +146,8 @@
public boolean isResolvingInherited() {
return false;
}
+
+ public int getStatementFetchSize() {
+ return 0;
+ }
}
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/ObjectStore.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/ObjectStore.java?rev=778311&r1=778310&r2=778311&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/ObjectStore.java
(original)
+++
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/ObjectStore.java
Mon May 25 07:05:27 2009
@@ -248,6 +248,7 @@
* @since 1.2
* @deprecated since 3.0. See {...@link DataContext#getQueryCache()}.
*/
+ @Deprecated
public int cachedQueriesCount() {
return context != null && context.getQueryCache() != null ? context
.getQueryCache()
@@ -319,6 +320,7 @@
* @deprecated since 3.0, use {...@link
DataContext#invalidateObjects(Collection)} or
* {...@link RefreshQuery}.
*/
+ @Deprecated
public synchronized void objectsInvalidated(Collection objects) {
if (context != null) {
context.invalidateObjects(objects);
@@ -426,6 +428,7 @@
* @since 1.1
* @deprecated since 3.0 unused
*/
+ @Deprecated
public void snapshotsUpdatedForObjects(List objects, List snapshots,
boolean refresh) {
DataRowStore cache = getDataRowCache();
if (cache != null) {
@@ -541,6 +544,7 @@
* @deprecated since 3.0 as ObjectStore holds weak reference to unmodified
objects and
* this feature is useless.
*/
+ @Deprecated
public synchronized void startTrackingNewObjects() {
// noop
}
@@ -553,6 +557,7 @@
* @deprecated since 3.0 as ObjectStore holds weak reference to unmodified
objects and
* this feature is useless.
*/
+ @Deprecated
public synchronized void unregisterNewObjects() {
// noop
}
@@ -583,6 +588,7 @@
* @since 1.1
* @deprecated since 3.0. See {...@link DataContext#getQueryCache()}.
*/
+ @Deprecated
public synchronized List getCachedQueryResult(String name) {
return context != null && context.getQueryCache() != null ? context
.getQueryCache()
@@ -595,6 +601,7 @@
* @since 1.1
* @deprecated since 3.0. See {...@link DataContext#getQueryCache()}.
*/
+ @Deprecated
public synchronized void cacheQueryResult(String name, List results) {
if (context != null) {
context.getQueryCache().put(new CacheQueryMetadata(name), results);
@@ -718,6 +725,7 @@
* @deprecated since 3.0 use
* {...@link ObjectContext#prepareForAccess(Persistent,
String, boolean)}.
*/
+ @Deprecated
public void resolveHollow(Persistent object) {
context.prepareForAccess(object, null, false);
}
@@ -1155,6 +1163,7 @@
* @deprecated since 3.0 as this inner class is used to provide backwards
* compatibility for some deprecated methods.
*/
+ @Deprecated
final class CacheQueryMetadata implements QueryMetadata {
private String cacheKey;
@@ -1206,6 +1215,7 @@
/**
* @deprecated since 3.0
*/
+ @Deprecated
public int getFetchStartIndex() {
return getFetchOffset();
}
@@ -1245,5 +1255,9 @@
public boolean isResolvingInherited() {
return false;
}
+
+ public int getStatementFetchSize() {
+ return 0;
+ }
}
}
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLAction.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLAction.java?rev=778311&r1=778310&r2=778311&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLAction.java
(original)
+++
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLAction.java
Mon May 25 07:05:27 2009
@@ -98,6 +98,10 @@
sqlQuery.setFetchOffset(md.getFetchOffset());
sqlQuery.setResult(compiledExpression.getResult());
sqlQuery.setPageSize(md.getPageSize());
+
+ if (md.getStatementFetchSize() != 0) {
+ sqlQuery.setStatementFetchSize(md.getStatementFetchSize());
+ }
actionFactory.sqlAction(sqlQuery).performAction(connection, observer);
}
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/ProcedureAction.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/ProcedureAction.java?rev=778311&r1=778310&r2=778311&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/ProcedureAction.java
(original)
+++
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/ProcedureAction.java
Mon May 25 07:05:27 2009
@@ -70,6 +70,8 @@
CallableStatement statement = (CallableStatement)
transl.createStatement();
try {
+ initStatement(statement);
+
// stored procedure may contain a mixture of update counts and
result sets,
// and out parameters. Read out parameters first, then
// iterate until we exhaust all results
@@ -228,4 +230,15 @@
delegate.nextRows(query, Collections.singletonList(result));
}
}
+
+ /**
+ * Initializes statement with query parameters
+ * @throws Exception
+ */
+ void initStatement(CallableStatement statement) throws Exception {
+ int statementFetchSize =
query.getMetaData(getEntityResolver()).getStatementFetchSize();
+ if (statementFetchSize != 0) {
+ statement.setFetchSize(statementFetchSize);
+ }
+ }
}
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java?rev=778311&r1=778310&r2=778311&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java
(original)
+++
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java
Mon May 25 07:05:27 2009
@@ -63,6 +63,7 @@
* {...@link #SQLTemplateAction(SQLTemplate, DbAdapter,
EntityResolver)}
* constructor.
*/
+ @Deprecated
public SQLTemplateAction(SQLTemplate query, DbAdapter adapter) {
this.query = query;
this.adapter = adapter;
@@ -333,6 +334,10 @@
bindings[i].getPrecision());
}
}
+
+ if (queryMetadata.getStatementFetchSize() != 0) {
+
preparedStatement.setFetchSize(queryMetadata.getStatementFetchSize());
+ }
}
/**
@@ -340,6 +345,7 @@
*
* @deprecated since 3.0
*/
+ @Deprecated
public boolean isRemovingLineBreaks() {
return true;
}
@@ -347,6 +353,7 @@
/**
* @deprecated since 3.0 - does nothing
*/
+ @Deprecated
public void setRemovingLineBreaks(boolean removingLineBreaks) {
}
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/trans/QueryAssembler.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/trans/QueryAssembler.java?rev=778311&r1=778310&r2=778311&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/trans/QueryAssembler.java
(original)
+++
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/trans/QueryAssembler.java
Mon May 25 07:05:27 2009
@@ -218,5 +218,9 @@
}
}
}
+
+ if (queryMetadata.getStatementFetchSize() != 0) {
+ stmt.setFetchSize(queryMetadata.getStatementFetchSize());
+ }
}
}
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/cache/NestedQueryCache.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/cache/NestedQueryCache.java?rev=778311&r1=778310&r2=778311&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/cache/NestedQueryCache.java
(original)
+++
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/cache/NestedQueryCache.java
Mon May 25 07:05:27 2009
@@ -136,6 +136,7 @@
/**
* @deprecated since 3.0 in favor of 'getCacheStrategy'.
*/
+ @Deprecated
public String getCachePolicy() {
return mdDelegate.getCachePolicy();
}
@@ -167,6 +168,7 @@
/**
* @deprecated since 3.0
*/
+ @Deprecated
public int getFetchStartIndex() {
return mdDelegate.getFetchStartIndex();
}
@@ -210,5 +212,9 @@
public boolean isResolvingInherited() {
return mdDelegate.isResolvingInherited();
}
+
+ public int getStatementFetchSize() {
+ return mdDelegate.getStatementFetchSize();
+ }
}
}
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/BaseQueryMetadata.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/BaseQueryMetadata.java?rev=778311&r1=778310&r2=778311&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/BaseQueryMetadata.java
(original)
+++
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/BaseQueryMetadata.java
Mon May 25 07:05:27 2009
@@ -47,6 +47,8 @@
int fetchLimit = QueryMetadata.FETCH_LIMIT_DEFAULT;
int fetchOffset = QueryMetadata.FETCH_OFFSET_DEFAULT;
+
+ int statementFetchSize = QueryMetadata.FETCH_OFFSET_DEFAULT;
int pageSize = QueryMetadata.PAGE_SIZE_DEFAULT;
boolean fetchingDataRows = QueryMetadata.FETCHING_DATA_ROWS_DEFAULT;
@@ -164,6 +166,7 @@
Object fetchOffset =
properties.get(QueryMetadata.FETCH_OFFSET_PROPERTY);
Object fetchLimit = properties.get(QueryMetadata.FETCH_LIMIT_PROPERTY);
Object pageSize = properties.get(QueryMetadata.PAGE_SIZE_PROPERTY);
+ Object statementFetchSize =
properties.get(QueryMetadata.STATEMENT_FETCH_SIZE_PROPERTY);
Object fetchingDataRows = properties
.get(QueryMetadata.FETCHING_DATA_ROWS_PROPERTY);
@@ -184,6 +187,10 @@
this.pageSize = (pageSize != null)
? Integer.parseInt(pageSize.toString())
: QueryMetadata.PAGE_SIZE_DEFAULT;
+
+ this.statementFetchSize = (statementFetchSize != null)
+ ? Integer.parseInt(statementFetchSize.toString())
+ : QueryMetadata.STATEMENT_FETCH_SIZE_DEFAULT;
this.fetchingDataRows = (fetchingDataRows != null)
? "true".equalsIgnoreCase(fetchingDataRows.toString())
@@ -236,6 +243,10 @@
encoder.printProperty(QueryMetadata.CACHE_STRATEGY_PROPERTY,
cacheStrategy
.name());
}
+
+ if (statementFetchSize != QueryMetadata.STATEMENT_FETCH_SIZE_DEFAULT) {
+ encoder.printProperty(QueryMetadata.STATEMENT_FETCH_SIZE_PROPERTY,
statementFetchSize);
+ }
if (prefetchTree != null) {
prefetchTree.encodeAsXML(encoder);
@@ -473,6 +484,22 @@
void setPageSize(int i) {
pageSize = i;
}
+
+ /**
+ * Sets statement's fetch size (0 for no default size)
+ * @since 3.0
+ */
+ void setStatementFetchSize(int size) {
+ this.statementFetchSize = size;
+ }
+
+ /**
+ * @return statement's fetch size
+ * @since 3.0
+ */
+ public int getStatementFetchSize() {
+ return statementFetchSize;
+ }
/**
* Adds a joint prefetch.
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/DefaultQueryMetadata.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/DefaultQueryMetadata.java?rev=778311&r1=778310&r2=778311&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/DefaultQueryMetadata.java
(original)
+++
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/DefaultQueryMetadata.java
Mon May 25 07:05:27 2009
@@ -106,6 +106,7 @@
/**
* @deprecated since 3.0 {...@link #getCacheStrategy()} replaces this
method.
*/
+ @Deprecated
public String getCachePolicy() {
return QueryMetadata.CACHE_POLICY_DEFAULT;
}
@@ -121,6 +122,7 @@
/**
* @deprecated since 3.0
*/
+ @Deprecated
public boolean isResolvingInherited() {
return true;
}
@@ -136,6 +138,7 @@
/**
* @deprecated since 3.0
*/
+ @Deprecated
public int getFetchStartIndex() {
return getFetchOffset();
}
@@ -151,4 +154,8 @@
public Map<String, String> getPathSplitAliases() {
return Collections.emptyMap();
}
+
+ public int getStatementFetchSize() {
+ return QueryMetadata.STATEMENT_FETCH_SIZE_DEFAULT;
+ }
}
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/EJBQLQuery.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/EJBQLQuery.java?rev=778311&r1=778310&r2=778311&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/EJBQLQuery.java
(original)
+++
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/EJBQLQuery.java
Mon May 25 07:05:27 2009
@@ -249,4 +249,20 @@
public void setPageSize(int pageSize) {
metadata.setPageSize(pageSize);
}
+
+ /**
+ * Sets statement's fetch size (0 for no default size)
+ * @since 3.0
+ */
+ public void setStatementFetchSize(int size) {
+ metadata.setStatementFetchSize(size);
+ }
+
+ /**
+ * @return statement's fetch size
+ * @since 3.0
+ */
+ public int getStatementFetchSize() {
+ return metadata.getStatementFetchSize();
+ }
}
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/ProcedureQuery.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/ProcedureQuery.java?rev=778311&r1=778310&r2=778311&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/ProcedureQuery.java
(original)
+++
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/ProcedureQuery.java
Mon May 25 07:05:27 2009
@@ -301,6 +301,7 @@
/**
* @deprecated since 3.0 {...@link #getCacheStrategy()} replaces this
method.
*/
+ @Deprecated
public String getCachePolicy() {
return metaData.getCachePolicy();
}
@@ -309,6 +310,7 @@
* @deprecated since 3.0 {...@link #setCacheStrategy(QueryCacheStrategy)}
replaces this
* method.
*/
+ @Deprecated
public void setCachePolicy(String policy) {
metaData.setCachePolicy(policy);
}
@@ -384,6 +386,7 @@
* redundant, although it is still being taken into account.
It will be
* removed in the later versions of Cayenne.
*/
+ @Deprecated
public boolean isRefreshingObjects() {
return metaData.isRefreshingObjects();
}
@@ -393,6 +396,7 @@
* redundant, although it is still being taken into account.
It will be
* removed in the later versions of Cayenne.
*/
+ @Deprecated
public void setRefreshingObjects(boolean flag) {
// noop
}
@@ -400,6 +404,7 @@
/**
* @deprecated since 3.0. Inheritance resolving is not optional anymore.
*/
+ @Deprecated
public boolean isResolvingInherited() {
return true;
}
@@ -407,6 +412,7 @@
/**
* @deprecated since 3.0. Inheritance resolving is not optional anymore.
*/
+ @Deprecated
public void setResolvingInherited(boolean b) {
// noop
}
@@ -531,4 +537,20 @@
public void setColumnNamesCapitalization(CapsStrategy
columnNameCapitalization) {
this.columnNamesCapitalization = columnNameCapitalization;
}
+
+ /**
+ * Sets statement's fetch size (0 for no default size)
+ * @since 3.0
+ */
+ public void setStatementFetchSize(int size) {
+ metaData.setStatementFetchSize(size);
+ }
+
+ /**
+ * @return statement's fetch size
+ * @since 3.0
+ */
+ public int getStatementFetchSize() {
+ return metaData.getStatementFetchSize();
+ }
}
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/QueryMetadata.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/QueryMetadata.java?rev=778311&r1=778310&r2=778311&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/QueryMetadata.java
(original)
+++
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/QueryMetadata.java
Mon May 25 07:05:27 2009
@@ -40,6 +40,7 @@
*
* @deprecated since 3.0 use {...@link QueryCacheStrategy} enum.
*/
+ @Deprecated
public static final String NO_CACHE = "nocache";
/**
@@ -48,6 +49,7 @@
*
* @deprecated since 3.0 use {...@link QueryCacheStrategy} enum.
*/
+ @Deprecated
public static final String LOCAL_CACHE = "localcache";
/**
@@ -55,6 +57,7 @@
*
* @deprecated since 3.0 use {...@link QueryCacheStrategy} enum.
*/
+ @Deprecated
public static final String LOCAL_CACHE_REFRESH = "localcache_refresh";
/**
@@ -63,6 +66,7 @@
*
* @deprecated since 3.0 use {...@link QueryCacheStrategy} enum.
*/
+ @Deprecated
public static final String SHARED_CACHE = "sharedcache";
/**
@@ -70,6 +74,7 @@
*
* @deprecated since 3.0 use {...@link QueryCacheStrategy} enum.
*/
+ @Deprecated
public static final String SHARED_CACHE_REFRESH = "sharedcache_refresh";
/**
@@ -117,26 +122,31 @@
/**
* @deprecated since 3.0
*/
+ @Deprecated
public static final String REFRESHING_OBJECTS_PROPERTY =
"cayenne.GenericSelectQuery.refreshingObjects";
/**
* @deprecated since 3.0
*/
+ @Deprecated
public static final boolean REFRESHING_OBJECTS_DEFAULT = true;
/**
* @deprecated since 3.0. Inheritance resolving is not optional anymore.
*/
+ @Deprecated
public static final String RESOLVING_INHERITED_PROPERTY =
"cayenne.GenericSelectQuery.resolvingInherited";
/**
* @deprecated since 3.0. Inheritance resolving is not optional anymore.
*/
+ @Deprecated
public static final boolean RESOLVING_INHERITED_DEFAULT = true;
/**
* @deprecated since 3.0 use {...@value #CACHE_STRATEGY_PROPERTY}
*/
+ @Deprecated
public static final String CACHE_POLICY_PROPERTY =
"cayenne.GenericSelectQuery.cachePolicy";
/**
@@ -152,7 +162,24 @@
/**
* @deprecated since 3.0 use {...@link QueryCacheStrategy} enum.
*/
+ @Deprecated
public static final String CACHE_POLICY_DEFAULT = NO_CACHE;
+
+ /**
+ * Defines the name of the property for the query {...@link
#getStatementFetchSize() fetch
+ * size}.
+ *
+ * @since 3.0
+ */
+ public static final String STATEMENT_FETCH_SIZE_PROPERTY =
"cayenne.GenericSelectQuery.statementFetchSize";
+
+ /**
+ * Defines default query fetch start index, which is 0, meaning that
matching rows
+ * selected starting from the first.
+ *
+ * @since 3.0
+ */
+ public static final int STATEMENT_FETCH_SIZE_DEFAULT = 0;
/**
* @since 3.0
@@ -186,6 +213,7 @@
*
* @deprecated since 3.0 {...@link #getCacheStrategy()} replaces this
method.
*/
+ @Deprecated
String getCachePolicy();
/**
@@ -231,6 +259,7 @@
*
* @deprecated since 3.0. Inheritance resolving is not optional anymore.
*/
+ @Deprecated
boolean isResolvingInherited();
/**
@@ -250,6 +279,7 @@
/**
* @deprecated since 3.0, renamed to {...@link #getFetchOffset()}.
*/
+ @Deprecated
int getFetchStartIndex();
/**
@@ -297,4 +327,10 @@
* @since 3.0
*/
List<Object> getResultSetMapping();
+
+ /**
+ * @return statement's fetch size
+ * @since 3.0
+ */
+ public int getStatementFetchSize();
}
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/QueryMetadataWrapper.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/QueryMetadataWrapper.java?rev=778311&r1=778310&r2=778311&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/QueryMetadataWrapper.java
(original)
+++
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/QueryMetadataWrapper.java
Mon May 25 07:05:27 2009
@@ -111,6 +111,7 @@
/**
* @deprecated since 3.0 {...@link #getCacheStrategy()} replaces this
method.
*/
+ @Deprecated
public String getCachePolicy() {
return (overrideExists(QueryMetadata.CACHE_POLICY_PROPERTY)) ?
(String) overrides
.get(QueryMetadata.CACHE_POLICY_PROPERTY) :
info.getCachePolicy();
@@ -144,6 +145,7 @@
/**
* @deprecated since 3.0 as super is deprecated.
*/
+ @Deprecated
public boolean isRefreshingObjects() {
return true;
}
@@ -151,6 +153,7 @@
/**
* @deprecated since 3.0 inheritance resolving is not optional.
*/
+ @Deprecated
public boolean isResolvingInherited() {
return true;
}
@@ -171,6 +174,7 @@
/**
* @deprecated since 3.0
*/
+ @Deprecated
public int getFetchStartIndex() {
return getFetchOffset();
}
@@ -187,4 +191,13 @@
public PrefetchTreeNode getPrefetchTree() {
return info.getPrefetchTree();
}
+
+ public int getStatementFetchSize() {
+ if (!overrideExists(QueryMetadata.STATEMENT_FETCH_SIZE_PROPERTY)) {
+ return info.getPageSize();
+ }
+
+ Number n = (Number)
overrides.get(QueryMetadata.STATEMENT_FETCH_SIZE_PROPERTY);
+ return n != null ? n.intValue() : 0;
+ }
}
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/SQLTemplate.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/SQLTemplate.java?rev=778311&r1=778310&r2=778311&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/SQLTemplate.java
(original)
+++
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/SQLTemplate.java
Mon May 25 07:05:27 2009
@@ -322,6 +322,7 @@
/**
* @deprecated since 3.0 {...@link #getCacheStrategy()} replaces this
method.
*/
+ @Deprecated
public String getCachePolicy() {
return metaData.getCachePolicy();
}
@@ -330,6 +331,7 @@
* @deprecated since 3.0 {...@link #setCacheStrategy(QueryCacheStrategy)}
replaces this
* method.
*/
+ @Deprecated
public void setCachePolicy(String policy) {
metaData.setCachePolicy(policy);
}
@@ -405,6 +407,7 @@
* redundant, although it is still being taken into account.
It will be
* removed in the later versions of Cayenne.
*/
+ @Deprecated
public boolean isRefreshingObjects() {
return metaData.isRefreshingObjects();
}
@@ -414,6 +417,7 @@
* redundant, although it is still being taken into account.
It will be
* removed in the later versions of Cayenne.
*/
+ @Deprecated
public void setRefreshingObjects(boolean flag) {
// noop
}
@@ -421,6 +425,7 @@
/**
* @deprecated since 3.0. Inheritance resolving is not optional anymore.
*/
+ @Deprecated
public boolean isResolvingInherited() {
return true;
}
@@ -428,6 +433,7 @@
/**
* @deprecated since 3.0. Inheritance resolving is not optional anymore.
*/
+ @Deprecated
public void setResolvingInherited(boolean b) {
// noop
}
@@ -622,4 +628,20 @@
public SQLResult getResult() {
return result;
}
+
+ /**
+ * Sets statement's fetch size (0 for no default size)
+ * @since 3.0
+ */
+ public void setStatementFetchSize(int size) {
+ metaData.setStatementFetchSize(size);
+ }
+
+ /**
+ * @return statement's fetch size
+ * @since 3.0
+ */
+ public int getStatementFetchSize() {
+ return metaData.getStatementFetchSize();
+ }
}
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/SelectQuery.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/SelectQuery.java?rev=778311&r1=778310&r2=778311&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/SelectQuery.java
(original)
+++
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/SelectQuery.java
Mon May 25 07:05:27 2009
@@ -415,6 +415,7 @@
* @deprecated since 3.0. Will likely be removed after 3.0M6. Can be
replaced with
* EJBQL.
*/
+ @Deprecated
public List<String> getCustomDbAttributes() {
// if query root is DbEntity, and no custom attributes
// are defined, return DbEntity attributes.
@@ -438,6 +439,7 @@
* @deprecated since 3.0. Will likely be removed after 3.0M6. Can be
replaced with
* EJBQL.
*/
+ @Deprecated
public void addCustomDbAttribute(String attributePath) {
nonNullCustomDbAttributes().add(attributePath);
}
@@ -446,6 +448,7 @@
* @deprecated since 3.0. Will likely be removed after 3.0M6. Can be
replaced with
* EJBQL.
*/
+ @Deprecated
public void addCustomDbAttributes(List<String> attrPaths) {
nonNullCustomDbAttributes().addAll(attrPaths);
}
@@ -532,6 +535,7 @@
* redundant, although it is still being taken into account.
It will be
* removed in the later versions of Cayenne.
*/
+ @Deprecated
public boolean isRefreshingObjects() {
return metaData.isRefreshingObjects();
}
@@ -542,6 +546,7 @@
* redundant, although it is still being taken into account.
It will be
* removed in the later versions of Cayenne.
*/
+ @Deprecated
public void setRefreshingObjects(boolean flag) {
// noop
}
@@ -550,6 +555,7 @@
* @since 1.1
* @deprecated since 3.0 {...@link #getCacheStrategy()} replaces this
method.
*/
+ @Deprecated
public String getCachePolicy() {
return metaData.getCachePolicy();
}
@@ -559,6 +565,7 @@
* @deprecated since 3.0 {...@link #setCacheStrategy(QueryCacheStrategy)}
replaces this
* method.
*/
+ @Deprecated
public void setCachePolicy(String policy) {
metaData.setCachePolicy(policy);
}
@@ -646,6 +653,7 @@
* @since 1.1
* @deprecated since 3.0. Inheritance resolving is not optional anymore.
*/
+ @Deprecated
public boolean isResolvingInherited() {
return true;
}
@@ -657,6 +665,7 @@
* @since 1.1
* @deprecated since 3.0. Inheritance resolving is not optional anymore.
*/
+ @Deprecated
public void setResolvingInherited(boolean b) {
// noop
}
@@ -686,4 +695,20 @@
return orderings;
}
+
+ /**
+ * Sets statement's fetch size (0 for no default size)
+ * @since 3.0
+ */
+ public void setStatementFetchSize(int size) {
+ metaData.setStatementFetchSize(size);
+ }
+
+ /**
+ * @return statement's fetch size
+ * @since 3.0
+ */
+ public int getStatementFetchSize() {
+ return metaData.getStatementFetchSize();
+ }
}
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/remote/IncrementalQuery.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/remote/IncrementalQuery.java?rev=778311&r1=778310&r2=778311&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/remote/IncrementalQuery.java
(original)
+++
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/remote/IncrementalQuery.java
Mon May 25 07:05:27 2009
@@ -82,6 +82,7 @@
/**
* @deprecated since 3.0 in favor of 'getCacheStrategy'.
*/
+ @Deprecated
public String getCachePolicy() {
return metadata.getCachePolicy();
}
@@ -112,6 +113,7 @@
/**
* @deprecated since 3.0
*/
+ @Deprecated
public int getFetchStartIndex() {
return metadata.getFetchStartIndex();
}
@@ -147,6 +149,7 @@
/**
* @deprecated since 3.0
*/
+ @Deprecated
public boolean isRefreshingObjects() {
return metadata.isRefreshingObjects();
}
@@ -154,9 +157,14 @@
/**
* @deprecated since 3.0. Inheritance resolving is not optional
anymore.
*/
+ @Deprecated
public boolean isResolvingInherited() {
return metadata.isResolvingInherited();
}
+
+ public int getStatementFetchSize() {
+ return metadata.getStatementFetchSize();
+ }
};
}
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/remote/IncrementalSelectQuery.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/remote/IncrementalSelectQuery.java?rev=778311&r1=778310&r2=778311&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/remote/IncrementalSelectQuery.java
(original)
+++
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/remote/IncrementalSelectQuery.java
Mon May 25 07:05:27 2009
@@ -89,6 +89,7 @@
/**
* @deprecated since 3.0 in favor of 'getCacheStrategy'.
*/
+ @Deprecated
public String getCachePolicy() {
return metadata.getCachePolicy();
}
@@ -116,6 +117,7 @@
/**
* @deprecated since 3.0
*/
+ @Deprecated
public int getFetchStartIndex() {
return metadata.getFetchStartIndex();
}
@@ -155,6 +157,10 @@
public boolean isResolvingInherited() {
return metadata.isResolvingInherited();
}
+
+ public int getStatementFetchSize() {
+ return metadata.getStatementFetchSize();
+ }
};
}
@@ -306,6 +312,7 @@
/**
* @deprecated since 3.0
*/
+ @Deprecated
@Override
public boolean isRefreshingObjects() {
return query.isRefreshingObjects();
@@ -314,6 +321,7 @@
/**
* @deprecated since 3.0. Inheritance resolving is not optional anymore.
*/
+ @Deprecated
@Override
public boolean isResolvingInherited() {
return query.isResolvingInherited();
@@ -397,6 +405,7 @@
/**
* @deprecated since 3.0 as wrapped method is also deprecated.
*/
+ @Deprecated
@Override
public void setRefreshingObjects(boolean flag) {
query.setRefreshingObjects(flag);
@@ -405,6 +414,7 @@
/**
* @deprecated since 3.0 as wrapped method is also deprecated.
*/
+ @Deprecated
@Override
public void setResolvingInherited(boolean b) {
query.setResolvingInherited(b);
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/remote/RangeQuery.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/remote/RangeQuery.java?rev=778311&r1=778310&r2=778311&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/remote/RangeQuery.java
(original)
+++
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/remote/RangeQuery.java
Mon May 25 07:05:27 2009
@@ -95,6 +95,7 @@
/**
* @deprecated since 3.0
*/
+ @Deprecated
public int getFetchStartIndex() {
return getFetchOffset();
}
@@ -114,6 +115,7 @@
/**
* @deprecated since 3.0 in favor of 'getCacheStrategy'.
*/
+ @Deprecated
public String getCachePolicy() {
return QueryMetadata.NO_CACHE;
}
@@ -160,6 +162,10 @@
public boolean isResolvingInherited() {
throw new UnsupportedOperationException();
}
+
+ public int getStatementFetchSize() {
+ return 0;
+ }
};
}
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/map/SQLTemplateBuilderTest.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/map/SQLTemplateBuilderTest.java?rev=778311&r1=778310&r2=778311&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/map/SQLTemplateBuilderTest.java
(original)
+++
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/map/SQLTemplateBuilderTest.java
Mon May 25 07:05:27 2009
@@ -22,8 +22,8 @@
import junit.framework.TestCase;
import org.apache.cayenne.query.Query;
-import org.apache.cayenne.query.SQLTemplate;
import org.apache.cayenne.query.QueryMetadata;
+import org.apache.cayenne.query.SQLTemplate;
/**
*/
@@ -57,10 +57,13 @@
public void testGetQueryProperties() throws Exception {
SQLTemplateBuilder builder = new MockupRootQueryBuilder();
builder.addProperty(QueryMetadata.FETCH_LIMIT_PROPERTY, "5");
+ builder.addProperty(QueryMetadata.STATEMENT_FETCH_SIZE_PROPERTY, "6");
Query query = builder.getQuery();
assertTrue(query instanceof SQLTemplate);
assertEquals(5, ((SQLTemplate) query).getFetchLimit());
+
+ assertEquals(6, ((SQLTemplate) query).getStatementFetchSize());
// TODO: test other properties...
}
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/map/SelectQueryBuilderTest.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/map/SelectQueryBuilderTest.java?rev=778311&r1=778310&r2=778311&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/map/SelectQueryBuilderTest.java
(original)
+++
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/map/SelectQueryBuilderTest.java
Mon May 25 07:05:27 2009
@@ -66,10 +66,13 @@
public void testGetQueryProperties() throws Exception {
SelectQueryBuilder builder = new MockupRootQueryBuilder();
builder.addProperty(QueryMetadata.FETCH_LIMIT_PROPERTY, "5");
+ builder.addProperty(QueryMetadata.STATEMENT_FETCH_SIZE_PROPERTY, "6");
Query query = builder.getQuery();
assertTrue(query instanceof SelectQuery);
assertEquals(5, ((SelectQuery) query).getFetchLimit());
+
+ assertEquals(6, ((SelectQuery) query).getStatementFetchSize());
// TODO: test other properties...
}
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/MockQueryMetadata.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/MockQueryMetadata.java?rev=778311&r1=778310&r2=778311&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/MockQueryMetadata.java
(original)
+++
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/MockQueryMetadata.java
Mon May 25 07:05:27 2009
@@ -57,6 +57,7 @@
/**
* @deprecated since 3.0
*/
+ @Deprecated
public String getCachePolicy() {
return null;
}
@@ -100,6 +101,7 @@
/**
* @deprecated since 3.0
*/
+ @Deprecated
public int getFetchStartIndex() {
return getFetchOffset();
}
@@ -115,4 +117,8 @@
public Query getOrginatingQuery() {
return null;
}
+
+ public int getStatementFetchSize() {
+ return 0;
+ }
}
Added:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/StatementFetchSizeTest.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/StatementFetchSizeTest.java?rev=778311&view=auto
==============================================================================
---
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/StatementFetchSizeTest.java
(added)
+++
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/StatementFetchSizeTest.java
Mon May 25 07:05:27 2009
@@ -0,0 +1,47 @@
+/*****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ****************************************************************/
+package org.apache.cayenne.query;
+
+import org.apache.art.Artist;
+import org.apache.cayenne.access.DataContext;
+import org.apache.cayenne.unit.CayenneCase;
+
+public class StatementFetchSizeTest extends CayenneCase {
+ public void test() {
+ DataContext dataContext = createDataContext();
+
+ SelectQuery query = new SelectQuery(Artist.class);
+ query.setStatementFetchSize(10);
+
+ assertEquals(10,
query.getMetaData(dataContext.getEntityResolver()).getStatementFetchSize());
+ dataContext.performQuery(query);
+
+ SQLTemplate template = new SQLTemplate(Artist.class, "SELECT ARTIST_ID
FROM ARTIST");
+ template.setStatementFetchSize(10);
+
+ assertEquals(10,
template.getMetaData(dataContext.getEntityResolver()).getStatementFetchSize());
+ dataContext.performQuery(template);
+
+ EJBQLQuery ejbql = new EJBQLQuery("select a from Artist a");
+ ejbql.setStatementFetchSize(10);
+
+ assertEquals(10,
ejbql.getMetaData(dataContext.getEntityResolver()).getStatementFetchSize());
+ dataContext.performQuery(ejbql);
+ }
+}