Skip to content

Commit

Permalink
Move property cursor APIs from Node Cursors to OperationsFacade
Browse files Browse the repository at this point in the history
  • Loading branch information
davidegrohmann committed Feb 28, 2017
1 parent 7371cb8 commit 2a0b420
Show file tree
Hide file tree
Showing 36 changed files with 518 additions and 353 deletions.
Expand Up @@ -55,6 +55,7 @@
import org.neo4j.kernel.impl.api.store.RelationshipIterator; import org.neo4j.kernel.impl.api.store.RelationshipIterator;
import org.neo4j.register.Register.DoubleLongRegister; import org.neo4j.register.Register.DoubleLongRegister;
import org.neo4j.storageengine.api.NodeItem; import org.neo4j.storageengine.api.NodeItem;
import org.neo4j.storageengine.api.PropertyItem;
import org.neo4j.storageengine.api.RelationshipItem; import org.neo4j.storageengine.api.RelationshipItem;
import org.neo4j.storageengine.api.Token; import org.neo4j.storageengine.api.Token;
import org.neo4j.storageengine.api.lock.ResourceType; import org.neo4j.storageengine.api.lock.ResourceType;
Expand Down Expand Up @@ -216,6 +217,8 @@ <EXCEPTION extends Exception> void relationshipVisit( long relId, RelationshipVi


Cursor<RelationshipItem> relationshipCursorById( long relId ) throws EntityNotFoundException; Cursor<RelationshipItem> relationshipCursorById( long relId ) throws EntityNotFoundException;


Cursor<PropertyItem> nodeGetProperties( NodeItem node );

//=========================================== //===========================================
//== SCHEMA OPERATIONS ====================== //== SCHEMA OPERATIONS ======================
//=========================================== //===========================================
Expand Down
Expand Up @@ -21,14 +21,12 @@


import java.util.Iterator; import java.util.Iterator;


import org.neo4j.collection.primitive.PrimitiveIntCollection;
import org.neo4j.collection.primitive.PrimitiveIntIterator; import org.neo4j.collection.primitive.PrimitiveIntIterator;
import org.neo4j.collection.primitive.PrimitiveIntSet; import org.neo4j.collection.primitive.PrimitiveIntSet;
import org.neo4j.collection.primitive.PrimitiveLongIterator; import org.neo4j.collection.primitive.PrimitiveLongIterator;
import org.neo4j.cursor.Cursor; import org.neo4j.cursor.Cursor;
import org.neo4j.helpers.Strings; import org.neo4j.helpers.Strings;
import org.neo4j.helpers.collection.CastingIterator;
import org.neo4j.kernel.api.constraints.NodePropertyConstraint;
import org.neo4j.kernel.api.constraints.UniquenessConstraint;
import org.neo4j.kernel.api.exceptions.EntityNotFoundException; import org.neo4j.kernel.api.exceptions.EntityNotFoundException;
import org.neo4j.kernel.api.exceptions.InvalidTransactionTypeKernelException; import org.neo4j.kernel.api.exceptions.InvalidTransactionTypeKernelException;
import org.neo4j.kernel.api.exceptions.KernelException; import org.neo4j.kernel.api.exceptions.KernelException;
Expand Down Expand Up @@ -61,12 +59,13 @@
import org.neo4j.kernel.impl.api.operations.EntityWriteOperations; import org.neo4j.kernel.impl.api.operations.EntityWriteOperations;
import org.neo4j.kernel.impl.api.operations.SchemaReadOperations; import org.neo4j.kernel.impl.api.operations.SchemaReadOperations;
import org.neo4j.kernel.impl.api.operations.SchemaWriteOperations; import org.neo4j.kernel.impl.api.operations.SchemaWriteOperations;
import org.neo4j.kernel.impl.api.store.EntityLoadingIterator; import org.neo4j.kernel.impl.api.store.NodeLoadingIterator;
import org.neo4j.kernel.impl.constraints.ConstraintSemantics; import org.neo4j.kernel.impl.constraints.ConstraintSemantics;
import org.neo4j.kernel.impl.locking.LockTracer; import org.neo4j.kernel.impl.locking.LockTracer;
import org.neo4j.kernel.impl.locking.Locks; import org.neo4j.kernel.impl.locking.Locks;
import org.neo4j.storageengine.api.Direction; import org.neo4j.storageengine.api.Direction;
import org.neo4j.storageengine.api.NodeItem; import org.neo4j.storageengine.api.NodeItem;
import org.neo4j.storageengine.api.PropertyItem;
import org.neo4j.storageengine.api.RelationshipItem; import org.neo4j.storageengine.api.RelationshipItem;


import static org.neo4j.kernel.api.StatementConstants.NO_SUCH_NODE; import static org.neo4j.kernel.api.StatementConstants.NO_SUCH_NODE;
Expand Down Expand Up @@ -110,7 +109,7 @@ public boolean nodeAddLabel( KernelStatement state, long nodeId, int labelId )
{ {
UniquenessConstraintDescriptor uniqueConstraint = (UniquenessConstraintDescriptor) constraint; UniquenessConstraintDescriptor uniqueConstraint = (UniquenessConstraintDescriptor) constraint;
// TODO: Support composite indexes // TODO: Support composite indexes
Object propertyValue = node.getProperty( uniqueConstraint.schema().getPropertyId() ); Object propertyValue = nodeGetProperty( state, node, uniqueConstraint.schema().getPropertyId() );
if ( propertyValue != null ) if ( propertyValue != null )
{ {
// TODO: Support composite indexes // TODO: Support composite indexes
Expand Down Expand Up @@ -399,6 +398,30 @@ public Cursor<RelationshipItem> relationshipCursorGetAll( KernelStatement statem
return entityReadOperations.relationshipCursorGetAll( statement ); return entityReadOperations.relationshipCursorGetAll( statement );
} }


@Override
public Cursor<PropertyItem> nodeGetProperties( KernelStatement statement, NodeItem node )
{
return entityReadOperations.nodeGetProperties( statement, node );
}

@Override
public Object nodeGetProperty( KernelStatement statement, NodeItem node, int propertyKeyId )
{
return entityReadOperations.nodeGetProperty( statement, node, propertyKeyId );
}

@Override
public boolean nodeHasProperty( KernelStatement statement, NodeItem node, int propertyKeyId )
{
return entityReadOperations.nodeHasProperty( statement, node, propertyKeyId );
}

@Override
public PrimitiveIntCollection nodeGetPropertyKeys( KernelStatement statement, NodeItem node )
{
return entityReadOperations.nodeGetPropertyKeys( statement, node );
}

@Override @Override
public Cursor<RelationshipItem> nodeGetRelationships( KernelStatement statement, NodeItem node, public Cursor<RelationshipItem> nodeGetRelationships( KernelStatement statement, NodeItem node,
Direction direction ) Direction direction )
Expand Down Expand Up @@ -445,12 +468,10 @@ public NodeExistenceConstraintDescriptor nodePropertyExistenceConstraintCreate(
LabelSchemaDescriptor descriptor LabelSchemaDescriptor descriptor
) throws AlreadyConstrainedException, CreateConstraintFailureException ) throws AlreadyConstrainedException, CreateConstraintFailureException
{ {
Iterator<Cursor<NodeItem>> nodes = Iterator<Cursor<NodeItem>> nodes = new NodeLoadingIterator( nodesGetForLabel( state, descriptor.getLabelId() ),
new EntityLoadingIterator<>( ( id ) -> nodeCursorById( state, id ) );
nodesGetForLabel( state, descriptor.getLabelId() ), constraintSemantics.validateNodePropertyExistenceConstraint( nodes, descriptor,
( id ) -> nodeCursorById( state, id ) (node, propertyKey) -> entityReadOperations.nodeHasProperty(state, node, propertyKey) );
);
constraintSemantics.validateExistenceConstraint( nodes, descriptor );
return schemaWriteOperations.nodePropertyExistenceConstraintCreate( state, descriptor ); return schemaWriteOperations.nodePropertyExistenceConstraintCreate( state, descriptor );
} }


Expand Down
Expand Up @@ -19,6 +19,7 @@
*/ */
package org.neo4j.kernel.impl.api; package org.neo4j.kernel.impl.api;


import org.neo4j.collection.primitive.PrimitiveIntCollection;
import org.neo4j.collection.primitive.PrimitiveIntIterator; import org.neo4j.collection.primitive.PrimitiveIntIterator;
import org.neo4j.collection.primitive.PrimitiveIntSet; import org.neo4j.collection.primitive.PrimitiveIntSet;
import org.neo4j.collection.primitive.PrimitiveLongIterator; import org.neo4j.collection.primitive.PrimitiveLongIterator;
Expand All @@ -39,6 +40,7 @@
import org.neo4j.kernel.impl.api.operations.EntityWriteOperations; import org.neo4j.kernel.impl.api.operations.EntityWriteOperations;
import org.neo4j.storageengine.api.Direction; import org.neo4j.storageengine.api.Direction;
import org.neo4j.storageengine.api.NodeItem; import org.neo4j.storageengine.api.NodeItem;
import org.neo4j.storageengine.api.PropertyItem;
import org.neo4j.storageengine.api.RelationshipItem; import org.neo4j.storageengine.api.RelationshipItem;


public class GuardingStatementOperations implements public class GuardingStatementOperations implements
Expand Down Expand Up @@ -277,6 +279,34 @@ public Cursor<RelationshipItem> nodeGetRelationships( KernelStatement statement,
return entityReadDelegate.nodeGetRelationships( statement, node, direction, relTypes ); return entityReadDelegate.nodeGetRelationships( statement, node, direction, relTypes );
} }


@Override
public Cursor<PropertyItem> nodeGetProperties( KernelStatement statement, NodeItem node )
{
guard.check( statement );
return entityReadDelegate.nodeGetProperties( statement, node );
}

@Override
public Object nodeGetProperty( KernelStatement statement, NodeItem node, int propertyKeyId )
{
guard.check( statement );
return entityReadDelegate.nodeGetProperty( statement, node, propertyKeyId );
}

@Override
public boolean nodeHasProperty( KernelStatement statement, NodeItem node, int propertyKeyId )
{
guard.check( statement );
return entityReadDelegate.nodeHasProperty( statement, node, propertyKeyId );
}

@Override
public PrimitiveIntCollection nodeGetPropertyKeys( KernelStatement statement, NodeItem node )
{
guard.check( statement );
return entityReadDelegate.nodeGetPropertyKeys( statement, node );
}

@Override @Override
public long nodesGetCount( KernelStatement statement ) public long nodesGetCount( KernelStatement statement )
{ {
Expand Down
Expand Up @@ -29,7 +29,6 @@
import org.neo4j.kernel.api.properties.Property; import org.neo4j.kernel.api.properties.Property;
import org.neo4j.kernel.impl.api.operations.EntityOperations; import org.neo4j.kernel.impl.api.operations.EntityOperations;
import org.neo4j.kernel.impl.api.operations.EntityReadOperations; import org.neo4j.kernel.impl.api.operations.EntityReadOperations;
import org.neo4j.storageengine.api.EntityType;
import org.neo4j.storageengine.api.NodeItem; import org.neo4j.storageengine.api.NodeItem;


/** /**
Expand Down Expand Up @@ -132,7 +131,7 @@ Property nodeProperty( long nodeId, int propertyKeyId ) throws EntityNotFoundExc
{ {
try ( Cursor<NodeItem> node = readOperations.nodeCursorById( state, nodeId ) ) try ( Cursor<NodeItem> node = readOperations.nodeCursorById( state, nodeId ) )
{ {
Object value = node.get().getProperty( propertyKeyId ); Object value = readOperations.nodeGetProperty( state, node.get(), propertyKeyId );
return value == null ? Property.noNodeProperty( nodeId, propertyKeyId ) return value == null ? Property.noNodeProperty( nodeId, propertyKeyId )
: Property.property( propertyKeyId, value ); : Property.property( propertyKeyId, value );
} }
Expand Down Expand Up @@ -186,7 +185,7 @@ public boolean test( long nodeId )
{ {
try ( Cursor<NodeItem> node = readOperations.nodeCursorById( state, nodeId ) ) try ( Cursor<NodeItem> node = readOperations.nodeCursorById( state, nodeId ) )
{ {
return inRange( node.get().getProperty( propertyKeyId ) ); return inRange( readOperations.nodeGetProperty( state, node.get(), propertyKeyId ) );
} }
catch ( EntityNotFoundException e ) catch ( EntityNotFoundException e )
{ {
Expand Down
Expand Up @@ -107,6 +107,7 @@
import org.neo4j.kernel.impl.query.clientconnection.ClientConnectionInfo; import org.neo4j.kernel.impl.query.clientconnection.ClientConnectionInfo;
import org.neo4j.register.Register.DoubleLongRegister; import org.neo4j.register.Register.DoubleLongRegister;
import org.neo4j.storageengine.api.NodeItem; import org.neo4j.storageengine.api.NodeItem;
import org.neo4j.storageengine.api.PropertyItem;
import org.neo4j.storageengine.api.RelationshipItem; import org.neo4j.storageengine.api.RelationshipItem;
import org.neo4j.storageengine.api.Token; import org.neo4j.storageengine.api.Token;
import org.neo4j.storageengine.api.lock.ResourceType; import org.neo4j.storageengine.api.lock.ResourceType;
Expand Down Expand Up @@ -285,7 +286,7 @@ public boolean nodeHasProperty( long nodeId, int propertyKeyId ) throws EntityNo
} }
try ( Cursor<NodeItem> node = dataRead().nodeCursorById( statement, nodeId ) ) try ( Cursor<NodeItem> node = dataRead().nodeCursorById( statement, nodeId ) )
{ {
return node.get().hasProperty( propertyKeyId ); return dataRead().nodeHasProperty( statement, node.get(), propertyKeyId );
} }
} }


Expand All @@ -299,7 +300,7 @@ public Object nodeGetProperty( long nodeId, int propertyKeyId ) throws EntityNot
} }
try ( Cursor<NodeItem> node = dataRead().nodeCursorById( statement, nodeId ) ) try ( Cursor<NodeItem> node = dataRead().nodeCursorById( statement, nodeId ) )
{ {
return node.get().getProperty( propertyKeyId ); return dataRead().nodeGetProperty( statement, node.get(), propertyKeyId );
} }
finally finally
{ {
Expand Down Expand Up @@ -443,8 +444,7 @@ public PrimitiveIntIterator nodeGetPropertyKeys( long nodeId ) throws EntityNotF
statement.assertOpen(); statement.assertOpen();
try ( Cursor<NodeItem> node = dataRead().nodeCursorById( statement, nodeId ) ) try ( Cursor<NodeItem> node = dataRead().nodeCursorById( statement, nodeId ) )
{ {
PrimitiveIntCollection propertyKeys = node.get().getPropertyKeys(); return dataRead().nodeGetPropertyKeys( statement, node.get() ).iterator();
return propertyKeys.iterator();
} }
finally finally
{ {
Expand Down Expand Up @@ -554,6 +554,14 @@ public Cursor<RelationshipItem> relationshipCursorById( long relId ) throws Enti
statement.assertOpen(); statement.assertOpen();
return dataRead().relationshipCursorById( statement, relId ); return dataRead().relationshipCursorById( statement, relId );
} }

@Override
public Cursor<PropertyItem> nodeGetProperties( NodeItem node )
{
statement.assertOpen();
return dataRead().nodeGetProperties( statement, node );
}

// </DataReadCursors> // </DataReadCursors>


// <SchemaRead> // <SchemaRead>
Expand Down
Expand Up @@ -24,12 +24,15 @@
import java.util.Map; import java.util.Map;


import org.neo4j.collection.primitive.Primitive; import org.neo4j.collection.primitive.Primitive;
import org.neo4j.collection.primitive.PrimitiveIntCollection;
import org.neo4j.collection.primitive.PrimitiveIntIterator; import org.neo4j.collection.primitive.PrimitiveIntIterator;
import org.neo4j.collection.primitive.PrimitiveIntSet; import org.neo4j.collection.primitive.PrimitiveIntSet;
import org.neo4j.collection.primitive.PrimitiveIntStack;
import org.neo4j.collection.primitive.PrimitiveLongCollections; import org.neo4j.collection.primitive.PrimitiveLongCollections;
import org.neo4j.collection.primitive.PrimitiveLongIterator; import org.neo4j.collection.primitive.PrimitiveLongIterator;
import org.neo4j.collection.primitive.PrimitiveLongResourceIterator; import org.neo4j.collection.primitive.PrimitiveLongResourceIterator;
import org.neo4j.cursor.Cursor; import org.neo4j.cursor.Cursor;
import org.neo4j.graphdb.NotFoundException;
import org.neo4j.kernel.api.DataWriteOperations; import org.neo4j.kernel.api.DataWriteOperations;
import org.neo4j.kernel.api.LegacyIndex; import org.neo4j.kernel.api.LegacyIndex;
import org.neo4j.kernel.api.LegacyIndexHits; import org.neo4j.kernel.api.LegacyIndexHits;
Expand Down Expand Up @@ -244,6 +247,85 @@ public Cursor<RelationshipItem> nodeGetRelationships( KernelStatement statement,
return statement.txState().augmentNodeRelationshipCursor( cursor, nodeState, direction, relTypes ); return statement.txState().augmentNodeRelationshipCursor( cursor, nodeState, direction, relTypes );
} }


@Override
public Cursor<PropertyItem> nodeGetProperties( KernelStatement statement, NodeItem node )
{
Cursor<PropertyItem> cursor;
if ( statement.hasTxStateWithChanges() && statement.txState().nodeIsAddedInThisTx( node.id() ) )
{
cursor = empty();
}
else
{
cursor = storeLayer.nodeGetProperties( statement.getStoreStatement(), node );
}

return statement.hasTxStateWithChanges()
? statement.txState().augmentPropertyCursor( cursor, statement.txState().getNodeState( node.id() ) )
: cursor;
}

@Override
public PrimitiveIntCollection nodeGetPropertyKeys( KernelStatement statement, NodeItem node )
{
PrimitiveIntStack keys = new PrimitiveIntStack();
try ( Cursor<PropertyItem> properties = nodeGetProperties( statement, node ) )
{
while ( properties.next() )
{
keys.push( properties.get().propertyKeyId() );
}
}

return keys;
}

@Override
public Object nodeGetProperty( KernelStatement statement, NodeItem node, int propertyKeyId )
{
try ( Cursor<PropertyItem> cursor = nodeGetPropertyCursor( statement, node, propertyKeyId ) )
{
if ( cursor.next() )
{
return cursor.get().value();
}
}
catch ( NotFoundException e )
{
return null;
}

return null;
}

@Override
public boolean nodeHasProperty( KernelStatement statement, NodeItem node, int propertyKeyId )
{
try ( Cursor<PropertyItem> cursor = nodeGetPropertyCursor( statement, node, propertyKeyId ) )
{
return cursor.next();
}
}

private Cursor<PropertyItem> nodeGetPropertyCursor( KernelStatement statement, NodeItem node, int propertyKeyId )
{

Cursor<PropertyItem> cursor;
if ( statement.hasTxStateWithChanges() && statement.txState().nodeIsAddedInThisTx( node.id() ) )
{
cursor = empty();
}
else
{
cursor = storeLayer.nodeGetProperty( statement.getStoreStatement(), node, propertyKeyId );
}

return statement.hasTxStateWithChanges()
? statement.txState().augmentSinglePropertyCursor(
cursor, statement.txState().getNodeState( node.id() ), propertyKeyId )
: cursor;
}

// </Cursors> // </Cursors>


@Override @Override
Expand Down Expand Up @@ -344,7 +426,7 @@ public boolean nodeAddLabel( KernelStatement state, long nodeId, int labelId ) t


state.txState().nodeDoAddLabel( labelId, node.id() ); state.txState().nodeDoAddLabel( labelId, node.id() );


try ( Cursor<PropertyItem> properties = node.properties() ) try ( Cursor<PropertyItem> properties = nodeGetProperties( state, node ) )
{ {
while ( properties.next() ) while ( properties.next() )
{ {
Expand Down Expand Up @@ -380,7 +462,7 @@ public boolean nodeRemoveLabel( KernelStatement state, long nodeId, int labelId


state.txState().nodeDoRemoveLabel( labelId, node.id() ); state.txState().nodeDoRemoveLabel( labelId, node.id() );


try ( Cursor<PropertyItem> properties = node.properties() ) try ( Cursor<PropertyItem> properties = nodeGetProperties( state, node ) )
{ {
while ( properties.next() ) while ( properties.next() )
{ {
Expand Down Expand Up @@ -866,7 +948,7 @@ public Property nodeSetProperty( KernelStatement state, long nodeId, DefinedProp
{ {
NodeItem node = cursor.get(); NodeItem node = cursor.get();
Property existingProperty; Property existingProperty;
try ( Cursor<PropertyItem> properties = node.property( property.propertyKeyId() ) ) try ( Cursor<PropertyItem> properties = nodeGetPropertyCursor( state, node, property.propertyKeyId() ) )
{ {
if ( !properties.next() ) if ( !properties.next() )
{ {
Expand Down Expand Up @@ -940,7 +1022,7 @@ public Property nodeRemoveProperty( KernelStatement state, long nodeId, int prop
{ {
NodeItem node = cursor.get(); NodeItem node = cursor.get();
Property existingProperty; Property existingProperty;
try ( Cursor<PropertyItem> properties = node.property( propertyKeyId ) ) try ( Cursor<PropertyItem> properties = nodeGetPropertyCursor( state, node, propertyKeyId ) )
{ {
if ( !properties.next() ) if ( !properties.next() )
{ {
Expand Down

0 comments on commit 2a0b420

Please sign in to comment.