package org.neo4j.kernel.impl.traversal; import java.util.Iterator; import java.util.LinkedList; import org.neo4j.graphdb.Node; import org.neo4j.graphdb.Path; import org.neo4j.graphdb.Relationship; import org.neo4j.graphdb.traversal.ExpansionSource; import org.neo4j.kernel.TraversalFactory; public class TraversalPath implements Path { private final LinkedList<Node> nodes = new LinkedList<Node>(); private final LinkedList<Relationship> relationships = new LinkedList<Relationship>(); TraversalPath( ExpansionSource source ) { while ( source != null ) { nodes.addFirst( source.node() ); Relationship relationship = source.relationship(); if (relationship != null) { relationships.addFirst( relationship ); } source = source.parent(); } } public Node getStartNode() { return nodes.getFirst(); } public Node getEndNode() { return nodes.getLast(); } public Iterable<Node> nodes() { return nodes; } public Iterable<Relationship> relationships() { return relationships; } public int length() { return relationships.size(); } @Override public String toString() { return TraversalFactory.defaultPathToString( this ); } @Override public int hashCode() { if ( relationships.isEmpty() ) { return getStartNode().hashCode(); } else { return relationships.hashCode(); } } @Override public boolean equals( Object obj ) { if ( this == obj ) { return true; } else if ( obj instanceof TraversalPath ) { TraversalPath other = (TraversalPath) obj; return getStartNode().equals( other.getStartNode() ) && relationships.equals( other.relationships ); } else if ( obj instanceof Path ) { Path other = (Path) obj; if ( getStartNode().equals( other.getStartNode() ) ) { Iterator<Relationship> these = relationships().iterator(); Iterator<Relationship> those = other.relationships().iterator(); while ( these.hasNext() && those.hasNext() ) { if ( !these.next().equals( those.next() ) ) { return false; } } if ( these.hasNext() || those.hasNext() ) { return false; } return true; } } return false; } }