Coverage Summary for Class: TestGremlinCompileChoose (org.umlg.sqlg.test.gremlincompile)
Class |
Class, %
|
Method, %
|
Branch, %
|
Line, %
|
TestGremlinCompileChoose |
100%
(1/1)
|
91.7%
(11/12)
|
40%
(4/10)
|
84.3%
(113/134)
|
package org.umlg.sqlg.test.gremlincompile;
import org.apache.commons.lang3.time.StopWatch;
import org.apache.tinkerpop.gremlin.process.traversal.Pick;
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.GraphTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.MapHelper;
import org.apache.tinkerpop.gremlin.structure.T;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.hamcrest.MatcherAssert;
import org.hamcrest.core.Is;
import org.junit.Assert;
import org.junit.Test;
import org.umlg.sqlg.step.SqlgGraphStep;
import org.umlg.sqlg.step.barrier.SqlgChooseStepBarrier;
import org.umlg.sqlg.test.BaseTest;
import java.util.*;
import java.util.stream.Collectors;
/**
* Date: 2017/02/06
* Time: 9:27 AM
*/
public class TestGremlinCompileChoose extends BaseTest {
// @Test
@SuppressWarnings("unused")
public void testChoosePerformance() {
this.sqlgGraph.tx().normalBatchModeOn();
int count1 = 10_000;
int count2 = 100;
for (int i = 0; i < count1; i++) {
Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
for (int j = 0; j < count2; j++) {
Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1");
a1.addEdge("ab", b1);
}
}
this.sqlgGraph.tx().commit();
System.out.println("=================================");
StopWatch stopWatch = new StopWatch();
for (int i = 0; i < 1000; i++) {
stopWatch.start();
Traversal<Vertex, Vertex> traversal = this.sqlgGraph.traversal()
.V().hasLabel("A")
.choose(__.outE(), __.out());
List<Vertex> vertices = traversal.toList();
Assert.assertEquals(count1 * count2, vertices.size());
stopWatch.stop();
System.out.println(stopWatch.toString());
stopWatch.reset();
}
}
@Test
public void g_injectX1X_chooseXisX1X__constantX10Xfold__foldX() {
final Traversal<Integer, List<Integer>> traversal = this.sqlgGraph.traversal()
.inject(1)
.choose(
__.is(1),
__.constant(10).fold(),
__.fold()
);
printTraversalForm(traversal);
Assert.assertEquals(Collections.singletonList(10), traversal.next());
MatcherAssert.assertThat(traversal.hasNext(), Is.is(false));
}
@Test
public void g_V_hasLabelXpersonX_chooseXageX__optionX27L__constantXyoungXX_optionXnone__constantXoldXX_groupCount() {
loadModern();
final Traversal<Vertex, Map<String, Long>> traversal = this.sqlgGraph.traversal()
.V().hasLabel("person").choose(__.values("age"))
.option(27, __.constant("young"))
.option(Pick.none, __.constant("old"))
.groupCount();
printTraversalForm(traversal);
final Map<String, Long> expected = new HashMap<>(2);
expected.put("young", 1L);
expected.put("old", 3L);
Assert.assertTrue(traversal.hasNext());
Map<String, Long> first = traversal.next();
checkMap(expected, first);
Assert.assertFalse(traversal.hasNext());
}
@Test
public void g_V_hasLabelXpersonX_asXp1X_chooseXoutEXknowsX__outXknowsXX_asXp2X_selectXp1_p2X_byXnameX() {
loadModern();
final Traversal<Vertex, Map<String, String>> traversal = this.sqlgGraph.traversal()
.V()
.hasLabel("person").as("p1")
.choose(
__.outE("knows"), __.out("knows")
).as("p2")
.<String>select("p1", "p2").by("name");
printTraversalForm(traversal);
checkResults(makeMapList(2,
"p1", "marko", "p2", "vadas",
"p1", "marko", "p2", "josh",
"p1", "vadas", "p2", "vadas",
"p1", "josh", "p2", "josh",
"p1", "peter", "p2", "peter"
), traversal);
}
@Test
public void g_V_chooseXhasLabelXpersonX_and_outXcreatedX__outXknowsX__identityX_name() {
loadModern();
GraphTraversal<Vertex, String> traversal = this.sqlgGraph.traversal()
.V()
.choose(
__.hasLabel("person").and().out("created"),
__.out("knows"),
__.identity()
).values("name");
checkResults(Arrays.asList("lop", "ripple", "josh", "vadas", "vadas"), traversal);
}
//not optimized
@Test
public void g_V_chooseXlabelX_optionXblah__outXknowsXX_optionXbleep__outXcreatedXX_optionXnone__identityX_name() {
loadModern();
DefaultGraphTraversal<Vertex, String> traversal = (DefaultGraphTraversal<Vertex, String>)this.sqlgGraph.traversal().V().choose(__.label())
.option("blah", __.out("knows"))
.option("bleep", __.out("created"))
.option(Pick.none, __.identity()).<String>values("name");
Assert.assertEquals(3, traversal.getSteps().size());
printTraversalForm(traversal);
Assert.assertEquals(3, traversal.getSteps().size());
checkResults(Arrays.asList("marko", "vadas", "peter", "josh", "lop", "ripple"), traversal);
}
@Test
public void g_V_chooseXout_countX_optionX2L__nameX_optionX3L__valueMapX() {
loadModern();
final Traversal<Vertex, Object> traversal = this.sqlgGraph.traversal()
.V()
.choose(__.out().count())
.option(2L, __.values("name"))
.option(3L, __.valueMap());
printTraversalForm(traversal);
final Map<String, Long> counts = new HashMap<>();
int counter = 0;
while (traversal.hasNext()) {
MapHelper.incr(counts, traversal.next().toString(), 1L);
counter++;
}
Assert.assertFalse(traversal.hasNext());
Assert.assertEquals(2, counter);
Assert.assertEquals(2, counts.size());
Assert.assertEquals(Long.valueOf(1), counts.get("{name=[marko], age=[29]}"));
Assert.assertEquals(Long.valueOf(1), counts.get("josh"));
}
@Test
public void testUnoptimizableChooseStep() {
Vertex a1 = this.sqlgGraph.addVertex(T.label, "A");
this.sqlgGraph.addVertex(T.label, "A");
Vertex b1 = this.sqlgGraph.addVertex(T.label, "B");
Vertex b2 = this.sqlgGraph.addVertex(T.label, "B");
a1.addEdge("ab", b1);
a1.addEdge("ab", b2);
this.sqlgGraph.tx().commit();
DefaultGraphTraversal<Vertex, Vertex> traversal = (DefaultGraphTraversal<Vertex, Vertex>)this.sqlgGraph.traversal()
.V()
.hasLabel("A")
.choose(
v -> v.label().equals("A"),
__.out(),
__.in()
);
Assert.assertEquals(3, traversal.getSteps().size());
List<Vertex> vertices = traversal.toList();
Assert.assertEquals(2, traversal.getSteps().size());
Assert.assertTrue(traversal.getSteps().get(0) instanceof SqlgGraphStep);
Assert.assertTrue(traversal.getSteps().get(1) instanceof SqlgChooseStepBarrier);
Assert.assertEquals(2, vertices.size());
}
@Test
public void g_V_chooseXlabel_eq_person__unionX__out_lang__out_nameX__in_labelX_groupCount() {
loadModern();
@SuppressWarnings("unchecked") final Traversal<Vertex, Map<String, Long>> traversal = this.sqlgGraph.traversal()
.V()
.choose(
__.label().is("person"),
__.union(__.out().values("lang"), __.out().values("name")),
__.in().label()
).groupCount();
printTraversalForm(traversal);
final Map<String, Long> groupCount = traversal.next();
Assert.assertFalse(traversal.hasNext());
Assert.assertEquals(3L, groupCount.get("lop").longValue());
Assert.assertEquals(1L, groupCount.get("ripple").longValue());
Assert.assertEquals(4L, groupCount.get("java").longValue());
Assert.assertEquals(1L, groupCount.get("josh").longValue());
Assert.assertEquals(1L, groupCount.get("vadas").longValue());
Assert.assertEquals(4L, groupCount.get("person").longValue());
Assert.assertEquals(6, groupCount.size());
}
private static <A, B> void checkMap(final Map<A, B> expectedMap, final Map<A, B> actualMap) {
final List<Map.Entry<A, B>> actualList = actualMap.entrySet().stream().sorted(Comparator.comparing(a -> a.getKey().toString())).collect(Collectors.toList());
final List<Map.Entry<A, B>> expectedList = expectedMap.entrySet().stream().sorted(Comparator.comparing(a -> a.getKey().toString())).collect(Collectors.toList());
Assert.assertEquals(expectedList.size(), actualList.size());
for (int i = 0; i < actualList.size(); i++) {
Assert.assertEquals(expectedList.get(i).getKey(), actualList.get(i).getKey());
Assert.assertEquals(expectedList.get(i).getValue(), actualList.get(i).getValue());
}
}
}