use of org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.has in project timbuctoo by HuygensING.
the class RelatedDatableRangeFacetDescription method filter.
@Override
@SuppressWarnings("unchecked")
public void filter(GraphTraversal<Vertex, Vertex> graphTraversal, List<FacetValue> facets) {
Optional<FacetValue> first = facets.stream().filter(facetValue -> Objects.equals(facetValue.getName(), facetName)).findFirst();
if (!first.isPresent()) {
return;
}
FacetValue facetValue = first.get();
if (!(facetValue instanceof DateRangeFacetValue)) {
return;
}
// pad the strings to make them parsable
String lowerLimitString = Strings.padStart("" + ((DateRangeFacetValue) facetValue).getLowerLimit(), 8, '0').substring(0, 4);
String upperLimitString = Strings.padStart("" + ((DateRangeFacetValue) facetValue).getUpperLimit(), 8, '0').substring(0, 4);
try {
Range<Date> range = Range.closed(FILTER_FORMAT.parse(lowerLimitString), FILTER_FORMAT.parse(upperLimitString));
graphTraversal.where(__.bothE(relations).otherV().has(propertyName, P.test((o1, o2) -> {
Datable datable = getDatable("" + o1);
if (!datable.isValid()) {
return false;
}
Range<Date> range1 = (Range<Date>) o2;
return range1.contains(datable.getFromDate()) || range1.contains(datable.getToDate());
}, range)));
} catch (ParseException e) {
LOG.error("Cannot parse date", e);
}
}
use of org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.has in project timbuctoo by HuygensING.
the class AltNameFacetDescription method filter.
@Override
public void filter(GraphTraversal<Vertex, Vertex> graphTraversal, List<FacetValue> facetValues) {
Optional<FacetValue> first = facetValues.stream().filter(facetValue -> Objects.equals(facetValue.getName(), facetName)).findFirst();
if (!first.isPresent()) {
return;
}
FacetValue facetValue = first.get();
if (!(facetValue instanceof ListFacetValue)) {
return;
}
List<String> values = ((ListFacetValue) facetValue).getValues();
if (values.isEmpty()) {
return;
}
graphTraversal.where(__.<String>has(propertyName, P.test((o1, o2) -> o1 instanceof String && o2 instanceof List && ((List<?>) o2).stream().anyMatch(value -> ((String) o1).contains("\"" + value + "\"")), values)));
}
use of org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.has in project timbuctoo by HuygensING.
the class TinkerPopToEntityMapper method getRelations.
private List<RelationRef> getRelations(Vertex entity, GraphTraversalSource traversalSource, Collection collection) {
final Vre vre = collection.getVre();
Vre adminVre = mappings.getVre("Admin");
Map<String, Collection> collectionsOfVre = vre.getCollections();
Object[] relationTypes = traversalSource.V().has(T.label, LabelP.of("relationtype")).id().toList().toArray();
GraphTraversal<Vertex, RelationRef> realRelations = collectionsOfVre.values().stream().filter(Collection::isRelationCollection).findAny().map(Collection::getEntityTypeName).map(ownRelationType -> traversalSource.V(entity.id()).union(__.outE().as("edge").label().as("label").select("edge"), __.inE().as("edge").label().as("edgeLabel").V(relationTypes).has("relationtype_regularName", __.where(P.eq("edgeLabel"))).properties("relationtype_inverseName").value().as("label").select("edge")).where(// FIXME move to strategy
__.has("isLatest", true).not(__.has("deleted", true)).not(__.hasLabel("VERSION_OF")).not(__.has(ownRelationType + "_accepted", false))).otherV().as("vertex").select("edge", "vertex", "label").map(r -> {
try {
Map<String, Object> val = r.get();
Edge edge = (Edge) val.get("edge");
Vertex target = (Vertex) val.get("vertex");
String label = (String) val.get("label");
String targetEntityType = vre.getOwnType(getEntityTypesOrDefault(target));
Collection targetCollection = vre.getCollectionForTypeName(targetEntityType);
if (targetEntityType == null) {
// this means that the edge is of this VRE, but the
// Vertex it points to is of another VRE
// In that case we use the admin vre
targetEntityType = adminVre.getOwnType(getEntityTypesOrDefault(target));
targetCollection = adminVre.getCollectionForTypeName(targetEntityType);
}
String displayName = DisplayNameHelper.getDisplayname(traversalSource, target, targetCollection).orElse("<No displayname found>");
String targetId = getProp(target, "tim_id", String.class).orElse("");
String targetRdfUri = getProp(target, RDF_URI_PROP, String.class).orElse("");
String[] targetAlternativeUris = getProp(target, RDF_SYNONYM_PROP, String[].class).orElse(new String[0]);
boolean accepted = getProp(edge, "accepted", Boolean.class).orElse(true);
String relationId = getProp(edge, "tim_id", String.class).orElse("");
String relationRdfUri = getProp(edge, "rdfUri", String.class).orElse("");
int relationRev = getProp(edge, "rev", Integer.class).orElse(1);
RelationRef relationRef = new RelationRef(targetId, targetRdfUri, targetAlternativeUris, targetCollection.getCollectionName(), targetEntityType, accepted, relationId, relationRdfUri, relationRev, label, displayName);
customRelationProperties.execute(traversalSource, vre, target, relationRef);
return relationRef;
} catch (Exception e) {
LOG.error(databaseInvariant, "Something went wrong while formatting the entity", e);
return null;
}
})).orElse(EmptyGraph.instance().traversal().V().map(x -> null));
List<RelationRef> relations = stream(realRelations).filter(x -> x != null).collect(toList());
return relations;
}
use of org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.has in project sqlg by pietermartin.
the class TestLocalVertexStepOptionalWithOrder method testOptionalWithOrderAndRange2.
@Test
public void testOptionalWithOrderAndRange2() {
Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a");
Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "aa");
Vertex a3 = this.sqlgGraph.addVertex(T.label, "A", "name", "aaa");
Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "d");
Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "c");
Vertex b3 = this.sqlgGraph.addVertex(T.label, "B", "name", "b");
Vertex bb1 = this.sqlgGraph.addVertex(T.label, "BB", "name", "g");
Vertex bb2 = this.sqlgGraph.addVertex(T.label, "BB", "name", "f");
Vertex bb3 = this.sqlgGraph.addVertex(T.label, "BB", "name", "e");
Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "h");
Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "name", "i");
Vertex c3 = this.sqlgGraph.addVertex(T.label, "C", "name", "j");
Vertex cc1 = this.sqlgGraph.addVertex(T.label, "CC", "name", "k");
Vertex cc2 = this.sqlgGraph.addVertex(T.label, "CC", "name", "l");
Vertex cc3 = this.sqlgGraph.addVertex(T.label, "CC", "name", "m");
a1.addEdge("ab", b1);
a1.addEdge("ab", b2);
a1.addEdge("ab", b3);
a1.addEdge("abb", bb1);
a1.addEdge("abb", bb2);
a1.addEdge("abb", bb3);
b1.addEdge("bc", c1);
b1.addEdge("bc", c2);
b1.addEdge("bc", c3);
b2.addEdge("bcc", cc1);
b2.addEdge("bcc", cc2);
b2.addEdge("bcc", cc3);
this.sqlgGraph.tx().commit();
DefaultGraphTraversal<Vertex, Path> traversal = (DefaultGraphTraversal<Vertex, Path>) this.sqlgGraph.traversal().V().hasLabel("A").local(__.optional(__.out().order().by("name").range(1, 2).optional(__.out().order().by("name", Order.decr).range(2, 3)))).path();
Assert.assertEquals(4, traversal.getSteps().size());
List<Path> paths = traversal.toList();
// This query is no fully optimized.
// The range messes it up, so it has a SqlgVertexStep
Assert.assertEquals(3, traversal.getSteps().size());
Assert.assertTrue(traversal.getSteps().get(1) instanceof LocalStep);
LocalStep<?, ?> localStep = (LocalStep<?, ?>) traversal.getSteps().get(1);
List<SqlgVertexStep> sqlgVertexSteps = TraversalHelper.getStepsOfAssignableClassRecursively(SqlgVertexStep.class, localStep.getLocalChildren().get(0));
// first optional step can not be optimized because it has a range step that is not the last step
// the second is optimized.
Assert.assertEquals(2, sqlgVertexSteps.size());
Assert.assertEquals(3, paths.size());
List<Path> pathsOfLength1 = paths.stream().filter(p -> p.size() == 1).collect(Collectors.toList());
Assert.assertEquals(2, pathsOfLength1.size());
List<Path> pathsOfLength3 = paths.stream().filter(p -> p.size() == 3).collect(Collectors.toList());
Assert.assertEquals(1, pathsOfLength3.size());
Vertex v = (Vertex) pathsOfLength3.get(0).objects().get(2);
Assert.assertEquals("k", v.value("name"));
}
use of org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.has in project sqlg by pietermartin.
the class TestOptionalWithOrder method testOptionalWithOrderAndRange2.
@Test
public void testOptionalWithOrderAndRange2() {
Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a");
Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "aa");
Vertex a3 = this.sqlgGraph.addVertex(T.label, "A", "name", "aaa");
Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "d");
Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "c");
Vertex b3 = this.sqlgGraph.addVertex(T.label, "B", "name", "b");
Vertex bb1 = this.sqlgGraph.addVertex(T.label, "BB", "name", "g");
Vertex bb2 = this.sqlgGraph.addVertex(T.label, "BB", "name", "f");
Vertex bb3 = this.sqlgGraph.addVertex(T.label, "BB", "name", "e");
Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "h");
Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "name", "i");
Vertex c3 = this.sqlgGraph.addVertex(T.label, "C", "name", "j");
Vertex cc1 = this.sqlgGraph.addVertex(T.label, "CC", "name", "k");
Vertex cc2 = this.sqlgGraph.addVertex(T.label, "CC", "name", "l");
Vertex cc3 = this.sqlgGraph.addVertex(T.label, "CC", "name", "m");
a1.addEdge("ab", b1);
a1.addEdge("ab", b2);
a1.addEdge("ab", b3);
a1.addEdge("abb", bb1);
a1.addEdge("abb", bb2);
a1.addEdge("abb", bb3);
b1.addEdge("bc", c1);
b1.addEdge("bc", c2);
b1.addEdge("bc", c3);
b2.addEdge("bcc", cc1);
b2.addEdge("bcc", cc2);
b2.addEdge("bcc", cc3);
this.sqlgGraph.tx().commit();
DefaultGraphTraversal<Vertex, Path> traversal = (DefaultGraphTraversal<Vertex, Path>) this.sqlgGraph.traversal().V().hasLabel("A").optional(__.out().order().by("name").range(1, 2).optional(__.out().order().by("name", Order.decr).range(2, 3))).path();
Assert.assertEquals(4, traversal.getSteps().size());
List<Path> paths = traversal.toList();
// This query is no fully optimized.
// The range messes it up, so it has a SqlgVertexStep
assertStep(traversal.getSteps().get(0), true, false, false, true);
Step<?, ?> step = traversal.getSteps().get(1);
Assert.assertTrue(step instanceof SqlgOptionalStepBarrier);
// SqlgOptionalStepBarrier<?,?,?> sqlgOptionalStepBarrier = (SqlgOptionalStepBarrier<?, ?, ?>) step;
SqlgOptionalStepBarrier<?> sqlgOptionalStepBarrier = (SqlgOptionalStepBarrier<?>) step;
Traversal.Admin<?, ?> traversal1 = sqlgOptionalStepBarrier.getLocalChildren().get(0);
Assert.assertTrue(traversal1.getSteps().get(0) instanceof SqlgVertexStep);
assertStep(traversal1.getSteps().get(0), false, true, true, true);
// There is another SqlgVertexStep but it is not being asserted
Assert.assertEquals(3, paths.size());
List<Path> pathsOfLength1 = paths.stream().filter(p -> p.size() == 1).collect(Collectors.toList());
Assert.assertEquals(2, pathsOfLength1.size());
List<Path> pathsOfLength3 = paths.stream().filter(p -> p.size() == 3).collect(Collectors.toList());
Assert.assertEquals(1, pathsOfLength3.size());
Vertex v = (Vertex) pathsOfLength3.get(0).objects().get(2);
Assert.assertEquals("k", v.value("name"));
}
Aggregations