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 2006/08/21 11:42:06 UTC
svn commit: r433204 - in
/incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src:
main/java/org/apache/cayenne/ main/java/org/apache/cayenne/access/
test/java/org/apache/cayenne/access/
Author: aadamchik
Date: Mon Aug 21 02:42:02 2006
New Revision: 433204
URL: http://svn.apache.org/viewvc?rev=433204&view=rev
Log:
CAY-632 - "refresh all" functionality
Modified:
incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/CayenneContextQueryAction.java
incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/access/DataContextQueryAction.java
incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java
incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/test/java/org/apache/cayenne/access/RefreshQueryInContextTst.java
Modified: incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/CayenneContextQueryAction.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/CayenneContextQueryAction.java?rev=433204&r1=433203&r2=433204&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/CayenneContextQueryAction.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/CayenneContextQueryAction.java Mon Aug 21 02:42:02 2006
@@ -109,38 +109,34 @@
CayenneContext context = (CayenneContext) actingContext;
- // handle three separate scenarious, but do not combine them as it will be
+ // handle 4 separate scenarious, but do not combine them as it will be
// unclear how to handle cascading behavior
- // 1. invalidate object collection
+ // 1. refresh all
+ if (refreshQuery.isRefreshAll()) {
+
+ invalidateLocally(context.internalGraphManager(), context
+ .internalGraphManager()
+ .registeredNodes()
+ .iterator());
+ context.getQueryCache().clear();
+
+ // cascade
+ return !DONE;
+ }
+
+ // 2. invalidate object collection
Collection objects = refreshQuery.getObjects();
if (objects != null && !objects.isEmpty()) {
- CayenneContextGraphManager graphManager = context.internalGraphManager();
-
- Iterator it = objects.iterator();
- while (it.hasNext()) {
- Persistent object = (Persistent) it.next();
-
- // we don't care about NEW objects,
- // but we still do care about HOLLOW, since snapshot might still be
- // present
- if (object.getPersistenceState() == PersistenceState.NEW) {
- continue;
- }
-
- object.setPersistenceState(PersistenceState.HOLLOW);
-
- // remove cached changes
- graphManager.changeLog.unregisterNode(object.getObjectId());
- graphManager.stateLog.unregisterNode(object.getObjectId());
- }
+ invalidateLocally(context.internalGraphManager(), objects.iterator());
// cascade
return !DONE;
}
- // 2. refresh query - have to do it eagerly to refresh the objects involved
- else if (refreshQuery.getQuery() != null) {
+
+ // 3. refresh query - have to do it eagerly to refresh the objects involved
+ if (refreshQuery.getQuery() != null) {
Query cachedQuery = refreshQuery.getQuery();
String cacheKey = cachedQuery
@@ -153,8 +149,9 @@
// do not cascade to avoid running query twice
return DONE;
}
- // 3. refresh groups...
- else if (refreshQuery.getGroupKeys() != null
+
+ // 4. refresh groups...
+ if (refreshQuery.getGroupKeys() != null
&& refreshQuery.getGroupKeys().length > 0) {
String[] groups = refreshQuery.getGroupKeys();
@@ -168,5 +165,24 @@
}
return !DONE;
+ }
+
+ private void invalidateLocally(CayenneContextGraphManager graphManager, Iterator it) {
+ while (it.hasNext()) {
+ Persistent object = (Persistent) it.next();
+
+ // we don't care about NEW objects,
+ // but we still do care about HOLLOW, since snapshot might still be
+ // present
+ if (object.getPersistenceState() == PersistenceState.NEW) {
+ continue;
+ }
+
+ object.setPersistenceState(PersistenceState.HOLLOW);
+
+ // remove cached changes
+ graphManager.changeLog.unregisterNode(object.getObjectId());
+ graphManager.stateLog.unregisterNode(object.getObjectId());
+ }
}
}
Modified: incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/access/DataContextQueryAction.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/access/DataContextQueryAction.java?rev=433204&r1=433203&r2=433204&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/access/DataContextQueryAction.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/access/DataContextQueryAction.java Mon Aug 21 02:42:02 2006
@@ -146,38 +146,39 @@
DataContext context = (DataContext) actingContext;
- // handle three separate scenarious, but do not combine them as it will be
+ // handle four separate cases, but do not combine them as it will be
// unclear how to handle cascading behavior
- // 1. invalidate object collection
- Collection objects = refreshQuery.getObjects();
- if (objects != null && !objects.isEmpty()) {
+ // 1. refresh all
+ if (refreshQuery.isRefreshAll()) {
+ synchronized (context.getObjectStore()) {
+
+ invalidateLocally(context.getObjectStore(), context
+ .getObjectStore()
+ .getObjectIterator());
- Map diffMap = context.getObjectStore().getChangesByObjectId();
+ context.getQueryCache().clear();
+ }
- Iterator it = objects.iterator();
- while (it.hasNext()) {
- Persistent object = (Persistent) it.next();
-
- // we don't care about NEW objects,
- // but we still do care about HOLLOW, since snapshot might still be
- // present
- if (object.getPersistenceState() == PersistenceState.NEW) {
- continue;
- }
+ // cascade
+ return !DONE;
+ }
- object.setPersistenceState(PersistenceState.HOLLOW);
+ // 2. invalidate object collection
+ Collection objects = refreshQuery.getObjects();
+ if (objects != null && !objects.isEmpty()) {
- // remove cached changes
- diffMap.remove(object.getObjectId());
+ synchronized (context.getObjectStore()) {
+ invalidateLocally(context.getObjectStore(), objects.iterator());
}
// cascade
return !DONE;
}
- // 2. refresh query - have to do it eagerly to refresh the objects involved
- else if (refreshQuery.getQuery() != null) {
- Query cachedQuery = refreshQuery.getQuery();
+
+ // 3. refresh query - have to do it eagerly to refresh the objects involved
+ Query cachedQuery = refreshQuery.getQuery();
+ if (cachedQuery != null) {
String cacheKey = cachedQuery
.getMetaData(context.getEntityResolver())
@@ -189,11 +190,11 @@
// do not cascade to avoid running query twice
return DONE;
}
- // 3. refresh groups...
- else if (refreshQuery.getGroupKeys() != null
- && refreshQuery.getGroupKeys().length > 0) {
- String[] groups = refreshQuery.getGroupKeys();
+ // 4. refresh groups...
+ String[] groups = refreshQuery.getGroupKeys();
+ if (groups != null && groups.length > 0) {
+
for (int i = 0; i < groups.length; i++) {
context.getQueryCache().removeGroup(groups[i]);
}
@@ -201,8 +202,35 @@
// cascade group invalidation
return !DONE;
}
+
+ // shouldn't ever happen
+ return DONE;
}
return !DONE;
+ }
+
+ private void invalidateLocally(ObjectStore objectStore, Iterator it) {
+ Map diffMap = objectStore.getChangesByObjectId();
+
+ while (it.hasNext()) {
+ Persistent object = (Persistent) it.next();
+
+ int state = object.getPersistenceState();
+
+ // we don't care about NEW objects,
+ // but we still do care about HOLLOW, since snapshot might still
+ // be present
+ if (state == PersistenceState.NEW) {
+ continue;
+ }
+
+ if (state == PersistenceState.MODIFIED || state == PersistenceState.DELETED) {
+ // remove cached changes
+ diffMap.remove(object.getObjectId());
+ }
+
+ object.setPersistenceState(PersistenceState.HOLLOW);
+ }
}
}
Modified: incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java?rev=433204&r1=433203&r2=433204&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java Mon Aug 21 02:42:02 2006
@@ -243,6 +243,18 @@
if (query instanceof RefreshQuery) {
RefreshQuery refreshQuery = (RefreshQuery) query;
+ if (refreshQuery.isRefreshAll()) {
+
+ // not sending any events - peer contexts will not get refreshed
+ domain.getSharedSnapshotCache().clear();
+ context.getQueryCache().clear();
+
+ GenericResponse response = new GenericResponse();
+ response.addUpdateCount(1);
+ this.response = response;
+ return DONE;
+ }
+
Collection objects = refreshQuery.getObjects();
if (objects != null && !objects.isEmpty()) {
@@ -268,9 +280,10 @@
this.response = response;
return DONE;
}
- // 2. refresh query - this shouldn't normally happen as child datacontext
+
+ // 3. refresh query - this shouldn't normally happen as child datacontext
// usually does a cascading refresh
- else if (refreshQuery.getQuery() != null) {
+ if (refreshQuery.getQuery() != null) {
Query cachedQuery = refreshQuery.getQuery();
String cacheKey = cachedQuery
@@ -281,8 +294,9 @@
this.response = domain.onQuery(context, cachedQuery);
return DONE;
}
- // 3. refresh groups...
- else if (refreshQuery.getGroupKeys() != null
+
+ // 4. refresh groups...
+ if (refreshQuery.getGroupKeys() != null
&& refreshQuery.getGroupKeys().length > 0) {
String[] groups = refreshQuery.getGroupKeys();
Modified: incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/test/java/org/apache/cayenne/access/RefreshQueryInContextTst.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/test/java/org/apache/cayenne/access/RefreshQueryInContextTst.java?rev=433204&r1=433203&r2=433204&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/test/java/org/apache/cayenne/access/RefreshQueryInContextTst.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/test/java/org/apache/cayenne/access/RefreshQueryInContextTst.java Mon Aug 21 02:42:02 2006
@@ -221,7 +221,7 @@
assertEquals("c", p1.getToArtist().getArtistName());
assertEquals("b", p2.getToArtist().getArtistName());
}
-
+
public void testRefreshQueryResultsSharedCache() throws Exception {
deleteTestData();
createTestData("testRefreshCollection");
@@ -347,5 +347,63 @@
assertNotSame(a1, p2.getToArtist());
assertEquals("c", p1.getToArtist().getArtistName());
assertEquals("b", p2.getToArtist().getArtistName());
+ }
+
+ public void testRefreshAll() throws Exception {
+ deleteTestData();
+ createTestData("testRefreshCollection");
+
+ DataContext context = createDataContext();
+
+ SelectQuery q = new SelectQuery(Artist.class);
+ q.addOrdering("db:ARTIST_ID", true);
+ List artists = context.performQuery(q);
+
+ Artist a1 = (Artist) artists.get(0);
+ Artist a2 = (Artist) artists.get(1);
+ Painting p1 = (Painting) a1.getPaintingArray().get(0);
+ Painting p2 = (Painting) a1.getPaintingArray().get(0);
+
+ assertNotNull(context
+ .getParentDataDomain()
+ .getSharedSnapshotCache()
+ .getCachedSnapshot(a1.getObjectId()));
+ assertNotNull(context
+ .getParentDataDomain()
+ .getSharedSnapshotCache()
+ .getCachedSnapshot(a2.getObjectId()));
+ assertNotNull(context
+ .getParentDataDomain()
+ .getSharedSnapshotCache()
+ .getCachedSnapshot(p1.getObjectId()));
+ assertNotNull(context
+ .getParentDataDomain()
+ .getSharedSnapshotCache()
+ .getCachedSnapshot(p2.getObjectId()));
+
+ RefreshQuery refresh = new RefreshQuery();
+ context.performQuery(refresh);
+
+ assertNull(context
+ .getParentDataDomain()
+ .getSharedSnapshotCache()
+ .getCachedSnapshot(a1.getObjectId()));
+ assertNull(context
+ .getParentDataDomain()
+ .getSharedSnapshotCache()
+ .getCachedSnapshot(a2.getObjectId()));
+ assertNull(context
+ .getParentDataDomain()
+ .getSharedSnapshotCache()
+ .getCachedSnapshot(p1.getObjectId()));
+ assertNull(context
+ .getParentDataDomain()
+ .getSharedSnapshotCache()
+ .getCachedSnapshot(p2.getObjectId()));
+
+ assertEquals(PersistenceState.HOLLOW, a1.getPersistenceState());
+ assertEquals(PersistenceState.HOLLOW, a2.getPersistenceState());
+ assertEquals(PersistenceState.HOLLOW, p1.getPersistenceState());
+ assertEquals(PersistenceState.HOLLOW, p2.getPersistenceState());
}
}