Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>org.gephi</groupId>
<artifactId>graphstore</artifactId>
<version>0.7.4-SNAPSHOT</version>
<version>0.8.0-SNAPSHOT</version>
<packaging>jar</packaging>

<name>GraphStore</name>
Expand Down
23 changes: 22 additions & 1 deletion src/main/java/org/gephi/graph/api/EdgeIterable.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.Set;
import java.util.Spliterator;
import java.util.Spliterators;

/**
* An edge iterable.
Expand Down Expand Up @@ -63,10 +65,24 @@ public interface EdgeIterable extends ElementIterable<Edge> {
@Override
public Set<Edge> toSet();

/**
* Returns a Spliterator over the edges.
* <p>
* Implementations return a splittable, sized, fail-fast spliterator suitable
* for parallel streams. When not possible, a non-splittable spliterator is
* returned.
*
* @return edge spliterator
*/
@Override
default Spliterator<Edge> spliterator() {
return ElementIterable.super.spliterator();
}

/**
* Empty edge iterable.
*/
static final class EdgeIterableEmpty implements Iterator<Edge>, EdgeIterable {
final class EdgeIterableEmpty implements Iterator<Edge>, EdgeIterable {

@Override
public boolean hasNext() {
Expand All @@ -88,6 +104,11 @@ public Iterator<Edge> iterator() {
return this;
}

@Override
public Spliterator<Edge> spliterator() {
return Spliterators.emptySpliterator();
}

@Override
public Edge[] toArray() {
return new Edge[0];
Expand Down
28 changes: 28 additions & 0 deletions src/main/java/org/gephi/graph/api/ElementIterable.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.Set;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;

/**
* Element iterable.
Expand All @@ -41,6 +45,25 @@ public interface ElementIterable<T extends Element> extends Iterable<T> {
@Override
public Iterator<T> iterator();

/**
* Creates a new sequential stream, based on the spliterator returned.
*
* @return stream
*/
default Stream<T> stream() {
return StreamSupport.stream(spliterator(), false);
}

/**
* Creates a new sequential and parallel stream, based on the spliterator
* returned.
*
* @return stream
*/
default Stream<T> parallelStream() {
return StreamSupport.stream(spliterator(), true);
}

/**
* Returns the iterator content as an array.
*
Expand Down Expand Up @@ -92,6 +115,11 @@ public Iterator<Element> iterator() {
return this;
}

@Override
public Spliterator<Element> spliterator() {
return Spliterators.emptySpliterator();
}

@Override
public Element[] toArray() {
return new Node[0];
Expand Down
21 changes: 21 additions & 0 deletions src/main/java/org/gephi/graph/api/NodeIterable.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.Set;
import java.util.Spliterator;
import java.util.Spliterators;

/**
* A node iterable.
Expand Down Expand Up @@ -63,6 +65,20 @@ public interface NodeIterable extends ElementIterable<Node> {
@Override
public Set<Node> toSet();

/**
* Returns a Spliterator over the nodes.
* <p>
* Implementations return a splittable, sized, fail-fast spliterator suitable
* for parallel streams. When not possible, a non-splittable spliterator is
* returned.
*
* @return node spliterator
*/
@Override
default Spliterator<Node> spliterator() {
return ElementIterable.super.spliterator();
}

/**
* Empty node iterable.
*/
Expand All @@ -88,6 +104,11 @@ public Iterator<Node> iterator() {
return this;
}

@Override
public Spliterator<Node> spliterator() {
return Spliterators.emptySpliterator();
}

@Override
public Node[] toArray() {
return new Node[0];
Expand Down
8 changes: 5 additions & 3 deletions src/main/java/org/gephi/graph/impl/ColumnObserverImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import cern.colt.bitvector.QuickBitVector;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import it.unimi.dsi.fastutil.objects.ObjectList;
import it.unimi.dsi.fastutil.objects.ObjectLists;
import org.gephi.graph.api.AttributeUtils;
import org.gephi.graph.api.Column;
import org.gephi.graph.api.ColumnDiff;
Expand Down Expand Up @@ -155,7 +156,8 @@ protected final class NodeColumnDiffImpl extends ColumnDiffImpl<Node> {
@Override
public NodeIterable getTouchedElements() {
if (!touchedElements.isEmpty()) {
return graphStore.getNodeIterableWrapper(touchedElements.iterator(), false);
return new NodeIterableWrapper(() -> ObjectLists.unmodifiable(touchedElements).iterator(),
() -> ObjectLists.unmodifiable(touchedElements).spliterator(), null);

}
return NodeIterable.NodeIterableEmpty.EMPTY;
Expand All @@ -167,8 +169,8 @@ protected final class EdgeColumnDiffImpl extends ColumnDiffImpl<Edge> {
@Override
public EdgeIterable getTouchedElements() {
if (!touchedElements.isEmpty()) {
return graphStore.getEdgeIterableWrapper(touchedElements.iterator(), false);

return new EdgeIterableWrapper(() -> ObjectLists.unmodifiable(touchedElements).iterator(),
() -> ObjectLists.unmodifiable(touchedElements).spliterator(), null);
}
return EdgeIterable.EdgeIterableEmpty.EMPTY;
}
Expand Down
21 changes: 16 additions & 5 deletions src/main/java/org/gephi/graph/impl/EdgeIterableWrapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,21 +16,32 @@
package org.gephi.graph.impl;

import java.util.Iterator;
import java.util.Spliterator;
import java.util.function.Supplier;
import java.util.stream.StreamSupport;
import org.gephi.graph.api.Edge;
import org.gephi.graph.api.EdgeIterable;

public class EdgeIterableWrapper extends ElementIterableWrapper<Edge> implements EdgeIterable {

public EdgeIterableWrapper(Iterator<Edge> iterator) {
super(iterator);
public EdgeIterableWrapper(Supplier<Iterator<Edge>> iteratorSupplier, GraphLockImpl lock) {
super(iteratorSupplier, lock);
}

public EdgeIterableWrapper(Iterator<Edge> iterator, GraphLockImpl lock) {
super(iterator, lock);
public EdgeIterableWrapper(Supplier<Iterator<Edge>> iteratorSupplier, Supplier<Spliterator<Edge>> spliteratorSupplier, GraphLockImpl lock) {
super(iteratorSupplier, spliteratorSupplier, lock);
}

@Override
public Edge[] toArray() {
return toArray(new Edge[0]);
if (parallelPossible && lock != null) {
lock.readLock();
try {
return StreamSupport.stream(spliterator(), true).toArray(Edge[]::new);
} finally {
lock.readUnlock();
}
}
return StreamSupport.stream(spliterator(), parallelPossible).toArray(Edge[]::new);
}
}
Loading