private void setNodeLabels( NodeRecord nodeRecord, Label... labels ) { NodeLabels nodeLabels = parseLabelsField( nodeRecord ); nodeLabels.put( getOrCreateLabelIds( labels ), nodeStore, nodeStore.getDynamicLabelStore() ); labelsTouched = true; }
@Override public boolean visitNodeCommand( NodeCommand command ) { NodeStore nodeStore = neoStores.getNodeStore(); track( nodeStore, command ); track( nodeStore.getDynamicLabelStore(), command.getAfter().getDynamicLabelRecords() ); return false; }
void addLabelToNode( long labelId, long nodeId ) { NodeRecord nodeRecord = recordChangeSet.getNodeRecords().getOrLoad( nodeId, null ).forChangingData(); parseLabelsField( nodeRecord ).add( labelId, nodeStore, nodeStore.getDynamicLabelStore() ); }
private Collection<DynamicRecord> allocateAndApply( NodeStore nodeStore, long nodeId, long[] longs ) { Collection<DynamicRecord> records = DynamicNodeLabels.allocateRecordsForDynamicLabels( nodeId, longs, nodeStore.getDynamicLabelStore() ); nodeStore.updateDynamicLabelRecords( records ); return records; }
public static long[] get( NodeRecord node, NodeStore nodeStore ) { if ( node.isLight() ) { nodeStore.ensureHeavy( node, firstDynamicLabelRecordId( node.getLabelField() ) ); } return getDynamicLabelsArray( node.getUsedDynamicLabelRecords(), nodeStore.getDynamicLabelStore() ); }
@Before public void setup() { when( neoStores.getMetaDataStore() ).thenReturn( metaDataStore ); when( neoStores.getNodeStore() ).thenReturn( nodeStore ); when( neoStores.getRelationshipStore() ).thenReturn( relationshipStore ); when( neoStores.getPropertyStore() ).thenReturn( propertyStore ); when( neoStores.getRelationshipGroupStore() ).thenReturn( relationshipGroupStore ); when( neoStores.getRelationshipTypeTokenStore() ).thenReturn( relationshipTypeTokenStore ); when( neoStores.getLabelTokenStore() ).thenReturn( labelTokenStore ); when( neoStores.getPropertyKeyTokenStore() ).thenReturn( propertyKeyTokenStore ); when( neoStores.getSchemaStore() ).thenReturn( schemaStore ); when( nodeStore.getDynamicLabelStore() ).thenReturn( dynamicLabelStore ); when( lockService.acquireNodeLock( anyLong(), any() ) ) .thenReturn( LockService.NO_LOCK ); when( lockService.acquireRelationshipLock( anyLong(), any() ) ) .thenReturn( LockService.NO_LOCK ); when( transactionToApply.transactionId() ).thenReturn( transactionId ); }
@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() ); }
private void assertDynamicLabelRecordInUse( NeoStores store, long id, boolean inUse ) { DynamicArrayStore dynamicLabelStore = store.getNodeStore().getDynamicLabelStore(); DynamicRecord record = dynamicLabelStore.getRecord( id, dynamicLabelStore.nextRecord(), FORCE ); assertEquals( inUse, record.inUse() ); }
@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 shouldSpillOverToDynamicRecordIfExceedsInlinedSpace() { // GIVEN -- the upper limit for a label ID for 3 labels would be 36b/3 - 1 = 12b - 1 = 4095 long labelId1 = 10; long labelId2 = 30; long labelId3 = 4096; NodeRecord node = nodeRecordWithInlinedLabels( labelId1, labelId2 ); NodeLabels nodeLabels = NodeLabelsField.parseLabelsField( node ); // WHEN Collection<DynamicRecord> changedDynamicRecords = nodeLabels.add( labelId3, nodeStore, nodeStore.getDynamicLabelStore() ); // THEN assertEquals( 1, Iterables.count( changedDynamicRecords ) ); assertEquals( dynamicLabelsLongRepresentation( changedDynamicRecords ), node.getLabelField() ); assertTrue( Arrays.equals( new long[] {labelId1, labelId2, labelId3}, DynamicNodeLabels.getDynamicLabelsArray( changedDynamicRecords, nodeStore.getDynamicLabelStore() ) ) ); }
@Override public Collection<DynamicRecord> add( long labelId, NodeStore nodeStore, DynamicRecordAllocator allocator ) { nodeStore.ensureHeavy( node, firstDynamicLabelRecordId( node.getLabelField() ) ); long[] existingLabelIds = getDynamicLabelsArray( node.getUsedDynamicLabelRecords(), nodeStore.getDynamicLabelStore() ); long[] newLabelIds = LabelIdArray.concatAndSort( existingLabelIds, labelId ); Collection<DynamicRecord> existingRecords = node.getDynamicLabelRecords(); Collection<DynamicRecord> changedDynamicRecords = allocateRecordsForDynamicLabels( node.getId(), newLabelIds, new ReusableRecordsCompositeAllocator( existingRecords, allocator ) ); node.setLabelField( dynamicPointer( changedDynamicRecords ), changedDynamicRecords ); return changedDynamicRecords; }
@Test public void addingAnAlreadyAddedLabelWhenLabelsAreInlinedShouldFail() { // GIVEN int labelId = 1; NodeRecord node = nodeRecordWithInlinedLabels( labelId ); NodeLabels nodeLabels = NodeLabelsField.parseLabelsField( node ); // WHEN try { nodeLabels.add( labelId, nodeStore, nodeStore.getDynamicLabelStore() ); fail( "Should have thrown exception" ); } catch ( IllegalStateException e ) { // THEN } }
@Test public void shouldReallocateAllOfPreviousDynamicRecordsAndThenSome() { // GIVEN NodeRecord node = nodeRecordWithDynamicLabels( nodeStore, fourByteLongs( 100 ) ); Set<DynamicRecord> initialRecords = Iterables.asSet( cloned( node.getDynamicLabelRecords(), DynamicRecord.class ) ); NodeLabels nodeLabels = NodeLabelsField.parseLabelsField( node ); // WHEN Set<DynamicRecord> reallocatedRecords = Iterables.asUniqueSet( nodeLabels.put( fourByteLongs( 5 ), nodeStore, nodeStore.getDynamicLabelStore() ) ); // THEN assertTrue( "initial:" + initialRecords + ", reallocated:" + reallocatedRecords , initialRecords.containsAll( used( reallocatedRecords ) ) ); assertTrue( used( reallocatedRecords ).size() < initialRecords.size() ); }
@Test public void twoDynamicRecordsShouldShrinkToOneWhenRemovingWithoutChangingItsOwner() { // GIVEN // will occupy 61B of data, i.e. just two dynamic records Long nodeId = 42L; NodeRecord node = nodeRecordWithDynamicLabels( nodeId, nodeStore, oneByteLongs( 57 ) ); NodeLabels nodeLabels = NodeLabelsField.parseLabelsField( node ); List<DynamicRecord> changedDynamicRecords = Iterables.addToCollection( nodeLabels.remove( 255 /*Initial labels go from 255 and down to 255-58*/, nodeStore ), new ArrayList<>() ); // WHEN Pair<Long,long[]> changedPair = DynamicNodeLabels.getDynamicLabelsArrayAndOwner( changedDynamicRecords, nodeStore.getDynamicLabelStore() ); // THEN assertEquals( nodeId, changedPair.first() ); }
@Test public void oneDynamicRecordShouldStoreItsOwner() { // GIVEN // will occupy 60B of data, i.e. one dynamic record Long nodeId = 24L; NodeRecord node = nodeRecordWithDynamicLabels( nodeId, nodeStore, oneByteLongs(56) ); Collection<DynamicRecord> initialRecords = node.getDynamicLabelRecords(); // WHEN Pair<Long,long[]> pair = DynamicNodeLabels.getDynamicLabelsArrayAndOwner( initialRecords, nodeStore.getDynamicLabelStore() ); // THEN assertEquals( nodeId, pair.first() ); }
@Test public void addingAnAlreadyAddedLabelWhenLabelsAreInDynamicRecordsShouldFail() { // GIVEN long[] labels = oneByteLongs( 20 ); NodeRecord node = nodeRecordWithDynamicLabels( nodeStore, labels ); NodeLabels nodeLabels = NodeLabelsField.parseLabelsField( node ); // WHEN try { nodeLabels.add( safeCastLongToInt( labels[0] ), nodeStore, nodeStore.getDynamicLabelStore() ); fail( "Should have thrown exception" ); } catch ( IllegalStateException e ) { // THEN } }
@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 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 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 ) ); }
private Ids createNode( DataImporter.Monitor monitor, NeoStores neoStores, int propertyCount, int labelCount ) { PropertyStore propertyStore = neoStores.getPropertyStore(); RecordAccess<PropertyRecord,PrimitiveRecord> propertyRecordAccess = new DirectRecordAccess<>( propertyStore, new Loaders( neoStores ).propertyLoader() ); NodeStore nodeStore = neoStores.getNodeStore(); NodeRecord nodeRecord = nodeStore.newRecord(); nodeRecord.setId( nodeStore.nextId() ); nodeRecord.setInUse( true ); NodeLabelsField.parseLabelsField( nodeRecord ).put( labelIds( labelCount ), nodeStore, nodeStore.getDynamicLabelStore() ); long nextProp = new PropertyCreator( propertyStore, new PropertyTraverser() ) .createPropertyChain( nodeRecord, properties( propertyStore, propertyCount ), propertyRecordAccess ); nodeRecord.setNextProp( nextProp ); nodeStore.updateRecord( nodeRecord ); PropertyRecord[] propertyRecords = extractPropertyRecords( propertyRecordAccess, nextProp ); propertyRecordAccess.close(); monitor.nodesImported( 1 ); monitor.propertiesImported( propertyCount ); return new Ids( nodeRecord, propertyRecords ); }