From 7a678522a2d83448543bc75d7360ac0857529727 Mon Sep 17 00:00:00 2001 From: Tglman Date: Wed, 6 May 2015 18:42:24 +0100 Subject: [PATCH] fixed case of removed vertex in the same transaction where is created, issue #4045 --- .../impls/orient/OrientElement.java | 5 +- .../TestFailOperationOnRemovedElement.java | 19 ++ .../graph/TestGraphTransactionOnBatch.java | 295 ++++++++---------- 3 files changed, 147 insertions(+), 172 deletions(-) diff --git a/graphdb/src/main/java/com/tinkerpop/blueprints/impls/orient/OrientElement.java b/graphdb/src/main/java/com/tinkerpop/blueprints/impls/orient/OrientElement.java index 81bcedda6c5..269f4444213 100755 --- a/graphdb/src/main/java/com/tinkerpop/blueprints/impls/orient/OrientElement.java +++ b/graphdb/src/main/java/com/tinkerpop/blueprints/impls/orient/OrientElement.java @@ -117,7 +117,10 @@ protected boolean checkDeletedInTx() { if (curGraph == null) return false; final ORecordOperation oper = curGraph.getRawGraph().getTransaction().getRecordEntry(getIdentity()); - return oper != null && oper.type == ORecordOperation.DELETED; + if (oper == null) + return getIdentity().isTemporary(); + else + return oper.type == ORecordOperation.DELETED; } /** diff --git a/graphdb/src/test/java/com/orientechnologies/orient/graph/TestFailOperationOnRemovedElement.java b/graphdb/src/test/java/com/orientechnologies/orient/graph/TestFailOperationOnRemovedElement.java index 040b3386cb6..391cf6ee683 100644 --- a/graphdb/src/test/java/com/orientechnologies/orient/graph/TestFailOperationOnRemovedElement.java +++ b/graphdb/src/test/java/com/orientechnologies/orient/graph/TestFailOperationOnRemovedElement.java @@ -23,6 +23,15 @@ public void after() { grap.drop(); } + @Test(expected = IllegalStateException.class) + public void testAddEdgeOnRemovedVertexSameTransaction() { + Vertex v = grap.addVertex(null); + Vertex v1 = grap.addVertex(null); + + v.remove(); + v.addEdge("test", v1); + } + @Test(expected = IllegalStateException.class) public void testAddEdgeOnRemovedVertex() { Vertex v = grap.addVertex(null); @@ -33,6 +42,16 @@ public void testAddEdgeOnRemovedVertex() { v.addEdge("test", v1); } + @Test(expected = IllegalStateException.class) + public void testAddEdgeToRemovedVertex() { + Vertex v = grap.addVertex(null); + Vertex v1 = grap.addVertex(null); + grap.commit(); + + v1.remove(); + v.addEdge("test", v1); + } + @Test(expected = IllegalStateException.class) public void testSetPropertyOnRemovedVertex() { Vertex v = grap.addVertex(null); diff --git a/graphdb/src/test/java/com/orientechnologies/orient/graph/TestGraphTransactionOnBatch.java b/graphdb/src/test/java/com/orientechnologies/orient/graph/TestGraphTransactionOnBatch.java index d42bd920092..83ee7b1350f 100644 --- a/graphdb/src/test/java/com/orientechnologies/orient/graph/TestGraphTransactionOnBatch.java +++ b/graphdb/src/test/java/com/orientechnologies/orient/graph/TestGraphTransactionOnBatch.java @@ -2,7 +2,9 @@ import java.util.List; +import org.junit.After; import org.junit.Assert; +import org.junit.Before; import org.junit.Test; import com.orientechnologies.orient.core.command.script.OCommandScript; @@ -17,225 +19,176 @@ import com.orientechnologies.orient.core.storage.ORecordDuplicatedException; public class TestGraphTransactionOnBatch { + private ODatabaseDocument db; + private OClass V; + private OClass E; + + @Before + public void before() { + db = new ODatabaseDocumentTx("memory:" + TestGraphTransactionOnBatch.class.getSimpleName()); + db.create(); + V = db.getMetadata().getSchema().createClass("V"); + E = db.getMetadata().getSchema().createClass("E"); + } + + @After + public void after() { + db.drop(); + } @Test public void testDuplicateRollback() { - ODatabaseDocument db = new ODatabaseDocumentTx("memory:" + TestGraphTransactionOnBatch.class.getSimpleName()); + OClass clazz = db.getMetadata().getSchema().createClass("Test"); + clazz.setSuperClass(V); + clazz.createProperty("id", OType.STRING).createIndex(INDEX_TYPE.UNIQUE); + try { + db.command( + new OCommandScript( + "sql", + "BEGIN \n LET a = create vertex Test SET id = \"12345678\" \n LET b = create vertex Test SET id = \"4kkrPhGe\" \n LET c =create vertex Test SET id = \"4kkrPhGe\" \n RETURN $b \n COMMIT")) + .execute(); + Assert.fail("expected record duplicate exception"); + } catch (ORecordDuplicatedException ex) { + + } try { - db.create(); - db.getMetadata().getSchema().createClass("E"); - OClass V = db.getMetadata().getSchema().createClass("V"); - OClass clazz = db.getMetadata().getSchema().createClass("Test"); - clazz.setSuperClass(V); - clazz.createProperty("id", OType.STRING).createIndex(INDEX_TYPE.UNIQUE); - try { - db.command( - new OCommandScript( - "sql", - "BEGIN \n LET a = create vertex Test SET id = \"12345678\" \n LET b = create vertex Test SET id = \"4kkrPhGe\" \n LET c =create vertex Test SET id = \"4kkrPhGe\" \n RETURN $b \n COMMIT")) - .execute(); - Assert.fail("expected record duplicate exception"); - } catch (ORecordDuplicatedException ex) { - - } - try { - db.command( - new OCommandScript( - "sql", - "BEGIN \n LET a = create vertex Test content {\"id\": \"12345678\"} \n LET b = create vertex Test content {\"id\": \"4kkrPhGe\"} \n LET c =create vertex Test content { \"id\": \"4kkrPhGe\"} \n RETURN $b \n COMMIT")) - .execute(); - Assert.fail("expected record duplicate exception"); - } catch (ORecordDuplicatedException ex) { - - } - - List res = db.query(new OSQLSynchQuery("select from Test")); - Assert.assertEquals(0, res.size()); - } finally { - db.drop(); + db.command( + new OCommandScript( + "sql", + "BEGIN \n LET a = create vertex Test content {\"id\": \"12345678\"} \n LET b = create vertex Test content {\"id\": \"4kkrPhGe\"} \n LET c =create vertex Test content { \"id\": \"4kkrPhGe\"} \n RETURN $b \n COMMIT")) + .execute(); + Assert.fail("expected record duplicate exception"); + } catch (ORecordDuplicatedException ex) { + } + + List res = db.query(new OSQLSynchQuery("select from Test")); + Assert.assertEquals(0, res.size()); } @Test public void testDuplicateAlreadyExistingRollback() { - ODatabaseDocument db = new ODatabaseDocumentTx("memory:" + TestGraphTransactionOnBatch.class.getSimpleName()); + OClass clazz = db.getMetadata().getSchema().createClass("Test"); + clazz.setSuperClass(V); + clazz.createProperty("id", OType.STRING).createIndex(INDEX_TYPE.UNIQUE); + db.command(new OCommandSQL("create vertex Test SET id = \"12345678\"")).execute(); try { - db.create(); - db.getMetadata().getSchema().createClass("E"); - OClass V = db.getMetadata().getSchema().createClass("V"); - OClass clazz = db.getMetadata().getSchema().createClass("Test"); - clazz.setSuperClass(V); - clazz.createProperty("id", OType.STRING).createIndex(INDEX_TYPE.UNIQUE); - db.command(new OCommandSQL("create vertex Test SET id = \"12345678\"")).execute(); - try { - db.command(new OCommandScript("sql", "BEGIN \n LET a = create vertex Test SET id = \"12345678\" \n RETURN $a \n COMMIT")) - .execute(); - Assert.fail("expected record duplicate exception"); - } catch (ORecordDuplicatedException ex) { - - } - List res = db.query(new OSQLSynchQuery("select from Test")); - Assert.assertEquals(1, res.size()); - } finally { - db.drop(); + db.command(new OCommandScript("sql", "BEGIN \n LET a = create vertex Test SET id = \"12345678\" \n RETURN $a \n COMMIT")) + .execute(); + Assert.fail("expected record duplicate exception"); + } catch (ORecordDuplicatedException ex) { + } + List res = db.query(new OSQLSynchQuery("select from Test")); + Assert.assertEquals(1, res.size()); } @Test public void testDuplicateEdgeRollback() { - ODatabaseDocument db = new ODatabaseDocumentTx("memory:" + TestGraphTransactionOnBatch.class.getSimpleName()); + OClass clazz = db.getMetadata().getSchema().createClass("Test"); + clazz.setSuperClass(E); + clazz.createProperty("aKey", OType.STRING).createIndex(INDEX_TYPE.UNIQUE); try { - db.create(); - OClass E = db.getMetadata().getSchema().createClass("E"); - db.getMetadata().getSchema().createClass("V"); - OClass clazz = db.getMetadata().getSchema().createClass("Test"); - clazz.setSuperClass(E); - clazz.createProperty("aKey", OType.STRING).createIndex(INDEX_TYPE.UNIQUE); - try { - db.command( - new OCommandScript( - "sql", - "BEGIN \n LET a = create vertex V \n LET b = create vertex V \n LET c =create edge Test from $a to $b SET aKey = \"12345\" \n LET d =create edge Test from $a to $b SET aKey = \"12345\" \n RETURN $c \n COMMIT")) - .execute(); - Assert.fail("expected record duplicate exception"); - } catch (ORecordDuplicatedException ex) { - - } - List res = db.query(new OSQLSynchQuery("select from Test")); - Assert.assertEquals(0, res.size()); - } finally { - db.drop(); + db.command( + new OCommandScript( + "sql", + "BEGIN \n LET a = create vertex V \n LET b = create vertex V \n LET c =create edge Test from $a to $b SET aKey = \"12345\" \n LET d =create edge Test from $a to $b SET aKey = \"12345\" \n RETURN $c \n COMMIT")) + .execute(); + Assert.fail("expected record duplicate exception"); + } catch (ORecordDuplicatedException ex) { + } + List res = db.query(new OSQLSynchQuery("select from Test")); + Assert.assertEquals(0, res.size()); } @Test public void testDuplicateEdgeAlreadyPresentRollback() { - ODatabaseDocument db = new ODatabaseDocumentTx("memory:" + TestGraphTransactionOnBatch.class.getSimpleName()); + OClass clazz = db.getMetadata().getSchema().createClass("Test"); + clazz.setSuperClass(E); + clazz.createProperty("aKey", OType.STRING).createIndex(INDEX_TYPE.UNIQUE); + db.command( + new OCommandScript( + "sql", + "BEGIN \n LET a = create vertex V \n LET b = create vertex V \n LET c =create edge Test from $a to $b SET aKey = \"12345\" \n RETURN $c \n commit \n")) + .execute(); try { - db.create(); - OClass E = db.getMetadata().getSchema().createClass("E"); - db.getMetadata().getSchema().createClass("V"); - OClass clazz = db.getMetadata().getSchema().createClass("Test"); - clazz.setSuperClass(E); - clazz.createProperty("aKey", OType.STRING).createIndex(INDEX_TYPE.UNIQUE); db.command( new OCommandScript( "sql", - "BEGIN \n LET a = create vertex V \n LET b = create vertex V \n LET c =create edge Test from $a to $b SET aKey = \"12345\" \n RETURN $c \n commit \n")) + "BEGIN \n LET a = create vertex V \n LET b = create vertex V \n LET c =create edge Test from $a to $b SET aKey = \"12345\"\n RETURN $c \n COMMIT")) .execute(); - try { - db.command( - new OCommandScript( - "sql", - "BEGIN \n LET a = create vertex V \n LET b = create vertex V \n LET c =create edge Test from $a to $b SET aKey = \"12345\"\n RETURN $c \n COMMIT")) - .execute(); - Assert.fail("expected record duplicate exception"); - } catch (ORecordDuplicatedException ex) { - - } - List res = db.query(new OSQLSynchQuery("select from Test")); - Assert.assertEquals(1, res.size()); - } finally { - db.drop(); + Assert.fail("expected record duplicate exception"); + } catch (ORecordDuplicatedException ex) { + } + List res = db.query(new OSQLSynchQuery("select from Test")); + Assert.assertEquals(1, res.size()); } @Test public void testReferInTxDeleteVertex() { - - ODatabaseDocument db = new ODatabaseDocumentTx("memory:" + TestGraphTransactionOnBatch.class.getSimpleName()); try { - db.create(); - db.getMetadata().getSchema().createClass("E"); - OClass V = db.getMetadata().getSchema().createClass("V"); - try { - db.command(new OCommandSQL("create vertex V set Mid = '1' ")).execute(); - db.command( - new OCommandScript("sql", "begin \n LET t0 = select from V where Mid='1' \n" - + "LET t1 = delete vertex V where Mid = '1' \n LET t2 = create vertex V set Mid = '2' \n" - + "LET t4 = create edge E from $t2 to $t0 \n commit \n return [$t4] ")).execute(); - Assert.fail("it should go in exception because referring to a in transaction delete vertex"); - } catch (Exception ex) { - } - List res = db.query(new OSQLSynchQuery("select from E")); - Assert.assertEquals(res.size(), 0); - } finally { - db.drop(); + db.command(new OCommandSQL("create vertex V set Mid = '1' ")).execute(); + db.command( + new OCommandScript("sql", "begin \n LET t0 = select from V where Mid='1' \n" + + "LET t1 = delete vertex V where Mid = '1' \n LET t2 = create vertex V set Mid = '2' \n" + + "LET t4 = create edge E from $t2 to $t0 \n commit \n return [$t4] ")).execute(); + Assert.fail("it should go in exception because referring to a in transaction delete vertex"); + } catch (Exception ex) { } + List res = db.query(new OSQLSynchQuery("select from E")); + Assert.assertEquals(res.size(), 0); } - // @Test disabled because failing + @Test public void testReferToInTxCreatedAndDeletedVertex() { - ODatabaseDocument db = new ODatabaseDocumentTx("memory:" + TestGraphTransactionOnBatch.class.getSimpleName()); try { - db.create(); - db.getMetadata().getSchema().createClass("E"); - OClass V = db.getMetadata().getSchema().createClass("V"); - try { - db.command( - new OCommandScript("sql", "begin \n LET t0 = create vertex V set Mid = '1' \n" - + "LET t1 = delete vertex V where Mid = '1' \n LET t2 = create vertex V set Mid = '2' \n" - + "LET t4 = create edge E from $t2 to $t0 \n commit \n return [$t4] ")).execute(); - Assert.fail("it should go in exception because referring to a in transaction delete vertex"); - } catch (Exception ex) { - } - List res = db.query(new OSQLSynchQuery("select from E")); - Assert.assertEquals(res.size(), 0); - } finally { - db.drop(); + db.command( + new OCommandScript("sql", "begin \n LET t0 = create vertex V set Mid = '1' \n" + + "LET t1 = delete vertex V where Mid = '1' \n LET t2 = create vertex V set Mid = '2' \n" + + "LET t4 = create edge E from $t2 to $t0 \n commit \n return [$t4] ")).execute(); + Assert.fail("it should go in exception because referring to a in transaction delete vertex"); + } catch (Exception ex) { } + List res = db.query(new OSQLSynchQuery("select from E")); + Assert.assertEquals(res.size(), 0); } - // @Test disabled because failing + /** + * This test is different from the original reported, because in case of empty query result the 'create edge ' command just don't + * create edges without failing + * + */ + @Test public void testReferToNotExistingVertex() { - - ODatabaseDocument db = new ODatabaseDocumentTx("memory:" + TestGraphTransactionOnBatch.class.getSimpleName()); - try { - db.create(); - db.getMetadata().getSchema().createClass("E"); - OClass V = db.getMetadata().getSchema().createClass("V"); - try { - db.command( - new OCommandScript("sql", "begin \n \n LET t2 = create vertex V set Mid = \"2\" \n" - + "LET t5 = select from V where Mid = '123456789' \n LET t3 = create edge E from $t5 to $t2 \n" - + "\n commit \n return [$t3] ")).execute(); - Assert.fail("it should go in exception because referring to a not existing vertex"); - } catch (Exception ex) { - } - List res = db.query(new OSQLSynchQuery("select from E")); - Assert.assertEquals(res.size(), 0); - } finally { - db.drop(); - } + db.command( + new OCommandScript("sql", "begin \n \n LET t2 = create vertex V set Mid = \"2\" \n" + + "LET t5 = select from V where Mid = '123456789' \n LET t3 = create edge E from $t5 to $t2 \n" + + "\n commit \n return [$t3] ")).execute(); + List res = db.query(new OSQLSynchQuery("select from E")); + Assert.assertEquals(res.size(), 0); } @Test public void testReferToNotExistingVariableInTx() { - ODatabaseDocument db = new ODatabaseDocumentTx("memory:" + TestGraphTransactionOnBatch.class.getSimpleName()); + db.command(new OCommandSQL(" create vertex V set Mid ='2'")).execute(); + List res = db.query(new OSQLSynchQuery("select from V")); + Assert.assertEquals(1, res.size()); + try { - db.create(); - db.getMetadata().getSchema().createClass("E"); - db.getMetadata().getSchema().createClass("V"); - db.command(new OCommandSQL(" create vertex V set Mid ='2'")).execute(); - List res = db.query(new OSQLSynchQuery("select from V")); - Assert.assertEquals(1, res.size()); - - try { - db.command( - new OCommandScript("sql", - "begin \n Let t0 = delete vertex V where Mid='2' \n LET t1 = create edge E from $t2 to $t3 \n commit \n return $t1 ")) - .execute(); - Assert.fail("it should go in exception because referring to not existing variable"); - } catch (Exception ex) { - } - Assert.assertFalse(db.getTransaction().isActive()); - - res = db.query(new OSQLSynchQuery("select from V")); - Assert.assertEquals(1, res.size()); - } finally { - db.drop(); + db.command( + new OCommandScript("sql", + "begin \n Let t0 = delete vertex V where Mid='2' \n LET t1 = create edge E from $t2 to $t3 \n commit \n return $t1 ")) + .execute(); + Assert.fail("it should go in exception because referring to not existing variable"); + } catch (Exception ex) { } + Assert.assertFalse(db.getTransaction().isActive()); + + res = db.query(new OSQLSynchQuery("select from V")); + Assert.assertEquals(1, res.size()); } }