package er.neo4jadaptor.query.neo4j_by_pk.results; import org.neo4j.graphdb.Direction; import org.neo4j.graphdb.Node; import org.neo4j.graphdb.Relationship; import org.neo4j.graphdb.RelationshipType; import com.webobjects.eoaccess.EORelationship; import er.neo4jadaptor.ersatz.neo4j.Neo4JUtils; import er.neo4jadaptor.query.Results; import er.neo4jadaptor.utils.cursor.Cursor; import er.neo4jadaptor.utils.cursor.FlattenedCursor; import er.neo4jadaptor.utils.cursor.IteratorCursor; /** * Returns only nodes that are connected with some relationship to some well defined set of nodes. * * @author Jedrzej Sobanski * */ public class NodesRelatedTo implements Results<Node> { final Cursor<Relationship> relationshipsIterator; public NodesRelatedTo(Results<Node> relatedTo, EORelationship rel) { final RelationshipType relationshipType = Neo4JUtils.getRelationshipType(rel); final Cursor<Node> nodeCursor = relatedTo; Cursor<Cursor<Relationship>> twoLevelIt = new Cursor<Cursor<Relationship>>() { public void remove() { nodeCursor.remove(); } public Cursor<Relationship> next() { Node node = nodeCursor.next(); Iterable<Relationship> relationships = node.getRelationships(Direction.INCOMING, relationshipType); return new IteratorCursor<>(relationships.iterator()); } public boolean hasNext() { return nodeCursor.hasNext(); } public void close() { nodeCursor.close(); } }; relationshipsIterator = new FlattenedCursor<>(twoLevelIt); } public boolean hasNext() { return relationshipsIterator.hasNext(); } public void close() { relationshipsIterator.close(); } public Node next() { return relationshipsIterator.next().getStartNode(); } public void remove() { relationshipsIterator.remove(); } }