/**
*
*/
package er.neo4jadaptor.query.neo4j_eval.retrievers;
import java.util.Iterator;
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;
/**
* For a node retrieves nodes being relationship value. It can handle both to-one and to-many types of {@link EORelationship}s.
*
* @author Jedrzej Sobanski
*/
public class NodeToNodeRetriever extends RelationshipRetriever<Node, Node> {
private final Direction direction;
private final RelationshipType relationshipType;
public NodeToNodeRetriever(EORelationship rel) {
if (rel.isToMany()) {
relationshipType = Neo4JUtils.getRelationshipType(rel.inverseRelationship());
direction = Direction.INCOMING;
} else {
relationshipType = Neo4JUtils.getRelationshipType(rel);
direction = Direction.OUTGOING;
}
}
public Iterator<Node> retrieve(final Node node) {
final Iterator<Relationship> it = node.getRelationships(direction, relationshipType).iterator();
return new Iterator<Node>() {
public boolean hasNext() {
return it.hasNext();
}
public Node next() {
Relationship r = it.next();
if (direction.equals(Direction.INCOMING)) {
return r.getStartNode();
} else {
return r.getEndNode();
}
}
public void remove() {
it.remove();
}
};
}
@Override
public String toString() {
return "node-to-node through " + relationshipType.name();
}
}