blob: a3ba0cc60dc2c5e73e9671f4a277ddf2ccada538 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.tinkerpop.gremlin.process.traversal.step.filter;
import org.apache.tinkerpop.gremlin.LoadGraphWith;
import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
import org.apache.tinkerpop.gremlin.process.GremlinProcessRunner;
import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
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.TraversalEngine;
import org.apache.tinkerpop.gremlin.structure.T;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.*;
import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
import static org.apache.tinkerpop.gremlin.process.traversal.P.*;
import static org.apache.tinkerpop.gremlin.process.traversal.P.not;
import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.not;
import static org.junit.Assert.*;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
@RunWith(GremlinProcessRunner.class)
public abstract class WhereTest extends AbstractGremlinProcessTest {
/// where(local)
public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_selectXa_bX_whereXa_eqXbXX();
public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_selectXa_bX_whereXa_neqXbXX();
public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_selectXa_bX_whereXb_hasXname_markoXX();
public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_selectXa_bX_whereXa_outXknowsX_bX();
/// where(global)
public abstract Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_asXbX_whereXa_neqXbXX_name(final Object v1Id);
public abstract Traversal<Vertex, Object> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_asXbX_whereXasXbX_outXcreatedX_hasXname_rippleXX_valuesXage_nameX(final Object v1Id);
// except/retain functionality
public abstract Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_whereXeqXaXX_name(final Object v1Id);
public abstract Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_whereXneqXaXX_name(final Object v1Id);
public abstract Traversal<Vertex, Vertex> get_g_VX1X_out_aggregateXxX_out_whereXnotXwithinXaXXX(final Object v1Id);
public abstract Traversal<Vertex, Vertex> get_g_withSideEffectXa_graph_verticesX2XX_VX1X_out_whereXneqXaXX(final Object v1Id, final Object v2Id);
public abstract Traversal<Vertex, Path> get_g_VX1X_repeatXbothEXcreatedX_whereXwithoutXeXX_aggregateXeX_otherVX_emit_path(final Object v1Id);
// hasNot functionality
public abstract Traversal<Vertex, String> get_g_V_whereXnotXoutXcreatedXXX_name();
// complex and/or functionality
public abstract Traversal<Vertex, Map<String, Object>> get_g_V_asXaX_out_asXbX_whereXandXasXaX_outXknowsX_asXbX__orXasXbX_outXcreatedX_hasXname_rippleX__asXbX_inXknowsX_count_isXnotXeqX0XXXXX_selectXa_bX();
public abstract Traversal<Vertex, String> get_g_V_whereXoutXcreatedX_and_outXknowsX_or_inXknowsXX_valuesXnameX();
public abstract Traversal<Vertex, Map<String, Object>> get_g_V_asXaX_outXcreatedX_asXbX_whereXandXasXbX_in__notXasXaX_outXcreatedX_hasXname_rippleXXX_selectXa_bX();
public abstract Traversal<Vertex, Map<String, Object>> get_g_V_asXaX_outXcreatedX_asXbX_inXcreatedX_asXcX_bothXknowsX_bothXknowsX_asXdX_whereXc__notXeqXaX_orXeqXdXXXX_selectXa_b_c_dX();
public abstract Traversal<Vertex, Map<String, Object>> get_g_V_asXaX_out_asXbX_whereXin_count_isXeqX3XX_or_whereXoutXcreatedX_and_hasXlabel_personXXX_selectXa_bX();
// multi-labels
//public abstract Traversal<Vertex, String> get_g_V_asXaX_outXknowsX_asXbX_whereXasXa__bX_outXcreatedX_hasXname__rippleX_name();
@Test
@LoadGraphWith(MODERN)
public void g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_selectXa_bX_whereXa_eqXbXX() {
final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_selectXa_bX_whereXa_eqXbXX();
printTraversalForm(traversal);
int counter = 0;
while (traversal.hasNext()) {
counter++;
final Map<String, Object> map = traversal.next();
assertEquals(2, map.size());
assertTrue(map.containsKey("a"));
assertTrue(map.containsKey("b"));
assertEquals(map.get("a"), map.get("b"));
}
assertEquals(6, counter);
assertFalse(traversal.hasNext());
}
@Test
@LoadGraphWith(MODERN)
public void g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_selectXa_bX_whereXa_neqXbXX() {
final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_selectXa_bX_whereXa_neqXbXX();
printTraversalForm(traversal);
int counter = 0;
while (traversal.hasNext()) {
counter++;
final Map<String, Object> map = traversal.next();
assertEquals(2, map.size());
assertTrue(map.containsKey("a"));
assertTrue(map.containsKey("b"));
assertNotEquals(map.get("a"), map.get("b"));
assertTrue(((Vertex) map.get("a")).id().equals(convertToVertexId("marko")) ||
((Vertex) map.get("a")).id().equals(convertToVertexId("peter")) ||
((Vertex) map.get("a")).id().equals(convertToVertexId("josh")));
assertTrue(((Vertex) map.get("b")).id().equals(convertToVertexId("marko")) ||
((Vertex) map.get("b")).id().equals(convertToVertexId("peter")) ||
((Vertex) map.get("b")).id().equals(convertToVertexId("josh")));
}
assertEquals(6, counter);
assertFalse(traversal.hasNext());
}
@Test
@LoadGraphWith(MODERN)
public void g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_selectXa_bX_whereXb_hasXname_markoXX() {
final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_selectXa_bX_whereXb_hasXname_markoXX();
printTraversalForm(traversal);
int counter = 0;
int markoCounter = 0;
while (traversal.hasNext()) {
counter++;
final Map<String, Object> map = traversal.next();
assertEquals(2, map.size());
assertTrue(map.containsKey("a"));
assertTrue(map.containsKey("b"));
assertEquals(convertToVertexId("marko"), ((Vertex) map.get("b")).id());
if (((Vertex) map.get("a")).id().equals(convertToVertexId("marko")))
markoCounter++;
else
assertTrue(((Vertex) map.get("a")).id().equals(convertToVertexId("josh")) || ((Vertex) map.get("a")).id().equals(convertToVertexId("peter")));
}
assertEquals(3, markoCounter);
assertEquals(5, counter);
assertFalse(traversal.hasNext());
}
@Test
@LoadGraphWith(MODERN)
public void g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_selectXa_bX_whereXa_outXknowsX_bX() {
final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_selectXa_bX_whereXa_outXknowsX_bX();
printTraversalForm(traversal);
int counter = 0;
while (traversal.hasNext()) {
counter++;
final Map<String, Object> map = traversal.next();
assertEquals(2, map.size());
assertTrue(map.containsKey("a"));
assertTrue(map.containsKey("b"));
assertEquals(convertToVertexId("marko"), ((Vertex) map.get("a")).id());
assertEquals(convertToVertexId("josh"), ((Vertex) map.get("b")).id());
}
assertEquals(1, counter);
assertFalse(traversal.hasNext());
}
/// where(global)
@Test
@LoadGraphWith(MODERN)
public void g_VX1X_asXaX_outXcreatedX_inXcreatedX_asXbX_whereXa_neqXbXX_name() {
final Traversal<Vertex, String> traversal = get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_asXbX_whereXa_neqXbXX_name(convertToVertexId(graph, "marko"));
printTraversalForm(traversal);
checkResults(Arrays.asList("josh", "peter"), traversal);
}
@Test
@LoadGraphWith(MODERN)
public void g_VX1X_asXaX_outXcreatedX_inXcreatedX_asXbX_whereXasXbX_outXcreatedX_hasXname_rippleXX_valuesXage_nameX() {
final Traversal<Vertex, Object> traversal = get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_asXbX_whereXasXbX_outXcreatedX_hasXname_rippleXX_valuesXage_nameX(convertToVertexId(graph, "marko"));
printTraversalForm(traversal);
checkResults(Arrays.asList("josh", 32), traversal);
}
/// except/retain functionality
@Test
@LoadGraphWith(MODERN)
public void g_VX1X_asXaX_outXcreatedX_inXcreatedX_whereXeqXaXX_name() {
final Traversal<Vertex, String> traversal = get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_whereXeqXaXX_name(convertToVertexId("marko"));
printTraversalForm(traversal);
assertEquals("marko", traversal.next());
assertFalse(traversal.hasNext());
}
@Test
@LoadGraphWith(MODERN)
public void g_VX1X_asXaX_outXcreatedX_inXcreatedX_whereXneqXaXX_name() {
final Traversal<Vertex, String> traversal = get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_whereXneqXaXX_name(convertToVertexId("marko"));
printTraversalForm(traversal);
checkResults(Arrays.asList("peter", "josh"), traversal);
}
@Test
@LoadGraphWith(MODERN)
public void g_VX1X_out_aggregateXxX_out_whereXwithout_xX() {
final Traversal<Vertex, Vertex> traversal = get_g_VX1X_out_aggregateXxX_out_whereXnotXwithinXaXXX(convertToVertexId("marko"));
printTraversalForm(traversal);
assertEquals("ripple", traversal.next().<String>value("name"));
assertFalse(traversal.hasNext());
}
@Test
@LoadGraphWith(MODERN)
public void g_withSideEffectXa_g_VX2XX_VX1X_out_whereXneqXaXX() {
final Traversal<Vertex, Vertex> traversal = get_g_withSideEffectXa_graph_verticesX2XX_VX1X_out_whereXneqXaXX(convertToVertexId("marko"), convertToVertexId("vadas"));
printTraversalForm(traversal);
int counter = 0;
final Set<Vertex> vertices = new HashSet<>();
while (traversal.hasNext()) {
counter++;
final Vertex vertex = traversal.next();
vertices.add(vertex);
assertTrue(vertex.value("name").equals("josh") || vertex.value("name").equals("lop"));
}
assertEquals(2, counter);
assertEquals(2, vertices.size());
}
@Test
@LoadGraphWith(MODERN)
public void g_VX1X_repeatXbothEXcreatedX_whereXwithoutXeXX_aggregateXeX_otherVX_emit_path() {
final Traversal<Vertex, Path> traversal = get_g_VX1X_repeatXbothEXcreatedX_whereXwithoutXeXX_aggregateXeX_otherVX_emit_path(convertToVertexId("marko"));
printTraversalForm(traversal);
final List<Path> paths = traversal.toList();
assertEquals(4, paths.size());
assertEquals(1, paths.stream().filter(path -> path.size() == 3).count());
assertEquals(2, paths.stream().filter(path -> path.size() == 5).count());
assertEquals(1, paths.stream().filter(path -> path.size() == 7).count());
assertFalse(traversal.hasNext());
}
// hasNot functionality
@Test
@LoadGraphWith(MODERN)
public void g_V_whereXnotXoutXcreatedXXX_name() {
final Traversal<Vertex, String> traversal = get_g_V_whereXnotXoutXcreatedXXX_name();
printTraversalForm(traversal);
checkResults(Arrays.asList("vadas", "lop", "ripple"), traversal);
}
// complex and/or functionality
@Test
@LoadGraphWith(MODERN)
public void g_V_asXaX_out_asXbX_whereXandXasXaX_outXknowsX_asXbX__orXasXbX_outXcreatedX_hasXname_rippleX__asXbX_inXknowsX_count_isXnotXeqX0XXXXX_selectXa_bX() {
final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_asXaX_out_asXbX_whereXandXasXaX_outXknowsX_asXbX__orXasXbX_outXcreatedX_hasXname_rippleX__asXbX_inXknowsX_count_isXnotXeqX0XXXXX_selectXa_bX();
printTraversalForm(traversal);
checkResults(makeMapList(2,
"a", convertToVertex(graph, "marko"), "b", convertToVertex(graph, "josh"),
"a", convertToVertex(graph, "marko"), "b", convertToVertex(graph, "vadas")), traversal);
}
@Test
@LoadGraphWith(MODERN)
public void g_V_whereXoutXcreatedX_and_outXknowsX_or_inXknowsXX_selectXaX_byXnameX() {
final Traversal<Vertex, String> traversal = get_g_V_whereXoutXcreatedX_and_outXknowsX_or_inXknowsXX_valuesXnameX();
printTraversalForm(traversal);
checkResults(Arrays.asList("marko", "vadas", "josh"), traversal);
}
@Test
@LoadGraphWith(MODERN)
public void g_V_asXaX_outXcreatedX_asXbX_whereXandXasXbX_in__notXasXaX_outXcreatedX_hasXname_rippleXXX_selectXa_bX() {
final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_asXaX_outXcreatedX_asXbX_whereXandXasXbX_in__notXasXaX_outXcreatedX_hasXname_rippleXXX_selectXa_bX();
printTraversalForm(traversal);
checkResults(makeMapList(2,
"a", convertToVertex(graph, "marko"), "b", convertToVertex(graph, "lop"),
"a", convertToVertex(graph, "peter"), "b", convertToVertex(graph, "lop")), traversal);
}
@Test
@LoadGraphWith(MODERN)
public void g_V_asXaX_outXcreatedX_asXbX_inXcreatedX_asXcX_bothXknowsX_bothXknowsX_asXdX_whereXc__notXeqXaX_orXeqXdXXXX_selectXa_b_c_dX() {
final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_asXaX_outXcreatedX_asXbX_inXcreatedX_asXcX_bothXknowsX_bothXknowsX_asXdX_whereXc__notXeqXaX_orXeqXdXXXX_selectXa_b_c_dX();
printTraversalForm(traversal);
checkResults(makeMapList(4,
"a", convertToVertex(graph, "marko"), "b", convertToVertex(graph, "lop"), "c", convertToVertex(graph, "josh"), "d", convertToVertex(graph, "vadas"),
"a", convertToVertex(graph, "peter"), "b", convertToVertex(graph, "lop"), "c", convertToVertex(graph, "josh"), "d", convertToVertex(graph, "vadas")), traversal);
}
@Test
@LoadGraphWith(MODERN)
public void g_V_asXaX_out_asXbX_whereXin_count_isXeqX3XX_or_whereXoutXcreatedX_and_hasXlabel_personXXX_selectXa_bX() {
final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_asXaX_out_asXbX_whereXin_count_isXeqX3XX_or_whereXoutXcreatedX_and_hasXlabel_personXXX_selectXa_bX();
printTraversalForm(traversal);
checkResults(makeMapList(2,
"a", convertToVertex(graph, "marko"), "b", convertToVertex(graph, "josh"),
"a", convertToVertex(graph, "marko"), "b", convertToVertex(graph, "lop"),
"a", convertToVertex(graph, "peter"), "b", convertToVertex(graph, "lop"),
"a", convertToVertex(graph, "josh"), "b", convertToVertex(graph, "lop")), traversal);
}
public static class Traversals extends WhereTest {
/// where(local)
@Override
public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_selectXa_bX_whereXa_eqXbXX() {
return g.V().has("age").as("a").out().in().has("age").as("b").select("a","b").where("a", eq("b"));
}
@Override
public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_selectXa_bX_whereXa_neqXbXX() {
return g.V().has("age").as("a").out().in().has("age").as("b").select("a","b").where("a", neq("b"));
}
@Override
public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_selectXa_bX_whereXb_hasXname_markoXX() {
return g.V().has("age").as("a").out().in().has("age").as("b").select("a","b").where(as("b").has("name", "marko"));
}
@Override
public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_selectXa_bX_whereXa_outXknowsX_bX() {
return g.V().has("age").as("a").out().in().has("age").as("b").select("a","b").where(as("a").out("knows").as("b"));
}
/// where(global)
@Override
public Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_asXbX_whereXa_neqXbXX_name(final Object v1Id) {
return g.V(v1Id).as("a").out("created").in("created").as("b").where("a", neq("b")).values("name");
}
@Override
public Traversal<Vertex, Object> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_asXbX_whereXasXbX_outXcreatedX_hasXname_rippleXX_valuesXage_nameX(final Object v1Id) {
return g.V(v1Id).as("a").out("created").in("created").as("b").where(as("b").out("created").has("name", "ripple")).values("age", "name");
}
// except/retain functionality
@Override
public Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_whereXeqXaXX_name(final Object v1Id) {
return g.V(v1Id).as("a").out("created").in("created").where(eq("a")).values("name");
}
@Override
public Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_whereXneqXaXX_name(final Object v1Id) {
return g.V(v1Id).as("a").out("created").in("created").where(neq("a")).values("name");
}
@Override
public Traversal<Vertex, Vertex> get_g_VX1X_out_aggregateXxX_out_whereXnotXwithinXaXXX(final Object v1Id) {
return g.V(v1Id).out().aggregate("x").out().where(not(within("x")));
}
@Override
public Traversal<Vertex, Vertex> get_g_withSideEffectXa_graph_verticesX2XX_VX1X_out_whereXneqXaXX(final Object v1Id, final Object v2Id) {
return g.withSideEffect("a", g.V(v2Id).next()).V(v1Id).out().where(neq("a"));
}
@Override
public Traversal<Vertex, Path> get_g_VX1X_repeatXbothEXcreatedX_whereXwithoutXeXX_aggregateXeX_otherVX_emit_path(final Object v1Id) {
return g.V(v1Id).repeat(bothE("created").where(without("e")).aggregate("e").otherV()).emit().path();
}
// hasNot functionality
@Override
public Traversal<Vertex, String> get_g_V_whereXnotXoutXcreatedXXX_name() {
return g.V().where(not(out("created"))).values("name");
}
// complex and/or functionality
@Override
public Traversal<Vertex, Map<String, Object>> get_g_V_asXaX_out_asXbX_whereXandXasXaX_outXknowsX_asXbX__orXasXbX_outXcreatedX_hasXname_rippleX__asXbX_inXknowsX_count_isXnotXeqX0XXXXX_selectXa_bX() {
return g.V().as("a").out().as("b").where(and(as("a").out("knows").as("b"), or(as("b").out("created").has("name", "ripple"), as("b").in("knows").count().is(not(eq(0)))))).select("a","b");
}
@Override
public Traversal<Vertex, String> get_g_V_whereXoutXcreatedX_and_outXknowsX_or_inXknowsXX_valuesXnameX() {
return g.V().where(out("created").and().out("knows").or().in("knows")).values("name");
}
@Override
public Traversal<Vertex, Map<String, Object>> get_g_V_asXaX_outXcreatedX_asXbX_whereXandXasXbX_in__notXasXaX_outXcreatedX_hasXname_rippleXXX_selectXa_bX() {
return g.V().as("a").out("created").as("b").where(and(as("b").in(), not(as("a").out("created").has("name", "ripple")))).select("a","b");
}
@Override
public Traversal<Vertex, Map<String, Object>> get_g_V_asXaX_outXcreatedX_asXbX_inXcreatedX_asXcX_bothXknowsX_bothXknowsX_asXdX_whereXc__notXeqXaX_orXeqXdXXXX_selectXa_b_c_dX() {
return g.V().as("a").out("created").as("b").in("created").as("c").both("knows").both("knows").as("d").where("c", P.not(P.eq("a").or(P.eq("d")))).select("a","b","c","d");
}
@Override
public Traversal<Vertex, Map<String, Object>> get_g_V_asXaX_out_asXbX_whereXin_count_isXeqX3XX_or_whereXoutXcreatedX_and_hasXlabel_personXXX_selectXa_bX() {
return g.V().as("a").out().as("b").where(as("b").in().count().is(eq(3)).or().where(as("b").out("created").and().as("b").has(T.label, "person"))).select("a","b");
}
}
}