private boolean nodeHasLabel( long node, int labelId ) { NodeRecord record = getNodeRecord( node ).forReadingData(); for ( long label : parseLabelsField( record ).get( nodeStore ) ) { if ( label == labelId ) { return true; } } return false; }
private void setNodeLabels( NodeRecord nodeRecord, Label... labels ) { NodeLabels nodeLabels = parseLabelsField( nodeRecord ); nodeLabels.put( getOrCreateLabelIds( labels ), nodeStore, nodeStore.getDynamicLabelStore() ); labelsTouched = true; }
void removeLabelFromNode( long labelId, long nodeId ) { NodeRecord nodeRecord = recordChangeSet.getNodeRecords().getOrLoad( nodeId, null ).forChangingData(); parseLabelsField( nodeRecord ).remove( labelId, nodeStore ); }
private Set<Integer> labels( NodeRecord record ) { long[] rawLabels = parseLabelsField( record ).get( nodeStore ); Set<Integer> labels = new HashSet<>( rawLabels.length ); for ( long label : rawLabels ) { labels.add( safeCastLongToInt( label ) ); } return labels; } }
void addLabelToNode( long labelId, long nodeId ) { NodeRecord nodeRecord = recordChangeSet.getNodeRecords().getOrLoad( nodeId, null ).forChangingData(); parseLabelsField( nodeRecord ).add( labelId, nodeStore, nodeStore.getDynamicLabelStore() ); }
@Override public Iterable<Label> getNodeLabels( final long node ) { return () -> { NodeRecord record = getNodeRecord( node ).forReadingData(); long[] labels = parseLabelsField( record ).get( nodeStore ); return map( labelIdToLabelFunction, PrimitiveLongCollections.iterator( labels ) ); }; }
private void updateCounts( NodeRecord node, int delta ) { writer.incrementNodeCount( StatementConstants.ANY_LABEL, delta ); for ( long label : NodeLabelsField.parseLabelsField( node ).get( nodes ) ) { writer.incrementNodeCount( (int)label, delta ); } }
@Override protected void transactionData( GraphStoreFixture.TransactionDataBuilder tx, GraphStoreFixture.IdGenerator next ) { NodeRecord nodeRecord = new NodeRecord( next.node(), false, -1, -1 ); NodeLabelsField.parseLabelsField( nodeRecord ).add( 10, null, null ); tx.create( nodeRecord ); } } );
@Test public void oneDynamicRecordShouldExtendIntoAnAdditionalIfTooManyLabels() { // GIVEN // will occupy 60B of data, i.e. one dynamic record NodeRecord node = nodeRecordWithDynamicLabels( nodeStore, oneByteLongs( 56 ) ); Collection<DynamicRecord> initialRecords = node.getDynamicLabelRecords(); NodeLabels nodeLabels = NodeLabelsField.parseLabelsField( node ); // WHEN Set<DynamicRecord> changedDynamicRecords = Iterables.asSet( nodeLabels.add( 1, nodeStore, nodeStore.getDynamicLabelStore() ) ); // THEN assertTrue( changedDynamicRecords.containsAll( initialRecords ) ); assertEquals( initialRecords.size() + 1, changedDynamicRecords.size() ); }
@Test public void shouldReallocateSomeOfPreviousDynamicRecords() { // GIVEN NodeRecord node = nodeRecordWithDynamicLabels( nodeStore, oneByteLongs( 5 ) ); Set<DynamicRecord> initialRecords = Iterables.asUniqueSet( node.getDynamicLabelRecords() ); NodeLabels nodeLabels = NodeLabelsField.parseLabelsField( node ); // WHEN Set<DynamicRecord> reallocatedRecords = Iterables.asUniqueSet( nodeLabels.put( fourByteLongs( 100 ), nodeStore, nodeStore.getDynamicLabelStore() ) ); // THEN assertTrue( reallocatedRecords.containsAll( initialRecords ) ); assertTrue( reallocatedRecords.size() > initialRecords.size() ); }
@Test public void shouldInlineOneLabelWithHighId() { // GIVEN long labelId = 10000; NodeRecord node = nodeRecordWithInlinedLabels(); NodeLabels nodeLabels = NodeLabelsField.parseLabelsField( node ); // WHEN nodeLabels.add( labelId, null, null ); // THEN assertEquals( inlinedLabelsLongRepresentation( labelId ), node.getLabelField() ); }
@Test public void shouldInlineOneLabel() { // GIVEN long labelId = 10; NodeRecord node = nodeRecordWithInlinedLabels(); NodeLabels nodeLabels = NodeLabelsField.parseLabelsField( node ); // WHEN nodeLabels.add( labelId, null, null ); // THEN assertEquals( inlinedLabelsLongRepresentation( labelId ), node.getLabelField() ); }
@Test public void shouldInlineThreeSmallLabels() { // GIVEN long labelId1 = 10; long labelId2 = 30; long labelId3 = 4095; NodeRecord node = nodeRecordWithInlinedLabels( labelId1, labelId2 ); NodeLabels nodeLabels = NodeLabelsField.parseLabelsField( node ); // WHEN nodeLabels.add( labelId3, null, null ); // THEN assertEquals( inlinedLabelsLongRepresentation( labelId1, labelId2, labelId3 ), node.getLabelField() ); }
@Test public void shouldInlineTwoSmallLabels() { // GIVEN long labelId1 = 10; long labelId2 = 30; NodeRecord node = nodeRecordWithInlinedLabels( labelId1 ); NodeLabels nodeLabels = NodeLabelsField.parseLabelsField( node ); // WHEN nodeLabels.add( labelId2, null, null ); // THEN assertEquals( inlinedLabelsLongRepresentation( labelId1, labelId2 ), node.getLabelField() ); }
private NodeCommand node( long nodeId ) { NodeRecord after = new NodeRecord( nodeId, true, false, NO_NEXT_RELATIONSHIP.intValue(),NO_NEXT_PROPERTY.intValue(), 0 ); NodeLabelsField.parseLabelsField( after ).add( 1, null, null ); return new NodeCommand( new NodeRecord( nodeId ), after ); }
@Test public void maximumOfSevenInlinedLabels() { // GIVEN long[] labels = new long[] {0, 1, 2, 3, 4, 5, 6}; NodeRecord node = nodeRecordWithInlinedLabels( labels ); NodeLabels nodeLabels = NodeLabelsField.parseLabelsField( node ); // WHEN Iterable<DynamicRecord> changedDynamicRecords = nodeLabels.add( 23, nodeStore, nodeStore.getDynamicLabelStore() ); // THEN assertEquals( dynamicLabelsLongRepresentation( changedDynamicRecords ), node.getLabelField() ); assertEquals( 1, Iterables.count( changedDynamicRecords ) ); }
@Test public void shouldSerializeInlineLabels() throws Exception { // Given NodeRecord before = new NodeRecord( 12, false, 1, 2 ); before.setInUse( true ); NodeRecord after = new NodeRecord( 12, false, 2, 1 ); after.setInUse( true ); NodeLabels nodeLabels = parseLabelsField( after ); nodeLabels.add( 1337, nodeStore, nodeStore.getDynamicLabelStore() ); // When assertSerializationWorksFor( new Command.NodeCommand( before, after ) ); }
@Test public void shouldSerializeDynamicRecordLabels() throws Exception { // Given NodeRecord before = new NodeRecord( 12, false, 1, 2 ); before.setInUse( true ); NodeRecord after = new NodeRecord( 12, false, 2, 1 ); after.setInUse( true ); NodeLabels nodeLabels = parseLabelsField( after ); for ( int i = 10; i < 100; i++ ) { nodeLabels.add( i, nodeStore, nodeStore.getDynamicLabelStore() ); } // When assertSerializationWorksFor( new Command.NodeCommand( before, after ) ); }
@Test public void shouldNotCreateSameLabelTwiceOnSameNode() { // GIVEN BatchInserter inserter = globalInserter; // WHEN long nodeId = inserter.createNode( map( "itemId", 1000L ), label( "Item" ), label( "Item" ) ); // THEN NodeStore nodeStore = getFlushedNeoStores( inserter ).getNodeStore(); NodeRecord node = nodeStore.getRecord( nodeId, nodeStore.newRecord(), NORMAL ); NodeLabels labels = NodeLabelsField.parseLabelsField( node ); long[] labelIds = labels.get( nodeStore ); assertEquals( 1, labelIds.length ); }
@Test public void oneDynamicRecordShouldShrinkIntoInlinedWhenRemoving() { // GIVEN NodeRecord node = nodeRecordWithDynamicLabels( nodeStore, oneByteLongs( 5 ) ); Collection<DynamicRecord> initialRecords = node.getDynamicLabelRecords(); NodeLabels nodeLabels = NodeLabelsField.parseLabelsField( node ); // WHEN Collection<DynamicRecord> changedDynamicRecords = Iterables.asCollection( nodeLabels.remove( 255, nodeStore ) ); // THEN assertEquals( initialRecords, changedDynamicRecords ); assertFalse( Iterables.single( changedDynamicRecords ).inUse() ); assertEquals( inlinedLabelsLongRepresentation( 251, 252, 253, 254 ), node.getLabelField() ); }