Skip to content

Commit

Permalink
Cleanup the relTypes argument in the read operation stack
Browse files Browse the repository at this point in the history
  • Loading branch information
davidegrohmann committed Feb 21, 2017
1 parent c2fe733 commit 37857fe
Show file tree
Hide file tree
Showing 19 changed files with 82 additions and 113 deletions.
Expand Up @@ -444,7 +444,7 @@ public Cursor<RelationshipItem> nodeGetRelationships( KernelStatement statement,


@Override @Override
public Cursor<RelationshipItem> nodeGetRelationships( KernelStatement statement, NodeItem node, Direction direction, public Cursor<RelationshipItem> nodeGetRelationships( KernelStatement statement, NodeItem node, Direction direction,
int... relTypes ) PrimitiveIntSet relTypes )
{ {
return entityReadOperations.nodeGetRelationships( statement, node, direction, relTypes ); return entityReadOperations.nodeGetRelationships( statement, node, direction, relTypes );
} }
Expand Down
Expand Up @@ -328,7 +328,7 @@ public Cursor<RelationshipItem> nodeGetRelationships( KernelStatement statement,


@Override @Override
public Cursor<RelationshipItem> nodeGetRelationships( KernelStatement statement, NodeItem node, Direction direction, public Cursor<RelationshipItem> nodeGetRelationships( KernelStatement statement, NodeItem node, Direction direction,
int... relTypes ) PrimitiveIntSet relTypes )
{ {
guard.check( statement ); guard.check( statement );
return entityReadDelegate.nodeGetRelationships( statement, node, direction, relTypes ); return entityReadDelegate.nodeGetRelationships( statement, node, direction, relTypes );
Expand Down
Expand Up @@ -112,6 +112,7 @@
import org.neo4j.storageengine.api.schema.SchemaRule; import org.neo4j.storageengine.api.schema.SchemaRule;


import static java.lang.String.format; import static java.lang.String.format;
import static org.neo4j.collection.primitive.PrimitiveIntCollections.asSet;
import static org.neo4j.collection.primitive.PrimitiveIntCollections.deduplicate; import static org.neo4j.collection.primitive.PrimitiveIntCollections.deduplicate;


public class OperationsFacade public class OperationsFacade
Expand Down Expand Up @@ -371,7 +372,8 @@ public RelationshipIterator nodeGetRelationships( long nodeId, Direction directi
try ( Cursor<NodeItem> node = dataRead().nodeCursorById( statement, nodeId ) ) try ( Cursor<NodeItem> node = dataRead().nodeCursorById( statement, nodeId ) )
{ {
return new CursorRelationshipIterator( dataRead() return new CursorRelationshipIterator( dataRead()
.nodeGetRelationships( statement, node.get(), direction( direction ), deduplicate( relTypes ) ) ); .nodeGetRelationships( statement, node.get(), direction( direction ),
asSet( relTypes, t -> t >= 0 ) ) );
} }
} }


Expand Down
Expand Up @@ -220,12 +220,12 @@ public Cursor<RelationshipItem> nodeGetRelationships( KernelStatement statement,
return cursor; return cursor;
} }
NodeState nodeState = statement.txState().getNodeState( node.id() ); NodeState nodeState = statement.txState().getNodeState( node.id() );
return statement.txState().augmentNodeRelationshipCursor( cursor, nodeState, direction, null ); return statement.txState().augmentNodeRelationshipCursor( cursor, nodeState, direction );
} }


@Override @Override
public Cursor<RelationshipItem> nodeGetRelationships( KernelStatement statement, NodeItem node, Direction direction, public Cursor<RelationshipItem> nodeGetRelationships( KernelStatement statement, NodeItem node, Direction direction,
int... relTypes ) PrimitiveIntSet relTypes )
{ {
Cursor<RelationshipItem> cursor; Cursor<RelationshipItem> cursor;
if ( statement.hasTxStateWithChanges() && statement.txState().nodeIsAddedInThisTx( node.id() ) ) if ( statement.hasTxStateWithChanges() && statement.txState().nodeIsAddedInThisTx( node.id() ) )
Expand Down Expand Up @@ -1721,7 +1721,7 @@ private int computeDegree( KernelStatement statement, NodeItem node, Direction
{ {
return count( relType == null return count( relType == null
? storeLayer.nodeGetRelationships( storeStatement, node, direction ) ? storeLayer.nodeGetRelationships( storeStatement, node, direction )
: storeLayer.nodeGetRelationships( storeStatement, node, direction, relType ) ); : storeLayer.nodeGetRelationships( storeStatement, node, direction, (t) -> t == relType ) );
} }
} }


Expand Down
Expand Up @@ -147,7 +147,7 @@ Cursor<RelationshipItem> relationshipCursorById( KernelStatement statement, long
Cursor<RelationshipItem> nodeGetRelationships( KernelStatement statement, NodeItem node, Direction direction ); Cursor<RelationshipItem> nodeGetRelationships( KernelStatement statement, NodeItem node, Direction direction );


Cursor<RelationshipItem> nodeGetRelationships( KernelStatement statement, NodeItem node, Direction direction, Cursor<RelationshipItem> nodeGetRelationships( KernelStatement statement, NodeItem node, Direction direction,
int... relTypes ); PrimitiveIntSet relTypes );


long nodesGetCount( KernelStatement statement ); long nodesGetCount( KernelStatement statement );


Expand Down
Expand Up @@ -225,7 +225,7 @@ public PrimitiveLongIterator getAddedRelationships( Direction direction )
} }


@Override @Override
public PrimitiveLongIterator getAddedRelationships( Direction direction, int[] relTypes ) public PrimitiveLongIterator getAddedRelationships( Direction direction, PrimitiveIntSet relTypes )
{ {
return relationshipsAdded != null ? relationshipsAdded.getRelationships( direction, relTypes ) : return relationshipsAdded != null ? relationshipsAdded.getRelationships( direction, relTypes ) :
PrimitiveLongCollections.emptyIterator(); PrimitiveLongCollections.emptyIterator();
Expand Down Expand Up @@ -348,7 +348,7 @@ public PrimitiveLongIterator getAddedRelationships( Direction direction )
} }


@Override @Override
public PrimitiveLongIterator getAddedRelationships( Direction direction, int[] relTypes ) public PrimitiveLongIterator getAddedRelationships( Direction direction, PrimitiveIntSet relTypes )
{ {
return null; return null;
} }
Expand Down
Expand Up @@ -258,7 +258,7 @@ public RelationshipIterator augmentRelationships( Direction direction, Relations
return augmentRelationships( direction, rels, ALL_TYPES ); return augmentRelationships( direction, rels, ALL_TYPES );
} }


public RelationshipIterator augmentRelationships( Direction direction, int[] types, RelationshipIterator rels ) public RelationshipIterator augmentRelationships( Direction direction, PrimitiveIntSet types, RelationshipIterator rels )
{ {
return augmentRelationships( direction, rels, typeFilter( types ) ); return augmentRelationships( direction, rels, typeFilter( types ) );
} }
Expand Down Expand Up @@ -441,11 +441,11 @@ private Map<Integer, Set<Long>> getTypeToRelMapForDirection( Direction direction
return relTypeToRelsMap; return relTypeToRelsMap;
} }


private Function<Map<Integer, Set<Long>>, Iterator<Set<Long>>> typeFilter( final int[] types ) private Function<Map<Integer, Set<Long>>, Iterator<Set<Long>>> typeFilter( PrimitiveIntSet types )
{ {
return relationshipsByType -> new PrefetchingIterator<Set<Long>>() return relationshipsByType -> new PrefetchingIterator<Set<Long>>()
{ {
private final PrimitiveIntIterator iterTypes = iterator( types ); private final PrimitiveIntIterator iterTypes = types.iterator();


@Override @Override
protected Set<Long> fetchNextOrNull() protected Set<Long> fetchNextOrNull()
Expand Down Expand Up @@ -490,7 +490,7 @@ public PrimitiveLongIterator getRelationships( Direction direction )
return getRelationships( direction, ALL_TYPES ); return getRelationships( direction, ALL_TYPES );
} }


public PrimitiveLongIterator getRelationships( Direction direction, int[] types ) public PrimitiveLongIterator getRelationships( Direction direction, PrimitiveIntSet types )
{ {
return getRelationships( direction, typeFilter( types ) ); return getRelationships( direction, typeFilter( types ) );
} }
Expand Down
Expand Up @@ -801,22 +801,24 @@ public Cursor<RelationshipItem> augmentSingleRelationshipCursor( Cursor<Relation
return hasChanges ? singleRelationshipCursor.get().init( cursor, relationshipId ) : cursor; return hasChanges ? singleRelationshipCursor.get().init( cursor, relationshipId ) : cursor;
} }


@Override
public Cursor<RelationshipItem> augmentNodeRelationshipCursor( Cursor<RelationshipItem> cursor,
NodeState nodeState,
Direction direction )
{
return nodeState.hasChanges()
? iteratorRelationshipCursor.get().init( cursor, nodeState.getAddedRelationships( direction ) )
: cursor;
}
@Override @Override
public Cursor<RelationshipItem> augmentNodeRelationshipCursor( Cursor<RelationshipItem> cursor, public Cursor<RelationshipItem> augmentNodeRelationshipCursor( Cursor<RelationshipItem> cursor,
NodeState nodeState, NodeState nodeState,
Direction direction, Direction direction,
int[] relTypes ) PrimitiveIntSet relTypes )
{ {
if ( nodeState.hasChanges() ) return nodeState.hasChanges()
{ ? iteratorRelationshipCursor.get().init( cursor, nodeState.getAddedRelationships( direction, relTypes ) )
if ( relTypes == null ) : cursor;
{
return iteratorRelationshipCursor.get().init( cursor, nodeState.getAddedRelationships( direction ) );
}
return iteratorRelationshipCursor.get().init( cursor,
nodeState.getAddedRelationships( direction, relTypes ) );
}
return cursor;
} }


@Override @Override
Expand Down
Expand Up @@ -20,6 +20,7 @@
package org.neo4j.kernel.impl.api.store; package org.neo4j.kernel.impl.api.store;


import java.util.Iterator; import java.util.Iterator;
import java.util.function.IntPredicate;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.function.Supplier; import java.util.function.Supplier;


Expand Down Expand Up @@ -81,6 +82,7 @@
import org.neo4j.storageengine.api.schema.SchemaRule; import org.neo4j.storageengine.api.schema.SchemaRule;


import static org.neo4j.collection.primitive.Primitive.intSet; import static org.neo4j.collection.primitive.Primitive.intSet;
import static org.neo4j.function.Predicates.ALWAYS_TRUE_INT;
import static org.neo4j.helpers.collection.Iterables.filter; import static org.neo4j.helpers.collection.Iterables.filter;
import static org.neo4j.kernel.api.schema_new.SchemaDescriptorPredicates.hasLabel; import static org.neo4j.kernel.api.schema_new.SchemaDescriptorPredicates.hasLabel;
import static org.neo4j.kernel.impl.api.store.DegreeCounter.countByFirstPrevPointer; import static org.neo4j.kernel.impl.api.store.DegreeCounter.countByFirstPrevPointer;
Expand Down Expand Up @@ -411,9 +413,16 @@ public RelationshipIterator relationshipsGetAll()
return new AllRelationshipIterator( relationshipStore ); return new AllRelationshipIterator( relationshipStore );
} }


@Override
public Cursor<RelationshipItem> nodeGetRelationships( StorageStatement statement, NodeItem nodeItem,
Direction direction )
{
return nodeGetRelationships( statement, nodeItem, direction, ALWAYS_TRUE_INT );
}

@Override @Override
public Cursor<RelationshipItem> nodeGetRelationships( StorageStatement statement, NodeItem node, public Cursor<RelationshipItem> nodeGetRelationships( StorageStatement statement, NodeItem node,
Direction direction, int... relTypes ) Direction direction, IntPredicate relTypes )
{ {
return statement.acquireNodeRelationshipCursor( node.isDense(), node.id(), node.nextRelationshipId(), direction, return statement.acquireNodeRelationshipCursor( node.isDense(), node.id(), node.nextRelationshipId(), direction,
relTypes ); relTypes );
Expand Down
Expand Up @@ -142,31 +142,10 @@ public Cursor<RelationshipItem> acquireSingleRelationshipCursor( long relId )


@Override @Override
public Cursor<RelationshipItem> acquireNodeRelationshipCursor( boolean isDense, long nodeId, long relationshipId, public Cursor<RelationshipItem> acquireNodeRelationshipCursor( boolean isDense, long nodeId, long relationshipId,
Direction direction, int... relTypes ) Direction direction, IntPredicate relTypeFilter )
{ {
neoStores.assertOpen(); neoStores.assertOpen();
return nodeRelationshipCursor.get().init( isDense, relationshipId, nodeId, direction, predicate( relTypes ) ); return nodeRelationshipCursor.get().init( isDense, relationshipId, nodeId, direction, relTypeFilter );
}

private IntPredicate predicate( int[] relTypes )
{
if ( relTypes.length == 0 )
{
return Predicates.ALWAYS_TRUE_INT;
}

return type ->
{
for ( int relType : relTypes )
{
if ( type == relType )
{
return true;
}
}
return false;

};
} }


@Override @Override
Expand Down
Expand Up @@ -19,6 +19,8 @@
*/ */
package org.neo4j.storageengine.api; package org.neo4j.storageengine.api;


import java.util.function.IntPredicate;

import org.neo4j.cursor.Cursor; import org.neo4j.cursor.Cursor;
import org.neo4j.kernel.api.exceptions.index.IndexNotFoundKernelException; import org.neo4j.kernel.api.exceptions.index.IndexNotFoundKernelException;
import org.neo4j.kernel.api.schema_new.index.NewIndexDescriptor; import org.neo4j.kernel.api.schema_new.index.NewIndexDescriptor;
Expand Down Expand Up @@ -93,11 +95,11 @@ public interface StorageStatement extends AutoCloseable
* @param nodeId the id of the node where to start traversing the relationships * @param nodeId the id of the node where to start traversing the relationships
* @param relationshipId the id of the first relationship in the chain * @param relationshipId the id of the first relationship in the chain
* @param direction the direction of the relationship wrt the node * @param direction the direction of the relationship wrt the node
* @param relTypes the allowed types (it allows all types if unspecified) * @param relTypeFilter the allowed types (it allows all types if unspecified)
* @return a {@link Cursor} over {@link RelationshipItem} for traversing the relationships associated to the node. * @return a {@link Cursor} over {@link RelationshipItem} for traversing the relationships associated to the node.
*/ */
Cursor<RelationshipItem> acquireNodeRelationshipCursor( boolean isDense, long nodeId, long relationshipId, Cursor<RelationshipItem> acquireNodeRelationshipCursor( boolean isDense, long nodeId, long relationshipId,
Direction direction, int... relTypes ); Direction direction, IntPredicate relTypeFilter );


/** /**
- * Acquires {@link Cursor} capable of {@link Cursor#get() serving} {@link RelationshipItem} for selected - * Acquires {@link Cursor} capable of {@link Cursor#get() serving} {@link RelationshipItem} for selected
Expand Down
Expand Up @@ -20,6 +20,7 @@
package org.neo4j.storageengine.api; package org.neo4j.storageengine.api;


import java.util.Iterator; import java.util.Iterator;
import java.util.function.IntPredicate;


import org.neo4j.collection.primitive.PrimitiveIntIterator; import org.neo4j.collection.primitive.PrimitiveIntIterator;
import org.neo4j.collection.primitive.PrimitiveIntSet; import org.neo4j.collection.primitive.PrimitiveIntSet;
Expand Down Expand Up @@ -281,8 +282,10 @@ <EXCEPTION extends Exception> void relationshipVisit( long relationshipId,
*/ */
RelationshipIterator relationshipsGetAll(); RelationshipIterator relationshipsGetAll();


Cursor<RelationshipItem> nodeGetRelationships( StorageStatement statement, NodeItem nodeItem, Direction direction );

Cursor<RelationshipItem> nodeGetRelationships( StorageStatement statement, NodeItem nodeItem, Direction direction, Cursor<RelationshipItem> nodeGetRelationships( StorageStatement statement, NodeItem nodeItem, Direction direction,
int... typeIds ); IntPredicate typeIds );


/** /**
* Reserves a node id for future use to store a node. The reason for it being exposed here is that * Reserves a node id for future use to store a node. The reason for it being exposed here is that
Expand Down
Expand Up @@ -57,5 +57,5 @@ void visitLabelChanges( long nodeId, Set<Integer> added, Set<Integer> removed )


PrimitiveLongIterator getAddedRelationships( Direction direction ); PrimitiveLongIterator getAddedRelationships( Direction direction );


PrimitiveLongIterator getAddedRelationships( Direction direction, int[] relTypes ); PrimitiveLongIterator getAddedRelationships( Direction direction, PrimitiveIntSet relTypes );
} }
Expand Up @@ -160,10 +160,11 @@ Cursor<PropertyItem> augmentSinglePropertyCursor( Cursor<PropertyItem> cursor,


Cursor<RelationshipItem> augmentSingleRelationshipCursor( Cursor<RelationshipItem> cursor, long relationshipId ); Cursor<RelationshipItem> augmentSingleRelationshipCursor( Cursor<RelationshipItem> cursor, long relationshipId );


Cursor<RelationshipItem> augmentNodeRelationshipCursor( Cursor<RelationshipItem> cursor, Cursor<RelationshipItem> augmentNodeRelationshipCursor( Cursor<RelationshipItem> cursor, NodeState nodeState,
NodeState nodeState, Direction direction );
Direction direction,
int[] relTypes ); Cursor<RelationshipItem> augmentNodeRelationshipCursor( Cursor<RelationshipItem> cursor, NodeState nodeState,
Direction direction, PrimitiveIntSet relTypes );


Cursor<RelationshipItem> augmentRelationshipsGetAllCursor( Cursor<RelationshipItem> cursor ); Cursor<RelationshipItem> augmentRelationshipsGetAllCursor( Cursor<RelationshipItem> cursor );


Expand Down
Expand Up @@ -27,6 +27,7 @@


import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.neo4j.collection.primitive.PrimitiveIntCollections.asSet;
import static org.neo4j.kernel.impl.api.store.RelationshipIterator.EMPTY; import static org.neo4j.kernel.impl.api.store.RelationshipIterator.EMPTY;


public class RelationshipChangesForNodeTest public class RelationshipChangesForNodeTest
Expand All @@ -45,7 +46,7 @@ public void testOutgoingRelsWithTypeAndLoop() throws Exception
changes.addRelationship( REL_1, TYPE_DIR, Direction.OUTGOING ); changes.addRelationship( REL_1, TYPE_DIR, Direction.OUTGOING );


RelationshipIterator iterator = changes.augmentRelationships( RelationshipIterator iterator = changes.augmentRelationships(
Direction.OUTGOING, new int[]{TYPE_DIR}, EMPTY ); Direction.OUTGOING, asSet( new int[]{TYPE_DIR} ), EMPTY );
assertEquals( true, iterator.hasNext() ); assertEquals( true, iterator.hasNext() );
assertEquals( REL_1, iterator.next() ); assertEquals( REL_1, iterator.next() );
assertEquals( "should have no next relationships but has ", false, iterator.hasNext() ); assertEquals( "should have no next relationships but has ", false, iterator.hasNext() );
Expand All @@ -59,7 +60,7 @@ public void testIncomingRelsWithTypeAndLoop() throws Exception
changes.addRelationship( REL_1, TYPE_DIR, Direction.INCOMING ); changes.addRelationship( REL_1, TYPE_DIR, Direction.INCOMING );


RelationshipIterator iterator = changes.augmentRelationships( RelationshipIterator iterator = changes.augmentRelationships(
Direction.INCOMING, new int[]{TYPE_DIR}, EMPTY ); Direction.INCOMING, asSet( new int[]{TYPE_DIR} ), EMPTY );
assertEquals( true, iterator.hasNext() ); assertEquals( true, iterator.hasNext() );
assertEquals( REL_1, iterator.next() ); assertEquals( REL_1, iterator.next() );
assertEquals( "should have no next relationships but has ", false, iterator.hasNext() ); assertEquals( "should have no next relationships but has ", false, iterator.hasNext() );
Expand Down
Expand Up @@ -40,14 +40,14 @@
import org.neo4j.cursor.Cursor; import org.neo4j.cursor.Cursor;
import org.neo4j.helpers.collection.Iterables; import org.neo4j.helpers.collection.Iterables;
import org.neo4j.helpers.collection.Pair; import org.neo4j.helpers.collection.Pair;
import org.neo4j.kernel.api.schema.NodePropertyDescriptor;
import org.neo4j.kernel.api.schema.RelationshipPropertyDescriptor;
import org.neo4j.kernel.api.constraints.NodePropertyConstraint; import org.neo4j.kernel.api.constraints.NodePropertyConstraint;
import org.neo4j.kernel.api.constraints.RelationshipPropertyExistenceConstraint; import org.neo4j.kernel.api.constraints.RelationshipPropertyExistenceConstraint;
import org.neo4j.kernel.api.constraints.UniquenessConstraint; import org.neo4j.kernel.api.constraints.UniquenessConstraint;
import org.neo4j.kernel.api.cursor.RelationshipItemHelper; import org.neo4j.kernel.api.cursor.RelationshipItemHelper;
import org.neo4j.kernel.api.properties.DefinedProperty; import org.neo4j.kernel.api.properties.DefinedProperty;
import org.neo4j.kernel.api.properties.Property; import org.neo4j.kernel.api.properties.Property;
import org.neo4j.kernel.api.schema.NodePropertyDescriptor;
import org.neo4j.kernel.api.schema.RelationshipPropertyDescriptor;
import org.neo4j.kernel.api.schema_new.index.NewIndexDescriptor; import org.neo4j.kernel.api.schema_new.index.NewIndexDescriptor;
import org.neo4j.kernel.api.schema_new.index.NewIndexDescriptorFactory; import org.neo4j.kernel.api.schema_new.index.NewIndexDescriptorFactory;
import org.neo4j.kernel.api.txstate.TransactionState; import org.neo4j.kernel.api.txstate.TransactionState;
Expand Down Expand Up @@ -80,8 +80,8 @@
import static org.neo4j.kernel.api.properties.Property.noNodeProperty; import static org.neo4j.kernel.api.properties.Property.noNodeProperty;
import static org.neo4j.kernel.api.properties.Property.numberProperty; import static org.neo4j.kernel.api.properties.Property.numberProperty;
import static org.neo4j.kernel.api.properties.Property.stringProperty; import static org.neo4j.kernel.api.properties.Property.stringProperty;
import static org.neo4j.kernel.impl.api.state.StubCursors.cursor;
import static org.neo4j.kernel.api.schema_new.index.NewIndexDescriptor.Filter.GENERAL; import static org.neo4j.kernel.api.schema_new.index.NewIndexDescriptor.Filter.GENERAL;
import static org.neo4j.kernel.impl.api.state.StubCursors.cursor;


public class TxStateTest public class TxStateTest
{ {
Expand Down Expand Up @@ -1459,9 +1459,10 @@ public void shouldObserveCorrectAugmentedNodeRelationshipsState() throws Excepti
int[] relationshipTypes = randomTypes( relationshipTypeCount, random.random() ); int[] relationshipTypes = randomTypes( relationshipTypeCount, random.random() );
Cursor<RelationshipItem> committed = cursor( Cursor<RelationshipItem> committed = cursor(
relationshipsForNode( i, committedRelationships, direction, relationshipTypes ).values() ); relationshipsForNode( i, committedRelationships, direction, relationshipTypes ).values() );
Cursor<RelationshipItem> augmented = Cursor<RelationshipItem> augmented = relationshipTypes == null
state.augmentNodeRelationshipCursor( committed, state.getNodeState( i ), direction, ? state.augmentNodeRelationshipCursor( committed, state.getNodeState( i ), direction )
relationshipTypes ); : state.augmentNodeRelationshipCursor( committed, state.getNodeState( i ), direction,
PrimitiveIntCollections.asSet( relationshipTypes ) );


Map<Long,RelationshipItem> expectedRelationships = Map<Long,RelationshipItem> expectedRelationships =
relationshipsForNode( i, allRelationships, direction, relationshipTypes ); relationshipsForNode( i, allRelationships, direction, relationshipTypes );
Expand Down

0 comments on commit 37857fe

Please sign in to comment.