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


Reply via email to