Skip to content

Commit

Permalink
added chained edge iterator so no longer added edges in set; saves on…
Browse files Browse the repository at this point in the history
… memory and properly delegates to store edge iterator
  • Loading branch information
trajar committed Apr 21, 2016
1 parent 6ea285b commit 9d2a1a8
Show file tree
Hide file tree
Showing 2 changed files with 150 additions and 114 deletions.
19 changes: 19 additions & 0 deletions store/src/main/java/org/gephi/graph/impl/GraphStore.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,29 +43,46 @@
public class GraphStore implements DirectedGraph, DirectedSubgraph {

protected final GraphModelImpl graphModel;

protected final Configuration configuration;

// Stores
protected final NodeStore nodeStore;

protected final EdgeStore edgeStore;

protected final EdgeTypeStore edgeTypeStore;

protected final TableImpl<Node> nodeTable;

protected final TableImpl<Edge> edgeTable;

protected final GraphViewStore viewStore;

protected final TimeStore timeStore;

protected final GraphAttributesImpl attributes;

// Factory
protected final GraphFactoryImpl factory;

// Lock
protected final GraphLock lock;

// Version
protected final GraphVersion version;

protected final List<GraphObserverImpl> observers;

// Undirected
protected final UndirectedDecorator undirectedDecorator;

// Main Graph view
protected final GraphView mainGraphView;

// TimeFormat
protected TimeFormat timeFormat;

// Time zone
protected DateTimeZone timeZone;

Expand Down Expand Up @@ -823,6 +840,7 @@ public boolean deepEquals(GraphStore obj) {
protected class NodeIterableWrapper implements NodeIterable {

protected final Iterator<Node> iterator;

protected final boolean blocking;

public NodeIterableWrapper(Iterator<Node> iterator) {
Expand Down Expand Up @@ -874,6 +892,7 @@ public void doBreak() {
protected class EdgeIterableWrapper implements EdgeIterable {

protected final Iterator<Edge> iterator;

protected final boolean blocking;

public EdgeIterableWrapper(Iterator<Edge> iterator) {
Expand Down
245 changes: 131 additions & 114 deletions store/src/main/java/org/gephi/graph/impl/HierarchicalGraphDecorator.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,15 @@
import org.gephi.graph.api.UndirectedSubgraph;

import java.awt.Color;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Callable;

public class HierarchicalGraphDecorator implements DirectedSubgraph, UndirectedSubgraph {
private final boolean undirected;
Expand Down Expand Up @@ -74,49 +77,44 @@ public Edge getEdge(Node node1, Node node2, int type) {
}

@Override
public EdgeIterable getEdges(Node node1, Node node2) {
final Set<Edge> set = new HashSet<Edge>();
graphStore.autoReadLock();
try {
for (final Node n1 : view.mapWithHidden(node1)) {
for (final Node n2 : view.mapWithHidden(node2)) {
EdgeImpl edge = graphStore.edgeStore.get(n1, n2, undirected);
if (edge != null && view.containsEdge(edge)) {
set.add(edge);
public EdgeIterable getEdges(final Node node1, final Node node2) {
List<Callable<Iterator<Edge>>> list = new ArrayList<Callable<Iterator<Edge>>>();
for (final Node n1 : view.mapWithHidden(node1)) {
for (final Node n2 : view.mapWithHidden(node2)) {
list.add(new Callable<Iterator<Edge>>() {
@Override
public Iterator<Edge> call() throws Exception {
return graphStore.edgeStore.getAll(n1, n2, undirected);
}
}
});
}
} finally {
graphStore.autoReadUnlock();
}
return graphStore.getEdgeIterableWrapper(new EdgeViewIterator(set.iterator()));
return graphStore.getEdgeIterableWrapper(new EdgeViewIterator(new ChainedFutureIterator<Edge>(list)));
}

@Override
public EdgeIterable getEdges(Node node1, Node node2, int type) {
final Set<Edge> set = new HashSet<Edge>();
graphStore.autoReadLock();
try {
for (final Node n1 : view.mapWithHidden(node1)) {
for (final Node n2 : view.mapWithHidden(node2)) {
EdgeImpl edge = graphStore.edgeStore.get(n1, n2, type, undirected);
if (edge != null && view.containsEdge(edge)) {
set.add(edge);
public EdgeIterable getEdges(final Node node1, final Node node2, final int type) {
List<Callable<Iterator<Edge>>> list = new ArrayList<Callable<Iterator<Edge>>>();
for (final Node n1 : view.mapWithHidden(node1)) {
for (final Node n2 : view.mapWithHidden(node2)) {
list.add(new Callable<Iterator<Edge>>() {
@Override
public Iterator<Edge> call() throws Exception {
return graphStore.edgeStore.getAll(n1, n2, type, undirected);
}
}
});
}
} finally {
graphStore.autoReadUnlock();
}
return graphStore.getEdgeIterableWrapper(new EdgeViewIterator(set.iterator()));
return graphStore.getEdgeIterableWrapper(new EdgeViewIterator(new ChainedFutureIterator<Edge>(list)));
}

@Override
public Edge getMutualEdge(Edge edge) {
graphStore.autoReadLock();
try {
for (final Node n1 : view.mapWithHidden(edge.getSource())) {
for (final Node n2 : view.mapWithHidden(edge.getTarget())) {
final Edge unpacked = undecorateEdge(edge);
for (final Node n1 : view.mapWithHidden(unpacked.getSource())) {
for (final Node n2 : view.mapWithHidden(unpacked.getTarget())) {
Edge e = graphStore.getEdge(n1, n2);
EdgeImpl mutual = graphStore.edgeStore.getMutualEdge(e);
if (mutual != null && view.containsEdge(mutual)) {
Expand Down Expand Up @@ -161,85 +159,61 @@ public NodeIterable getSuccessors(Node node, int type) {
@Override
public EdgeIterable getInEdges(Node node) {
checkValidInViewNodeObject(node);
Set<Edge> set = new HashSet<Edge>();
graphStore.autoReadLock();
try {
for (final Node n : view.mapWithHidden(node)) {
final EdgeStore.EdgeInIterator itr = graphStore.edgeStore.edgeInIterator(n);
while (itr.hasNext()) {
final Edge edge = itr.next();
if (edge != null) {
set.add(edge);
}
List<Callable<Iterator<Edge>>> list = new ArrayList<Callable<Iterator<Edge>>>();
for (final Node n : view.mapWithHidden(node)) {
list.add(new Callable<Iterator<Edge>>() {
@Override
public Iterator<Edge> call() throws Exception {
return graphStore.edgeStore.edgeInIterator(n);
}
}
} finally {
graphStore.autoReadUnlock();
});
}
return graphStore.getEdgeIterableWrapper(new EdgeViewIterator(set.iterator()));
return graphStore.getEdgeIterableWrapper(new EdgeViewIterator(new ChainedFutureIterator<Edge>(list)));
}

@Override
public EdgeIterable getInEdges(Node node, int type) {
public EdgeIterable getInEdges(final Node node, final int type) {
checkValidInViewNodeObject(node);
Set<Edge> set = new HashSet<Edge>();
graphStore.autoReadLock();
try {
for (final Node n : view.mapWithHidden(node)) {
final EdgeStore.EdgeTypeInIterator itr = graphStore.edgeStore.edgeInIterator(n, type);
while (itr.hasNext()) {
final Edge edge = itr.next();
if (edge != null) {
set.add(edge);
}
List<Callable<Iterator<Edge>>> list = new ArrayList<Callable<Iterator<Edge>>>();
for (final Node n : view.mapWithHidden(node)) {
list.add(new Callable<Iterator<Edge>>() {
@Override
public Iterator<Edge> call() throws Exception {
return graphStore.edgeStore.edgeInIterator(n, type);
}
}
} finally {
graphStore.autoReadUnlock();
});
}
return graphStore.getEdgeIterableWrapper(new EdgeViewIterator(set.iterator()));
return graphStore.getEdgeIterableWrapper(new EdgeViewIterator(new ChainedFutureIterator<Edge>(list)));
}

@Override
public EdgeIterable getOutEdges(Node node) {
public EdgeIterable getOutEdges(final Node node) {
checkValidInViewNodeObject(node);
Set<Edge> set = new HashSet<Edge>();
graphStore.autoReadLock();
try {
for (final Node n : view.mapWithHidden(node)) {
final EdgeStore.EdgeOutIterator itr = graphStore.edgeStore.edgeOutIterator(n);
while (itr.hasNext()) {
final Edge edge = itr.next();
if (edge != null) {
set.add(edge);
}
List<Callable<Iterator<Edge>>> list = new ArrayList<Callable<Iterator<Edge>>>();
for (final Node n : view.mapWithHidden(node)) {
list.add(new Callable<Iterator<Edge>>() {
@Override
public Iterator<Edge> call() throws Exception {
return graphStore.edgeStore.edgeOutIterator(n);
}
}
} finally {
graphStore.autoReadUnlock();
});
}
return graphStore.getEdgeIterableWrapper(new EdgeViewIterator(set.iterator()));
return graphStore.getEdgeIterableWrapper(new EdgeViewIterator(new ChainedFutureIterator<Edge>(list)));
}

@Override
public EdgeIterable getOutEdges(Node node, int type) {
public EdgeIterable getOutEdges(final Node node, final int type) {
checkValidInViewNodeObject(node);
Set<Edge> set = new HashSet<Edge>();
graphStore.autoReadLock();
try {
for (final Node n : view.mapWithHidden(node)) {
final EdgeStore.EdgeTypeOutIterator itr = graphStore.edgeStore.edgeOutIterator(n, type);
while (itr.hasNext()) {
final Edge edge = itr.next();
if (edge != null) {
set.add(edge);
}
List<Callable<Iterator<Edge>>> list = new ArrayList<Callable<Iterator<Edge>>>();
for (final Node n : view.mapWithHidden(node)) {
list.add(new Callable<Iterator<Edge>>() {
@Override
public Iterator<Edge> call() throws Exception {
return graphStore.edgeStore.edgeOutIterator(n, type);
}
}
} finally {
graphStore.autoReadUnlock();
});
}
return graphStore.getEdgeIterableWrapper(new EdgeViewIterator(set.iterator()));
return graphStore.getEdgeIterableWrapper(new EdgeViewIterator(new ChainedFutureIterator<Edge>(list)));
}

@Override
Expand Down Expand Up @@ -514,43 +488,39 @@ public NodeIterable getNeighbors(Node node, int type) {
@Override
public EdgeIterable getEdges(Node node) {
checkValidInViewNodeObject(node);
Set<Edge> set = new HashSet<Edge>();
List<Callable<Iterator<Edge>>> list = new ArrayList<Callable<Iterator<Edge>>>();
for (final Node n : view.mapWithHidden(node)) {
final Iterator<Edge> itr;
if (undirected) {
itr = new UndirectedEdgeViewIterator(graphStore.edgeStore.edgeIterator(node));
} else {
itr = graphStore.edgeStore.edgeIterator(node);
}
while (itr.hasNext()) {
final Edge edge = itr.next();
if (edge != null) {
set.add(edge);
list.add(new Callable<Iterator<Edge>>() {
@Override
public Iterator<Edge> call() throws Exception {
if (undirected) {
return new UndirectedEdgeViewIterator(graphStore.edgeStore.edgeIterator(n));
} else {
return graphStore.edgeStore.edgeIterator(n);
}
}
}
});
}
return graphStore.getEdgeIterableWrapper(new EdgeViewIterator(set.iterator()));
return graphStore.getEdgeIterableWrapper(new EdgeViewIterator(new ChainedFutureIterator<Edge>(list)));
}

@Override
public EdgeIterable getEdges(Node node, int type) {
public EdgeIterable getEdges(final Node node, final int type) {
checkValidInViewNodeObject(node);
Set<Edge> set = new HashSet<Edge>();
List<Callable<Iterator<Edge>>> list = new ArrayList<Callable<Iterator<Edge>>>();
for (final Node n : view.mapWithHidden(node)) {
final Iterator<Edge> itr;
if (undirected) {
itr = new UndirectedEdgeViewIterator(graphStore.edgeStore.edgeIterator(node, type));
} else {
itr = graphStore.edgeStore.edgeIterator(node, type);
}
while (itr.hasNext()) {
final Edge edge = itr.next();
if (edge != null) {
set.add(edge);
list.add(new Callable<Iterator<Edge>>() {
@Override
public Iterator<Edge> call() throws Exception {
if (undirected) {
return new UndirectedEdgeViewIterator(graphStore.edgeStore.edgeIterator(n, type));
} else {
return graphStore.edgeStore.edgeIterator(n, type);
}
}
}
});
}
return graphStore.getEdgeIterableWrapper(new EdgeViewIterator(set.iterator()));
return graphStore.getEdgeIterableWrapper(new EdgeViewIterator(new ChainedFutureIterator<Edge>(list)));
}

@Override
Expand Down Expand Up @@ -1019,6 +989,53 @@ boolean isUndirectedToIgnore(final EdgeImpl edge) {
return false;
}

private final class ChainedFutureIterator<T> implements Iterator<T> {
private final List<Callable<Iterator<T>>> delegates;

private Iterator<Callable<Iterator<T>>> itr = null;

private Iterator<T> delegatePointer = null;

private T itemPointer = null;

private ChainedFutureIterator(final Collection<? extends Callable<Iterator<T>>> c) {
this.delegates = new ArrayList<Callable<Iterator<T>>>(c);
}

@Override
public boolean hasNext() {
itemPointer = null;

if (null == this.itr) {
itr = delegates.iterator();
}

while (null == itemPointer) {
while (null == delegatePointer || !delegatePointer.hasNext()) {
if (!itr.hasNext()) {
return false;
}
try {
delegatePointer = itr.next().call();
} catch (final Exception e) {
throw new IllegalStateException(e);
}
}

if (delegatePointer.hasNext()) {
itemPointer = delegatePointer.next();
}
}

return true;
}

@Override
public T next() {
return itemPointer;
}
}

private final class NodeViewIterator implements Iterator<Node> {
private final Iterator<Node> nodeIterator;

Expand Down

0 comments on commit 9d2a1a8

Please sign in to comment.