diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/ConstraintEnforcingEntityOperations.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/ConstraintEnforcingEntityOperations.java index f11dbe5c08f8c..37f041f45c415 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/ConstraintEnforcingEntityOperations.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/ConstraintEnforcingEntityOperations.java @@ -444,7 +444,7 @@ public Cursor nodeGetRelationships( KernelStatement statement, @Override public Cursor nodeGetRelationships( KernelStatement statement, NodeItem node, Direction direction, - int... relTypes ) + PrimitiveIntSet relTypes ) { return entityReadOperations.nodeGetRelationships( statement, node, direction, relTypes ); } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/GuardingStatementOperations.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/GuardingStatementOperations.java index 908419037d5fb..281cbab046d8f 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/GuardingStatementOperations.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/GuardingStatementOperations.java @@ -328,7 +328,7 @@ public Cursor nodeGetRelationships( KernelStatement statement, @Override public Cursor nodeGetRelationships( KernelStatement statement, NodeItem node, Direction direction, - int... relTypes ) + PrimitiveIntSet relTypes ) { guard.check( statement ); return entityReadDelegate.nodeGetRelationships( statement, node, direction, relTypes ); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/OperationsFacade.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/OperationsFacade.java index ac11651597812..6b58d46678651 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/OperationsFacade.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/OperationsFacade.java @@ -112,6 +112,7 @@ import org.neo4j.storageengine.api.schema.SchemaRule; import static java.lang.String.format; +import static org.neo4j.collection.primitive.PrimitiveIntCollections.asSet; import static org.neo4j.collection.primitive.PrimitiveIntCollections.deduplicate; public class OperationsFacade @@ -371,7 +372,8 @@ public RelationshipIterator nodeGetRelationships( long nodeId, Direction directi try ( Cursor node = dataRead().nodeCursorById( statement, nodeId ) ) { return new CursorRelationshipIterator( dataRead() - .nodeGetRelationships( statement, node.get(), direction( direction ), deduplicate( relTypes ) ) ); + .nodeGetRelationships( statement, node.get(), direction( direction ), + asSet( relTypes, t -> t >= 0 ) ) ); } } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/StateHandlingStatementOperations.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/StateHandlingStatementOperations.java index c21dbe6266e1d..e58a063ff4100 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/StateHandlingStatementOperations.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/StateHandlingStatementOperations.java @@ -220,12 +220,12 @@ public Cursor nodeGetRelationships( KernelStatement statement, return cursor; } NodeState nodeState = statement.txState().getNodeState( node.id() ); - return statement.txState().augmentNodeRelationshipCursor( cursor, nodeState, direction, null ); + return statement.txState().augmentNodeRelationshipCursor( cursor, nodeState, direction ); } @Override public Cursor nodeGetRelationships( KernelStatement statement, NodeItem node, Direction direction, - int... relTypes ) + PrimitiveIntSet relTypes ) { Cursor cursor; if ( statement.hasTxStateWithChanges() && statement.txState().nodeIsAddedInThisTx( node.id() ) ) @@ -1721,7 +1721,7 @@ private int computeDegree( KernelStatement statement, NodeItem node, Direction { return count( relType == null ? storeLayer.nodeGetRelationships( storeStatement, node, direction ) - : storeLayer.nodeGetRelationships( storeStatement, node, direction, relType ) ); + : storeLayer.nodeGetRelationships( storeStatement, node, direction, (t) -> t == relType ) ); } } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/operations/EntityReadOperations.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/operations/EntityReadOperations.java index c2ad2fe26f390..a28d550e05c68 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/operations/EntityReadOperations.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/operations/EntityReadOperations.java @@ -147,7 +147,7 @@ Cursor relationshipCursorById( KernelStatement statement, long Cursor nodeGetRelationships( KernelStatement statement, NodeItem node, Direction direction ); Cursor nodeGetRelationships( KernelStatement statement, NodeItem node, Direction direction, - int... relTypes ); + PrimitiveIntSet relTypes ); long nodesGetCount( KernelStatement statement ); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/NodeStateImpl.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/NodeStateImpl.java index 3e3894632b2cc..4faec96befdb4 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/NodeStateImpl.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/NodeStateImpl.java @@ -225,7 +225,7 @@ public PrimitiveLongIterator getAddedRelationships( Direction direction ) } @Override - public PrimitiveLongIterator getAddedRelationships( Direction direction, int[] relTypes ) + public PrimitiveLongIterator getAddedRelationships( Direction direction, PrimitiveIntSet relTypes ) { return relationshipsAdded != null ? relationshipsAdded.getRelationships( direction, relTypes ) : PrimitiveLongCollections.emptyIterator(); @@ -348,7 +348,7 @@ public PrimitiveLongIterator getAddedRelationships( Direction direction ) } @Override - public PrimitiveLongIterator getAddedRelationships( Direction direction, int[] relTypes ) + public PrimitiveLongIterator getAddedRelationships( Direction direction, PrimitiveIntSet relTypes ) { return null; } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/RelationshipChangesForNode.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/RelationshipChangesForNode.java index 37a28e397be02..30dc65e22693e 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/RelationshipChangesForNode.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/RelationshipChangesForNode.java @@ -258,7 +258,7 @@ public RelationshipIterator augmentRelationships( Direction direction, Relations 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 ) ); } @@ -441,11 +441,11 @@ private Map> getTypeToRelMapForDirection( Direction direction return relTypeToRelsMap; } - private Function>, Iterator>> typeFilter( final int[] types ) + private Function>, Iterator>> typeFilter( PrimitiveIntSet types ) { return relationshipsByType -> new PrefetchingIterator>() { - private final PrimitiveIntIterator iterTypes = iterator( types ); + private final PrimitiveIntIterator iterTypes = types.iterator(); @Override protected Set fetchNextOrNull() @@ -490,7 +490,7 @@ public PrimitiveLongIterator getRelationships( Direction direction ) return getRelationships( direction, ALL_TYPES ); } - public PrimitiveLongIterator getRelationships( Direction direction, int[] types ) + public PrimitiveLongIterator getRelationships( Direction direction, PrimitiveIntSet types ) { return getRelationships( direction, typeFilter( types ) ); } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/TxState.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/TxState.java index d268b70a32845..2e32b5787b1f8 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/TxState.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/TxState.java @@ -801,22 +801,24 @@ public Cursor augmentSingleRelationshipCursor( Cursor augmentNodeRelationshipCursor( Cursor cursor, + NodeState nodeState, + Direction direction ) + { + return nodeState.hasChanges() + ? iteratorRelationshipCursor.get().init( cursor, nodeState.getAddedRelationships( direction ) ) + : cursor; + } @Override public Cursor augmentNodeRelationshipCursor( Cursor cursor, NodeState nodeState, Direction direction, - int[] relTypes ) + PrimitiveIntSet relTypes ) { - if ( nodeState.hasChanges() ) - { - if ( relTypes == null ) - { - return iteratorRelationshipCursor.get().init( cursor, nodeState.getAddedRelationships( direction ) ); - } - return iteratorRelationshipCursor.get().init( cursor, - nodeState.getAddedRelationships( direction, relTypes ) ); - } - return cursor; + return nodeState.hasChanges() + ? iteratorRelationshipCursor.get().init( cursor, nodeState.getAddedRelationships( direction, relTypes ) ) + : cursor; } @Override diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/store/StorageLayer.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/store/StorageLayer.java index fc0ec4662b21a..6917852499e56 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/store/StorageLayer.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/store/StorageLayer.java @@ -20,6 +20,7 @@ package org.neo4j.kernel.impl.api.store; import java.util.Iterator; +import java.util.function.IntPredicate; import java.util.function.Predicate; import java.util.function.Supplier; @@ -81,6 +82,7 @@ import org.neo4j.storageengine.api.schema.SchemaRule; 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.kernel.api.schema_new.SchemaDescriptorPredicates.hasLabel; import static org.neo4j.kernel.impl.api.store.DegreeCounter.countByFirstPrevPointer; @@ -411,9 +413,16 @@ public RelationshipIterator relationshipsGetAll() return new AllRelationshipIterator( relationshipStore ); } + @Override + public Cursor nodeGetRelationships( StorageStatement statement, NodeItem nodeItem, + Direction direction ) + { + return nodeGetRelationships( statement, nodeItem, direction, ALWAYS_TRUE_INT ); + } + @Override public Cursor nodeGetRelationships( StorageStatement statement, NodeItem node, - Direction direction, int... relTypes ) + Direction direction, IntPredicate relTypes ) { return statement.acquireNodeRelationshipCursor( node.isDense(), node.id(), node.nextRelationshipId(), direction, relTypes ); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/store/StoreStatement.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/store/StoreStatement.java index 4a3d122800ca1..da8279ce08f57 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/store/StoreStatement.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/store/StoreStatement.java @@ -142,31 +142,10 @@ public Cursor acquireSingleRelationshipCursor( long relId ) @Override public Cursor acquireNodeRelationshipCursor( boolean isDense, long nodeId, long relationshipId, - Direction direction, int... relTypes ) + Direction direction, IntPredicate relTypeFilter ) { neoStores.assertOpen(); - return nodeRelationshipCursor.get().init( isDense, relationshipId, nodeId, direction, predicate( relTypes ) ); - } - - 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; - - }; + return nodeRelationshipCursor.get().init( isDense, relationshipId, nodeId, direction, relTypeFilter ); } @Override diff --git a/community/kernel/src/main/java/org/neo4j/storageengine/api/StorageStatement.java b/community/kernel/src/main/java/org/neo4j/storageengine/api/StorageStatement.java index 82b5cc0d14165..8485f1610b718 100644 --- a/community/kernel/src/main/java/org/neo4j/storageengine/api/StorageStatement.java +++ b/community/kernel/src/main/java/org/neo4j/storageengine/api/StorageStatement.java @@ -19,6 +19,8 @@ */ package org.neo4j.storageengine.api; +import java.util.function.IntPredicate; + import org.neo4j.cursor.Cursor; import org.neo4j.kernel.api.exceptions.index.IndexNotFoundKernelException; import org.neo4j.kernel.api.schema_new.index.NewIndexDescriptor; @@ -93,11 +95,11 @@ public interface StorageStatement extends AutoCloseable * @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 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. */ Cursor 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 diff --git a/community/kernel/src/main/java/org/neo4j/storageengine/api/StoreReadLayer.java b/community/kernel/src/main/java/org/neo4j/storageengine/api/StoreReadLayer.java index c133ebd5f01c8..d4c747b385ecb 100644 --- a/community/kernel/src/main/java/org/neo4j/storageengine/api/StoreReadLayer.java +++ b/community/kernel/src/main/java/org/neo4j/storageengine/api/StoreReadLayer.java @@ -20,6 +20,7 @@ package org.neo4j.storageengine.api; import java.util.Iterator; +import java.util.function.IntPredicate; import org.neo4j.collection.primitive.PrimitiveIntIterator; import org.neo4j.collection.primitive.PrimitiveIntSet; @@ -281,8 +282,10 @@ void relationshipVisit( long relationshipId, */ RelationshipIterator relationshipsGetAll(); + Cursor nodeGetRelationships( StorageStatement statement, NodeItem nodeItem, Direction direction ); + Cursor 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 diff --git a/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/NodeState.java b/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/NodeState.java index 8f3f98613c6d0..de9ed30f677fb 100644 --- a/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/NodeState.java +++ b/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/NodeState.java @@ -57,5 +57,5 @@ void visitLabelChanges( long nodeId, Set added, Set removed ) PrimitiveLongIterator getAddedRelationships( Direction direction ); - PrimitiveLongIterator getAddedRelationships( Direction direction, int[] relTypes ); + PrimitiveLongIterator getAddedRelationships( Direction direction, PrimitiveIntSet relTypes ); } diff --git a/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/ReadableTransactionState.java b/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/ReadableTransactionState.java index ceec154c55144..10134276ce025 100644 --- a/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/ReadableTransactionState.java +++ b/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/ReadableTransactionState.java @@ -160,10 +160,11 @@ Cursor augmentSinglePropertyCursor( Cursor cursor, Cursor augmentSingleRelationshipCursor( Cursor cursor, long relationshipId ); - Cursor augmentNodeRelationshipCursor( Cursor cursor, - NodeState nodeState, - Direction direction, - int[] relTypes ); + Cursor augmentNodeRelationshipCursor( Cursor cursor, NodeState nodeState, + Direction direction ); + + Cursor augmentNodeRelationshipCursor( Cursor cursor, NodeState nodeState, + Direction direction, PrimitiveIntSet relTypes ); Cursor augmentRelationshipsGetAllCursor( Cursor cursor ); diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/state/RelationshipChangesForNodeTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/state/RelationshipChangesForNodeTest.java index e05b6f25d0ee9..475ef27d9eba4 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/state/RelationshipChangesForNodeTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/state/RelationshipChangesForNodeTest.java @@ -27,6 +27,7 @@ import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; +import static org.neo4j.collection.primitive.PrimitiveIntCollections.asSet; import static org.neo4j.kernel.impl.api.store.RelationshipIterator.EMPTY; public class RelationshipChangesForNodeTest @@ -45,7 +46,7 @@ public void testOutgoingRelsWithTypeAndLoop() throws Exception changes.addRelationship( REL_1, TYPE_DIR, Direction.OUTGOING ); RelationshipIterator iterator = changes.augmentRelationships( - Direction.OUTGOING, new int[]{TYPE_DIR}, EMPTY ); + Direction.OUTGOING, asSet( new int[]{TYPE_DIR} ), EMPTY ); assertEquals( true, iterator.hasNext() ); assertEquals( REL_1, iterator.next() ); assertEquals( "should have no next relationships but has ", false, iterator.hasNext() ); @@ -59,7 +60,7 @@ public void testIncomingRelsWithTypeAndLoop() throws Exception changes.addRelationship( REL_1, TYPE_DIR, Direction.INCOMING ); RelationshipIterator iterator = changes.augmentRelationships( - Direction.INCOMING, new int[]{TYPE_DIR}, EMPTY ); + Direction.INCOMING, asSet( new int[]{TYPE_DIR} ), EMPTY ); assertEquals( true, iterator.hasNext() ); assertEquals( REL_1, iterator.next() ); assertEquals( "should have no next relationships but has ", false, iterator.hasNext() ); diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/state/TxStateTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/state/TxStateTest.java index 8ded485a1bf44..ad429a95043ad 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/state/TxStateTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/state/TxStateTest.java @@ -40,14 +40,14 @@ import org.neo4j.cursor.Cursor; import org.neo4j.helpers.collection.Iterables; 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.RelationshipPropertyExistenceConstraint; import org.neo4j.kernel.api.constraints.UniquenessConstraint; import org.neo4j.kernel.api.cursor.RelationshipItemHelper; import org.neo4j.kernel.api.properties.DefinedProperty; 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.NewIndexDescriptorFactory; import org.neo4j.kernel.api.txstate.TransactionState; @@ -80,8 +80,8 @@ 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.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.impl.api.state.StubCursors.cursor; public class TxStateTest { @@ -1459,9 +1459,10 @@ public void shouldObserveCorrectAugmentedNodeRelationshipsState() throws Excepti int[] relationshipTypes = randomTypes( relationshipTypeCount, random.random() ); Cursor committed = cursor( relationshipsForNode( i, committedRelationships, direction, relationshipTypes ).values() ); - Cursor augmented = - state.augmentNodeRelationshipCursor( committed, state.getNodeState( i ), direction, - relationshipTypes ); + Cursor augmented = relationshipTypes == null + ? state.augmentNodeRelationshipCursor( committed, state.getNodeState( i ), direction ) + : state.augmentNodeRelationshipCursor( committed, state.getNodeState( i ), direction, + PrimitiveIntCollections.asSet( relationshipTypes ) ); Map expectedRelationships = relationshipsForNode( i, allRelationships, direction, relationshipTypes ); diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/NeoStoresTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/NeoStoresTest.java index 4582c5b77e53b..e002c0db4944f 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/NeoStoresTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/NeoStoresTest.java @@ -37,6 +37,7 @@ import java.util.concurrent.atomic.AtomicReference; import org.neo4j.cursor.Cursor; +import org.neo4j.function.Predicates; import org.neo4j.graphdb.GraphDatabaseService; import org.neo4j.graphdb.Node; import org.neo4j.graphdb.Relationship; @@ -99,6 +100,7 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import static org.neo4j.function.Predicates.ALWAYS_TRUE_INT; import static org.neo4j.graphdb.factory.GraphDatabaseSettings.counts_store_rotation_timeout; import static org.neo4j.helpers.collection.MapUtil.stringMap; import static org.neo4j.kernel.api.security.SecurityContext.AUTH_DISABLED; @@ -106,6 +108,7 @@ import static org.neo4j.kernel.impl.store.format.standard.MetaDataRecordFormat.FIELD_NOT_PRESENT; import static org.neo4j.kernel.impl.store.record.RecordLoad.NORMAL; import static org.neo4j.kernel.impl.transaction.log.TransactionIdStore.BASE_TX_COMMIT_TIMESTAMP; +import static org.neo4j.storageengine.api.Direction.BOTH; public class NeoStoresTest { @@ -955,7 +958,7 @@ private int validateAndCountRelationships( long node, long rel1, long rel2, int NodeItem nodeItem = nodeCursor.get(); try ( Cursor relationships = statement.getStoreStatement().acquireNodeRelationshipCursor( - nodeItem.isDense(), nodeItem.id(), nodeItem.nextRelationshipId(), Direction.BOTH ) ) + nodeItem.isDense(), nodeItem.id(), nodeItem.nextRelationshipId(), BOTH, ALWAYS_TRUE_INT ) ) { while ( relationships.next() ) { @@ -1038,7 +1041,7 @@ else if ( data.propertyKeyId() == prop3.propertyKeyId() ) nodeCursor.next(); NodeItem nodeItem = nodeCursor.get(); try ( Cursor relationships = statement.getStoreStatement().acquireNodeRelationshipCursor( - nodeItem.isDense(), nodeItem.id(), nodeItem.nextRelationshipId(), Direction.BOTH ) ) + nodeItem.isDense(), nodeItem.id(), nodeItem.nextRelationshipId(), BOTH, ALWAYS_TRUE_INT ) ) { while ( relationships.next() ) { @@ -1336,7 +1339,7 @@ private void assertHasRelationships( long node ) nodeCursor.next(); NodeItem nodeItem = nodeCursor.get(); try ( Cursor relationships = statement.getStoreStatement().acquireNodeRelationshipCursor( - nodeItem.isDense(), nodeItem.id(), nodeItem.nextRelationshipId(), Direction.BOTH ) ) + nodeItem.isDense(), nodeItem.id(), nodeItem.nextRelationshipId(), BOTH, ALWAYS_TRUE_INT ) ) { assertTrue( relationships.next() ); } @@ -1460,7 +1463,7 @@ private void deleteRelationships( long nodeId ) throws Exception NodeItem nodeItem = nodeCursor.get(); statement.getStoreStatement() .acquireNodeRelationshipCursor( nodeItem.isDense(), nodeItem.id(), nodeItem.nextRelationshipId(), - Direction.BOTH ).forAll( rel -> relDelete( rel.id() ) ); + BOTH, ALWAYS_TRUE_INT ).forAll( rel -> relDelete( rel.id() ) ); } } diff --git a/community/primitive-collections/src/main/java/org/neo4j/collection/primitive/PrimitiveIntCollections.java b/community/primitive-collections/src/main/java/org/neo4j/collection/primitive/PrimitiveIntCollections.java index db851d9ddd816..e151f21f79402 100644 --- a/community/primitive-collections/src/main/java/org/neo4j/collection/primitive/PrimitiveIntCollections.java +++ b/community/primitive-collections/src/main/java/org/neo4j/collection/primitive/PrimitiveIntCollections.java @@ -20,7 +20,6 @@ package org.neo4j.collection.primitive; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; @@ -33,6 +32,7 @@ import java.util.function.LongToIntFunction; import org.neo4j.collection.primitive.base.Empty; +import org.neo4j.function.Predicates; import static java.util.Arrays.copyOf; import static org.neo4j.collection.primitive.PrimitiveCommons.closeSafely; @@ -763,11 +763,19 @@ protected boolean fetchNext() } public static PrimitiveIntSet asSet( int[] values ) + { + return asSet( values, Predicates.ALWAYS_TRUE_INT ); + } + + public static PrimitiveIntSet asSet( int[] values, IntPredicate filter ) { PrimitiveIntSet set = Primitive.intSet( values.length ); for ( int value : values ) { - set.add( value ); + if ( filter.test( value ) ) + { + set.add( value ); + } } return set; } @@ -840,33 +848,4 @@ private static > void addUnique( C collection, T item throw new IllegalStateException( "Encountered an already added item:" + item + " when adding items uniquely to a collection:" + collection ); } - } - - /** - * Deduplicates values in the sorted {@code values} array. - * - * @param values sorted array of int values. - * @return the provided array if no duplicates were found, otherwise a new shorter array w/o duplicates. - */ - public static int[] deduplicate( int[] values ) - { - int unique = 0; - for ( int i = 0; i < values.length; i++ ) - { - int value = values[i]; - for ( int j = 0; j < unique; j++ ) - { - if ( value == values[j] ) - { - value = -1; // signal that this value is not unique - break; // we will not find more than one conflict - } - } - if ( value != -1 ) - { // this has to be done outside the inner loop, otherwise we'd never accept a single one... - values[unique++] = values[i]; - } - } - return unique < values.length ? Arrays.copyOf( values, unique ) : values; - } -} + }} diff --git a/community/primitive-collections/src/test/java/org/neo4j/collection/primitive/PrimitiveIntCollectionsTest.java b/community/primitive-collections/src/test/java/org/neo4j/collection/primitive/PrimitiveIntCollectionsTest.java index e6d005caffe91..ef203c02adeb7 100644 --- a/community/primitive-collections/src/test/java/org/neo4j/collection/primitive/PrimitiveIntCollectionsTest.java +++ b/community/primitive-collections/src/test/java/org/neo4j/collection/primitive/PrimitiveIntCollectionsTest.java @@ -530,19 +530,6 @@ public void asArray() throws Exception assertTrue( Arrays.equals( new int[] { 1, 2, 3 }, array ) ); } - @Test - public void shouldDeduplicate() throws Exception - { - // GIVEN - int[] array = new int[] {1, 1, 2, 5, 6, 6}; - - // WHEN - int[] deduped = PrimitiveIntCollections.deduplicate( array ); - - // THEN - assertArrayEquals( new int[] {1, 2, 5, 6}, deduped ); - } - @Test public void shouldNotContinueToCallNextOnHasNextFalse() throws Exception {