Search in sources :

Example 21 with RelationshipValue

use of org.neo4j.values.virtual.RelationshipValue in project neo4j by neo4j.

the class PathValueBuilderTest method shouldHandleNoValue.

@Test
void shouldHandleNoValue() {
    // Given  (n1)<--(n2)-->(n3)
    NodeValue node = node(42);
    RelationshipValue relationship = relationship(1337, node(43), node);
    PathValueBuilder builder = builder(node, relationship);
    // When (n1)<--(n2)--(n3)
    builder.addNode(node);
    builder.addIncoming(relationship);
    builder.addUndirected(NO_VALUE);
    // Then
    assertEquals(NO_VALUE, builder.build());
}
Also used : NodeValue(org.neo4j.values.virtual.NodeValue) RelationshipValue(org.neo4j.values.virtual.RelationshipValue) Test(org.junit.jupiter.api.Test)

Example 22 with RelationshipValue

use of org.neo4j.values.virtual.RelationshipValue in project neo4j by neo4j.

the class PathValueBuilderTest method builder.

private static PathValueBuilder builder(AnyValue... values) {
    DbAccess dbAccess = mock(DbAccess.class);
    RelationshipScanCursor cursors = mock(RelationshipScanCursor.class);
    Map<Long, RelationshipValue> relMap = new HashMap<>();
    for (AnyValue value : values) {
        if (value instanceof NodeValue) {
            NodeValue nodeValue = (NodeValue) value;
            when(dbAccess.nodeById(nodeValue.id())).thenReturn(nodeValue);
        } else if (value instanceof RelationshipValue) {
            RelationshipValue relationshipValue = (RelationshipValue) value;
            relMap.put(relationshipValue.id(), relationshipValue);
        } else {
            throw new AssertionError("invalid input");
        }
        Mockito.doAnswer((Answer<Void>) invocationOnMock -> {
            long id = invocationOnMock.getArgument(0);
            RelationshipScanCursor cursor = invocationOnMock.getArgument(1);
            RelationshipValue rel = relMap.get(id);
            when(cursor.sourceNodeReference()).thenReturn(rel.startNode().id());
            when(cursor.targetNodeReference()).thenReturn(rel.endNode().id());
            return null;
        }).when(dbAccess).singleRelationship(anyLong(), any(RelationshipScanCursor.class));
    }
    return new PathValueBuilder(dbAccess, cursors);
}
Also used : Assertions.assertThrows(org.junit.jupiter.api.Assertions.assertThrows) ArgumentMatchers.any(org.mockito.ArgumentMatchers.any) EMPTY_MAP(org.neo4j.values.virtual.VirtualValues.EMPTY_MAP) AnyValue(org.neo4j.values.AnyValue) RelationshipValue(org.neo4j.values.virtual.RelationshipValue) NO_VALUE(org.neo4j.values.storable.Values.NO_VALUE) ArgumentMatchers.anyLong(org.mockito.ArgumentMatchers.anyLong) NodeValue(org.neo4j.values.virtual.NodeValue) HashMap(java.util.HashMap) Mockito.when(org.mockito.Mockito.when) Values.stringValue(org.neo4j.values.storable.Values.stringValue) VirtualValues.list(org.neo4j.values.virtual.VirtualValues.list) EMPTY_LIST(org.neo4j.values.virtual.VirtualValues.EMPTY_LIST) Test(org.junit.jupiter.api.Test) Mockito(org.mockito.Mockito) Answer(org.mockito.stubbing.Answer) EMPTY_TEXT_ARRAY(org.neo4j.values.storable.Values.EMPTY_TEXT_ARRAY) DbAccess(org.neo4j.cypher.internal.runtime.DbAccess) Map(java.util.Map) RelationshipScanCursor(org.neo4j.internal.kernel.api.RelationshipScanCursor) PathValue(org.neo4j.values.virtual.PathValue) Assertions.assertEquals(org.junit.jupiter.api.Assertions.assertEquals) VirtualValues(org.neo4j.values.virtual.VirtualValues) Mockito.mock(org.mockito.Mockito.mock) NodeValue(org.neo4j.values.virtual.NodeValue) RelationshipScanCursor(org.neo4j.internal.kernel.api.RelationshipScanCursor) HashMap(java.util.HashMap) ArgumentMatchers.anyLong(org.mockito.ArgumentMatchers.anyLong) AnyValue(org.neo4j.values.AnyValue) RelationshipValue(org.neo4j.values.virtual.RelationshipValue) DbAccess(org.neo4j.cypher.internal.runtime.DbAccess)

Example 23 with RelationshipValue

use of org.neo4j.values.virtual.RelationshipValue in project neo4j by neo4j.

the class PathValueBuilder method addMultipleUndirected.

/**
 * Adds multiple undirected relationships to the path
 *
 * @param relationships the undirected relationships to add
 * @param target the final target node of the path
 */
@CalledFromGeneratedCode
public void addMultipleUndirected(ListValue relationships, NodeValue target) {
    if (relationships.isEmpty()) {
        // nothing to add
        return;
    }
    long previous = nodes.get(nodes.size() - 1).id();
    RelationshipValue first = (RelationshipValue) relationships.head();
    boolean correctDirection = startNode(first, dbAccess, cursor).id() == previous || endNode(first, dbAccess, cursor).id() == previous;
    int i;
    if (correctDirection) {
        for (i = 0; i < relationships.size() - 1; i++) {
            AnyValue value = relationships.value(i);
            if (notNoValue(value)) {
                // we know these relationships have already loaded start and end relationship
                // so we should not use CypherFunctions::[start,end]Node to look them up
                addUndirectedWhenRelationshipsAreFullyLoaded((RelationshipValue) value);
            }
        }
    } else {
        for (i = relationships.size() - 1; i > 0; i--) {
            AnyValue value = relationships.value(i);
            if (notNoValue(value)) {
                // we know these relationships have already loaded start and end relationship
                // so we should not use CypherFunctions::[start,end]Node to look them up
                addUndirectedWhenRelationshipsAreFullyLoaded((RelationshipValue) relationships.value(i));
            }
        }
    }
    AnyValue last = relationships.value(i);
    if (notNoValue(last)) {
        rels.add((RelationshipValue) last);
        nodes.add(target);
    }
}
Also used : AnyValue(org.neo4j.values.AnyValue) RelationshipValue(org.neo4j.values.virtual.RelationshipValue) CalledFromGeneratedCode(org.neo4j.util.CalledFromGeneratedCode)

Example 24 with RelationshipValue

use of org.neo4j.values.virtual.RelationshipValue in project neo4j by neo4j.

the class PathValueBuilder method addMultipleUndirected.

/**
 * Adds multiple undirected relationships to the path
 *
 * @param relationships the undirected relationships to add
 */
@CalledFromGeneratedCode
public void addMultipleUndirected(ListValue relationships) {
    if (relationships.isEmpty()) {
        // nothing to add
        return;
    }
    long previous = nodes.get(nodes.size() - 1).id();
    RelationshipValue first = (RelationshipValue) relationships.head();
    boolean correctDirection = startNode(first, dbAccess, cursor).id() == previous || endNode(first, dbAccess, cursor).id() == previous;
    if (correctDirection) {
        for (AnyValue value : relationships) {
            if (notNoValue(value)) {
                addUndirectedWhenRelationshipsAreFullyLoaded((RelationshipValue) value);
            }
        }
    } else {
        ListValue reversed = relationships.reverse();
        for (AnyValue rel : reversed) {
            if (notNoValue(rel)) {
                addUndirectedWhenRelationshipsAreFullyLoaded((RelationshipValue) rel);
            }
        }
    }
}
Also used : ListValue(org.neo4j.values.virtual.ListValue) AnyValue(org.neo4j.values.AnyValue) RelationshipValue(org.neo4j.values.virtual.RelationshipValue) CalledFromGeneratedCode(org.neo4j.util.CalledFromGeneratedCode)

Aggregations

RelationshipValue (org.neo4j.values.virtual.RelationshipValue)24 Test (org.junit.jupiter.api.Test)15 NodeValue (org.neo4j.values.virtual.NodeValue)13 AnyValue (org.neo4j.values.AnyValue)11 CalledFromGeneratedCode (org.neo4j.util.CalledFromGeneratedCode)6 ListValue (org.neo4j.values.virtual.ListValue)3 PathValue (org.neo4j.values.virtual.PathValue)3 Relationship (org.neo4j.graphdb.Relationship)2 Values.stringValue (org.neo4j.values.storable.Values.stringValue)2 MapValue (org.neo4j.values.virtual.MapValue)2 VirtualNodeValue (org.neo4j.values.virtual.VirtualNodeValue)2 VirtualRelationshipValue (org.neo4j.values.virtual.VirtualRelationshipValue)2 HashMap (java.util.HashMap)1 Map (java.util.Map)1 Assertions.assertEquals (org.junit.jupiter.api.Assertions.assertEquals)1 Assertions.assertThrows (org.junit.jupiter.api.Assertions.assertThrows)1 ArgumentMatchers.any (org.mockito.ArgumentMatchers.any)1 ArgumentMatchers.anyLong (org.mockito.ArgumentMatchers.anyLong)1 Mockito (org.mockito.Mockito)1 Mockito.mock (org.mockito.Mockito.mock)1