Author: aadamchik
Date: Thu Jul 27 15:23:13 2006
New Revision: 426282
URL: http://svn.apache.org/viewvc?rev=426282&view=rev
Log:
CAY-613 - using QueryCache throught the stack; changed semantics of
InvalidateListCacheQuery to match exact values.
Modified:
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/CayenneContext.java
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/CayenneContextGraphManager.java
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/CayenneContextQueryAction.java
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/access/DataContextQueryAction.java
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/access/DataDomain.java
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/access/DataDomainQueryAction.java
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/access/DataRowStore.java
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/cache/MapQueryCache.java
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/cache/OSQueryCache.java
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/cache/QueryCache.java
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/query/InvalidateListCacheQuery.java
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/tests/java/org/apache/cayenne/access/DataContextNamedQueryCachingTst.java
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/tests/java/org/apache/cayenne/access/DataContextQueryCachingTst.java
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/tests/java/org/apache/cayenne/access/DataRowStoreTst.java
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/tests/java/org/apache/cayenne/query/InvalidateListCacheQueryTst.java
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/tests/java/org/apache/cayenne/unit/CayenneTestCase.java
Modified:
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/CayenneContext.java
URL:
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/CayenneContext.java?rev=426282&r1=426281&r2=426282&view=diff
==============================================================================
---
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/CayenneContext.java
(original)
+++
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/CayenneContext.java
Thu Jul 27 15:23:13 2006
@@ -24,6 +24,8 @@
import java.util.Iterator;
import java.util.List;
+import org.apache.cayenne.cache.MapQueryCache;
+import org.apache.cayenne.cache.QueryCache;
import org.apache.cayenne.event.EventManager;
import org.apache.cayenne.graph.GraphDiff;
import org.apache.cayenne.graph.GraphManager;
@@ -61,6 +63,8 @@
// object that merges "backdoor" changes that come from the channel.
CayenneContextMergeHandler mergeHandler;
+
+ QueryCache queryCache;
/**
* Creates a new CayenneContext with no channel and disabled graph events.
@@ -93,6 +97,26 @@
syncEventsEnabled);
setChannel(channel);
+ }
+
+ /**
+ * Returns [EMAIL PROTECTED] QueryCache}, creating it on the fly if needed.
+ *
+ * @since 3.0
+ */
+ QueryCache getQueryCache() {
+
+ if (queryCache == null) {
+ synchronized (this) {
+ if (queryCache == null) {
+ // TODO: andrus, 7/27/2006 - figure out the factory stuff
like we have
+ // in DataContext
+ queryCache = new MapQueryCache();
+ }
+ }
+ }
+
+ return queryCache;
}
public DataChannel getChannel() {
Modified:
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/CayenneContextGraphManager.java
URL:
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/CayenneContextGraphManager.java?rev=426282&r1=426281&r2=426282&view=diff
==============================================================================
---
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/CayenneContextGraphManager.java
(original)
+++
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/CayenneContextGraphManager.java
Thu Jul 27 15:23:13 2006
@@ -21,10 +21,7 @@
import java.util.ArrayList;
import java.util.Collection;
-import java.util.HashMap;
import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
import org.apache.cayenne.event.EventManager;
import org.apache.cayenne.event.EventSubject;
@@ -59,8 +56,6 @@
ObjectContextStateLog stateLog;
ObjectContextChangeLog changeLog;
- Map queryResultMap = new HashMap();
-
CayenneContextGraphManager(CayenneContext context, boolean
changeEventsEnabled,
boolean lifecycleEventsEnabled) {
@@ -76,21 +71,6 @@
return changeLog.size() > 0;
}
- synchronized void cacheQueryResult(String name, List results) {
- queryResultMap.put(name, results);
- }
-
- synchronized List getCachedQueryResult(String name) {
- return (List) queryResultMap.get(name);
- }
-
- /**
- * @since 3.0
- */
- Map getCachedQueryResults() {
- return queryResultMap;
- }
-
boolean hasChangesSinceLastFlush() {
int size = changeLog.hasMarker(FLUSH_MARKER) ? changeLog
.sizeAfterMarker(FLUSH_MARKER) : changeLog.size();
@@ -116,7 +96,7 @@
public synchronized Object unregisterNode(Object nodeId) {
Object node = super.unregisterNode(nodeId);
-
+
// remove node from other collections...
if (node != null) {
stateLog.unregisterNode(nodeId);
Modified:
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/CayenneContextQueryAction.java
URL:
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/CayenneContextQueryAction.java?rev=426282&r1=426281&r2=426282&view=diff
==============================================================================
---
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/CayenneContextQueryAction.java
(original)
+++
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/CayenneContextQueryAction.java
Thu Jul 27 15:23:13 2006
@@ -19,10 +19,9 @@
package org.apache.cayenne;
-import java.util.Iterator;
import java.util.List;
-import java.util.Map;
+import org.apache.cayenne.cache.QueryCache;
import org.apache.cayenne.query.InvalidateListCacheQuery;
import org.apache.cayenne.query.Query;
import org.apache.cayenne.query.QueryMetadata;
@@ -73,8 +72,7 @@
private boolean interceptLocalCache() {
- String cacheKey = metadata.getCacheKey();
- if (cacheKey == null) {
+ if (metadata.getCacheKey() == null) {
return !DONE;
}
@@ -86,11 +84,11 @@
return !DONE;
}
- CayenneContextGraphManager graphManager = ((CayenneContext)
actingContext)
- .internalGraphManager();
+ QueryCache queryCache = ((CayenneContext) actingContext)
+ .getQueryCache();
if (cache) {
- List cachedResults = graphManager.getCachedQueryResult(cacheKey);
+ List cachedResults = queryCache.get(metadata);
if (cachedResults != null) {
response = new ListResponse(cachedResults);
return DONE;
@@ -101,26 +99,24 @@
runQuery();
}
- graphManager.cacheQueryResult(cacheKey, response.firstList());
+ queryCache.put(metadata, response.firstList());
return DONE;
}
private boolean interceptInvalidateQuery() {
if (query instanceof InvalidateListCacheQuery) {
InvalidateListCacheQuery invalidateQuery =
(InvalidateListCacheQuery) query;
+
+ QueryCache queryCache = ((CayenneContext)
actingContext).getQueryCache();
- CayenneContextGraphManager graphManager = ((CayenneContext)
actingContext)
- .internalGraphManager();
+ if (invalidateQuery.getQueryNameKey() != null) {
+ queryCache.remove(invalidateQuery.getQueryNameKey());
+ }
- int count = 0;
- synchronized (graphManager) {
- Iterator it =
graphManager.getCachedQueryResults().entrySet().iterator();
- while (it.hasNext()) {
- Map.Entry entry = (Map.Entry) it.next();
- if (invalidateQuery.matchesCacheKey((String)
entry.getKey())) {
- count++;
- it.remove();
- }
+ String[] groupKeys = invalidateQuery.getGroupKeys();
+ if (groupKeys != null && groupKeys.length > 0) {
+ for (int i = 0; i < groupKeys.length; i++) {
+ queryCache.removeGroup(groupKeys[i]);
}
}
@@ -129,7 +125,7 @@
}
else {
GenericResponse response = new GenericResponse();
- response.addUpdateCount(count);
+ response.addUpdateCount(1);
this.response = response;
return DONE;
}
Modified:
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/access/DataContextQueryAction.java
URL:
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/access/DataContextQueryAction.java?rev=426282&r1=426281&r2=426282&view=diff
==============================================================================
---
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/access/DataContextQueryAction.java
(original)
+++
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/access/DataContextQueryAction.java
Thu Jul 27 15:23:13 2006
@@ -141,7 +141,17 @@
InvalidateListCacheQuery invalidateQuery =
(InvalidateListCacheQuery) query;
QueryCache queryCache = ((DataContext)
actingContext).getQueryCache();
- queryCache.removeGroup(invalidateQuery.getCacheKeyPattern());
+
+ if (invalidateQuery.getQueryNameKey() != null) {
+ queryCache.remove(invalidateQuery.getQueryNameKey());
+ }
+
+ String[] groupKeys = invalidateQuery.getGroupKeys();
+ if (groupKeys != null && groupKeys.length > 0) {
+ for (int i = 0; i < groupKeys.length; i++) {
+ queryCache.removeGroup(groupKeys[i]);
+ }
+ }
if (invalidateQuery.isCascade()) {
return !DONE;
Modified:
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/access/DataDomain.java
URL:
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/access/DataDomain.java?rev=426282&r1=426281&r2=426282&view=diff
==============================================================================
---
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/access/DataDomain.java
(original)
+++
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/access/DataDomain.java
Thu Jul 27 15:23:13 2006
@@ -31,6 +31,7 @@
import org.apache.cayenne.ObjectContext;
import org.apache.cayenne.QueryResponse;
import org.apache.cayenne.cache.MapQueryCacheFactory;
+import org.apache.cayenne.cache.QueryCache;
import org.apache.cayenne.cache.QueryCacheFactory;
import org.apache.cayenne.event.EventManager;
import org.apache.cayenne.graph.CompoundDiff;
@@ -118,6 +119,11 @@
EntitySorter entitySorter;
/**
+ * @since 3.0
+ */
+ protected QueryCache queryCache;
+
+ /**
* Creates a DataDomain and assigns it a name.
*/
public DataDomain(String name) {
@@ -866,5 +872,33 @@
*/
public void setQueryCacheFactory(QueryCacheFactory queryCacheFactory) {
this.queryCacheFactory = queryCacheFactory;
+ }
+
+ /**
+ * Returns shared [EMAIL PROTECTED] QueryCache} used by this DataDomain,
creating it on the fly
+ * if needed. Uses factory obtained via [EMAIL PROTECTED]
#getQueryCacheFactory()} to initialize
+ * the cache for the first time.
+ *
+ * @since 3.0
+ */
+ public QueryCache getQueryCache() {
+
+ if (queryCache == null) {
+ synchronized (this) {
+ if (queryCache == null) {
+ queryCache = getQueryCacheFactory().getQueryCache(
+ Collections.EMPTY_MAP);
+ }
+ }
+ }
+
+ return queryCache;
+ }
+
+ /**
+ * @since 3.0
+ */
+ QueryCache getQueryCacheInternal() {
+ return queryCache;
}
}
Modified:
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/access/DataDomainQueryAction.java
URL:
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/access/DataDomainQueryAction.java?rev=426282&r1=426281&r2=426282&view=diff
==============================================================================
---
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/access/DataDomainQueryAction.java
(original)
+++
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/access/DataDomainQueryAction.java
Thu Jul 27 15:23:13 2006
@@ -33,6 +33,7 @@
import org.apache.cayenne.ObjectContext;
import org.apache.cayenne.ObjectId;
import org.apache.cayenne.QueryResponse;
+import org.apache.cayenne.cache.QueryCache;
import org.apache.cayenne.map.DataMap;
import org.apache.cayenne.map.DbRelationship;
import org.apache.cayenne.map.ObjEntity;
@@ -237,24 +238,29 @@
* @since 3.0
*/
private boolean interceptInvalidateQuery() {
+ if(domain.getQueryCacheInternal() == null) {
+ return !DONE;
+ }
+
if (query instanceof InvalidateListCacheQuery) {
InvalidateListCacheQuery invalidateQuery =
(InvalidateListCacheQuery) query;
- int count = 0;
- synchronized (cache) {
- Iterator it = cache.getCachedSnapshots().entrySet().iterator();
- while (it.hasNext()) {
- Map.Entry entry = (Map.Entry) it.next();
- if (invalidateQuery.matchesCacheKey((String)
entry.getKey())) {
- count++;
- it.remove();
- }
+ QueryCache queryCache = domain.getQueryCache();
+
+ if (invalidateQuery.getQueryNameKey() != null) {
+ queryCache.remove(invalidateQuery.getQueryNameKey());
+ }
+
+ String[] groupKeys = invalidateQuery.getGroupKeys();
+ if (groupKeys != null && groupKeys.length > 0) {
+ for (int i = 0; i < groupKeys.length; i++) {
+ queryCache.removeGroup(groupKeys[i]);
}
}
// ignore 'cascade' setting - we are at the bottom of the stack
already...
GenericResponse response = new GenericResponse();
- response.addUpdateCount(count);
+ response.addUpdateCount(1);
this.response = response;
return DONE;
}
@@ -266,8 +272,8 @@
* Wraps execution in shared cache checks
*/
private final boolean interceptSharedCache() {
- String cacheKey = metadata.getCacheKey();
- if (cacheKey == null) {
+
+ if (metadata.getCacheKey() == null) {
return !DONE;
}
@@ -279,8 +285,10 @@
return !DONE;
}
+ QueryCache queryCache = domain.getQueryCache();
+
if (cache) {
- List cachedRows = this.cache.getCachedSnapshots(cacheKey);
+ List cachedRows = queryCache.get(metadata);
if (cachedRows != null) {
// decorate result immutable list to avoid messing up the cache
@@ -305,7 +313,7 @@
list = new ListWithPrefetches(list, prefetchResultsByPath);
}
- this.cache.cacheSnapshots(cacheKey, list);
+ queryCache.put(metadata, list);
}
return DONE;
Modified:
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/access/DataRowStore.java
URL:
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/access/DataRowStore.java?rev=426282&r1=426281&r2=426282&view=diff
==============================================================================
---
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/access/DataRowStore.java
(original)
+++
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/access/DataRowStore.java
Thu Jul 27 15:23:13 2006
@@ -77,7 +77,6 @@
protected String name;
protected LRUMap snapshots;
- protected LRUMap snapshotLists;
protected boolean notifyingRemoteListeners;
protected transient EventManager eventManager;
@@ -182,10 +181,6 @@
// TODO: ENTRY EXPIRATION is not supported by commons LRU Map
this.snapshots = new LRUMap(snapshotsCacheSize);
- // TODO: cache size should really be a sum of all result lists sizes...
- // so we must track it outside the LRUMap...
- this.snapshotLists = new LRUMap(snapshotsCacheSize);
-
// init event bridge only if we are notifying remote listeners
if (notifyingRemoteListeners) {
try {
@@ -349,31 +344,6 @@
}
/**
- * @since 3.0
- */
- Map getCachedSnapshots() {
- return snapshotLists;
- }
-
- /**
- * Registers a list of snapshots with internal cache, using a String key.
- */
- public void cacheSnapshots(String key, List snapshots) {
- snapshotLists.put(key, snapshots);
- }
-
- /**
- * Returns a list of previously cached snapshots.
- */
- public List getCachedSnapshots(String key) {
- if (key == null) {
- return null;
- }
-
- return (List) snapshotLists.get(key);
- }
-
- /**
* Returns EventSubject used by this SnapshotCache to notify of snapshot
changes.
*/
public EventSubject getSnapshotEventSubject() {
@@ -385,7 +355,6 @@
*/
public synchronized void clear() {
snapshots.clear();
- snapshotLists.clear();
}
/**
Modified:
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/cache/MapQueryCache.java
URL:
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/cache/MapQueryCache.java?rev=426282&r1=426281&r2=426282&view=diff
==============================================================================
---
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/cache/MapQueryCache.java
(original)
+++
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/cache/MapQueryCache.java
Thu Jul 27 15:23:13 2006
@@ -80,8 +80,7 @@
}
}
- public void remove(QueryMetadata metadata) {
- String key = metadata.getCacheKey();
+ public void remove(String key) {
if (key != null) {
synchronized (this) {
map.remove(key);
@@ -100,6 +99,12 @@
}
}
}
+ }
+ }
+
+ public void clear() {
+ synchronized (this) {
+ map.clear();
}
}
Modified:
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/cache/OSQueryCache.java
URL:
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/cache/OSQueryCache.java?rev=426282&r1=426281&r2=426282&view=diff
==============================================================================
---
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/cache/OSQueryCache.java
(original)
+++
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/cache/OSQueryCache.java
Thu Jul 27 15:23:13 2006
@@ -73,10 +73,8 @@
}
}
- public void remove(QueryMetadata metadata) {
- String key = metadata.getCacheKey();
+ public void remove(String key) {
if (key != null) {
-
cache.removeEntry(key);
}
}
@@ -85,6 +83,10 @@
if (groupKey != null) {
cache.flushGroup(groupKey);
}
+ }
+
+ public void clear() {
+ cache.flushAll();
}
public int size() {
Modified:
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/cache/QueryCache.java
URL:
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/cache/QueryCache.java?rev=426282&r1=426281&r2=426282&view=diff
==============================================================================
---
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/cache/QueryCache.java
(original)
+++
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/cache/QueryCache.java
Thu Jul 27 15:23:13 2006
@@ -37,13 +37,18 @@
/**
* Removes a single entry from cache.
*/
- void remove(QueryMetadata metadata);
+ void remove(String key);
/**
* Removes a group of entries identified by group key. This may not be
supported by
* the implementation.
*/
void removeGroup(String groupKey);
+
+ /**
+ * Clears all entries.
+ */
+ void clear();
int size();
}
Modified:
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/query/InvalidateListCacheQuery.java
URL:
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/query/InvalidateListCacheQuery.java?rev=426282&r1=426281&r2=426282&view=diff
==============================================================================
---
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/query/InvalidateListCacheQuery.java
(original)
+++
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/query/InvalidateListCacheQuery.java
Thu Jul 27 15:23:13 2006
@@ -18,71 +18,50 @@
****************************************************************/
package org.apache.cayenne.query;
-import java.util.regex.Pattern;
-
import org.apache.cayenne.CayenneRuntimeException;
import org.apache.cayenne.map.EntityResolver;
/**
* A Query that allows to clear list caches. Lists to invalidate are located
by matching a
- * regex pattern against the cache key. For non-cascading query result
returned from the
- * query execution is the number of cached invalidated lists. For cascading
query the
- * result is undefined.
+ * either a query name or an array of "groups" (one common "group key" is
ObjEntity name).
*
* @since 3.0
* @author Andrus Adamchik
*/
public class InvalidateListCacheQuery implements Query {
- protected String cacheKeyPattern;
+ protected String queryNameKey;
+ protected String[] groupKeys;
protected boolean cascade;
- protected transient Pattern cacheKeyCompiledPattern;
-
// needed for hessian serialization
private InvalidateListCacheQuery() {
}
/**
- * Creates a new InvalidateCacheQuery.
+ * Creates a new InvalidateCacheQuery. Either "queryNameKey" or
"groupKeys" parameter
+ * (or both) will have to be specified; otherwise the query makes no sense.
*
- * @param cacheKeyPattern a String that can be compiled to a valid
- * java.regex.util.Pattern that will be used to match against
query cache
- * keys.
+ * @param queryNameKey a string that matches a cache key of a single query.
* @param cascade whether to invalidate cache in the local ObjectContext,
or to
* propagate the operation through the entire stack.
*/
- public InvalidateListCacheQuery(String cacheKeyPattern, boolean cascade) {
- this.cacheKeyPattern = cacheKeyPattern;
- this.cascade = cascade;
- }
-
- public boolean isCascade() {
- return cascade;
- }
-
- public Pattern getCacheKeyCompiledPattern() {
+ public InvalidateListCacheQuery(String queryNameKey, String[] groupKeys,
+ boolean cascade) {
- // compiling pattern lazily is good for serialization
- if (cacheKeyCompiledPattern == null) {
- cacheKeyCompiledPattern = Pattern.compile(cacheKeyPattern);
+ if (queryNameKey == null && (groupKeys == null || groupKeys.length ==
0)) {
+ throw new IllegalArgumentException(
+ "Either \"queryNameKey\" or \"groupKeys\" parameter (or
both) must be specified");
}
- return cacheKeyCompiledPattern;
- }
-
- public String getCacheKeyPattern() {
- return cacheKeyPattern;
+ this.queryNameKey = queryNameKey;
+ this.groupKeys = groupKeys;
+ this.cascade = cascade;
}
- /**
- * Returns true if the cache key argument matches the pattern.
- */
- public boolean matchesCacheKey(String cacheKey) {
- return cacheKey == null ? false : getCacheKeyCompiledPattern()
- .matcher(cacheKey)
- .matches();
+ public boolean isCascade() {
+ return cascade;
}
public QueryMetadata getMetaData(EntityResolver resolver) {
@@ -99,5 +78,21 @@
public SQLAction createSQLAction(SQLActionVisitor visitor) {
throw new CayenneRuntimeException("Unsupported operation");
+ }
+
+ public String[] getGroupKeys() {
+ return groupKeys;
+ }
+
+ public void setGroupKeys(String[] groupKeys) {
+ this.groupKeys = groupKeys;
+ }
+
+ public String getQueryNameKey() {
+ return queryNameKey;
+ }
+
+ public void setQueryNameKey(String queryNameKey) {
+ this.queryNameKey = queryNameKey;
}
}
Modified:
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/tests/java/org/apache/cayenne/access/DataContextNamedQueryCachingTst.java
URL:
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/tests/java/org/apache/cayenne/access/DataContextNamedQueryCachingTst.java?rev=426282&r1=426281&r2=426282&view=diff
==============================================================================
---
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/tests/java/org/apache/cayenne/access/DataContextNamedQueryCachingTst.java
(original)
+++
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/tests/java/org/apache/cayenne/access/DataContextNamedQueryCachingTst.java
Thu Jul 27 15:23:13 2006
@@ -47,8 +47,7 @@
assertNull(context.getQueryCache().get(cacheKey));
context.performQuery("ParameterizedQueryWithSharedCache", false);
- Object cached =
getDomain().getSharedSnapshotCache().getCachedSnapshots(
- cacheKey.getCacheKey());
+ Object cached = getDomain().getQueryCache().get(cacheKey);
assertEquals(4, ((Collection) cached).size());
assertNotNull(
@@ -58,8 +57,7 @@
// get from cache
context.performQuery("ParameterizedQueryWithSharedCache", false);
- assertSame(cached,
getDomain().getSharedSnapshotCache().getCachedSnapshots(
- cacheKey.getCacheKey()));
+ assertSame(cached, getDomain().getQueryCache().get(cacheKey));
// delete one record
int[] counts = context.performNonSelectingQuery(new SQLTemplate(
@@ -70,8 +68,7 @@
// refresh
List objects1 =
context.performQuery("ParameterizedQueryWithSharedCache", true);
- Object cached1 =
getDomain().getSharedSnapshotCache().getCachedSnapshots(
- cacheKey.getCacheKey());
+ Object cached1 = getDomain().getQueryCache().get(cacheKey);
assertNotNull(
"Failed to cache results of refreshing NamedQuery that points
to a caching query",
cached1);
@@ -139,8 +136,7 @@
assertNull(context.getQueryCache().get(cacheKey));
context.performQuery(q1);
- Object cached =
getDomain().getSharedSnapshotCache().getCachedSnapshots(
- cacheKey.getCacheKey());
+ Object cached = getDomain().getQueryCache().get(cacheKey);
assertNotNull(
"Failed to cache results of a NamedQuery that points to a
caching query",
@@ -149,16 +145,14 @@
// get from cache
context.performQuery(q1);
- assertSame(cached,
getDomain().getSharedSnapshotCache().getCachedSnapshots(
- cacheKey.getCacheKey()));
+ assertSame(cached, getDomain().getQueryCache().get(cacheKey));
// refresh
q1.setForceNoCache(true);
context.performQuery(q1);
- Object cached1 =
getDomain().getSharedSnapshotCache().getCachedSnapshots(
- cacheKey.getCacheKey());
+ Object cached1 = getDomain().getQueryCache().get(cacheKey);
assertNotNull(
"Failed to cache results of refreshing NamedQuery that points
to a caching query",
cached1);
Modified:
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/tests/java/org/apache/cayenne/access/DataContextQueryCachingTst.java
URL:
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/tests/java/org/apache/cayenne/access/DataContextQueryCachingTst.java?rev=426282&r1=426281&r2=426282&view=diff
==============================================================================
---
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/tests/java/org/apache/cayenne/access/DataContextQueryCachingTst.java
(original)
+++
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/tests/java/org/apache/cayenne/access/DataContextQueryCachingTst.java
Thu Jul 27 15:23:13 2006
@@ -35,17 +35,12 @@
*/
public class DataContextQueryCachingTst extends CayenneTestCase {
- protected DataRowStore dataRowCache;
protected DataContext context;
protected void setUp() throws Exception {
super.setUp();
context = createDataContextWithSharedCache();
- dataRowCache = getDomain().getSharedSnapshotCache();
-
- // the above should clear shared cache before the run, but just in case
- dataRowCache.clear();
}
protected DataContext createDataContextNoCacheClear() {
@@ -70,7 +65,6 @@
List resultRows = context.performQuery(select);
assertEquals(1, engine.getRunCount());
assertEquals(rows, resultRows);
- assertNull(dataRowCache.getCachedSnapshots("c"));
QueryMetadata cacheKey = new MockQueryMetadata() {
@@ -79,6 +73,7 @@
}
};
+
assertNull(context.getParentDataDomain().getQueryCache().get(cacheKey));
assertEquals(rows, context.getQueryCache().get(cacheKey));
// now the query with the same name must run from cache
@@ -110,14 +105,15 @@
List resultRows = context.performQuery(select);
assertEquals(1, engine.getRunCount());
assertEquals(rows1, resultRows);
- assertNull(dataRowCache.getCachedSnapshots("c"));
-
+
QueryMetadata cacheKey = new MockQueryMetadata() {
public String getCacheKey() {
return "c";
}
};
+
assertNull(context.getParentDataDomain().getQueryCache().get(cacheKey));
+
assertEquals(rows1, context.getQueryCache().get(cacheKey));
// second run, must refresh the cache
@@ -128,7 +124,7 @@
List freshResultRows = context.performQuery(select);
assertEquals(1, engine.getRunCount());
assertEquals(rows2, freshResultRows);
- assertNull(dataRowCache.getCachedSnapshots("c"));
+
assertNull(context.getParentDataDomain().getQueryCache().get(cacheKey));
assertEquals(rows2, context.getQueryCache().get(cacheKey));
}
finally {
@@ -160,9 +156,12 @@
return "c";
}
};
-
+
assertNull(context.getQueryCache().get(cacheKey));
- assertEquals(rows, dataRowCache.getCachedSnapshots("c"));
+ assertEquals(rows, context
+ .getParentDataDomain()
+ .getQueryCache()
+ .get(cacheKey));
// now the query with the same name must run from cache
engine.reset();
@@ -199,13 +198,17 @@
List resultRows = context.performQuery(select);
assertEquals(1, engine.getRunCount());
assertEquals(rows1, resultRows);
- assertEquals(rows1, dataRowCache.getCachedSnapshots("c"));
+
QueryMetadata cacheKey = new MockQueryMetadata() {
public String getCacheKey() {
return "c";
}
};
+
+ assertEquals(rows1,
context.getParentDataDomain().getQueryCache().get(
+ cacheKey));
+
assertNull(context.getQueryCache().get(cacheKey));
// second run, must refresh the cache
@@ -216,7 +219,8 @@
List freshResultRows = context.performQuery(select);
assertEquals(1, engine.getRunCount());
assertEquals(rows2, freshResultRows);
- assertEquals(rows2, dataRowCache.getCachedSnapshots("c"));
+ assertEquals(rows2,
context.getParentDataDomain().getQueryCache().get(
+ cacheKey));
assertNull(context.getQueryCache().get(cacheKey));
}
finally {
@@ -242,13 +246,14 @@
assertEquals(1, engine.getRunCount());
assertEquals(2, resultRows.size());
assertTrue(resultRows.get(0) instanceof DataObject);
- assertNull(dataRowCache.getCachedSnapshots("c"));
QueryMetadata cacheKey = new MockQueryMetadata() {
public String getCacheKey() {
return "c";
}
};
+
assertNull(context.getParentDataDomain().getQueryCache().get(cacheKey));
+
assertEquals(resultRows, context.getQueryCache().get(cacheKey));
// second run, must refresh the cache
@@ -261,7 +266,7 @@
assertEquals(1, engine.getRunCount());
assertEquals(4, freshResultRows.size());
assertTrue(resultRows.get(0) instanceof DataObject);
- assertNull(dataRowCache.getCachedSnapshots("c"));
+
assertNull(context.getParentDataDomain().getQueryCache().get(cacheKey));
assertEquals(freshResultRows,
context.getQueryCache().get(cacheKey));
}
finally {
@@ -288,13 +293,15 @@
assertEquals(1, engine.getRunCount());
assertEquals(2, resultRows.size());
assertTrue(resultRows.get(0) instanceof DataObject);
- assertNull(dataRowCache.getCachedSnapshots("c"));
+
QueryMetadata cacheKey = new MockQueryMetadata() {
public String getCacheKey() {
return "c";
}
};
+
assertNull(context.getParentDataDomain().getQueryCache().get(cacheKey));
+
assertEquals(resultRows, context.getQueryCache().get(cacheKey));
// now the query with the same name must run from cache
@@ -334,7 +341,10 @@
}
};
assertNull(context.getQueryCache().get(cacheKey));
- assertEquals(rows, dataRowCache.getCachedSnapshots("c"));
+ assertEquals(rows, context
+ .getParentDataDomain()
+ .getQueryCache()
+ .get(cacheKey));
// now the query with the same name must run from cache
engine.reset();
Modified:
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/tests/java/org/apache/cayenne/access/DataRowStoreTst.java
URL:
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/tests/java/org/apache/cayenne/access/DataRowStoreTst.java?rev=426282&r1=426281&r2=426282&view=diff
==============================================================================
---
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/tests/java/org/apache/cayenne/access/DataRowStoreTst.java
(original)
+++
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/tests/java/org/apache/cayenne/access/DataRowStoreTst.java
Thu Jul 27 15:23:13 2006
@@ -17,13 +17,10 @@
* under the License.
****************************************************************/
-
package org.apache.cayenne.access;
-import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
import org.apache.art.Artist;
@@ -40,38 +37,32 @@
DataRowStore cache = new DataRowStore("cacheXYZ");
assertEquals("cacheXYZ", cache.getName());
assertNotNull(cache.getSnapshotEventSubject());
- assertTrue(
-
cache.getSnapshotEventSubject().getSubjectName().indexOf("cacheXYZ") >= 0);
+
assertTrue(cache.getSnapshotEventSubject().getSubjectName().indexOf("cacheXYZ")
>= 0);
- assertEquals(
- DataRowStore.REMOTE_NOTIFICATION_DEFAULT,
- cache.isNotifyingRemoteListeners());
+ assertEquals(DataRowStore.REMOTE_NOTIFICATION_DEFAULT, cache
+ .isNotifyingRemoteListeners());
}
public void testConstructorWithProperties() {
Map props = new HashMap();
- props.put(
- DataRowStore.REMOTE_NOTIFICATION_PROPERTY,
- String.valueOf(!DataRowStore.REMOTE_NOTIFICATION_DEFAULT));
+ props.put(DataRowStore.REMOTE_NOTIFICATION_PROPERTY, String
+ .valueOf(!DataRowStore.REMOTE_NOTIFICATION_DEFAULT));
DataRowStore cache = new DataRowStore("cacheXYZ", props);
assertEquals("cacheXYZ", cache.getName());
- assertEquals(
- !DataRowStore.REMOTE_NOTIFICATION_DEFAULT,
- cache.isNotifyingRemoteListeners());
+ assertEquals(!DataRowStore.REMOTE_NOTIFICATION_DEFAULT, cache
+ .isNotifyingRemoteListeners());
}
public void testNotifyingRemoteListeners() {
DataRowStore cache = new DataRowStore("cacheXYZ");
- assertEquals(
- DataRowStore.REMOTE_NOTIFICATION_DEFAULT,
- cache.isNotifyingRemoteListeners());
+ assertEquals(DataRowStore.REMOTE_NOTIFICATION_DEFAULT, cache
+ .isNotifyingRemoteListeners());
cache.setNotifyingRemoteListeners(!DataRowStore.REMOTE_NOTIFICATION_DEFAULT);
- assertEquals(
- !DataRowStore.REMOTE_NOTIFICATION_DEFAULT,
- cache.isNotifyingRemoteListeners());
+ assertEquals(!DataRowStore.REMOTE_NOTIFICATION_DEFAULT, cache
+ .isNotifyingRemoteListeners());
}
/**
@@ -97,28 +88,32 @@
Map diff3 = new HashMap();
diff3.put(key3, new DataRow(1));
- cache.processSnapshotChanges(this, diff1, Collections.EMPTY_LIST,
Collections.EMPTY_LIST, Collections.EMPTY_LIST);
+ cache.processSnapshotChanges(
+ this,
+ diff1,
+ Collections.EMPTY_LIST,
+ Collections.EMPTY_LIST,
+ Collections.EMPTY_LIST);
assertEquals(1, cache.size());
- cache.processSnapshotChanges(this, diff2, Collections.EMPTY_LIST,
Collections.EMPTY_LIST, Collections.EMPTY_LIST);
+ cache.processSnapshotChanges(
+ this,
+ diff2,
+ Collections.EMPTY_LIST,
+ Collections.EMPTY_LIST,
+ Collections.EMPTY_LIST);
assertEquals(2, cache.size());
// this addition must overflow the cache, and throw out the first item
- cache.processSnapshotChanges(this, diff3, Collections.EMPTY_LIST,
Collections.EMPTY_LIST, Collections.EMPTY_LIST);
+ cache.processSnapshotChanges(
+ this,
+ diff3,
+ Collections.EMPTY_LIST,
+ Collections.EMPTY_LIST,
+ Collections.EMPTY_LIST);
assertEquals(2, cache.size());
assertNotNull(cache.getCachedSnapshot(key2));
assertNotNull(cache.getCachedSnapshot(key3));
assertNull(cache.getCachedSnapshot(key1));
- }
-
- public void testCachedSnapshots() throws Exception {
- DataRowStore resultStore = new DataRowStore("test");
-
- List list = new ArrayList();
-
- assertNull(resultStore.getCachedSnapshots("key"));
-
- resultStore.cacheSnapshots("key", list);
- assertSame(list, resultStore.getCachedSnapshots("key"));
}
}
Modified:
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/tests/java/org/apache/cayenne/query/InvalidateListCacheQueryTst.java
URL:
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/tests/java/org/apache/cayenne/query/InvalidateListCacheQueryTst.java?rev=426282&r1=426281&r2=426282&view=diff
==============================================================================
---
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/tests/java/org/apache/cayenne/query/InvalidateListCacheQueryTst.java
(original)
+++
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/tests/java/org/apache/cayenne/query/InvalidateListCacheQueryTst.java
Thu Jul 27 15:23:13 2006
@@ -25,30 +25,9 @@
public class InvalidateListCacheQueryTst extends TestCase {
- public void testMatchesCacheKey() {
-
- InvalidateListCacheQuery q1 = new InvalidateListCacheQuery("abc.",
true);
-
- assertTrue(q1.matchesCacheKey("abcd"));
- assertTrue(q1.matchesCacheKey("abc4"));
-
- assertFalse(q1.matchesCacheKey("abcde"));
- assertFalse(q1.matchesCacheKey("abc"));
- assertFalse(q1.matchesCacheKey("xxxx"));
-
- InvalidateListCacheQuery q2 = new InvalidateListCacheQuery("abc.*",
true);
-
- assertTrue(q2.matchesCacheKey("abcd"));
- assertTrue(q2.matchesCacheKey("abc4"));
-
- assertTrue(q2.matchesCacheKey("abcde"));
- assertTrue(q2.matchesCacheKey("abc"));
-
- assertFalse(q2.matchesCacheKey("xxxx"));
- }
public void testSerializabilityWithHessian() throws Exception {
- InvalidateListCacheQuery o = new InvalidateListCacheQuery("XXX", true);
+ InvalidateListCacheQuery o = new InvalidateListCacheQuery("XXX", new
String[] {"a", "b"}, true);
Object clone = HessianUtil.cloneViaClientServerSerialization(
o,
new EntityResolver());
@@ -57,7 +36,10 @@
InvalidateListCacheQuery c1 = (InvalidateListCacheQuery) clone;
assertNotSame(o, c1);
- assertEquals(o.getCacheKeyPattern(), c1.getCacheKeyPattern());
+ assertEquals("XXX", c1.getQueryNameKey());
+ assertEquals(2, c1.getGroupKeys().length);
+ assertEquals("a", c1.getGroupKeys()[0]);
+ assertEquals("b", c1.getGroupKeys()[1]);
assertTrue(c1.isCascade());
}
}
Modified:
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/tests/java/org/apache/cayenne/unit/CayenneTestCase.java
URL:
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/tests/java/org/apache/cayenne/unit/CayenneTestCase.java?rev=426282&r1=426281&r2=426282&view=diff
==============================================================================
---
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/tests/java/org/apache/cayenne/unit/CayenneTestCase.java
(original)
+++
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/tests/java/org/apache/cayenne/unit/CayenneTestCase.java
Thu Jul 27 15:23:13 2006
@@ -141,6 +141,7 @@
// clear cache...
getDomain().getSharedSnapshotCache().clear();
+ getDomain().getQueryCache().clear();
DataContext context = getDomain().createDataContext(true);
assertSame(getDomain().getSharedSnapshotCache(), context