
org.umlg.runtime.collection.persistent.PropertyTree Maven / Gradle / Ivy
The newest version!
package org.umlg.runtime.collection.persistent;
import org.apache.commons.collections4.set.ListOrderedSet;
import org.apache.tinkerpop.gremlin.process.traversal.Order;
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.GraphTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversal;
import org.apache.tinkerpop.gremlin.structure.*;
import org.umlg.runtime.collection.UmlgRuntimeProperty;
import org.umlg.runtime.util.PathTree;
import java.util.*;
import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.select;
/**
* Date: 2016/05/24
* Time: 8:24 PM
*/
public class PropertyTree {
//Only the root may have an label
private String label;
private UmlgRuntimeProperty umlgRuntimeProperty;
private PropertyTree parent;
private ListOrderedSet children = new ListOrderedSet<>();
private Set hasContainers = new HashSet<>();
public void addHasContainer(HasContainer hasContainer) {
this.hasContainers.add(hasContainer);
}
private PropertyTree(String label) {
this.label = label;
}
private PropertyTree(UmlgRuntimeProperty umlgRuntimeProperty) {
this.umlgRuntimeProperty = umlgRuntimeProperty;
}
public static PropertyTree from(UmlgRuntimeProperty umlgRuntimeProperty) {
return new PropertyTree(umlgRuntimeProperty);
}
public static PropertyTree from(String label) {
return new PropertyTree(label);
}
public PropertyTree addChild(PropertyTree propertyTree) {
this.children.add(propertyTree);
propertyTree.parent = this;
return propertyTree;
}
public PropertyTree addChild(UmlgRuntimeProperty umlgRuntimeProperty) {
PropertyTree propertyTree = PropertyTree.from(umlgRuntimeProperty);
return addChild(propertyTree);
}
public UmlgRuntimeProperty getUmlgRuntimeProperty() {
return umlgRuntimeProperty;
}
public List traversal(Graph graph) {
GraphTraversal traversal = graph.traversal().V().hasLabel(this.label).as(this.label);
for (HasContainer hasContainer : this.hasContainers) {
traversal.has(hasContainer.getKey(), hasContainer.getPredicate());
}
List> traversals = walk(traversal);
List pathTree = PathTree.from(traversals);
return pathTree;
}
public List traversal(Graph graph, Vertex vertex) {
PropertyTree rootPropertyTree = PropertyTree.from("Root");
rootPropertyTree.addChild(this);
GraphTraversal traversal = graph.traversal().V(vertex).as("Root");
List> traversals = walk(traversal);
List pathTree = PathTree.from(traversals);
return pathTree;
}
List> walk(GraphTraversal traversal) {
Set leafNodes = leafNodes();
List> graphTraversals = new ArrayList<>();
for (PropertyTree leafNode : leafNodes) {
GraphTraversal leafTraversal = null;
List rootToLeafPropertyTrees = rootToLeaf(leafNode);
for (PropertyTree node : rootToLeafPropertyTrees) {
if (leafTraversal == null) {
if (node.umlgRuntimeProperty.isControllingSide()) {
leafTraversal = __.outE(node.label()).as("e_" + node.umlgRuntimeProperty.getLabel()).inV();
for (HasContainer hasContainer : node.hasContainers) {
leafTraversal.has(hasContainer.getKey(), hasContainer.getPredicate());
}
if (node.umlgRuntimeProperty.isOrdered()) {
leafTraversal.order()
.by(select("e_" + node.umlgRuntimeProperty.getLabel())
.by(BaseCollection.IN_EDGE_SEQUENCE_ID), Order.asc);
}
} else {
leafTraversal = __.inE(node.label()).as("e_" + node.umlgRuntimeProperty.getLabel()).outV();
for (HasContainer hasContainer : node.hasContainers) {
leafTraversal.has(hasContainer.getKey(), hasContainer.getPredicate());
}
if (node.umlgRuntimeProperty.isOrdered()) {
leafTraversal.order()
.by(select("e_" + node.umlgRuntimeProperty.getLabel())
.by(BaseCollection.OUT_EDGE_SEQUENCE_ID), Order.asc);
}
leafTraversal = __.local(__.optional(leafTraversal));
}
} else {
if (node.umlgRuntimeProperty.isControllingSide()) {
GraphTraversal tmpTraversal = __.outE(node.label()).as("e_" + node.umlgRuntimeProperty.getLabel()).inV();
for (HasContainer hasContainer : node.hasContainers) {
tmpTraversal.has(hasContainer.getKey(), hasContainer.getPredicate());
}
if (node.umlgRuntimeProperty.isOrdered()) {
tmpTraversal.order()
.by(select("e_" + node.umlgRuntimeProperty.getLabel())
.by(BaseCollection.IN_EDGE_SEQUENCE_ID), Order.asc);
}
leafTraversal.local(__.optional(tmpTraversal));
} else {
GraphTraversal tmpTraversal = __.inE(node.label()).as("e_" + node.umlgRuntimeProperty.getLabel()).outV();
for (HasContainer hasContainer : node.hasContainers) {
tmpTraversal.has(hasContainer.getKey(), hasContainer.getPredicate());
}
if (node.umlgRuntimeProperty.isOrdered()) {
tmpTraversal.order()
.by(select("e_" + node.umlgRuntimeProperty.getLabel())
.by(BaseCollection.OUT_EDGE_SEQUENCE_ID), Order.asc);
}
leafTraversal.local(__.optional(tmpTraversal));
}
}
}
if (leafTraversal != null) {
graphTraversals.add(traversal.asAdmin().clone().local(__.optional(leafTraversal)).path());
}
}
if (graphTraversals.isEmpty()) {
graphTraversals.add(traversal.path());
}
return graphTraversals;
}
private List rootToLeaf(PropertyTree leafNode) {
List result = new ArrayList<>();
PropertyTree tmp = leafNode;
while (tmp.parent != null) {
result.add(0, tmp);
tmp = tmp.parent;
}
return result;
}
// /**
// * g.V(id).local(
// * optional(
// * outE().as('e')
// * )
// * )
// *
// * @param traversal
// */
// void walk(GraphTraversal traversal) {
// Set leafNodes = leafNodes();
// List> graphTraversals = new ArrayList<>();
// for (PropertyTree leafNode : leafNodes) {
// PropertyTree node = leafNode;
// GraphTraversal
© 2015 - 2025 Weber Informatics LLC | Privacy Policy