/** * @see NodeRecord * * @param labelField label field value from a node record * @return the id of the dynamic record this label field points to or null if it is an inline label field */ public static long firstDynamicLabelRecordId( long labelField ) { assert fieldPointsToDynamicRecordOfLabels( labelField ); return parseLabelsBody( labelField ); }
public static long[] parseInlined( long labelField ) { byte numberOfLabels = labelCount( labelField ); if ( numberOfLabels == 0 ) { return EMPTY_LONG_ARRAY; } long existingLabelsField = parseLabelsBody( labelField ); byte bitsPerLabel = (byte) (LABEL_BITS / numberOfLabels); Bits bits = bitsFromLongs( new long[]{existingLabelsField} ); long[] result = new long[numberOfLabels]; for ( int i = 0; i < result.length; i++ ) { result[i] = bits.getLong( bitsPerLabel ); } return result; }
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; }
/** * @see NodeRecord * * @param labelField label field value from a node record * @return the id of the dynamic record this label field points to or null if it is an inline label field */ public static long firstDynamicLabelRecordId( long labelField ) { assert fieldPointsToDynamicRecordOfLabels( labelField ); return parseLabelsBody( labelField ); }
public static long[] parseInlined( long labelField ) { byte numberOfLabels = labelCount( labelField ); if ( numberOfLabels == 0 ) { return EMPTY_LONG_ARRAY; } long existingLabelsField = parseLabelsBody( labelField ); byte bitsPerLabel = (byte) (LABEL_BITS / numberOfLabels); Bits bits = bitsFromLongs( new long[]{existingLabelsField} ); long[] result = new long[numberOfLabels]; for ( int i = 0; i < result.length; i++ ) { result[i] = bits.getLong( bitsPerLabel ); } return result; }
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; }