You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2008/02/03 23:04:30 UTC

svn commit: r618101 - in /cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src: main/java/org/apache/cayenne/graph/GraphDiffCompressor.java test/java/org/apache/cayenne/CayenneContextGraphDiffCompressorTest.java

Author: aadamchik
Date: Sun Feb  3 14:04:28 2008
New Revision: 618101

URL: http://svn.apache.org/viewvc?rev=618101&view=rev
Log:
CAY-971 ROP GraphDiff "compressor"
(canceling complimentary arc diffs)

Modified:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/graph/GraphDiffCompressor.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/CayenneContextGraphDiffCompressorTest.java

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/graph/GraphDiffCompressor.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/graph/GraphDiffCompressor.java?rev=618101&r1=618100&r2=618101&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/graph/GraphDiffCompressor.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/graph/GraphDiffCompressor.java Sun Feb  3 14:04:28 2008
@@ -52,10 +52,48 @@
         }
 
         public void arcCreated(Object nodeId, Object targetNodeId, Object arcId) {
+
+            if (targetNodeId != null) {
+                List<NodeDiff> diffs = diffsByNode.get(nodeId);
+                if (diffs != null) {
+                    for (int i = diffs.size() - 1; i >= 0; i--) {
+                        NodeDiff diff = diffs.get(i);
+                        if (diff instanceof ArcDeleteOperation) {
+                            ArcDeleteOperation arcDiff = (ArcDeleteOperation) diff;
+                            if (arcId.equals(arcDiff.getArcId())
+                                    && targetNodeId.equals(arcDiff.targetNodeId)) {
+                                diffs.remove(i);
+                                compressed.remove(arcDiff);
+                                return;
+                            }
+                        }
+                    }
+                }
+            }
+
             registerDiff(new ArcCreateOperation(nodeId, targetNodeId, arcId));
         }
 
         public void arcDeleted(Object nodeId, Object targetNodeId, Object arcId) {
+
+            if (targetNodeId != null) {
+                List<NodeDiff> diffs = diffsByNode.get(nodeId);
+                if (diffs != null) {
+                    for (int i = diffs.size() - 1; i >= 0; i--) {
+                        NodeDiff diff = diffs.get(i);
+                        if (diff instanceof ArcCreateOperation) {
+                            ArcCreateOperation arcDiff = (ArcCreateOperation) diff;
+                            if (arcId.equals(arcDiff.getArcId())
+                                    && targetNodeId.equals(arcDiff.targetNodeId)) {
+                                diffs.remove(i);
+                                compressed.remove(arcDiff);
+                                return;
+                            }
+                        }
+                    }
+                }
+            }
+
             registerDiff(new ArcDeleteOperation(nodeId, targetNodeId, arcId));
         }
 

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/CayenneContextGraphDiffCompressorTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/CayenneContextGraphDiffCompressorTest.java?rev=618101&r1=618100&r2=618101&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/CayenneContextGraphDiffCompressorTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/CayenneContextGraphDiffCompressorTest.java Sun Feb  3 14:04:28 2008
@@ -25,6 +25,7 @@
 import org.apache.cayenne.remote.ClientChannel;
 import org.apache.cayenne.remote.service.LocalConnection;
 import org.apache.cayenne.testdo.mt.ClientMtTable1;
+import org.apache.cayenne.testdo.mt.ClientMtTable2;
 import org.apache.cayenne.unit.AccessStack;
 import org.apache.cayenne.unit.CayenneCase;
 import org.apache.cayenne.unit.CayenneResources;
@@ -43,19 +44,38 @@
                 LocalConnection.HESSIAN_SERIALIZATION);
         ClientChannel channel = new ClientChannel(connection);
         CayenneContext context = new CayenneContext(channel);
-        
-        
+
         ClientMtTable1 o1 = context.newObject(ClientMtTable1.class);
         o1.setGlobalAttribute1("v1");
         o1.setGlobalAttribute1("v2");
-        
+
         context.commitChanges();
         assertEquals(1, serverChannel.nodePropertiesChanged);
         assertEquals(1, serverChannel.nodesCreated);
     }
 
+    public void testComplimentaryArcs() {
+        DiffCounter serverChannel = new DiffCounter(getDomain());
+        LocalConnection connection = new LocalConnection(
+                serverChannel,
+                LocalConnection.HESSIAN_SERIALIZATION);
+        ClientChannel channel = new ClientChannel(connection);
+        CayenneContext context = new CayenneContext(channel);
+
+        ClientMtTable1 o1 = context.newObject(ClientMtTable1.class);
+        ClientMtTable2 o2 = context.newObject(ClientMtTable2.class);
+        o2.setTable1(o1);
+        o2.setTable1(null);
+
+        context.commitChanges();
+        assertEquals(0, serverChannel.nodePropertiesChanged);
+        assertEquals(2, serverChannel.nodesCreated);
+        assertEquals(0, serverChannel.arcsCreated);
+        assertEquals(0, serverChannel.arcsDeleted);
+    }
+
     final class DiffCounter extends ClientServerChannel implements GraphChangeHandler {
-        
+
         int arcsCreated;
         int arcsDeleted;
         int nodesCreated;
@@ -66,15 +86,15 @@
         public DiffCounter(DataDomain domain) {
             super(domain);
         }
-        
+
         @Override
         public GraphDiff onSync(
                 ObjectContext originatingContext,
                 GraphDiff changes,
                 int syncType) {
-            
+
             changes.apply(this);
-            
+
             return super.onSync(originatingContext, changes, syncType);
         }