Skip to content

Commit

Permalink
Use primitive long diff sets for node state
Browse files Browse the repository at this point in the history
  • Loading branch information
Andrei Koval committed May 16, 2018
1 parent e46db3a commit 58f003d
Show file tree
Hide file tree
Showing 32 changed files with 278 additions and 316 deletions.
Expand Up @@ -19,7 +19,6 @@
*/
package org.neo4j.collection;

import org.eclipse.collections.api.IntIterable;
import org.eclipse.collections.api.iterator.IntIterator;
import org.eclipse.collections.api.set.primitive.IntSet;
import org.eclipse.collections.api.set.primitive.MutableIntSet;
Expand Down Expand Up @@ -228,18 +227,6 @@ public static IntSet asSet( IntIterator iterator )
return set;
}

public static long[] asLongArray( IntIterable values )
{
long[] array = new long[values.size()];
final IntIterator iterator = values.intIterator();
int i = 0;
while ( iterator.hasNext() )
{
array[i++] = iterator.next();
}
return array;
}

public static IntIterator toPrimitiveIterator( final Iterator<Integer> iterator )
{
return new PrimitiveIntBaseIterator()
Expand Down
Expand Up @@ -19,10 +19,9 @@
*/
package org.neo4j.kernel.api.txstate;

import org.eclipse.collections.api.set.primitive.IntSet;
import org.eclipse.collections.api.set.primitive.LongSet;

import java.util.Set;
import java.util.function.IntConsumer;
import java.util.function.LongConsumer;

import org.neo4j.cursor.Cursor;
import org.neo4j.internal.kernel.api.exceptions.EntityNotFoundException;
Expand Down Expand Up @@ -73,7 +72,7 @@ public void visitDeletedNode( long id )

private void decrementCountForLabelsAndRelationships( NodeItem node )
{
final IntSet labelIds = node.labels();
final LongSet labelIds = node.labels();
labelIds.forEach( labelId ->
{
counts.incrementNodeCount( labelId, -1 );
Expand Down Expand Up @@ -107,20 +106,14 @@ public void visitDeletedRelationship( long id )
}

@Override
public void visitNodeLabelChanges( long id, final Set<Integer> added, final Set<Integer> removed )
public void visitNodeLabelChanges( long id, final LongSet added, final LongSet removed )
throws ConstraintValidationException
{
// update counts
if ( !(added.isEmpty() && removed.isEmpty()) )
{
for ( Integer label : added )
{
counts.incrementNodeCount( label, 1 );
}
for ( Integer label : removed )
{
counts.incrementNodeCount( label, -1 );
}
added.each( label -> counts.incrementNodeCount( label, 1 ) );
removed.each( label -> counts.incrementNodeCount( label, -1 ) );
// get the relationship counts from *before* this transaction,
// the relationship changes will compensate for what happens during the transaction
statement.acquireSingleNodeCursor( id )
Expand All @@ -133,13 +126,12 @@ public void visitNodeLabelChanges( long id, final Set<Integer> added, final Set<
super.visitNodeLabelChanges( id, added, removed );
}

private void updateRelationshipsCountsFromDegrees( IntSet labels, int type, long outgoing,
long incoming )
private void updateRelationshipsCountsFromDegrees( LongSet labels, int type, long outgoing, long incoming )
{
labels.forEach( label -> updateRelationshipsCountsFromDegrees( type, label, outgoing, incoming ) );
}

private boolean updateRelationshipsCountsFromDegrees( int type, int label, long outgoing, long incoming )
private boolean updateRelationshipsCountsFromDegrees( int type, long label, long outgoing, long incoming )
{
// untyped
counts.incrementRelationshipCount( label, ANY_RELATIONSHIP_TYPE, ANY_LABEL, outgoing );
Expand All @@ -157,7 +149,7 @@ private void updateRelationshipCount( long startNode, int type, long endNode, in
visitLabels( endNode, labelId -> updateRelationshipsCountsFromDegrees( type, labelId, 0, delta ) );
}

private void visitLabels( long nodeId, IntConsumer visitor )
private void visitLabels( long nodeId, LongConsumer visitor )
{
nodeCursor( statement, nodeId ).forAll( node -> node.labels().forEach( visitor::accept ) );
}
Expand Down
Expand Up @@ -63,13 +63,13 @@ public interface TransactionState extends ReadableTransactionState

void graphDoRemoveProperty( int propertyKeyId );

void nodeDoAddLabel( int labelId, long nodeId );
void nodeDoAddLabel( long labelId, long nodeId );

void nodeDoRemoveLabel( int labelId, long nodeId );
void nodeDoRemoveLabel( long labelId, long nodeId );

// TOKEN RELATED

void labelDoCreateForName( String labelName, int id );
void labelDoCreateForName( String labelName, long id );

void propertyKeyDoCreateForName( String propertyKeyName, int id );

Expand Down
Expand Up @@ -49,9 +49,9 @@ public interface CountsAccessor extends CountsVisitor.Visitable

interface Updater extends AutoCloseable
{
void incrementNodeCount( int labelId, long delta );
void incrementNodeCount( long labelId, long delta );

void incrementRelationshipCount( int startLabelId, int typeId, int endLabelId, long delta );
void incrementRelationshipCount( long startLabelId, int typeId, long endLabelId, long delta );

@Override
void close();
Expand Down
Expand Up @@ -54,7 +54,7 @@ public DoubleLongRegister nodeCount( int labelId, DoubleLongRegister target )
}

@Override
public void incrementNodeCount( int labelId, long delta )
public void incrementNodeCount( long labelId, long delta )
{
counts( nodeKey( labelId ) ).increment( 0L, delta );
}
Expand All @@ -75,7 +75,7 @@ public DoubleLongRegister indexSample( long indexId, DoubleLongRegister target )
}

@Override
public void incrementRelationshipCount( int startLabelId, int typeId, int endLabelId, long delta )
public void incrementRelationshipCount( long startLabelId, int typeId, long endLabelId, long delta )
{
if ( delta != 0 )
{
Expand Down
Expand Up @@ -19,8 +19,8 @@
*/
package org.neo4j.kernel.impl.api.cursor;

import org.eclipse.collections.api.set.primitive.MutableIntSet;
import org.eclipse.collections.impl.set.mutable.primitive.IntHashSet;
import org.eclipse.collections.api.set.primitive.MutableLongSet;
import org.eclipse.collections.impl.set.mutable.primitive.LongHashSet;

import java.util.function.Consumer;

Expand Down Expand Up @@ -117,13 +117,13 @@ public long id()
}

@Override
public MutableIntSet labels()
public MutableLongSet labels()
{
return state.augmentLabels( nodeIsAddedInThisTx ? new IntHashSet() : this.cursor.get().labels(), nodeState );
return state.augmentLabels( nodeIsAddedInThisTx ? new LongHashSet() : this.cursor.get().labels(), nodeState );
}

@Override
public boolean hasLabel( int labelId )
public boolean hasLabel( long labelId )
{
if ( nodeIsAddedInThisTx || nodeState.labelDiffSets().getRemoved().contains( labelId ) )
{
Expand Down
Expand Up @@ -29,12 +29,12 @@

import org.neo4j.kernel.impl.api.state.RelationshipChangesForNode.DiffStrategy;
import org.neo4j.kernel.impl.newapi.RelationshipDirection;
import org.neo4j.kernel.impl.util.diffsets.DiffSets;
import org.neo4j.kernel.impl.util.diffsets.MutableLongDiffSets;
import org.neo4j.kernel.impl.util.diffsets.MutableLongDiffSetsImpl;
import org.neo4j.storageengine.api.Direction;
import org.neo4j.storageengine.api.StorageProperty;
import org.neo4j.storageengine.api.txstate.LongDiffSets;
import org.neo4j.storageengine.api.txstate.NodeState;
import org.neo4j.storageengine.api.txstate.ReadableDiffSets;

import static java.util.Collections.emptyIterator;

Expand Down Expand Up @@ -67,9 +67,9 @@ public Iterator<StorageProperty> addedAndChangedProperties()
}

@Override
public ReadableDiffSets<Integer> labelDiffSets()
public LongDiffSets labelDiffSets()
{
return ReadableDiffSets.Empty.instance();
return LongDiffSets.EMPTY;
}

@Override
Expand Down Expand Up @@ -127,7 +127,7 @@ public LongIterator getAddedRelationships( RelationshipDirection direction, int
}
};

private DiffSets<Integer> labelDiffSets;
private MutableLongDiffSets labelDiffSets;
private RelationshipChangesForNode relationshipsAdded;
private RelationshipChangesForNode relationshipsRemoved;

Expand All @@ -139,16 +139,16 @@ public LongIterator getAddedRelationships( RelationshipDirection direction, int
}

@Override
public ReadableDiffSets<Integer> labelDiffSets()
public LongDiffSets labelDiffSets()
{
return ReadableDiffSets.Empty.ifNull( labelDiffSets );
return labelDiffSets == null ? LongDiffSets.EMPTY : labelDiffSets;
}

DiffSets<Integer> getOrCreateLabelDiffSets()
MutableLongDiffSets getOrCreateLabelDiffSets()
{
if ( labelDiffSets == null )
{
labelDiffSets = new DiffSets<>();
labelDiffSets = new MutableLongDiffSetsImpl();
}
return labelDiffSets;
}
Expand Down Expand Up @@ -194,7 +194,7 @@ public void clear()
}
if ( labelDiffSets != null )
{
labelDiffSets.clear();
labelDiffSets = null;
}
if ( indexDiffs != null )
{
Expand Down

0 comments on commit 58f003d

Please sign in to comment.