You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2008/03/05 23:16:08 UTC
svn commit: r634056 - in
/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src:
main/java/org/apache/cayenne/access/ main/java/org/apache/cayenne/query/
main/java/org/apache/cayenne/remote/ test/java/org/apache/cayenne/access/
test/java/org/apac...
Author: aadamchik
Date: Wed Mar 5 14:16:04 2008
New Revision: 634056
URL: http://svn.apache.org/viewvc?rev=634056&view=rev
Log:
CAY-998 ROP paginated lists must recover from server LRU query cache overflow
(fixed... may need to optimize things a bit more)
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/ClientServerChannelQueryAction.java
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/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/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/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/main/java/org/apache/cayenne/remote/RemoteIncrementalFaultList.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/ClientServerChannelQueryTest.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/ClientServerChannelQueryAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/ClientServerChannelQueryAction.java?rev=634056&r1=634055&r2=634056&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/ClientServerChannelQueryAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/ClientServerChannelQueryAction.java Wed Mar 5 14:16:04 2008
@@ -82,8 +82,23 @@
List cachedList = channel.getQueryCache().get(serverMetadata);
if (cachedList == null) {
- throw new CayenneRuntimeException("No cached list for "
- + serverMetadata.getCacheKey());
+
+ // attempt to refetch... respawn the action...
+
+ Query originatingQuery = serverMetadata.getOrginatingQuery();
+ if (originatingQuery != null) {
+
+ ClientServerChannelQueryAction subaction = new ClientServerChannelQueryAction(
+ channel,
+ originatingQuery);
+ subaction.execute();
+ cachedList = channel.getQueryCache().get(serverMetadata);
+ }
+
+ if (cachedList == null) {
+ throw new CayenneRuntimeException("No cached list for "
+ + serverMetadata.getCacheKey());
+ }
}
int startIndex = serverMetadata.getFetchStartIndex();
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=634056&r1=634055&r2=634056&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 Wed Mar 5 14:16:04 2008
@@ -52,6 +52,10 @@
public SQLResultSetMapping getResultSetMapping() {
return null;
}
+
+ public Query getOrginatingQuery() {
+ return null;
+ }
public String getName() {
return null;
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=634056&r1=634055&r2=634056&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 Wed Mar 5 14:16:04 2008
@@ -50,6 +50,7 @@
import org.apache.cayenne.map.Procedure;
import org.apache.cayenne.query.ObjectIdQuery;
import org.apache.cayenne.query.PrefetchTreeNode;
+import org.apache.cayenne.query.Query;
import org.apache.cayenne.query.QueryMetadata;
import org.apache.cayenne.query.RefreshQuery;
import org.apache.cayenne.query.SQLResultSetMapping;
@@ -1157,6 +1158,10 @@
}
public SQLResultSetMapping getResultSetMapping() {
+ return null;
+ }
+
+ public Query getOrginatingQuery() {
return null;
}
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=634056&r1=634055&r2=634056&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 Wed Mar 5 14:16:04 2008
@@ -356,6 +356,10 @@
public int getPageSize() {
return pageSize;
}
+
+ public Query getOrginatingQuery() {
+ return null;
+ }
/**
* Always returns -1.
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=634056&r1=634055&r2=634056&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 Wed Mar 5 14:16:04 2008
@@ -61,6 +61,13 @@
public SQLResultSetMapping getResultSetMapping() {
return null;
}
+
+ /**
+ * @since 3.0
+ */
+ public Query getOrginatingQuery() {
+ return null;
+ }
public DbEntity getDbEntity() {
return null;
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=634056&r1=634055&r2=634056&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 Wed Mar 5 14:16:04 2008
@@ -197,6 +197,17 @@
int getFetchLimit();
/**
+ * Returns a query that originated this query. Most often than not the returned value
+ * is null. One example of non-null originating query is a query for a range of
+ * objects in a previously fetched paginated list. The query that fetched the original
+ * paginated list is an "originated" query. It may be used to restore a list that got
+ * lost due to a cache overflow, etc.
+ *
+ * @since 3.0
+ */
+ Query getOrginatingQuery();
+
+ /**
* Returns a root node of prefetch tree used by this query, or null of no prefetches
* are configured.
*/
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=634056&r1=634055&r2=634056&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 Wed Mar 5 14:16:04 2008
@@ -85,6 +85,10 @@
return info.getObjEntity();
}
+ public Query getOrginatingQuery() {
+ return info.getOrginatingQuery();
+ }
+
/**
* @since 3.0
*/
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=634056&r1=634055&r2=634056&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 Wed Mar 5 14:16:04 2008
@@ -60,6 +60,10 @@
// ClientServerChannel behavior
return new QueryMetadata() {
+
+ public Query getOrginatingQuery() {
+ return null;
+ }
public String getCacheKey() {
return cacheKey;
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=634056&r1=634055&r2=634056&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 Wed Mar 5 14:16:04 2008
@@ -71,6 +71,10 @@
return new QueryMetadata() {
+ public Query getOrginatingQuery() {
+ return null;
+ }
+
public String getCacheKey() {
return cacheKey;
}
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=634056&r1=634055&r2=634056&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 Wed Mar 5 14:16:04 2008
@@ -34,8 +34,8 @@
import org.apache.cayenne.reflect.ClassDescriptor;
/**
- * An Query wrapper that triggers pagination processing on the server. This query is
- * client-only and can't be executed on the server.
+ * A Query that fetches a range of objects from a previously fetched server-side paginated
+ * list. This query is client-only and can't be executed on the server.
*
* @since 1.2
* @author Andrus Adamchik
@@ -45,8 +45,7 @@
private String cacheKey;
private int fetchStartIndex;
private int fetchLimit;
- private boolean fetchingDataRows;
- private PrefetchTreeNode prefetchTree;
+ private Query originatingQuery;
// exists for hessian serialization.
@SuppressWarnings("unused")
@@ -55,21 +54,25 @@
}
/**
- * Creates a PaginatedQuery that returns a single page from an existing cached
- * server-side result list.
+ * Creates a query that returns a single page from an existing cached server-side
+ * result list.
*/
- public RangeQuery(String cacheKey, int fetchStartIndex, int fetchLimit,
- QueryMetadata rootMetadata) {
+ RangeQuery(String cacheKey, int fetchStartIndex, int fetchLimit, Query originatingQuery) {
this.cacheKey = cacheKey;
this.fetchStartIndex = fetchStartIndex;
this.fetchLimit = fetchLimit;
- this.fetchingDataRows = rootMetadata.isFetchingDataRows();
- this.prefetchTree = rootMetadata.getPrefetchTree();
+ this.originatingQuery = originatingQuery;
}
public QueryMetadata getMetaData(EntityResolver resolver) {
+ final QueryMetadata originatingMetadata = originatingQuery.getMetaData(resolver);
+
return new QueryMetadata() {
+ public Query getOrginatingQuery() {
+ return originatingQuery;
+ }
+
public SQLResultSetMapping getResultSetMapping() {
return null;
}
@@ -91,7 +94,7 @@
}
public boolean isFetchingDataRows() {
- return fetchingDataRows;
+ return originatingMetadata.isFetchingDataRows();
}
public int getPageSize() {
@@ -103,7 +106,7 @@
}
public PrefetchTreeNode getPrefetchTree() {
- return prefetchTree;
+ return originatingMetadata.getPrefetchTree();
}
public DataMap getDataMap() {
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/remote/RemoteIncrementalFaultList.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/remote/RemoteIncrementalFaultList.java?rev=634056&r1=634055&r2=634056&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/remote/RemoteIncrementalFaultList.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/remote/RemoteIncrementalFaultList.java Wed Mar 5 14:16:04 2008
@@ -68,7 +68,7 @@
protected String cacheKey;
protected int pageSize;
protected int unfetchedObjects;
- protected QueryMetadata metadata;
+ protected Query paginatedQuery;
protected transient ObjectContext context;
@@ -82,7 +82,7 @@
public RemoteIncrementalFaultList(ObjectContext context, Query paginatedQuery) {
- this.metadata = paginatedQuery.getMetaData(context.getEntityResolver());
+ QueryMetadata metadata = paginatedQuery.getMetaData(context.getEntityResolver());
if (metadata.getPageSize() <= 0) {
throw new IllegalArgumentException("Page size must be positive: "
@@ -116,6 +116,9 @@
}
}
+ // ensure that originating query is wrapped to include the right cache key....
+ this.paginatedQuery = query;
+
// select directly from the channel, bypassing the context. Otherwise our query
// wrapper can be intercepted incorrectly
QueryResponse response = context.getChannel().onQuery(context, query);
@@ -251,7 +254,7 @@
int fetchLimit = toIndex - fromIndex;
- RangeQuery query = new RangeQuery(cacheKey, fromIndex, fetchLimit, metadata);
+ RangeQuery query = new RangeQuery(cacheKey, fromIndex, fetchLimit, paginatedQuery);
List sublist = context.performQuery(query);
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/ClientServerChannelQueryTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/ClientServerChannelQueryTest.java?rev=634056&r1=634055&r2=634056&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/ClientServerChannelQueryTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/ClientServerChannelQueryTest.java Wed Mar 5 14:16:04 2008
@@ -80,7 +80,7 @@
qc.clear();
assertEquals(0, qc.size());
- // assertTrue(results.get(3) instanceof ClientMtTable1);
+ assertTrue(results.get(3) instanceof ClientMtTable1);
}
public void testNamedQuery() throws Exception {
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=634056&r1=634055&r2=634056&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 Wed Mar 5 14:16:04 2008
@@ -90,5 +90,8 @@
public PrefetchTreeNode getPrefetchTree() {
return null;
}
-
+
+ public Query getOrginatingQuery() {
+ return null;
+ }
}