package com.tinkerpop.blueprints.impls.orient; import com.orientechnologies.orient.core.db.record.OIdentifiable; import com.tinkerpop.blueprints.Direction; import com.tinkerpop.blueprints.Edge; import org.junit.After; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import java.util.Iterator; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; @RunWith(JUnit4.class) public class OrientDeleteVertexTest { @After public void tearDown() { OrientGraph g = createGraph(); g.drop(); } @Test public void shouldDeleteEdgesWhenDeletingVertex() { // Create a node v1 with at least two edges OrientGraph g = createGraph(); OrientVertex v1 = g.addVertex("class:V1"); OrientVertex v2 = g.addVertex("class:V2"); OrientVertex v22 = g.addVertex("class:V2"); g.addEdge(null, v1, v2, "edgeType1"); g.addEdge(null, v1, v22, "edgeType1"); g.shutdown(); // delete connected vertex v2 g = createGraph(); long total = g.countVertices(); g.getVertex(v2.getId()).remove(); assertEquals(total-1, g.countVertices()); // the v1 out_edgeType1 property should not contain a reference to // deleted node v2 // OK INSIDE THE TRANSACTION Iterable<OrientEdge> out_edge = g.getVertex(v1.getId()).getProperty("out_edgeType1"); boolean contains = false; for (OIdentifiable id : out_edge) if (id.equals(v2.getId())) contains = true; assertFalse(contains); g.shutdown(); // the v1 node should only have one edge left // OK assertEquals(1, getEdgeCount(v1.getId())); g = createGraph(); // v2 vertex sould be deleted // OK assertNull(g.getVertex(v2.getId())); // the v1 out_edgeType1 property should not contain a reference to // deleted v2 // FAILS HERE OUTSIDE OF THE TRANSACTION out_edge = g.getVertex(v1.getId()).getProperty("out_edgeType1"); contains = false; for (OIdentifiable id : out_edge) if (id.equals(v2.getId())) contains = true; assertFalse(contains); g.shutdown(); } int getEdgeCount(Object vid) { OrientGraph g = createGraph(); int n = 0; for (Iterator<Edge> it = g.getVertex(vid).getEdges(Direction.BOTH).iterator(); it.hasNext(); n++) { it.next(); } g.shutdown(); return n; } private OrientGraph createGraph() { return (OrientGraph) new OrientGraph("memory:" + OrientDeleteVertexTest.class.getSimpleName()).setWarnOnForceClosingTx(false); } }