package com.orientechnologies.orient.core.command.traverse;
import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx;
import com.orientechnologies.orient.core.db.record.OIdentifiable;
import com.orientechnologies.orient.core.record.impl.ODocument;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* @author Artem Orobets (enisher-at-gmail.com)
*/
public class OTraverseTest {
private ODatabaseDocumentTx db;
private ODocument rootDocument;
private OTraverse traverse;
@BeforeMethod
public void setUp() throws Exception {
db = new ODatabaseDocumentTx("memory:" + OTraverseTest.class.getSimpleName());
if (db.exists()) {
db.open("admin", "admin");
db.drop();
}
db.create();
rootDocument = new ODocument();
traverse = new OTraverse();
traverse.target(rootDocument).fields("*");
}
@AfterMethod
public void tearDown() throws Exception {
db.drop();
}
@Test
public void testDepthTraverse() throws Exception {
final ODocument aa = new ODocument();
final ODocument ab = new ODocument();
final ODocument ba = new ODocument();
final ODocument bb = new ODocument();
final ODocument a = new ODocument();
a.field("aa", aa);
a.field("ab", ab);
final ODocument b = new ODocument();
b.field("ba", ba);
b.field("bb", bb);
rootDocument.field("a", a);
rootDocument.field("b", b);
final ODocument c1 = new ODocument();
final ODocument c1a = new ODocument();
c1.field("c1a", c1a);
final ODocument c1b = new ODocument();
c1.field("c1b", c1b);
final ODocument c2 = new ODocument();
final ODocument c2a = new ODocument();
c2.field("c2a", c2a);
final ODocument c2b = new ODocument();
c2.field("c2b", c2b);
final ODocument c3 = new ODocument();
final ODocument c3a = new ODocument();
c3.field("c3a", c3a);
final ODocument c3b = new ODocument();
c3.field("c3b", c3b);
rootDocument.field("c", new ArrayList<ODocument>(Arrays.asList(c1, c2, c3)));
rootDocument.save();
final List<ODocument> expectedResult = Arrays.asList(rootDocument, a, aa, ab, b, ba, bb, c1, c1a, c1b, c2, c2a, c2b, c3, c3a, c3b);
final List<OIdentifiable> results = traverse.execute();
compareTraverseResults(expectedResult, results);
}
@Test
public void testBreadthTraverse() throws Exception {
traverse.setStrategy(OTraverse.STRATEGY.BREADTH_FIRST);
final ODocument aa = new ODocument();
final ODocument ab = new ODocument();
final ODocument ba = new ODocument();
final ODocument bb = new ODocument();
final ODocument a = new ODocument();
a.field("aa", aa);
a.field("ab", ab);
final ODocument b = new ODocument();
b.field("ba", ba);
b.field("bb", bb);
rootDocument.field("a", a);
rootDocument.field("b", b);
final ODocument c1 = new ODocument();
final ODocument c1a = new ODocument();
c1.field("c1a", c1a);
final ODocument c1b = new ODocument();
c1.field("c1b", c1b);
final ODocument c2 = new ODocument();
final ODocument c2a = new ODocument();
c2.field("c2a", c2a);
final ODocument c2b = new ODocument();
c2.field("c2b", c2b);
final ODocument c3 = new ODocument();
final ODocument c3a = new ODocument();
c3.field("c3a", c3a);
final ODocument c3b = new ODocument();
c3.field("c3b", c3b);
rootDocument.field("c", new ArrayList<ODocument>(Arrays.asList(c1, c2, c3)));
rootDocument.save();
final List<ODocument> expectedResult = Arrays.asList(rootDocument, a, b, aa, ab, ba, bb, c1, c2, c3, c1a, c1b, c2a, c2b, c3a,
c3b);
final List<OIdentifiable> results = traverse.execute();
compareTraverseResults(expectedResult, results);
}
private void compareTraverseResults(List<ODocument> expectedResult, List<OIdentifiable> results) {
boolean equality = results.size() == expectedResult.size();
for (int i = 0; i < expectedResult.size() && equality; i++) {
equality &= results.get(i).equals(expectedResult.get(i));
}
System.out.println("Expected: " + expectedResult);
System.out.println();
System.out.println("Actual: " + results);
Assert.assertTrue(equality);
}
}