Skip to content

Commit

Permalink
Make labels return PrimitiveIntSet instead of IntCursor
Browse files Browse the repository at this point in the history
  • Loading branch information
davidegrohmann committed Feb 2, 2017
1 parent 4711dc9 commit 0b414ce
Show file tree
Hide file tree
Showing 29 changed files with 212 additions and 866 deletions.
Expand Up @@ -22,10 +22,10 @@
import java.util.Set;
import java.util.function.IntConsumer;

import org.neo4j.collection.primitive.Primitive;
import org.neo4j.collection.primitive.PrimitiveIntCollection;
import org.neo4j.collection.primitive.PrimitiveIntIterator;
import org.neo4j.collection.primitive.PrimitiveIntCollections;
import org.neo4j.collection.primitive.PrimitiveIntSet;
import org.neo4j.collection.primitive.PrimitiveIntVisitor;
import org.neo4j.cursor.Cursor;
import org.neo4j.kernel.api.exceptions.EntityNotFoundException;
import org.neo4j.kernel.api.exceptions.schema.ConstraintValidationKernelException;
Expand All @@ -37,6 +37,7 @@
import org.neo4j.storageengine.api.txstate.ReadableTransactionState;
import org.neo4j.storageengine.api.txstate.TxStateVisitor;

import static org.neo4j.collection.primitive.PrimitiveIntCollections.consume;
import static org.neo4j.kernel.api.ReadOperations.ANY_LABEL;
import static org.neo4j.kernel.api.ReadOperations.ANY_RELATIONSHIP_TYPE;

Expand Down Expand Up @@ -75,7 +76,7 @@ public void visitDeletedNode( long id )

private void decrementCountForLabelsAndRelationships( NodeItem node )
{
PrimitiveIntSet labelIds = node.labels().collect( Primitive.intSet() );
PrimitiveIntSet labelIds = node.labels();
labelIds.visitKeys( labelId ->
{
counts.incrementNodeCount( labelId, -1 );
Expand Down Expand Up @@ -167,9 +168,9 @@ private void updateRelationshipCount( long startNode, int type, long endNode, in
visitLabels( endNode, ( labelId ) -> updateRelationshipsCountsFromDegrees( type, labelId, 0, delta ) );
}

private void visitLabels( long nodeId, IntConsumer consumer )
private void visitLabels( long nodeId, PrimitiveIntVisitor<RuntimeException> visitor )
{
nodeCursor( statement, nodeId ).forAll( node -> node.labels().forAll( consumer ) );
nodeCursor( statement, nodeId ).forAll( node -> node.labels().visitKeys( visitor ) );
}

private Cursor<NodeItem> nodeCursor( StorageStatement statement, long nodeId )
Expand Down
Expand Up @@ -24,7 +24,6 @@
import org.neo4j.collection.primitive.PrimitiveIntIterator;
import org.neo4j.collection.primitive.PrimitiveLongIterator;
import org.neo4j.cursor.Cursor;
import org.neo4j.cursor.IntCursor;
import org.neo4j.helpers.Strings;
import org.neo4j.helpers.collection.CastingIterator;
import org.neo4j.kernel.api.constraints.NodePropertyConstraint;
Expand Down Expand Up @@ -119,34 +118,27 @@ public Property nodeSetProperty( KernelStatement state, long nodeId, DefinedProp
{
try ( Cursor<NodeItem> cursor = nodeCursorById( state, nodeId ) )
{

NodeItem node = cursor.get();

try ( IntCursor labels = node.labels() )
node.labels().visitKeys( labelId ->
{
while ( labels.next() )
int propertyKeyId = property.propertyKeyId();
Iterator<UniquenessConstraint> constraintIterator = uniquePropertyConstraints( schemaReadOperations
.constraintsGetForLabelAndPropertyKey( state,
new NodePropertyDescriptor( labelId, propertyKeyId ) ) );
if ( constraintIterator.hasNext() )
{
int labelId = labels.getAsInt();
int propertyKeyId = property.propertyKeyId();
Iterator<UniquenessConstraint> constraintIterator =
uniquePropertyConstraints( schemaReadOperations.constraintsGetForLabelAndPropertyKey( state,
new NodePropertyDescriptor( labelId, propertyKeyId ) ) );
if ( constraintIterator.hasNext() )
{
UniquenessConstraint constraint = constraintIterator.next();
validateNoExistingNodeWithLabelAndProperty( state, constraint, property.value(), node.id() );
}
UniquenessConstraint constraint = constraintIterator.next();
validateNoExistingNodeWithLabelAndProperty( state, constraint, property.value(), node.id() );
}
}

return false;
} );
}

return entityWriteOperations.nodeSetProperty( state, nodeId, property );
}

private void validateNoExistingNodeWithLabelAndProperty( KernelStatement state, UniquenessConstraint constraint,
Object value, long modifiedNode )
throws ConstraintValidationKernelException
Object value, long modifiedNode ) throws ConstraintValidationKernelException
{
try
{
Expand Down
Expand Up @@ -326,7 +326,7 @@ public PrimitiveIntIterator nodeGetLabels( long nodeId ) throws EntityNotFoundEx
statement.assertOpen();
try ( Cursor<NodeItem> node = dataRead().nodeCursorById( statement, nodeId ) )
{
return node.get().labels().collect( intSet() ).iterator();
return node.get().labels().iterator();
}
}

Expand Down
Expand Up @@ -28,7 +28,6 @@
import org.neo4j.collection.primitive.PrimitiveLongIterator;
import org.neo4j.collection.primitive.PrimitiveLongResourceIterator;
import org.neo4j.cursor.Cursor;
import org.neo4j.cursor.IntCursor;
import org.neo4j.helpers.collection.Iterators;
import org.neo4j.kernel.api.DataWriteOperations;
import org.neo4j.kernel.api.LegacyIndex;
Expand Down Expand Up @@ -282,7 +281,7 @@ public boolean nodeAddLabel( KernelStatement state, long nodeId, int labelId ) t
try ( Cursor<NodeItem> cursor = nodeCursorById( state, nodeId ) )
{
NodeItem node = cursor.get();
if ( node.label( labelId ).exists() )
if ( node.hasLabel( labelId ) )
{
// Label is already in state or in store, no-op
return false;
Expand Down Expand Up @@ -317,7 +316,7 @@ public boolean nodeRemoveLabel( KernelStatement state, long nodeId, int labelId
try ( Cursor<NodeItem> cursor = nodeCursorById( state, nodeId ) )
{
NodeItem node = cursor.get();
if ( !node.label( labelId ).exists() )
if ( !node.hasLabel( labelId ) )
{
// Label does not exist in state or in store, no-op
return false;
Expand Down Expand Up @@ -1006,14 +1005,11 @@ public Property graphRemoveProperty( KernelStatement state, int propertyKeyId )
private void indexesUpdateProperty( KernelStatement state, NodeItem node, int propertyKey, DefinedProperty before,
DefinedProperty after )
{
try ( IntCursor labels = node.labels() )
node.labels().visitKeys( labelId ->
{
while ( labels.next() )
{
NodePropertyDescriptor descriptor = new NodePropertyDescriptor( labels.getAsInt(), propertyKey );
indexUpdateProperty( state, node.id(), descriptor, before, after );
}
}
indexUpdateProperty( state, node.id(), new NodePropertyDescriptor( labelId, propertyKey ), before, after );
return false;
} );
}

private void indexUpdateProperty( KernelStatement state, long nodeId, NodePropertyDescriptor descriptor,
Expand Down
Expand Up @@ -20,50 +20,40 @@
package org.neo4j.kernel.impl.api.cursor;

import java.util.Iterator;
import java.util.function.Consumer;

import org.neo4j.cursor.IntCursor;
import org.neo4j.kernel.api.StatementConstants;
import org.neo4j.collection.primitive.PrimitiveIntCollections;
import org.neo4j.collection.primitive.PrimitiveIntIterator;
import org.neo4j.storageengine.api.txstate.ReadableDiffSets;

/**
* Overlays transaction state on a label cursor.
*/
public class TxLabelCursor implements IntCursor
public class TxLabelIterator extends PrimitiveIntCollections.PrimitiveIntBaseIterator
{
private final Consumer<TxLabelCursor> instanceCache;

protected IntCursor cursor;
protected ReadableDiffSets<Integer> labelDiffSet;

protected int label;
private PrimitiveIntIterator iterator;
private ReadableDiffSets<Integer> labelDiffSet;
private Iterator<Integer> added;

public TxLabelCursor( Consumer<TxLabelCursor> instanceCache )
public TxLabelIterator( PrimitiveIntIterator iterator, ReadableDiffSets<Integer> labelDiffSet )
{
this.instanceCache = instanceCache;
}

public TxLabelCursor init( IntCursor cursor, ReadableDiffSets<Integer> labelDiffSet )
{
this.cursor = cursor;
this.iterator = iterator;
this.labelDiffSet = labelDiffSet;
this.added = null;
return this;
}

@Override
public boolean next()
protected boolean fetchNext()
{
if ( added == null )
{
while ( cursor != null && cursor.next() )
while ( iterator != null && iterator.hasNext() )
{
label = cursor.getAsInt();
int label = iterator.next();
if ( labelDiffSet.isRemoved( label ) )
{
continue;
}
next( label );
return true;
}

Expand All @@ -72,27 +62,10 @@ public boolean next()

if ( added.hasNext() )
{
label = added.next();
next( added.next() );
return true;
}
else
{
label = StatementConstants.NO_SUCH_LABEL;
return false;
}
}

@Override
public int getAsInt()
{
return label;
}

@Override
public void close()
{
cursor.close();
cursor = null;
instanceCache.accept( this );
return false;
}
}

This file was deleted.

Expand Up @@ -36,8 +36,8 @@
import org.neo4j.storageengine.api.RelationshipItem;
import org.neo4j.storageengine.api.txstate.NodeState;

import static org.neo4j.collection.primitive.PrimitiveIntCollections.emptySet;
import static org.neo4j.kernel.impl.util.Cursors.empty;
import static org.neo4j.kernel.impl.util.Cursors.emptyInt;

/**
* Overlays transaction state on a {@link NodeItem} cursor.
Expand Down Expand Up @@ -121,23 +121,23 @@ public long id()
}

@Override
public IntCursor labels()
public PrimitiveIntSet labels()
{
IntCursor cursor = nodeIsAddedInThisTx ? emptyInt() : this.cursor.get().labels();
return state.augmentLabelCursor( cursor, nodeState );
}

@Override
public IntCursor label( int labelId )
{
IntCursor cursor = nodeIsAddedInThisTx ? emptyInt() : this.cursor.get().label( labelId );
return state.augmentSingleLabelCursor( cursor, nodeState, labelId );
return state.augmentLabels( nodeIsAddedInThisTx ? emptySet() : this.cursor.get().labels(), nodeState );
}

@Override
public boolean hasLabel( int labelId )
{
return label( labelId ).exists();
if ( nodeIsAddedInThisTx || nodeState.labelDiffSets().getRemoved().contains( labelId ) )
{
return false;
}
if ( nodeState.labelDiffSets().getAdded().contains( labelId ) )
{
return true;
}
return this.cursor.get().hasLabel( labelId );
}

@Override
Expand Down

0 comments on commit 0b414ce

Please sign in to comment.