@Override public String toString() { if ( node.isLight() ) { return format( "Dynamic(id:%d)", firstDynamicLabelRecordId( node.getLabelField() ) ); } return format( "Dynamic(id:%d,[%s])", firstDynamicLabelRecordId( node.getLabelField() ), Arrays.toString( getDynamicLabelsArrayFromHeavyRecords( node.getUsedDynamicLabelRecords() ) ) ); }
@Override public long[] getIfLoaded() { if ( node.isLight() ) { return null; } return stripNodeId( (long[]) getRightArray( readFullByteArrayFromHeavyRecords( node.getUsedDynamicLabelRecords(), ARRAY ) ).asObject() ); }
public static long[] get( NodeRecord node, NodeStore nodeStore ) { if ( node.isLight() ) { nodeStore.ensureHeavy( node, firstDynamicLabelRecordId( node.getLabelField() ) ); } return getDynamicLabelsArray( node.getUsedDynamicLabelRecords(), nodeStore.getDynamicLabelStore() ); }
@Test public void shouldListLabelRecordsInUse() { // Given NodeRecord node = new NodeRecord( 1, false, -1, -1 ); long inlinedLabels = 12L; DynamicRecord dynamic1 = dynamicRecord( 1L, true ); DynamicRecord dynamic2 = dynamicRecord( 2L, true ); DynamicRecord dynamic3 = dynamicRecord( 3L, true ); node.setLabelField( inlinedLabels, asList( dynamic1, dynamic2, dynamic3 ) ); dynamic3.setInUse( false ); // When Iterable<DynamicRecord> usedRecords = node.getUsedDynamicLabelRecords(); // Then assertThat( asList( usedRecords ), equalTo( asList( dynamic1, dynamic2 ) ) ); }
@Override public Collection<DynamicRecord> remove( long labelId, NodeStore nodeStore ) { nodeStore.ensureHeavy( node, firstDynamicLabelRecordId( node.getLabelField() ) ); long[] existingLabelIds = getDynamicLabelsArray( node.getUsedDynamicLabelRecords(), nodeStore.getDynamicLabelStore() ); long[] newLabelIds = filter( existingLabelIds, labelId ); Collection<DynamicRecord> existingRecords = node.getDynamicLabelRecords(); if ( InlineNodeLabels.tryInlineInNodeRecord( node, newLabelIds, existingRecords ) ) { setNotInUse( existingRecords ); } else { Collection<DynamicRecord> newRecords = allocateRecordsForDynamicLabels( node.getId(), newLabelIds, new ReusableRecordsCompositeAllocator( existingRecords, nodeStore.getDynamicLabelStore() ) ); node.setLabelField( dynamicPointer( newRecords ), existingRecords ); if ( !newRecords.equals( existingRecords ) ) { // One less dynamic record, mark that one as not in use for ( DynamicRecord record : existingRecords ) { if ( !newRecords.contains( record ) ) { record.setInUse( false ); } } } } return existingRecords; }
@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; }
@Override public String toString() { if ( node.isLight() ) { return format( "Dynamic(id:%d)", firstDynamicLabelRecordId( node.getLabelField() ) ); } return format( "Dynamic(id:%d,[%s])", firstDynamicLabelRecordId( node.getLabelField() ), Arrays.toString( getDynamicLabelsArrayFromHeavyRecords( node.getUsedDynamicLabelRecords() ) ) ); }
@Override public long[] getIfLoaded() { if ( node.isLight() ) { return null; } return stripNodeId( (long[]) getRightArray( readFullByteArrayFromHeavyRecords( node.getUsedDynamicLabelRecords(), ARRAY ) ).asObject() ); }
public static long[] get( NodeRecord node, NodeStore nodeStore ) { if ( node.isLight() ) { nodeStore.ensureHeavy( node, firstDynamicLabelRecordId( node.getLabelField() ) ); } return getDynamicLabelsArray( node.getUsedDynamicLabelRecords(), 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; }
@Override public Collection<DynamicRecord> remove( long labelId, NodeStore nodeStore ) { nodeStore.ensureHeavy( node, firstDynamicLabelRecordId( node.getLabelField() ) ); long[] existingLabelIds = getDynamicLabelsArray( node.getUsedDynamicLabelRecords(), nodeStore.getDynamicLabelStore() ); long[] newLabelIds = filter( existingLabelIds, labelId ); Collection<DynamicRecord> existingRecords = node.getDynamicLabelRecords(); if ( InlineNodeLabels.tryInlineInNodeRecord( node, newLabelIds, existingRecords ) ) { setNotInUse( existingRecords ); } else { Collection<DynamicRecord> newRecords = allocateRecordsForDynamicLabels( node.getId(), newLabelIds, new ReusableRecordsCompositeAllocator( existingRecords, nodeStore.getDynamicLabelStore() ) ); node.setLabelField( dynamicPointer( newRecords ), existingRecords ); if ( !newRecords.equals( existingRecords ) ) { // One less dynamic record, mark that one as not in use for ( DynamicRecord record : existingRecords ) { if ( !newRecords.contains( record ) ) { record.setInUse( false ); } } } } return existingRecords; }