Coverage Summary for Class: TestRepeatStepGraphBoth (org.umlg.sqlg.test.gremlincompile)
Class |
Class, %
|
Method, %
|
Branch, %
|
Line, %
|
TestRepeatStepGraphBoth |
100%
(1/1)
|
100%
(12/12)
|
53.6%
(15/28)
|
100%
(209/209)
|
package org.umlg.sqlg.test.gremlincompile;
import org.apache.tinkerpop.gremlin.process.traversal.P;
import org.apache.tinkerpop.gremlin.process.traversal.Path;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
import org.apache.tinkerpop.gremlin.structure.Column;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.T;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.junit.Assert;
import org.junit.Test;
import org.umlg.sqlg.step.SqlgGraphStep;
import org.umlg.sqlg.step.SqlgVertexStep;
import org.umlg.sqlg.test.BaseTest;
import java.util.*;
/**
* Date: 2015/10/21
* Time: 8:18 PM
*/
@SuppressWarnings({"DuplicatedCode", "resource"})
public class TestRepeatStepGraphBoth extends BaseTest {
@Test
public void testUntil() {
Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1");
Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "c1");
Vertex d1 = this.sqlgGraph.addVertex(T.label, "D", "name", "d1");
Vertex e1 = this.sqlgGraph.addVertex(T.label, "E", "name", "e1");
a1.addEdge("ab", b1);
b1.addEdge("bc", c1);
c1.addEdge("cd", d1);
d1.addEdge("de", e1);
this.sqlgGraph.tx().commit();
List<Path> paths = this.sqlgGraph.traversal().V(a1)
.repeat(__.both().simplePath())
.until(__.not(__.both().simplePath()))
.path()
.toList();
Assert.assertEquals(1, paths.size());
Assert.assertEquals(5, paths.get(0).size());
}
@Test
public void testEmitRepeatWithVertexStepAfter() {
Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
@SuppressWarnings("unused")
Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2");
Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1");
Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2");
Vertex b3 = this.sqlgGraph.addVertex(T.label, "B", "name", "b3");
Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "c1");
Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "name", "c2");
Vertex c3 = this.sqlgGraph.addVertex(T.label, "C", "name", "c3");
a1.addEdge("ab", b1);
a1.addEdge("ab", b2);
a1.addEdge("ab", b3);
b1.addEdge("bc", c1);
b2.addEdge("bc", c2);
b2.addEdge("bc", c3);
this.sqlgGraph.tx().commit();
DefaultGraphTraversal<Vertex, Vertex> traversal = (DefaultGraphTraversal<Vertex, Vertex>) this.sqlgGraph.traversal().V().hasLabel("A")
.repeat(__.out()).emit().times(3)
.out();
printTraversalForm(traversal);
Assert.assertEquals(2, traversal.getSteps().size());
Assert.assertTrue(traversal.getSteps().get(0) instanceof SqlgGraphStep);
Assert.assertTrue(traversal.getSteps().get(1) instanceof SqlgVertexStep);
List<Vertex> vertices = traversal.toList();
Assert.assertEquals(3, vertices.size());
Assert.assertTrue(vertices.containsAll(Arrays.asList(c1, c2, c3)));
}
@Test
public void g_V_untilXout_outX_repeatXin_asXaX_in_asXbXX_selectXa_bX_byXnameX() {
loadModern();
final Traversal<Vertex, Map<String, String>> traversal = this.sqlgGraph.traversal()
.V()
.until(__.out().out())
.repeat(__.in().as("a").in().as("b"))
.<String>select("a", "b").by("name");
Map<String, String> result = traversal.next();
Assert.assertEquals(2, result.size());
Assert.assertEquals("josh", result.get("a"));
Assert.assertEquals("marko", result.get("b"));
result = traversal.next();
Assert.assertEquals(2, result.size());
Assert.assertEquals("josh", result.get("a"));
Assert.assertEquals("marko", result.get("b"));
Assert.assertFalse(traversal.hasNext());
}
@Test
public void g_V_asXaX_repeatXbothX_timesX3X_emit_asXbX_group_byXselectXaXX_byXselectXbX_dedup_order_byXidX_foldX_selectXvaluesX_unfold_dedup() {
loadModern();
final Traversal<Vertex, Collection<String>> traversal = this.sqlgGraph.traversal()
.V().as("a")
.repeat(__.both()).times(3).emit().values("name").as("b")
.group()
.by(__.select("a"))
.by(__.select("b").dedup().order().fold())
.select(Column.values).<Collection<String>>unfold().dedup();
final List<String> vertices = new ArrayList<>(traversal.next());
Assert.assertFalse(traversal.hasNext());
Assert.assertEquals(6, vertices.size());
Assert.assertEquals("josh", vertices.get(0));
Assert.assertEquals("lop", vertices.get(1));
Assert.assertEquals("marko", vertices.get(2));
Assert.assertEquals("peter", vertices.get(3));
Assert.assertEquals("ripple", vertices.get(4));
Assert.assertEquals("vadas", vertices.get(5));
}
@Test
public void testRepeatBoth() {
Vertex a1 = this.sqlgGraph.addVertex(T.label, "A");
Vertex b1 = this.sqlgGraph.addVertex(T.label, "B");
Vertex c1 = this.sqlgGraph.addVertex(T.label, "C");
a1.addEdge("ab", b1);
b1.addEdge("bc", c1);
this.sqlgGraph.tx().commit();
DefaultGraphTraversal<Vertex, Map<String, Vertex>> traversal = (DefaultGraphTraversal<Vertex, Map<String, Vertex>>) this.sqlgGraph.traversal()
.V(b1).as("a")
.repeat(__.both()).times(3).emit().as("b")
.<Vertex>select("a", "b");
Assert.assertEquals(3, traversal.getSteps().size());
List<Map<String, Vertex>> vertexList = traversal.toList();
Assert.assertEquals(2, traversal.getSteps().size());
Assert.assertEquals(8, vertexList.size());
List<Vertex> aVertices = new ArrayList<>();
List<Vertex> bVertices = new ArrayList<>();
for (Map<String, Vertex> stringVertexMap : vertexList) {
System.out.println(stringVertexMap);
Assert.assertEquals(2, stringVertexMap.size());
aVertices.add(stringVertexMap.get("a"));
bVertices.add(stringVertexMap.get("b"));
}
Assert.assertTrue(aVertices.remove(b1));
Assert.assertTrue(aVertices.remove(b1));
Assert.assertTrue(aVertices.remove(b1));
Assert.assertTrue(aVertices.remove(b1));
Assert.assertTrue(aVertices.remove(b1));
Assert.assertTrue(aVertices.remove(b1));
Assert.assertTrue(aVertices.remove(b1));
Assert.assertTrue(aVertices.remove(b1));
Assert.assertTrue(aVertices.isEmpty());
Assert.assertTrue(bVertices.remove(c1));
Assert.assertTrue(bVertices.remove(c1));
Assert.assertTrue(bVertices.remove(c1));
Assert.assertTrue(bVertices.remove(a1));
Assert.assertTrue(bVertices.remove(a1));
Assert.assertTrue(bVertices.remove(a1));
Assert.assertTrue(bVertices.remove(b1));
Assert.assertTrue(bVertices.remove(b1));
Assert.assertTrue(bVertices.isEmpty());
}
@Test
public void testGroupByByFailureWithoutDedup() {
loadModern();
this.sqlgGraph.tx().commit();
DefaultGraphTraversal<Vertex, Collection<Vertex>> traversal = (DefaultGraphTraversal<Vertex, Collection<Vertex>>) this.sqlgGraph.traversal()
.V().as("a")
.repeat(__.both()).times(3).emit().as("b")
.group()
.by(__.select("a"))
.by(__.select("b").dedup().order().by(T.id).fold())
.select(Column.values)
.<Collection<Vertex>>unfold();
final List<Collection<Vertex>> result = traversal.toList();
Assert.assertEquals(6, result.size());
Assert.assertTrue(result.stream().allMatch(v -> v.size() == 6));
}
@Test
public void testGroupByByFailure() {
loadModern();
this.sqlgGraph.tx().commit();
DefaultGraphTraversal<Vertex, Collection<Vertex>> traversal = (DefaultGraphTraversal<Vertex, Collection<Vertex>>) this.sqlgGraph.traversal()
.V().as("a")
.repeat(__.both()).times(3).emit().as("b")
.group()
.by(__.select("a"))
.by(__.select("b").dedup().order().by(T.id).fold())
.select(Column.values)
.<Collection<Vertex>>unfold()
.dedup();
Assert.assertEquals(6, traversal.getSteps().size());
printTraversalForm(traversal);
Assert.assertEquals(5, traversal.getSteps().size());
final Collection<Vertex> vertices = traversal.next();
Assert.assertFalse(traversal.hasNext());
Assert.assertEquals(6, vertices.size());
Assert.assertTrue(vertices.contains(convertToVertex(this.sqlgGraph, "marko")));
Assert.assertTrue(vertices.contains(convertToVertex(this.sqlgGraph, "vadas")));
Assert.assertTrue(vertices.contains(convertToVertex(this.sqlgGraph, "josh")));
Assert.assertTrue(vertices.contains(convertToVertex(this.sqlgGraph, "peter")));
Assert.assertTrue(vertices.contains(convertToVertex(this.sqlgGraph, "lop")));
Assert.assertTrue(vertices.contains(convertToVertex(this.sqlgGraph, "ripple")));
}
@Test
public void testRepeatAndOut() {
Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1");
a1.addEdge("ab", b1);
this.sqlgGraph.tx().commit();
DefaultGraphTraversal<Vertex, Vertex> traversal = (DefaultGraphTraversal<Vertex, Vertex>) this.sqlgGraph.traversal()
.V().repeat(__.both()).times(1).out();
Assert.assertEquals(3, traversal.getSteps().size());
List<Vertex> vertices = traversal.toList();
Assert.assertEquals(1, traversal.getSteps().size());
Assert.assertEquals(1, vertices.size());
Assert.assertEquals(b1, vertices.get(0));
}
@Test
public void testRepeatBoth2() {
Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1");
Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "c1");
a1.addEdge("ab", b1);
b1.addEdge("bc", c1);
this.sqlgGraph.tx().commit();
DefaultGraphTraversal<Vertex, Vertex> traversal = (DefaultGraphTraversal<Vertex, Vertex>) this.sqlgGraph.traversal()
.V(b1).repeat(__.both()).times(3);
Assert.assertEquals(2, traversal.getSteps().size());
List<Vertex> vertices = traversal.toList();
Assert.assertEquals(1, traversal.getSteps().size());
Assert.assertEquals(4, vertices.size());
}
@Test
public void testRepeatBothE() {
Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1");
Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "c1");
a1.addEdge("ab", b1);
b1.addEdge("bc", c1);
this.sqlgGraph.tx().commit();
DefaultGraphTraversal<Vertex, Vertex> traversal = (DefaultGraphTraversal<Vertex, Vertex>) this.sqlgGraph.traversal()
.V(b1).repeat(__.bothE().otherV()).times(3);
Assert.assertEquals(2, traversal.getSteps().size());
List<Vertex> vertices = traversal.toList();
Assert.assertEquals(1, traversal.getSteps().size());
Assert.assertEquals(4, vertices.size());
}
@Test
public void testRepeatBothEWithAggregate() {
Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1");
Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "c1");
Edge e1 = a1.addEdge("ab", b1);
Edge e2 = b1.addEdge("bc", c1);
this.sqlgGraph.tx().commit();
DefaultGraphTraversal<Vertex, Path> traversal = (DefaultGraphTraversal<Vertex, Path>) this.sqlgGraph.traversal()
.V(b1)
.repeat(
__.bothE()
.where(P.without("e"))
.aggregate("e")
.otherV()
)
.emit()
.path();
Assert.assertEquals(3, traversal.getSteps().size());
List<Path> paths = traversal.toList();
Assert.assertEquals(3, traversal.getSteps().size());
Assert.assertEquals(2, paths.size());
Assert.assertTrue(paths.stream().anyMatch(p -> p.size() == 3 && p.get(0).equals(b1) && p.get(1).equals(e1) && p.get(2).equals(a1)));
paths.remove(paths.stream().filter(p -> p.size() == 3 && p.get(0).equals(b1) && p.get(1).equals(e1) && p.get(2).equals(a1)).findAny().orElseThrow());
Assert.assertTrue(paths.stream().anyMatch(p -> p.size() == 3 && p.get(0).equals(b1) && p.get(1).equals(e2) && p.get(2).equals(c1)));
paths.remove(paths.stream().filter(p -> p.size() == 3 && p.get(0).equals(b1) && p.get(1).equals(e2) && p.get(2).equals(c1)).findAny().orElseThrow());
Assert.assertTrue(paths.isEmpty());
}
}