public long getFirstDynamicRecordId() { return firstDynamicLabelRecordId( node.getLabelField() ); }
@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 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() ); }
public static long[] getListOfLabels( NodeRecord nodeRecord, RecordStore<DynamicRecord> labels ) { long field = nodeRecord.getLabelField(); if ( NodeLabelsField.fieldPointsToDynamicRecordOfLabels( field ) ) { List<DynamicRecord> recordList = new ArrayList<>(); final MutableLongSet alreadySeen = new LongHashSet(); long id = NodeLabelsField.firstDynamicLabelRecordId( field ); while ( !Record.NULL_REFERENCE.is( id ) ) { DynamicRecord record = labels.getRecord( id, labels.newRecord(), FORCE ); if ( !record.inUse() || !alreadySeen.add( id ) ) { return PrimitiveLongCollections.EMPTY_LONG_ARRAY; } recordList.add( record ); } return LabelChainWalker.labelIds( recordList ); } return InlineNodeLabels.get( nodeRecord ); }
@Test public void shouldReadIdOfDynamicRecordFromDynamicLabelsField() { // GIVEN NodeRecord node = nodeRecordWithDynamicLabels( nodeStore, oneByteLongs( 5 ) ); DynamicRecord dynamicRecord = node.getDynamicLabelRecords().iterator().next(); // WHEN long dynRecordId = NodeLabelsField.firstDynamicLabelRecordId( node.getLabelField() ); // THEN assertEquals( dynamicRecord.getId(), dynRecordId ); }
@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; }
public long getFirstDynamicRecordId() { return firstDynamicLabelRecordId( node.getLabelField() ); }
@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 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() ); }
@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; }