/*
* Copyright 2010-2012 Luca Garulli (l.garulli--at--orientechnologies.com)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.orientechnologies.orient.test.database.auto;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.testng.Assert;
import org.testng.annotations.*;
import com.orientechnologies.orient.core.db.document.ODatabaseDocument;
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.OClass;
import com.orientechnologies.orient.core.metadata.schema.OType;
import com.orientechnologies.orient.core.record.impl.ODocument;
import com.orientechnologies.orient.core.sql.OCommandSQL;
@Test(groups = "sql-findReferences")
public class SQLFindReferencesTest extends DocumentDBBaseTest {
private static final String WORKPLACE = "Workplace";
private static final String WORKER = "Worker";
private static final String CAR = "Car";
private ORID carID;
private ORID johnDoeID;
private ORID janeDoeID;
private ORID chuckNorrisID;
private ORID jackBauerID;
private ORID ctuID;
private ORID fbiID;
@Parameters(value = "url")
public SQLFindReferencesTest(@Optional String url) {
super(url);
}
@SuppressWarnings("unchecked")
@Test
public void findSimpleReference() {
Collection<ODocument> result = database.command(new OCommandSQL("find references " + carID)).execute();
Assert.assertEquals(result.size(), 1);
Assert.assertEquals(((Collection<OIdentifiable>) result.iterator().next().field("referredBy")).iterator().next(), johnDoeID);
// SUB QUERY
result = database.command(new OCommandSQL("find references ( select from " + carID + ")")).execute();
Assert.assertEquals(result.size(), 1);
Assert.assertEquals(((Collection<OIdentifiable>) result.iterator().next().field("referredBy")).iterator().next(), johnDoeID);
result = database.command(new OCommandSQL("find references " + chuckNorrisID)).execute();
Assert.assertEquals(result.size(), 1);
Assert.assertEquals(((Collection<OIdentifiable>) result.iterator().next().field("referredBy")).size(), 2);
for (OIdentifiable rid : ((Collection<OIdentifiable>) result.iterator().next().field("referredBy"))) {
Assert.assertTrue(rid.equals(ctuID) || rid.equals(fbiID));
}
result = database.command(new OCommandSQL("find references " + johnDoeID)).execute();
Assert.assertEquals(result.size(), 1);
Assert.assertEquals(((Collection<OIdentifiable>) result.iterator().next().field("referredBy")).size(), 0);
result.clear();
result = null;
}
@SuppressWarnings("unchecked")
@Test
public void findReferenceByClassAndClusters() {
Collection<ODocument> result = database.command(new OCommandSQL("find references " + janeDoeID + " [" + WORKPLACE + "]"))
.execute();
Assert.assertEquals(result.size(), 1);
Assert.assertTrue(((Collection<OIdentifiable>) result.iterator().next().field("referredBy")).iterator().next().equals(ctuID));
result = database.command(new OCommandSQL("find references " + jackBauerID + " [" + WORKPLACE + ",cluster:" + CAR + "]"))
.execute();
Assert.assertEquals(result.size(), 1);
Assert.assertEquals(((Collection<OIdentifiable>) result.iterator().next().field("referredBy")).size(), 3);
for (OIdentifiable rid : ((Collection<OIdentifiable>) result.iterator().next().field("referredBy"))) {
Assert.assertTrue(rid.equals(ctuID) || rid.equals(fbiID) || rid.equals(carID));
}
result = database.command(
new OCommandSQL("find references " + johnDoeID + " [" + WORKPLACE + "," + CAR + ",cluster:" + WORKER + "]")).execute();
Assert.assertEquals(result.size(), 1);
Assert.assertEquals(((Collection<OIdentifiable>) result.iterator().next().field("referredBy")).size(), 0);
result.clear();
result = null;
}
@BeforeClass
public void createTestEnviroment() {
createSchema();
populateDatabase();
}
private void createSchema() {
OClass worker = database.getMetadata().getSchema().createClass(WORKER);
OClass workplace = database.getMetadata().getSchema().createClass(WORKPLACE);
OClass car = database.getMetadata().getSchema().createClass(CAR);
worker.createProperty("name", OType.STRING);
worker.createProperty("surname", OType.STRING);
worker.createProperty("colleagues", OType.LINKLIST, worker);
worker.createProperty("car", OType.LINK, car);
workplace.createProperty("name", OType.STRING);
workplace.createProperty("boss", OType.LINK, worker);
workplace.createProperty("workers", OType.LINKLIST, worker);
car.createProperty("plate", OType.STRING);
car.createProperty("owner", OType.LINK, worker);
database.getMetadata().getSchema().save();
}
private void populateDatabase() {
ODocument car = new ODocument(CAR);
car.field("plate", "JINF223S");
ODocument johnDoe = new ODocument(WORKER);
johnDoe.field("name", "John");
johnDoe.field("surname", "Doe");
johnDoe.field("car", car);
johnDoe.save();
johnDoeID = johnDoe.getIdentity().copy();
ODocument janeDoe = new ODocument(WORKER);
janeDoe.field("name", "Jane");
janeDoe.field("surname", "Doe");
janeDoe.save();
janeDoeID = janeDoe.getIdentity().copy();
ODocument chuckNorris = new ODocument(WORKER);
chuckNorris.field("name", "Chuck");
chuckNorris.field("surname", "Norris");
chuckNorris.save();
chuckNorrisID = chuckNorris.getIdentity().copy();
ODocument jackBauer = new ODocument(WORKER);
jackBauer.field("name", "Jack");
jackBauer.field("surname", "Bauer");
jackBauer.save();
jackBauerID = jackBauer.getIdentity().copy();
ODocument ctu = new ODocument(WORKPLACE);
ctu.field("name", "CTU");
ctu.field("boss", jackBauer);
List<ODocument> workplace1Workers = new ArrayList<ODocument>();
workplace1Workers.add(chuckNorris);
workplace1Workers.add(janeDoe);
ctu.field("workers", workplace1Workers);
ctu.save();
ctuID = ctu.getIdentity().copy();
ODocument fbi = new ODocument(WORKPLACE);
fbi.field("name", "FBI");
fbi.field("boss", chuckNorris);
List<ODocument> workplace2Workers = new ArrayList<ODocument>();
workplace2Workers.add(chuckNorris);
workplace2Workers.add(jackBauer);
fbi.field("workers", workplace2Workers);
fbi.save();
fbiID = fbi.getIdentity().copy();
car.field("owner", jackBauer);
car.save();
carID = car.getIdentity().copy();
}
@AfterClass
public void deleteTestEnviroment() {
database.open("admin", "admin");
carID.reset();
carID = null;
johnDoeID.reset();
johnDoeID = null;
janeDoeID.reset();
janeDoeID = null;
chuckNorrisID.reset();
chuckNorrisID = null;
jackBauerID.reset();
jackBauerID = null;
ctuID.reset();
ctuID = null;
fbiID.reset();
fbiID = null;
deleteSchema();
database.close();
}
private void deleteSchema() {
dropClass(CAR);
dropClass(WORKER);
dropClass(WORKPLACE);
}
private void dropClass(String iClass) {
OCommandSQL dropClassCommand = new OCommandSQL("drop class " + iClass);
database.command(dropClassCommand).execute();
database.getMetadata().getSchema().save();
database.getMetadata().getSchema().reload();
database.reload();
while (database.getMetadata().getSchema().existsClass(iClass)) {
database.getMetadata().getSchema().dropClass(iClass);
database.getMetadata().getSchema().save();
database.reload();
}
while (database.getClusterIdByName(iClass) > -1) {
database.dropCluster(iClass, true);
database.reload();
}
}
}