@Override public void ensureHeavy( NodeRecord node ) { if ( NodeLabelsField.fieldPointsToDynamicRecordOfLabels( node.getLabelField() ) ) { ensureHeavy( node, NodeLabelsField.firstDynamicLabelRecordId( node.getLabelField() ) ); } }
public static long[] get( NodeRecord node, NodeStore nodeStore ) { if ( node.isLight() ) { nodeStore.ensureHeavy( node, firstDynamicLabelRecordId( node.getLabelField() ) ); } return getDynamicLabelsArray( node.getUsedDynamicLabelRecords(), nodeStore.getDynamicLabelStore() ); }
static Collection<DynamicRecord> putSorted( NodeRecord node, long[] labelIds, NodeStore nodeStore, DynamicRecordAllocator allocator ) { long existingLabelsField = node.getLabelField(); long existingLabelsBits = parseLabelsBody( existingLabelsField ); Collection<DynamicRecord> changedDynamicRecords = node.getDynamicLabelRecords(); long labelField = node.getLabelField(); if ( fieldPointsToDynamicRecordOfLabels( labelField ) ) { // There are existing dynamic label records, get them nodeStore.ensureHeavy( node, existingLabelsBits ); changedDynamicRecords = node.getDynamicLabelRecords(); setNotInUse( changedDynamicRecords ); } if ( !InlineNodeLabels.tryInlineInNodeRecord( node, labelIds, changedDynamicRecords ) ) { Iterator<DynamicRecord> recycledRecords = changedDynamicRecords.iterator(); Collection<DynamicRecord> allocatedRecords = allocateRecordsForDynamicLabels( node.getId(), labelIds, new ReusableRecordsCompositeAllocator( recycledRecords, allocator ) ); // Set the rest of the previously set dynamic records as !inUse while ( recycledRecords.hasNext() ) { DynamicRecord removedRecord = recycledRecords.next(); removedRecord.setInUse( false ); allocatedRecords.add( removedRecord ); } node.setLabelField( dynamicPointer( allocatedRecords ), allocatedRecords ); changedDynamicRecords = allocatedRecords; } 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; }
@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; }
assert nodeRecord.inUse() : nodeRecord; nodeStore.ensureHeavy( nodeRecord );
@Override public void ensureHeavy( NodeRecord node ) { if ( NodeLabelsField.fieldPointsToDynamicRecordOfLabels( node.getLabelField() ) ) { ensureHeavy( node, NodeLabelsField.firstDynamicLabelRecordId( node.getLabelField() ) ); } }
public static long[] get( NodeRecord node, NodeStore nodeStore ) { if ( node.isLight() ) { nodeStore.ensureHeavy( node, firstDynamicLabelRecordId( node.getLabelField() ) ); } return getDynamicLabelsArray( node.getUsedDynamicLabelRecords(), nodeStore.getDynamicLabelStore() ); }
static Collection<DynamicRecord> putSorted( NodeRecord node, long[] labelIds, NodeStore nodeStore, DynamicRecordAllocator allocator ) { long existingLabelsField = node.getLabelField(); long existingLabelsBits = parseLabelsBody( existingLabelsField ); Collection<DynamicRecord> changedDynamicRecords = node.getDynamicLabelRecords(); long labelField = node.getLabelField(); if ( fieldPointsToDynamicRecordOfLabels( labelField ) ) { // There are existing dynamic label records, get them nodeStore.ensureHeavy( node, existingLabelsBits ); changedDynamicRecords = node.getDynamicLabelRecords(); setNotInUse( changedDynamicRecords ); } if ( !InlineNodeLabels.tryInlineInNodeRecord( node, labelIds, changedDynamicRecords ) ) { Iterator<DynamicRecord> recycledRecords = changedDynamicRecords.iterator(); Collection<DynamicRecord> allocatedRecords = allocateRecordsForDynamicLabels( node.getId(), labelIds, new ReusableRecordsCompositeAllocator( recycledRecords, allocator ) ); // Set the rest of the previously set dynamic records as !inUse while ( recycledRecords.hasNext() ) { DynamicRecord removedRecord = recycledRecords.next(); removedRecord.setInUse( false ); allocatedRecords.add( removedRecord ); } node.setLabelField( dynamicPointer( allocatedRecords ), allocatedRecords ); changedDynamicRecords = allocatedRecords; } return changedDynamicRecords; }
@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; }
assert nodeRecord.inUse() : nodeRecord; nodeStore.ensureHeavy( nodeRecord );