Skip to content

Commit 2a65494

Browse files
committed
Fix nodes/edges are re-added to removedNodes / removedEdges on every subsequent diff because the cache entry is never nulled after detection
1 parent 215f828 commit 2a65494

2 files changed

Lines changed: 57 additions & 4 deletions

File tree

src/main/java/org/gephi/graph/impl/GraphObserverImpl.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -119,10 +119,11 @@ protected void refreshDiff() {
119119
if (nodeVersion < graphVersion.nodeVersion) {
120120
int maxStoreId = graphStore.nodeStore.maxStoreId();
121121

122-
for (Node n : nodeCache) {
123-
NodeImpl nImpl = (NodeImpl) n;
122+
for (int i = 0; i < nodeCache.length; i++) {
123+
NodeImpl nImpl = nodeCache[i];
124124
if (nImpl != null && !graph.contains(nImpl)) {
125125
graphDiff.removedNodes.add(nImpl);
126+
nodeCache[i] = null;
126127
}
127128
}
128129
if (maxStoreId > nodeCache.length || maxStoreId < nodeCache.length) {
@@ -145,10 +146,11 @@ protected void refreshDiff() {
145146
if (edgeVersion < graphVersion.edgeVersion) {
146147
int maxStoreId = graphStore.edgeStore.maxStoreId();
147148

148-
for (Edge e : edgeCache) {
149-
EdgeImpl eImpl = (EdgeImpl) e;
149+
for (int i = 0; i < edgeCache.length; i++) {
150+
EdgeImpl eImpl = edgeCache[i];
150151
if (eImpl != null && !graph.contains(eImpl)) {
151152
graphDiff.removedEdges.add(eImpl);
153+
edgeCache[i] = null;
152154
}
153155
}
154156
if (maxStoreId > edgeCache.length || maxStoreId < edgeCache.length) {

src/test/java/org/gephi/graph/impl/GraphObserverTest.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,57 @@ public void testDiffRemoveAllNodes() {
389389
Assert.assertSame(diff.getAddedNodes(), NodeIterable.EMPTY);
390390
}
391391

392+
@Test
393+
public void testDiffRemovedNodeNotReportedTwice() {
394+
GraphStore store = GraphGenerator.generateSmallGraphStore();
395+
GraphObserverImpl graphObserver = store.createGraphObserver(store, true);
396+
graphObserver.hasGraphChanged();
397+
398+
Node removed = store.getNodes().toArray()[0];
399+
store.removeNode(removed);
400+
401+
// First diff: removal is reported
402+
graphObserver.hasGraphChanged();
403+
GraphDiff diff1 = graphObserver.getDiff();
404+
Assert.assertEquals(diff1.getRemovedNodes().toArray().length, 1);
405+
406+
// Make an unrelated change so a second diff is triggered
407+
store.addNode(store.factory.newNode("extra"));
408+
409+
// Second diff: the already-reported removal must NOT appear again
410+
graphObserver.hasGraphChanged();
411+
GraphDiff diff2 = graphObserver.getDiff();
412+
for (Node n : diff2.getRemovedNodes()) {
413+
Assert.assertNotSame(n, removed);
414+
}
415+
}
416+
417+
@Test
418+
public void testDiffRemovedEdgeNotReportedTwice() {
419+
GraphStore store = GraphGenerator.generateSmallGraphStore();
420+
GraphObserverImpl graphObserver = store.createGraphObserver(store, true);
421+
graphObserver.hasGraphChanged();
422+
423+
Edge removed = store.getEdges().toArray()[0];
424+
store.removeEdge(removed);
425+
426+
// First diff: removal is reported
427+
graphObserver.hasGraphChanged();
428+
GraphDiff diff1 = graphObserver.getDiff();
429+
Assert.assertEquals(diff1.getRemovedEdges().toArray().length, 1);
430+
431+
// Make an unrelated change so a second diff is triggered
432+
Node[] ns = store.getNodes().toArray();
433+
store.addEdge(store.factory.newEdge("extra", ns[0], ns[1], 0, 1.0, true));
434+
435+
// Second diff: the already-reported removal must NOT appear again
436+
graphObserver.hasGraphChanged();
437+
GraphDiff diff2 = graphObserver.getDiff();
438+
for (Edge e : diff2.getRemovedEdges()) {
439+
Assert.assertNotSame(e, removed);
440+
}
441+
}
442+
392443
@Test
393444
public void testDiffReplaceNode() {
394445
GraphStore store = GraphGenerator.generateSmallGraphStore();

0 commit comments

Comments
 (0)