Skip to content

Commit 9d2a1a8

Browse files
committed
added chained edge iterator so no longer added edges in set; saves on memory and properly delegates to store edge iterator
1 parent 6ea285b commit 9d2a1a8

File tree

2 files changed

+150
-114
lines changed

2 files changed

+150
-114
lines changed

store/src/main/java/org/gephi/graph/impl/GraphStore.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,29 +43,46 @@
4343
public class GraphStore implements DirectedGraph, DirectedSubgraph {
4444

4545
protected final GraphModelImpl graphModel;
46+
4647
protected final Configuration configuration;
48+
4749
// Stores
4850
protected final NodeStore nodeStore;
51+
4952
protected final EdgeStore edgeStore;
53+
5054
protected final EdgeTypeStore edgeTypeStore;
55+
5156
protected final TableImpl<Node> nodeTable;
57+
5258
protected final TableImpl<Edge> edgeTable;
59+
5360
protected final GraphViewStore viewStore;
61+
5462
protected final TimeStore timeStore;
63+
5564
protected final GraphAttributesImpl attributes;
65+
5666
// Factory
5767
protected final GraphFactoryImpl factory;
68+
5869
// Lock
5970
protected final GraphLock lock;
71+
6072
// Version
6173
protected final GraphVersion version;
74+
6275
protected final List<GraphObserverImpl> observers;
76+
6377
// Undirected
6478
protected final UndirectedDecorator undirectedDecorator;
79+
6580
// Main Graph view
6681
protected final GraphView mainGraphView;
82+
6783
// TimeFormat
6884
protected TimeFormat timeFormat;
85+
6986
// Time zone
7087
protected DateTimeZone timeZone;
7188

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

825842
protected final Iterator<Node> iterator;
843+
826844
protected final boolean blocking;
827845

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

876894
protected final Iterator<Edge> iterator;
895+
877896
protected final boolean blocking;
878897

879898
public EdgeIterableWrapper(Iterator<Edge> iterator) {

store/src/main/java/org/gephi/graph/impl/HierarchicalGraphDecorator.java

Lines changed: 131 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,15 @@
1717
import org.gephi.graph.api.UndirectedSubgraph;
1818

1919
import java.awt.Color;
20+
import java.util.ArrayList;
2021
import java.util.Arrays;
2122
import java.util.Collection;
2223
import java.util.HashSet;
2324
import java.util.Iterator;
25+
import java.util.List;
2426
import java.util.Map;
2527
import java.util.Set;
28+
import java.util.concurrent.Callable;
2629

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

7679
@Override
77-
public EdgeIterable getEdges(Node node1, Node node2) {
78-
final Set<Edge> set = new HashSet<Edge>();
79-
graphStore.autoReadLock();
80-
try {
81-
for (final Node n1 : view.mapWithHidden(node1)) {
82-
for (final Node n2 : view.mapWithHidden(node2)) {
83-
EdgeImpl edge = graphStore.edgeStore.get(n1, n2, undirected);
84-
if (edge != null && view.containsEdge(edge)) {
85-
set.add(edge);
80+
public EdgeIterable getEdges(final Node node1, final Node node2) {
81+
List<Callable<Iterator<Edge>>> list = new ArrayList<Callable<Iterator<Edge>>>();
82+
for (final Node n1 : view.mapWithHidden(node1)) {
83+
for (final Node n2 : view.mapWithHidden(node2)) {
84+
list.add(new Callable<Iterator<Edge>>() {
85+
@Override
86+
public Iterator<Edge> call() throws Exception {
87+
return graphStore.edgeStore.getAll(n1, n2, undirected);
8688
}
87-
}
89+
});
8890
}
89-
} finally {
90-
graphStore.autoReadUnlock();
9191
}
92-
return graphStore.getEdgeIterableWrapper(new EdgeViewIterator(set.iterator()));
92+
return graphStore.getEdgeIterableWrapper(new EdgeViewIterator(new ChainedFutureIterator<Edge>(list)));
9393
}
9494

9595
@Override
96-
public EdgeIterable getEdges(Node node1, Node node2, int type) {
97-
final Set<Edge> set = new HashSet<Edge>();
98-
graphStore.autoReadLock();
99-
try {
100-
for (final Node n1 : view.mapWithHidden(node1)) {
101-
for (final Node n2 : view.mapWithHidden(node2)) {
102-
EdgeImpl edge = graphStore.edgeStore.get(n1, n2, type, undirected);
103-
if (edge != null && view.containsEdge(edge)) {
104-
set.add(edge);
96+
public EdgeIterable getEdges(final Node node1, final Node node2, final int type) {
97+
List<Callable<Iterator<Edge>>> list = new ArrayList<Callable<Iterator<Edge>>>();
98+
for (final Node n1 : view.mapWithHidden(node1)) {
99+
for (final Node n2 : view.mapWithHidden(node2)) {
100+
list.add(new Callable<Iterator<Edge>>() {
101+
@Override
102+
public Iterator<Edge> call() throws Exception {
103+
return graphStore.edgeStore.getAll(n1, n2, type, undirected);
105104
}
106-
}
105+
});
107106
}
108-
} finally {
109-
graphStore.autoReadUnlock();
110107
}
111-
return graphStore.getEdgeIterableWrapper(new EdgeViewIterator(set.iterator()));
108+
return graphStore.getEdgeIterableWrapper(new EdgeViewIterator(new ChainedFutureIterator<Edge>(list)));
112109
}
113110

114111
@Override
115112
public Edge getMutualEdge(Edge edge) {
116113
graphStore.autoReadLock();
117114
try {
118-
for (final Node n1 : view.mapWithHidden(edge.getSource())) {
119-
for (final Node n2 : view.mapWithHidden(edge.getTarget())) {
115+
final Edge unpacked = undecorateEdge(edge);
116+
for (final Node n1 : view.mapWithHidden(unpacked.getSource())) {
117+
for (final Node n2 : view.mapWithHidden(unpacked.getTarget())) {
120118
Edge e = graphStore.getEdge(n1, n2);
121119
EdgeImpl mutual = graphStore.edgeStore.getMutualEdge(e);
122120
if (mutual != null && view.containsEdge(mutual)) {
@@ -161,85 +159,61 @@ public NodeIterable getSuccessors(Node node, int type) {
161159
@Override
162160
public EdgeIterable getInEdges(Node node) {
163161
checkValidInViewNodeObject(node);
164-
Set<Edge> set = new HashSet<Edge>();
165-
graphStore.autoReadLock();
166-
try {
167-
for (final Node n : view.mapWithHidden(node)) {
168-
final EdgeStore.EdgeInIterator itr = graphStore.edgeStore.edgeInIterator(n);
169-
while (itr.hasNext()) {
170-
final Edge edge = itr.next();
171-
if (edge != null) {
172-
set.add(edge);
173-
}
162+
List<Callable<Iterator<Edge>>> list = new ArrayList<Callable<Iterator<Edge>>>();
163+
for (final Node n : view.mapWithHidden(node)) {
164+
list.add(new Callable<Iterator<Edge>>() {
165+
@Override
166+
public Iterator<Edge> call() throws Exception {
167+
return graphStore.edgeStore.edgeInIterator(n);
174168
}
175-
}
176-
} finally {
177-
graphStore.autoReadUnlock();
169+
});
178170
}
179-
return graphStore.getEdgeIterableWrapper(new EdgeViewIterator(set.iterator()));
171+
return graphStore.getEdgeIterableWrapper(new EdgeViewIterator(new ChainedFutureIterator<Edge>(list)));
180172
}
181173

182174
@Override
183-
public EdgeIterable getInEdges(Node node, int type) {
175+
public EdgeIterable getInEdges(final Node node, final int type) {
184176
checkValidInViewNodeObject(node);
185-
Set<Edge> set = new HashSet<Edge>();
186-
graphStore.autoReadLock();
187-
try {
188-
for (final Node n : view.mapWithHidden(node)) {
189-
final EdgeStore.EdgeTypeInIterator itr = graphStore.edgeStore.edgeInIterator(n, type);
190-
while (itr.hasNext()) {
191-
final Edge edge = itr.next();
192-
if (edge != null) {
193-
set.add(edge);
194-
}
177+
List<Callable<Iterator<Edge>>> list = new ArrayList<Callable<Iterator<Edge>>>();
178+
for (final Node n : view.mapWithHidden(node)) {
179+
list.add(new Callable<Iterator<Edge>>() {
180+
@Override
181+
public Iterator<Edge> call() throws Exception {
182+
return graphStore.edgeStore.edgeInIterator(n, type);
195183
}
196-
}
197-
} finally {
198-
graphStore.autoReadUnlock();
184+
});
199185
}
200-
return graphStore.getEdgeIterableWrapper(new EdgeViewIterator(set.iterator()));
186+
return graphStore.getEdgeIterableWrapper(new EdgeViewIterator(new ChainedFutureIterator<Edge>(list)));
201187
}
202188

203189
@Override
204-
public EdgeIterable getOutEdges(Node node) {
190+
public EdgeIterable getOutEdges(final Node node) {
205191
checkValidInViewNodeObject(node);
206-
Set<Edge> set = new HashSet<Edge>();
207-
graphStore.autoReadLock();
208-
try {
209-
for (final Node n : view.mapWithHidden(node)) {
210-
final EdgeStore.EdgeOutIterator itr = graphStore.edgeStore.edgeOutIterator(n);
211-
while (itr.hasNext()) {
212-
final Edge edge = itr.next();
213-
if (edge != null) {
214-
set.add(edge);
215-
}
192+
List<Callable<Iterator<Edge>>> list = new ArrayList<Callable<Iterator<Edge>>>();
193+
for (final Node n : view.mapWithHidden(node)) {
194+
list.add(new Callable<Iterator<Edge>>() {
195+
@Override
196+
public Iterator<Edge> call() throws Exception {
197+
return graphStore.edgeStore.edgeOutIterator(n);
216198
}
217-
}
218-
} finally {
219-
graphStore.autoReadUnlock();
199+
});
220200
}
221-
return graphStore.getEdgeIterableWrapper(new EdgeViewIterator(set.iterator()));
201+
return graphStore.getEdgeIterableWrapper(new EdgeViewIterator(new ChainedFutureIterator<Edge>(list)));
222202
}
223203

224204
@Override
225-
public EdgeIterable getOutEdges(Node node, int type) {
205+
public EdgeIterable getOutEdges(final Node node, final int type) {
226206
checkValidInViewNodeObject(node);
227-
Set<Edge> set = new HashSet<Edge>();
228-
graphStore.autoReadLock();
229-
try {
230-
for (final Node n : view.mapWithHidden(node)) {
231-
final EdgeStore.EdgeTypeOutIterator itr = graphStore.edgeStore.edgeOutIterator(n, type);
232-
while (itr.hasNext()) {
233-
final Edge edge = itr.next();
234-
if (edge != null) {
235-
set.add(edge);
236-
}
207+
List<Callable<Iterator<Edge>>> list = new ArrayList<Callable<Iterator<Edge>>>();
208+
for (final Node n : view.mapWithHidden(node)) {
209+
list.add(new Callable<Iterator<Edge>>() {
210+
@Override
211+
public Iterator<Edge> call() throws Exception {
212+
return graphStore.edgeStore.edgeOutIterator(n, type);
237213
}
238-
}
239-
} finally {
240-
graphStore.autoReadUnlock();
214+
});
241215
}
242-
return graphStore.getEdgeIterableWrapper(new EdgeViewIterator(set.iterator()));
216+
return graphStore.getEdgeIterableWrapper(new EdgeViewIterator(new ChainedFutureIterator<Edge>(list)));
243217
}
244218

245219
@Override
@@ -514,43 +488,39 @@ public NodeIterable getNeighbors(Node node, int type) {
514488
@Override
515489
public EdgeIterable getEdges(Node node) {
516490
checkValidInViewNodeObject(node);
517-
Set<Edge> set = new HashSet<Edge>();
491+
List<Callable<Iterator<Edge>>> list = new ArrayList<Callable<Iterator<Edge>>>();
518492
for (final Node n : view.mapWithHidden(node)) {
519-
final Iterator<Edge> itr;
520-
if (undirected) {
521-
itr = new UndirectedEdgeViewIterator(graphStore.edgeStore.edgeIterator(node));
522-
} else {
523-
itr = graphStore.edgeStore.edgeIterator(node);
524-
}
525-
while (itr.hasNext()) {
526-
final Edge edge = itr.next();
527-
if (edge != null) {
528-
set.add(edge);
493+
list.add(new Callable<Iterator<Edge>>() {
494+
@Override
495+
public Iterator<Edge> call() throws Exception {
496+
if (undirected) {
497+
return new UndirectedEdgeViewIterator(graphStore.edgeStore.edgeIterator(n));
498+
} else {
499+
return graphStore.edgeStore.edgeIterator(n);
500+
}
529501
}
530-
}
502+
});
531503
}
532-
return graphStore.getEdgeIterableWrapper(new EdgeViewIterator(set.iterator()));
504+
return graphStore.getEdgeIterableWrapper(new EdgeViewIterator(new ChainedFutureIterator<Edge>(list)));
533505
}
534506

535507
@Override
536-
public EdgeIterable getEdges(Node node, int type) {
508+
public EdgeIterable getEdges(final Node node, final int type) {
537509
checkValidInViewNodeObject(node);
538-
Set<Edge> set = new HashSet<Edge>();
510+
List<Callable<Iterator<Edge>>> list = new ArrayList<Callable<Iterator<Edge>>>();
539511
for (final Node n : view.mapWithHidden(node)) {
540-
final Iterator<Edge> itr;
541-
if (undirected) {
542-
itr = new UndirectedEdgeViewIterator(graphStore.edgeStore.edgeIterator(node, type));
543-
} else {
544-
itr = graphStore.edgeStore.edgeIterator(node, type);
545-
}
546-
while (itr.hasNext()) {
547-
final Edge edge = itr.next();
548-
if (edge != null) {
549-
set.add(edge);
512+
list.add(new Callable<Iterator<Edge>>() {
513+
@Override
514+
public Iterator<Edge> call() throws Exception {
515+
if (undirected) {
516+
return new UndirectedEdgeViewIterator(graphStore.edgeStore.edgeIterator(n, type));
517+
} else {
518+
return graphStore.edgeStore.edgeIterator(n, type);
519+
}
550520
}
551-
}
521+
});
552522
}
553-
return graphStore.getEdgeIterableWrapper(new EdgeViewIterator(set.iterator()));
523+
return graphStore.getEdgeIterableWrapper(new EdgeViewIterator(new ChainedFutureIterator<Edge>(list)));
554524
}
555525

556526
@Override
@@ -1019,6 +989,53 @@ boolean isUndirectedToIgnore(final EdgeImpl edge) {
1019989
return false;
1020990
}
1021991

992+
private final class ChainedFutureIterator<T> implements Iterator<T> {
993+
private final List<Callable<Iterator<T>>> delegates;
994+
995+
private Iterator<Callable<Iterator<T>>> itr = null;
996+
997+
private Iterator<T> delegatePointer = null;
998+
999+
private T itemPointer = null;
1000+
1001+
private ChainedFutureIterator(final Collection<? extends Callable<Iterator<T>>> c) {
1002+
this.delegates = new ArrayList<Callable<Iterator<T>>>(c);
1003+
}
1004+
1005+
@Override
1006+
public boolean hasNext() {
1007+
itemPointer = null;
1008+
1009+
if (null == this.itr) {
1010+
itr = delegates.iterator();
1011+
}
1012+
1013+
while (null == itemPointer) {
1014+
while (null == delegatePointer || !delegatePointer.hasNext()) {
1015+
if (!itr.hasNext()) {
1016+
return false;
1017+
}
1018+
try {
1019+
delegatePointer = itr.next().call();
1020+
} catch (final Exception e) {
1021+
throw new IllegalStateException(e);
1022+
}
1023+
}
1024+
1025+
if (delegatePointer.hasNext()) {
1026+
itemPointer = delegatePointer.next();
1027+
}
1028+
}
1029+
1030+
return true;
1031+
}
1032+
1033+
@Override
1034+
public T next() {
1035+
return itemPointer;
1036+
}
1037+
}
1038+
10221039
private final class NodeViewIterator implements Iterator<Node> {
10231040
private final Iterator<Node> nodeIterator;
10241041

0 commit comments

Comments
 (0)