Coverage Summary for Class: TestOrStep (org.umlg.sqlg.test.filter.or)
Class |
Class, %
|
Method, %
|
Branch, %
|
Line, %
|
TestOrStep |
100%
(1/1)
|
100%
(14/14)
|
50%
(16/32)
|
100%
(266/266)
|
package org.umlg.sqlg.test.filter.or;
import org.apache.tinkerpop.gremlin.process.traversal.P;
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.structure.T;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.junit.Assert;
import org.junit.Assume;
import org.junit.Test;
import org.umlg.sqlg.predicate.FullText;
import org.umlg.sqlg.structure.topology.IndexType;
import org.umlg.sqlg.structure.topology.VertexLabel;
import org.umlg.sqlg.test.BaseTest;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* @author <a href="https://github.com/pietermartin">Pieter Martin</a>
* Date: 2017/10/30
*/
@SuppressWarnings({"DuplicatedCode", "unused", "resource"})
public class TestOrStep extends BaseTest {
@Test
public void testSelect() {
Vertex a1 = this.sqlgGraph.addVertex(T.label, "A");
Vertex b1 = this.sqlgGraph.addVertex(T.label, "B");
a1.addEdge("ab", b1);
this.sqlgGraph.tx().commit();
GraphTraversal<Vertex, Vertex> traversal = this.sqlgGraph.traversal().V().hasLabel("A").as("a").out("ab").select("a");
printTraversalForm(traversal);
List<Vertex> result = traversal.toList();
Assert.assertEquals(1, result.size());
}
@Test
public void testSelectAfterAndOrHasContainer() {
this.sqlgGraph.traversal().addV("A").property("startDate", 0).next();
this.sqlgGraph.traversal().addV("A").property("startDate", 0).property("endDate", 10L).next();
this.sqlgGraph.tx().commit();
// This works correctly (not and has):
GraphTraversal<Vertex, Long> traversal = this.sqlgGraph.traversal().V()
.hasLabel("A")
.has("startDate", P.lte(9))
.or(
__.not(__.has("endDate")),
__.has("endDate", P.gt(9))
).as("svc")
.select("svc")
.count();
printTraversalForm(traversal);
Assert.assertEquals(2L, traversal.next(), 0);
// This works correctly(hasNot):
traversal = this.sqlgGraph.traversal().V()
.hasLabel("A")
.has("startDate", P.lte(9))
.or(
__.hasNot("endDate"),
__.has("endDate", P.gt(9))
).as("svc")
.count();
printTraversalForm(traversal);
Assert.assertEquals(2L, traversal.next(), 0);
// This fails (hasNot with select):
traversal = this.sqlgGraph.traversal().V()
.hasLabel("A")
.has("startDate", P.lte(9))
.or(
__.hasNot("endDate"),
__.has("endDate", P.gt(9))
).as("svc")
.select("svc")
.count();
printTraversalForm(traversal);
Assert.assertEquals(2, traversal.next(), 0);
}
@Test
public void testOrStepOptimizedWith3Ors() {
Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2");
Vertex a3 = this.sqlgGraph.addVertex(T.label, "A", "name", "a3");
this.sqlgGraph.addVertex(T.label, "A", "name", "a4");
this.sqlgGraph.tx().commit();
DefaultGraphTraversal<Vertex, Vertex> traversal = (DefaultGraphTraversal<Vertex, Vertex>) this.sqlgGraph.traversal()
.V().hasLabel("A")
.or(
__.has("name", "a1"),
__.has("name", "a2"),
__.has("name", "a3")
);
List<Vertex> vertices = traversal.toList();
Assert.assertEquals(1, traversal.getSteps().size());
Assert.assertEquals(3, vertices.size());
Assert.assertTrue(vertices.contains(a1) && vertices.contains(a2) && vertices.contains(a3));
}
@Test
public void testOrChained() {
Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1", "p1", "v1");
Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2", "p1", "v1");
this.sqlgGraph.addVertex(T.label, "A", "name", "a3", "p1", "v1");
this.sqlgGraph.addVertex(T.label, "A", "name", "a4", "p1", "v1");
this.sqlgGraph.tx().commit();
DefaultGraphTraversal<Vertex, Vertex> traversal = (DefaultGraphTraversal<Vertex, Vertex>) this.sqlgGraph.traversal()
.V().hasLabel("A")
.or(
__.has("name", "a1").has("p1", "v1"),
__.has("name", "a2"),
__.has("name", "a3").has("p1", "v2")
);
List<Vertex> vertices = traversal.toList();
Assert.assertEquals(1, traversal.getSteps().size());
Assert.assertEquals(2, vertices.size());
Assert.assertTrue(vertices.contains(a1) && vertices.contains(a2));
}
@Test
public void testOrMissingProperty() {
Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1", "p1", "v1");
Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2", "p1", "v1");
Vertex a3 = this.sqlgGraph.addVertex(T.label, "A", "name", "a3", "p1", "v1");
this.sqlgGraph.addVertex(T.label, "A", "name", "a4", "p1", "v1");
this.sqlgGraph.tx().commit();
DefaultGraphTraversal<Vertex, Vertex> traversal = (DefaultGraphTraversal<Vertex, Vertex>) this.sqlgGraph.traversal()
.V().hasLabel("A")
.or(
__.has("name", "a1").has("p1", "v1"),
__.has("name", "a2"),
__.has("name", "a3").has("p2", "v2")
);
List<Vertex> vertices = traversal.toList();
Assert.assertEquals(1, traversal.getSteps().size());
Assert.assertEquals(2, vertices.size());
Assert.assertTrue(vertices.contains(a1) && vertices.contains(a2));
traversal = (DefaultGraphTraversal<Vertex, Vertex>) this.sqlgGraph.traversal()
.V().hasLabel("A")
.or(
__.has("name", "a1").has("p1", "v1"),
__.has("name", "a2"),
__.has("name", "a3").has("p2")
);
vertices = traversal.toList();
//Assert.assertEquals(1, traversal.getSteps().size());
Assert.assertEquals(2, vertices.size());
Assert.assertTrue(vertices.contains(a1) && vertices.contains(a2));
traversal = (DefaultGraphTraversal<Vertex, Vertex>) this.sqlgGraph.traversal()
.V().hasLabel("A")
.or(
__.has("name", "a1").has("p1", "v1"),
__.has("name", "a2"),
__.has("name", "a3").hasNot("p2")
);
vertices = traversal.toList();
//Assert.assertEquals(1, traversal.getSteps().size());
Assert.assertEquals(3, vertices.size());
Assert.assertTrue(vertices.contains(a1) && vertices.contains(a2) && vertices.contains(a3));
}
@Test
public void testOrStepOptimized() {
Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2");
Vertex a3 = this.sqlgGraph.addVertex(T.label, "A", "name", "a3");
this.sqlgGraph.tx().commit();
DefaultGraphTraversal<Vertex, Vertex> traversal = (DefaultGraphTraversal<Vertex, Vertex>) this.sqlgGraph.traversal()
.V().hasLabel("A")
.or(
__.has("name", "a1"),
__.has("name", "a2")
);
List<Vertex> vertices = traversal.toList();
Assert.assertEquals(1, traversal.getSteps().size());
Assert.assertEquals(2, vertices.size());
Assert.assertTrue(vertices.contains(a1) && vertices.contains(a2));
}
@Test
public void testNestedOrStep() {
Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2");
Vertex a3 = this.sqlgGraph.addVertex(T.label, "A", "name", "a3");
Vertex a4 = this.sqlgGraph.addVertex(T.label, "A", "name", "a4");
this.sqlgGraph.tx().commit();
DefaultGraphTraversal<Vertex, Vertex> traversal = (DefaultGraphTraversal<Vertex, Vertex>) this.sqlgGraph.traversal()
.V().hasLabel("A")
.or(
__.has("name", "a1"),
__.or(
__.has("name", "a2"),
__.has("name", "a3")
)
);
List<Vertex> vertices = traversal.toList();
Assert.assertEquals(1, traversal.getSteps().size());
Assert.assertEquals(3, vertices.size());
Assert.assertTrue(vertices.contains(a1) && vertices.contains(a2) && vertices.contains(a3));
}
@Test
public void testOrWithinPredicate() {
Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2");
Vertex a3 = this.sqlgGraph.addVertex(T.label, "A", "name", "a3");
Vertex a4 = this.sqlgGraph.addVertex(T.label, "A", "name", "a4");
Vertex a5 = this.sqlgGraph.addVertex(T.label, "A", "name", "a5");
Vertex a6 = this.sqlgGraph.addVertex(T.label, "A", "name", "a6");
Vertex a7 = this.sqlgGraph.addVertex(T.label, "A", "name", "a7");
this.sqlgGraph.tx().commit();
DefaultGraphTraversal<Vertex, Vertex> traversal = (DefaultGraphTraversal<Vertex, Vertex>) this.sqlgGraph.traversal()
.V().hasLabel("A")
.or(
__.has("name", P.within("a1", "a2", "a3", "a4", "a5")),
__.or(
__.has("name", "a6")
)
);
List<Vertex> vertices = traversal.toList();
Assert.assertEquals(1, traversal.getSteps().size());
Assert.assertEquals(6, vertices.size());
Assert.assertTrue(vertices.contains(a1) && vertices.contains(a2) && vertices.contains(a3));
//logic in BaseStrategy is different
traversal = (DefaultGraphTraversal<Vertex, Vertex>) this.sqlgGraph.traversal()
.V().hasLabel("A")
.or(
__.has("name", "a6"),
__.or(
__.has("name", P.within("a1", "a2", "a3", "a4", "a5"))
)
);
vertices = traversal.toList();
Assert.assertEquals(1, traversal.getSteps().size());
Assert.assertEquals(6, vertices.size());
Assert.assertTrue(vertices.contains(a1) && vertices.contains(a2) && vertices.contains(a3));
}
@Test
public void testOrBetween() {
Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1", "age", 1);
Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2", "age", 2);
Vertex a3 = this.sqlgGraph.addVertex(T.label, "A", "name", "a3", "age", 3);
Vertex a4 = this.sqlgGraph.addVertex(T.label, "A", "name", "a4", "age", 4);
Vertex a5 = this.sqlgGraph.addVertex(T.label, "A", "name", "a5", "age", 5);
Vertex a6 = this.sqlgGraph.addVertex(T.label, "A", "name", "a6", "age", 6);
Vertex a7 = this.sqlgGraph.addVertex(T.label, "A", "name", "a7", "age", 7);
this.sqlgGraph.tx().commit();
DefaultGraphTraversal<Vertex, Vertex> traversal = (DefaultGraphTraversal<Vertex, Vertex>) this.sqlgGraph.traversal().V()
.hasLabel("A")
.or(
__.has("age", P.between(2, 5)),
__.has("name", "a7")
);
List<Vertex> vertices = traversal.toList();
Assert.assertEquals(1, traversal.getSteps().size());
Assert.assertEquals(4, vertices.size());
Assert.assertTrue(vertices.containsAll(Arrays.asList(a2, a3, a4, a7)));
}
@Test
public void testOrInside() {
Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1", "age", 1);
Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2", "age", 2);
Vertex a3 = this.sqlgGraph.addVertex(T.label, "A", "name", "a3", "age", 3);
Vertex a4 = this.sqlgGraph.addVertex(T.label, "A", "name", "a4", "age", 4);
Vertex a5 = this.sqlgGraph.addVertex(T.label, "A", "name", "a5", "age", 5);
Vertex a6 = this.sqlgGraph.addVertex(T.label, "A", "name", "a6", "age", 6);
Vertex a7 = this.sqlgGraph.addVertex(T.label, "A", "name", "a7", "age", 7);
this.sqlgGraph.tx().commit();
DefaultGraphTraversal<Vertex, Vertex> traversal = (DefaultGraphTraversal<Vertex, Vertex>) this.sqlgGraph.traversal().V()
.hasLabel("A")
.or(
__.has("age", P.inside(2, 5)),
__.has("name", "a7")
);
List<Vertex> vertices = traversal.toList();
Assert.assertEquals(1, traversal.getSteps().size());
Assert.assertEquals(3, vertices.size());
Assert.assertTrue(vertices.containsAll(Arrays.asList(a3, a4, a7)));
}
@Test
public void testOrOutside() {
Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1", "age", 1);
Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2", "age", 2);
Vertex a3 = this.sqlgGraph.addVertex(T.label, "A", "name", "a3", "age", 3);
Vertex a4 = this.sqlgGraph.addVertex(T.label, "A", "name", "a4", "age", 4);
Vertex a5 = this.sqlgGraph.addVertex(T.label, "A", "name", "a5", "age", 5);
Vertex a6 = this.sqlgGraph.addVertex(T.label, "A", "name", "a6", "age", 6);
Vertex a7 = this.sqlgGraph.addVertex(T.label, "A", "name", "a7", "age", 7);
this.sqlgGraph.tx().commit();
DefaultGraphTraversal<Vertex, Vertex> traversal = (DefaultGraphTraversal<Vertex, Vertex>) this.sqlgGraph.traversal().V()
.hasLabel("A")
.or(
__.has("age", P.outside(2, 5)),
__.has("name", "a7")
);
List<Vertex> vertices = traversal.toList();
Assert.assertEquals(1, traversal.getSteps().size());
Assert.assertEquals(3, vertices.size());
Assert.assertTrue(vertices.containsAll(Arrays.asList(a1, a6, a7)));
}
@Test
public void testOrFullText() {
Assume.assumeTrue(isPostgres());
Vertex v0 = this.sqlgGraph.addVertex(T.label, "Sentence", "name", "a fat cat sat on a mat and ate a fat rat");
Vertex v1 = this.sqlgGraph.addVertex(T.label, "Sentence", "name", "fatal error");
Vertex v2 = this.sqlgGraph.addVertex(T.label, "Sentence", "name", "error is not fatal");
VertexLabel vl = this.sqlgGraph.getTopology().getVertexLabel("public", "Sentence").orElseThrow();
vl.ensureIndexExists(IndexType.getFullTextGIN("english"), Collections.singletonList(vl.getProperty("name").orElseThrow()));
this.sqlgGraph.tx().commit();
DefaultGraphTraversal<Vertex, Vertex> traversal = (DefaultGraphTraversal<Vertex, Vertex>) this.sqlgGraph.traversal()
.V().hasLabel("Sentence")
.or(
__.has("name", FullText.fullTextMatch("english", "fat & rat")),
__.has("name", "fatal error")
);
List<Vertex> vertices = traversal.toList();
Assert.assertEquals(1, traversal.getSteps().size());
Assert.assertEquals(2, vertices.size());
Assert.assertTrue(vertices.containsAll(Arrays.asList(v0, v1)));
traversal = (DefaultGraphTraversal<Vertex, Vertex>) this.sqlgGraph.traversal()
.V().hasLabel("Sentence")
.or(
__.has("name", FullText.fullTextMatch("english", "fat & cow")),
__.has("name", "fatal error")
);
vertices = traversal.toList();
Assert.assertEquals(1, traversal.getSteps().size());
Assert.assertEquals(1, vertices.size());
Assert.assertTrue(vertices.contains(v1));
}
@Test
public void testOrStepForVertexStep() {
Vertex aa1 = this.sqlgGraph.addVertex(T.label, "AA", "name", "a1");
Vertex aa2 = this.sqlgGraph.addVertex(T.label, "AA", "name", "a2");
Vertex aa3 = this.sqlgGraph.addVertex(T.label, "AA", "name", "a3");
Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2");
Vertex a3 = this.sqlgGraph.addVertex(T.label, "A", "name", "a3");
Vertex a4 = this.sqlgGraph.addVertex(T.label, "A", "name", "a4");
aa1.addEdge("ab", a1);
aa1.addEdge("ab", a2);
aa1.addEdge("ab", a2);
aa1.addEdge("ab", a2);
this.sqlgGraph.tx().commit();
DefaultGraphTraversal<Vertex, Vertex> traversal = (DefaultGraphTraversal<Vertex, Vertex>) this.sqlgGraph.traversal()
.V().hasLabel("AA")
.local(
__.out("ab")
.or(
__.has("name", "a1"),
__.or(
__.has("name", "a2"),
__.has("name", "a3")
)
)
);
List<Vertex> vertices = traversal.toList();
Assert.assertEquals(2, traversal.getSteps().size());
Assert.assertEquals(4, vertices.size());
Assert.assertTrue(vertices.contains(a1) && vertices.contains(a2));
Assert.assertTrue(!vertices.contains(a3) || vertices.contains(a4));
}
}