package com.tinkerpop.blueprints.util.wrappers.partition; import com.tinkerpop.blueprints.Contains; import com.tinkerpop.blueprints.Edge; import com.tinkerpop.blueprints.Element; import com.tinkerpop.blueprints.Features; import com.tinkerpop.blueprints.Graph; import com.tinkerpop.blueprints.GraphQuery; import com.tinkerpop.blueprints.Vertex; import com.tinkerpop.blueprints.util.StringFactory; import com.tinkerpop.blueprints.util.wrappers.WrappedGraphQuery; import com.tinkerpop.blueprints.util.wrappers.WrapperGraph; import java.util.Arrays; import java.util.HashSet; import java.util.Set; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ public class PartitionGraph<T extends Graph> implements Graph, WrapperGraph<T> { protected T baseGraph; private String writePartition; private Set<String> readPartitions = new HashSet<String>(); private String partitionKey; private final Features features; public PartitionGraph(final T baseGraph, final String partitionKey, final String writePartition, final Set<String> readPartitions) { this.baseGraph = baseGraph; this.partitionKey = partitionKey; this.writePartition = writePartition; this.readPartitions.addAll(readPartitions); this.features = this.baseGraph.getFeatures().copyFeatures(); this.features.isWrapper = true; } public PartitionGraph(final T baseGraph, final String partitionKey, final String readWritePartition) { this(baseGraph, partitionKey, readWritePartition, new HashSet<String>(Arrays.asList(readWritePartition))); } public String getWritePartition() { return this.writePartition; } public void setWritePartition(final String writePartition) { this.writePartition = writePartition; } public Set<String> getReadPartitions() { return new HashSet<String>(this.readPartitions); } public void removeReadPartition(final String readPartition) { this.readPartitions.remove(readPartition); } public void addReadPartition(final String readPartition) { this.readPartitions.add(readPartition); } public void setPartitionKey(final String partitionKey) { this.partitionKey = partitionKey; } public String getPartitionKey() { return this.partitionKey; } public boolean isInPartition(final Element element) { final String writePartition; if (element instanceof PartitionElement) writePartition = ((PartitionElement) element).getPartition(); else writePartition = element.getProperty(this.partitionKey); return (null == writePartition || this.readPartitions.contains(writePartition)); } public void shutdown() { this.baseGraph.shutdown(); } public Vertex addVertex(final Object id) { final PartitionVertex vertex = new PartitionVertex(this.baseGraph.addVertex(id), this); vertex.setPartition(this.writePartition); return vertex; } public Vertex getVertex(final Object id) { final Vertex vertex = this.baseGraph.getVertex(id); if (null == vertex) return null; else { if (isInPartition(vertex)) return new PartitionVertex(vertex, this); else return null; } } public Iterable<Vertex> getVertices() { return new PartitionVertexIterable(this.baseGraph.getVertices(), this); } public Iterable<Vertex> getVertices(final String key, final Object value) { return new PartitionVertexIterable(this.baseGraph.getVertices(key, value), this); } public Edge addEdge(final Object id, final Vertex outVertex, final Vertex inVertex, final String label) { final PartitionEdge edge = new PartitionEdge(this.baseGraph.addEdge(id, ((PartitionVertex) outVertex).getBaseVertex(), ((PartitionVertex) inVertex).getBaseVertex(), label), this); edge.setPartition(this.writePartition); return edge; } public Edge getEdge(final Object id) { final Edge edge = this.baseGraph.getEdge(id); if (null == edge) return null; else return new PartitionEdge(edge, this); } public Iterable<Edge> getEdges() { return new PartitionEdgeIterable(this.baseGraph.getEdges(), this); } public Iterable<Edge> getEdges(final String key, final Object value) { return new PartitionEdgeIterable(this.baseGraph.getEdges(key, value), this); } public void removeEdge(final Edge edge) { this.baseGraph.removeEdge(((PartitionEdge) edge).getBaseEdge()); } public void removeVertex(final Vertex vertex) { this.baseGraph.removeVertex(((PartitionVertex) vertex).getBaseVertex()); } @Override public T getBaseGraph() { return this.baseGraph; } public String toString() { return StringFactory.graphString(this, this.baseGraph.toString()); } public Features getFeatures() { return this.features; } public GraphQuery query() { final PartitionGraph partitionGraph = this; return new WrappedGraphQuery(this.baseGraph.query()) { @Override public Iterable<Edge> edges() { return new PartitionEdgeIterable(this.query.has(partitionKey, Contains.IN, readPartitions).edges(), partitionGraph); } @Override public Iterable<Vertex> vertices() { return new PartitionVertexIterable(this.query.has(partitionKey, Contains.IN, readPartitions).vertices(), partitionGraph); } }; } }