@Override public boolean equals( VirtualValue other ) { if ( other == null || !(other instanceof PathValue) ) { return false; } PathValue that = (PathValue) other; return size() == that.size() && Arrays.equals( nodes(), that.nodes() ) && Arrays.equals( relationships(), that.relationships() ); }
@Override public Node endNode() { return mapNode( value.endNode() ); }
@Override public Relationship lastRelationship() { if ( value.size() == 0 ) { return null; } else { return mapRelationship( value.lastRelationship() ); } }
@Override public <E extends Exception> void writeTo( AnyValueWriter<E> writer ) throws E { writer.writePath( nodes(), relationships() ); }
@Override public String toString() { NodeValue[] nodes = nodes(); RelationshipValue[] relationships = relationships(); StringBuilder sb = new StringBuilder( getTypeName() + "{" ); int i = 0; for ( ; i < relationships.length; i++ ) { sb.append( nodes[i] ); sb.append( relationships[i] ); } sb.append( nodes[i] ); sb.append( '}' ); return sb.toString(); }
@Override public Iterable<Node> nodes() { return asList( value.nodes(), DefaultValueMapper.this::mapNode ); }
@Override public Iterable<Relationship> relationships() { return asList( value.relationships(), DefaultValueMapper.this::mapRelationship ); }
@Override public Value mapPath( PathValue value ) { return value.size() > 0 ? TRUE : FALSE; }
@Override public boolean equals( Object obj ) { if ( this == obj ) { return true; } if ( obj instanceof CoreAPIPath ) { return value.equals( ((CoreAPIPath) obj).value ); } else if ( obj instanceof Path ) { Path other = (Path) obj; if ( value.nodes()[0].id() != other.startNode().getId() ) { return false; } return iteratorsEqual( this.relationships().iterator(), other.relationships().iterator() ); } else { return false; } }
@Test public void shouldHandlePaths() { // Given NodeValue n1 = nodeValue( 42L, stringArray( "L" ), EMPTY_MAP ); NodeValue n2 = nodeValue( 43L, stringArray( "L" ), EMPTY_MAP ); PathValue p = path( new NodeValue[]{n1, n2}, new RelationshipValue[]{relationshipValue( 1L, n1, n2, stringValue( "T" ), EMPTY_MAP )} ); // When p.writeTo( converter ); // Then Object value = converter.value(); assertThat( value, instanceOf( Path.class ) ); Path path = (Path) value; assertThat( path.length(), equalTo( 1 ) ); assertThat( path.startNode().getId(), equalTo( 42L ) ); assertThat( path.endNode().getId(), equalTo( 43L ) ); assertThat( path.relationships().iterator().next().getId(), equalTo( 1L ) ); }
private static ListValue fastListConversion( AnyValue value ) { if ( value instanceof ListValue ) { return (ListValue) value; } else if ( value instanceof ArrayValue ) { return VirtualValues.fromArray( (ArrayValue) value ); } else if ( value instanceof PathValue ) { return ((PathValue) value).asList(); } throw cantCoerce( value, "List" ); }
public ListValue asList() { NodeValue[] nodes = nodes(); RelationshipValue[] relationships = relationships(); int size = nodes.length + relationships.length; AnyValue[] anyValues = new AnyValue[size]; for ( int i = 0; i < size; i++ ) { if ( i % 2 == 0 ) { anyValues[i] = nodes[i / 2]; } else { anyValues[i] = relationships[i / 2]; } } return VirtualValues.list( anyValues ); }
@Override public String toString() { NodeValue[] nodes = nodes(); RelationshipValue[] relationships = relationships(); StringBuilder sb = new StringBuilder( getTypeName() + "{" ); int i = 0; for ( ; i < relationships.length; i++ ) { sb.append( nodes[i] ); sb.append( relationships[i] ); } sb.append( nodes[i] ); sb.append( '}' ); return sb.toString(); }
@Override public Iterable<Node> reverseNodes() { return asReverseList( value.nodes(), DefaultValueMapper.this::mapNode ); }
@Override public Iterable<Relationship> reverseRelationships() { return asReverseList( value.relationships(), DefaultValueMapper.this::mapRelationship ); }
@Override public int length() { return value.size(); }
@Override public boolean equals( Object obj ) { if ( this == obj ) { return true; } if ( obj instanceof CoreAPIPath ) { return value.equals( ((CoreAPIPath) obj).value ); } else if ( obj instanceof Path ) { Path other = (Path) obj; if ( value.nodes()[0].id() != other.startNode().getId() ) { return false; } return iteratorsEqual( this.relationships().iterator(), other.relationships().iterator() ); } else { return false; } }
@Override public Relationship lastRelationship() { if ( value.size() == 0 ) { return null; } else { return mapRelationship( value.lastRelationship() ); } }
@Test void shouldHandlePaths() { // Given NodeValue startNode = VirtualValues.nodeValue( 1L, Values.stringArray( "L" ), EMPTY_MAP ); NodeValue endNode = VirtualValues.nodeValue( 2L, Values.stringArray( "L" ), EMPTY_MAP ); RelationshipValue rel = VirtualValues.relationshipValue( 42L, startNode, endNode, stringValue( "R" ), EMPTY_MAP ); PathValue path = VirtualValues.path( new NodeValue[]{startNode, endNode}, new RelationshipValue[]{rel} ); PrettyPrinter printer = new PrettyPrinter(); // When path.writeTo( printer ); // Then assertThat( printer.value(), equalTo( "(id=1 :L)-[id=42 :R]->(id=2 :L)" ) ); }
private static ListValue fastListConversion( AnyValue value ) { if ( value instanceof ListValue ) { return (ListValue) value; } else if ( value instanceof ArrayValue ) { return VirtualValues.fromArray( (ArrayValue) value ); } else if ( value instanceof PathValue ) { return ((PathValue) value).asList(); } throw cantCoerce( value, "List" ); }