package com.orientechnologies.orient.graph.sql;
import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx;
import com.orientechnologies.orient.core.db.record.OIdentifiable;
import com.orientechnologies.orient.core.id.ORID;
import com.orientechnologies.orient.core.metadata.schema.OSchema;
import com.orientechnologies.orient.core.record.impl.ODocument;
import com.orientechnologies.orient.core.sql.OCommandSQL;
import com.orientechnologies.orient.core.sql.query.OSQLSynchQuery;
import org.junit.*;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import java.util.List;
/**
* @author Artem Orobets (enisher-at-gmail.com)
*/
@RunWith(JUnit4.class)
public class OCommandExecutorSQLDeleteEdgeTest {
private static ODatabaseDocumentTx db;
private static ORID folderId1;
private static ORID userId1;
private List<OIdentifiable> edges;
@BeforeClass
public static void init() throws Exception {
db = new ODatabaseDocumentTx("memory:" + OCommandExecutorSQLDeleteEdgeTest.class.getSimpleName());
if (db.exists()) {
db.open("admin", "admin");
db.drop();
}
db.create();
final OSchema schema = db.getMetadata().getSchema();
schema.createClass("User", schema.getClass("V"));
schema.createClass("Folder", schema.getClass("V"));
schema.createClass("CanAccess", schema.getClass("E"));
}
@AfterClass
public static void tearDown() throws Exception {
db.drop();
db = null;
folderId1 = null;
userId1 = null;
}
@Before
public void setUp() throws Exception {
db.close();
db.open("admin", "admin");
db.getMetadata().getSchema().getClass("User").truncate();
db.getMetadata().getSchema().getClass("Folder").truncate();
db.getMetadata().getSchema().getClass("CanAccess").truncate();
userId1 = new ODocument("User").field("username", "gongolo").save().getIdentity();
ORID userId2 = new ODocument("User").field("username", "user2").save().getIdentity();
folderId1 = new ODocument("Folder").field("keyId", "01234567893").save().getIdentity();
ORID folderId2 = new ODocument("Folder").field("keyId", "01234567894").save().getIdentity();
edges = db.command(new OCommandSQL("create edge CanAccess from " + userId1 + " to " + folderId1)).execute();
}
@Test
public void testFromSelect() throws Exception {
final int res = (Integer) db
.command(new OCommandSQL("delete edge CanAccess from (select from User where username = 'gongolo') to " + folderId1))
.execute();
Assert.assertEquals(res, 1);
Assert.assertTrue(db.query(new OSQLSynchQuery<Object>("select flatten(out(CanAccess)) from " + userId1)).isEmpty());
}
@Test
public void testFromSelectToSelect() throws Exception {
final int res = (Integer) db
.command(new OCommandSQL(
"delete edge CanAccess from ( select from User where username = 'gongolo' ) to ( select from Folder where keyId = '01234567893' )"))
.execute();
Assert.assertEquals(res, 1);
Assert.assertTrue(db.query(new OSQLSynchQuery<Object>("select flatten(out(CanAccess)) from " + userId1)).isEmpty());
}
@Test
public void testDeleteByRID() throws Exception {
final int res = (Integer) db.command(new OCommandSQL("delete edge [" + edges.get(0).getIdentity() + "]")).execute();
Assert.assertEquals(res, 1);
}
@Test
public void testDeleteEdgeWithVertexRid() throws Exception {
List<ODocument> vertexes = db.command(new OCommandSQL("select from v limit 1")).execute();
try {
final int res = (Integer) db.command(new OCommandSQL("delete edge [" + vertexes.get(0).getIdentity() + "]")).execute();
Assert.fail("Error on deleting an edge with a rid of a vertex");
} catch (Exception e) {
// OK
}
}
@Test
public void testDeleteEdgeBatch() throws Exception {
// for issue #4622
for (int i = 0; i < 100; i++) {
db.command(new OCommandSQL("create vertex User set name = 'foo" + i + "'")).execute();
db.command(new OCommandSQL("create edge CanAccess from (select from User where name = 'foo" + i + "') to " + folderId1))
.execute();
}
final int res = (Integer) db.command(new OCommandSQL("delete edge CanAccess batch 5")).execute();
List<?> result = db.query(new OSQLSynchQuery("select expand( in('CanAccess') ) from " + folderId1));
Assert.assertEquals(result.size(), 0);
}
@Test
public void testDeleteEdgeBatch2() throws Exception {
// for issue #6985
for (int i = 0; i < 100; i++) {
db.command(new OCommandSQL("create vertex User set name = 'testDeleteEdgeBatch2" + i + "'")).execute();
db.command(new OCommandSQL("create edge CanAccess from (select from User where name = 'testDeleteEdgeBatch2" + i + "') to " + folderId1))
.execute();
}
final int res = (Integer) db.command(new OCommandSQL("delete edge CanAccess where inV().@rid = "+folderId1+" batch 5")).execute();
List<?> result = db.query(new OSQLSynchQuery("select expand( in('CanAccess') ) from " + folderId1));
Assert.assertEquals(result.size(), 0);
}
}