From 8d5e4d9e5b1692c6eae350587bd1de421a8e1568 Mon Sep 17 00:00:00 2001 From: Pontus Melke Date: Mon, 23 Apr 2018 14:49:17 +0200 Subject: [PATCH] Add tests for hasLabel --- .../internal/kernel/api/NodeCursorTestBase.java | 13 +++++++++++++ .../kernel/api/NodeTransactionStateTestBase.java | 6 ++++++ .../neo4j/kernel/impl/newapi/DefaultNodeCursor.java | 9 ++++++++- .../java/org/neo4j/kernel/impl/newapi/Labels.java | 1 + 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/NodeCursorTestBase.java b/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/NodeCursorTestBase.java index ff33104f6112a..e8c384f72ed14 100644 --- a/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/NodeCursorTestBase.java +++ b/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/NodeCursorTestBase.java @@ -141,6 +141,7 @@ public void shouldReadLabels() labels = nodes.labels(); assertEquals( "number of labels", 1, labels.numberOfLabels() ); int fooLabel = labels.label( 0 ); + assertTrue( nodes.hasLabel( fooLabel ) ); assertFalse( "should only access a single node", nodes.next() ); // when @@ -151,6 +152,8 @@ public void shouldReadLabels() labels = nodes.labels(); assertEquals( "number of labels", 1, labels.numberOfLabels() ); int barLabel = labels.label( 0 ); + assertFalse( nodes.hasLabel( fooLabel ) ); + assertTrue( nodes.hasLabel( barLabel ) ); assertFalse( "should only access a single node", nodes.next() ); // when @@ -161,6 +164,9 @@ public void shouldReadLabels() labels = nodes.labels(); assertEquals( "number of labels", 1, labels.numberOfLabels() ); int bazLabel = labels.label( 0 ); + assertFalse( nodes.hasLabel( fooLabel ) ); + assertFalse( nodes.hasLabel( barLabel ) ); + assertTrue( nodes.hasLabel( bazLabel ) ); assertFalse( "should only access a single node", nodes.next() ); assertNotEquals( "distinct labels", fooLabel, barLabel ); @@ -183,6 +189,10 @@ public void shouldReadLabels() assertEquals( bazLabel, labels.label( 0 ) ); assertEquals( barLabel, labels.label( 1 ) ); } + assertFalse( nodes.hasLabel( fooLabel ) ); + assertTrue( nodes.hasLabel( barLabel ) ); + assertTrue( nodes.hasLabel( barLabel ) ); + assertFalse( "should only access a single node", nodes.next() ); // when @@ -192,6 +202,9 @@ public void shouldReadLabels() assertTrue( "should access defined node", nodes.next() ); labels = nodes.labels(); assertEquals( "number of labels", 0, labels.numberOfLabels() ); + assertFalse( nodes.hasLabel( fooLabel ) ); + assertFalse( nodes.hasLabel( barLabel ) ); + assertFalse( nodes.hasLabel( barLabel ) ); assertFalse( "should only access a single node", nodes.next() ); } } diff --git a/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/NodeTransactionStateTestBase.java b/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/NodeTransactionStateTestBase.java index c0c6f7a071d13..8146caed7650d 100644 --- a/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/NodeTransactionStateTestBase.java +++ b/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/NodeTransactionStateTestBase.java @@ -83,6 +83,8 @@ public void shouldSeeNewLabeledNodeInTransaction() throws Exception LabelSet labels = node.labels(); assertEquals( 1, labels.numberOfLabels() ); assertEquals( labelId, labels.label( 0 ) ); + assertTrue( node.hasLabel( labelId ) ); + assertFalse( node.hasLabel( labelId + 1 ) ); assertFalse( "should only find one node", node.next() ); } tx.success(); @@ -139,6 +141,10 @@ public void shouldSeeLabelChangesInTransaction() throws Exception assertTrue( "should access node", node.next() ); assertLabels( node.labels(), toRetain, toAdd ); + assertTrue( node.hasLabel( toAdd ) ); + assertTrue( node.hasLabel( toRetain ) ); + assertFalse( node.hasLabel( toDelete ) ); + assertFalse( node.hasLabel( toRegret ) ); assertFalse( "should only find one node", node.next() ); } tx.success(); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultNodeCursor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultNodeCursor.java index 6f03b75da39d7..afea65c3ecca7 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultNodeCursor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultNodeCursor.java @@ -35,6 +35,7 @@ import org.neo4j.kernel.impl.store.RecordCursor; import org.neo4j.kernel.impl.store.record.DynamicRecord; import org.neo4j.kernel.impl.store.record.NodeRecord; +import org.neo4j.storageengine.api.txstate.ReadableDiffSets; import static java.util.Collections.emptySet; @@ -135,10 +136,15 @@ public boolean hasLabel( int label ) if ( hasChanges() ) { TransactionState txState = read.txState(); - if ( txState.nodeStateLabelDiffSets( getId() ).getAdded().contains( label ) ) + ReadableDiffSets diffSets = txState.nodeStateLabelDiffSets( getId() ); + if ( diffSets.getAdded().contains( label ) ) { return true; } + if ( diffSets.getRemoved().contains( label ) ) + { + return false; + } } //Get labels from store and put in intSet, unfortunately we get longs back @@ -147,6 +153,7 @@ public boolean hasLabel( int label ) { if ( labelToken == label ) { + assert (int) labelToken == labelToken : "value too big to be represented as and int"; return true; } } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Labels.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Labels.java index 1572f2d51191b..26a2b8638971b 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Labels.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Labels.java @@ -83,6 +83,7 @@ public boolean contains( int labelToken ) //label sizes (≤100 labels) for ( long label : labels ) { + assert (int) label == label : "value too big to be represented as and int"; if ( label == labelToken ) { return true;