Search in sources :

Example 11 with RelationshipItem

use of org.neo4j.storageengine.api.RelationshipItem in project neo4j by neo4j.

the class StateOperationsAutoIndexingTest method shouldSignalRelationshipPropertyRemovedToAutoIndex.

@Test
public void shouldSignalRelationshipPropertyRemovedToAutoIndex() throws Exception {
    // Given
    PropertyItem existingProperty = mock(PropertyItem.class);
    int propertyKeyId = 1;
    when(existingProperty.propertyKeyId()).thenReturn(propertyKeyId);
    when(existingProperty.value()).thenReturn("Goodbye!");
    RelationshipItem relationship = mock(RelationshipItem.class);
    when(storeStmt.acquireSingleRelationshipCursor(1337)).thenReturn(cursor(relationship));
    when(storeLayer.relationshipGetProperty(storeStmt, relationship, propertyKeyId)).thenReturn(cursor(existingProperty));
    // When
    context.relationshipRemoveProperty(stmt, 1337, existingProperty.propertyKeyId());
    // Then
    verify(relOps).propertyRemoved(writeOps, 1337L, existingProperty.propertyKeyId());
}
Also used : PropertyItem(org.neo4j.storageengine.api.PropertyItem) RelationshipItem(org.neo4j.storageengine.api.RelationshipItem) Test(org.junit.Test)

Example 12 with RelationshipItem

use of org.neo4j.storageengine.api.RelationshipItem in project neo4j by neo4j.

the class TxStateTest method shouldObserveCorrectAugmentedNodeRelationshipsState.

@Test
public void shouldObserveCorrectAugmentedNodeRelationshipsState() throws Exception {
    // GIVEN random committed state
    TxState state = new TxState();
    for (int i = 0; i < 100; i++) {
        state.nodeDoCreate(i);
    }
    for (int i = 0; i < 5; i++) {
        state.relationshipTypeDoCreateForName("Type-" + i, i);
    }
    Map<Long, RelationshipItem> committedRelationships = new HashMap<>();
    long relationshipId = 0;
    int nodeCount = 100;
    int relationshipTypeCount = 5;
    for (int i = 0; i < 30; i++) {
        RelationshipItem relationship = relationship(relationshipId++, random.nextInt(relationshipTypeCount), random.nextInt(nodeCount), random.nextInt(nodeCount));
        committedRelationships.put(relationship.id(), relationship);
    }
    Map<Long, RelationshipItem> allRelationships = new HashMap<>(committedRelationships);
    // and some random changes to that
    for (int i = 0; i < 10; i++) {
        if (random.nextBoolean()) {
            RelationshipItem relationship = relationship(relationshipId++, random.nextInt(relationshipTypeCount), random.nextInt(nodeCount), random.nextInt(nodeCount));
            allRelationships.put(relationship.id(), relationship);
            state.relationshipDoCreate(relationship.id(), relationship.type(), relationship.startNode(), relationship.endNode());
        } else {
            RelationshipItem relationship = Iterables.fromEnd(committedRelationships.values(), random.nextInt(committedRelationships.size()));
            state.relationshipDoDelete(relationship.id(), relationship.type(), relationship.startNode(), relationship.endNode());
            allRelationships.remove(relationship.id());
        }
    }
    // WHEN
    for (int i = 0; i < nodeCount; i++) {
        Direction direction = Direction.values()[random.nextInt(Direction.values().length)];
        int[] relationshipTypes = randomTypes(relationshipTypeCount, random.random());
        Cursor<RelationshipItem> committed = cursor(relationshipsForNode(i, committedRelationships, direction, relationshipTypes).values());
        Cursor<RelationshipItem> augmented = relationshipTypes == null ? state.augmentNodeRelationshipCursor(committed, state.getNodeState(i), direction) : state.augmentNodeRelationshipCursor(committed, state.getNodeState(i), direction, relationshipTypes);
        Map<Long, RelationshipItem> expectedRelationships = relationshipsForNode(i, allRelationships, direction, relationshipTypes);
        // THEN
        while (augmented.next()) {
            RelationshipItem relationship = augmented.get();
            RelationshipItem actual = expectedRelationships.remove(relationship.id());
            assertNotNull("Augmented cursor returned relationship " + relationship + ", but shouldn't have", actual);
            assertRelationshipEquals(actual, relationship);
        }
        assertTrue("Augmented cursor didn't return some expected relationships: " + expectedRelationships, expectedRelationships.isEmpty());
    }
}
Also used : HashMap(java.util.HashMap) Direction(org.neo4j.storageengine.api.Direction) RelationshipItem(org.neo4j.storageengine.api.RelationshipItem) Test(org.junit.Test)

Example 13 with RelationshipItem

use of org.neo4j.storageengine.api.RelationshipItem in project neo4j by neo4j.

the class StateHandlingStatementOperations method nodeGetRelationships.

@Override
public Cursor<RelationshipItem> nodeGetRelationships(KernelStatement statement, NodeItem node, Direction direction, int[] relTypes) {
    Cursor<RelationshipItem> cursor;
    if (statement.hasTxStateWithChanges() && statement.txState().nodeIsAddedInThisTx(node.id())) {
        cursor = empty();
    } else {
        cursor = storeLayer.nodeGetRelationships(statement.getStoreStatement(), node, direction, any(relTypes));
    }
    if (!statement.hasTxStateWithChanges()) {
        return cursor;
    }
    NodeState nodeState = statement.txState().getNodeState(node.id());
    return statement.txState().augmentNodeRelationshipCursor(cursor, nodeState, direction, relTypes);
}
Also used : NodeState(org.neo4j.storageengine.api.txstate.NodeState) RelationshipItem(org.neo4j.storageengine.api.RelationshipItem)

Example 14 with RelationshipItem

use of org.neo4j.storageengine.api.RelationshipItem in project neo4j by neo4j.

the class StorageLayer method visitNode.

private void visitNode(StorageStatement statement, NodeItem nodeItem, DegreeVisitor visitor) {
    try (Cursor<RelationshipItem> relationships = nodeGetRelationships(statement, nodeItem, Direction.BOTH)) {
        while (relationships.next()) {
            RelationshipItem rel = relationships.get();
            int type = rel.type();
            switch(directionOf(nodeItem.id(), rel.id(), rel.startNode(), rel.endNode())) {
                case OUTGOING:
                    visitor.visitDegree(type, 1, 0);
                    break;
                case INCOMING:
                    visitor.visitDegree(type, 0, 1);
                    break;
                case BOTH:
                    visitor.visitDegree(type, 1, 1);
                    break;
                default:
                    throw new IllegalStateException("You found the missing direction!");
            }
        }
    }
}
Also used : RelationshipItem(org.neo4j.storageengine.api.RelationshipItem)

Example 15 with RelationshipItem

use of org.neo4j.storageengine.api.RelationshipItem in project neo4j by neo4j.

the class RelationshipProxy method getAllProperties.

@Override
public Map<String, Object> getAllProperties() {
    try (Statement statement = actions.statement()) {
        try (Cursor<RelationshipItem> relationship = statement.readOperations().relationshipCursorById(getId())) {
            try (Cursor<PropertyItem> propertyCursor = statement.readOperations().relationshipGetProperties(relationship.get())) {
                Map<String, Object> properties = new HashMap<>();
                // Get all properties
                while (propertyCursor.next()) {
                    String name = statement.readOperations().propertyKeyGetName(propertyCursor.get().propertyKeyId());
                    properties.put(name, propertyCursor.get().value());
                }
                return properties;
            }
        } catch (EntityNotFoundException e) {
            throw new NotFoundException("Relationship not found", e);
        }
    } catch (PropertyKeyIdNotFoundKernelException e) {
        throw new IllegalStateException("Property key retrieved through kernel API should exist.", e);
    }
}
Also used : HashMap(java.util.HashMap) Statement(org.neo4j.kernel.api.Statement) NotFoundException(org.neo4j.graphdb.NotFoundException) EntityNotFoundException(org.neo4j.kernel.api.exceptions.EntityNotFoundException) PropertyNotFoundException(org.neo4j.kernel.api.exceptions.PropertyNotFoundException) EntityNotFoundException(org.neo4j.kernel.api.exceptions.EntityNotFoundException) PropertyKeyIdNotFoundKernelException(org.neo4j.kernel.api.exceptions.PropertyKeyIdNotFoundKernelException) PropertyItem(org.neo4j.storageengine.api.PropertyItem) RelationshipItem(org.neo4j.storageengine.api.RelationshipItem)

Aggregations

RelationshipItem (org.neo4j.storageengine.api.RelationshipItem)20 DefinedProperty (org.neo4j.kernel.api.properties.DefinedProperty)7 PropertyItem (org.neo4j.storageengine.api.PropertyItem)6 NodeItem (org.neo4j.storageengine.api.NodeItem)5 Test (org.junit.Test)4 Property (org.neo4j.kernel.api.properties.Property)4 KernelStatement (org.neo4j.kernel.impl.api.KernelStatement)3 StorageProperty (org.neo4j.storageengine.api.StorageProperty)3 NodeState (org.neo4j.storageengine.api.txstate.NodeState)3 IOException (java.io.IOException)2 InterruptedIOException (java.io.InterruptedIOException)2 HashMap (java.util.HashMap)2 NoSuchElementException (java.util.NoSuchElementException)2 DataWriteOperations (org.neo4j.kernel.api.DataWriteOperations)2 EntityNotFoundException (org.neo4j.kernel.api.exceptions.EntityNotFoundException)2 PropertyKeyIdNotFoundKernelException (org.neo4j.kernel.api.exceptions.PropertyKeyIdNotFoundKernelException)2 InvocationOnMock (org.mockito.invocation.InvocationOnMock)1 Cursor (org.neo4j.cursor.Cursor)1 NotFoundException (org.neo4j.graphdb.NotFoundException)1 Relationship (org.neo4j.graphdb.Relationship)1