allocateFromNumbers( target, array, recordAllocator );
@Test void shouldReportMissingOwnerId() { // given DynamicRecord record = new DynamicRecord( 0 ); inUse( record ) ; allocateFromNumbers( new ArrayList<>(), new long[] { }, new ReusableRecordsAllocator( 66, record ) ); // when DynamicLabelConsistencyReport report = check( record ); // then verify( report ).orphanDynamicLabelRecord(); }
@Test public void shouldReadFirstFromSingleRecordDynamicLongArray() { // GIVEN Long expectedId = 12L; long[] ids = new long[]{expectedId, 23L, 42L}; DynamicRecord firstRecord = new DynamicRecord( 0L ); allocateFromNumbers( new ArrayList<>(), ids, new ReusableRecordsAllocator( 60, firstRecord ) ); // WHEN Long firstId = readOwnerFromDynamicLabelsRecord( firstRecord ); // THEN assertEquals( expectedId, firstId ); }
@Test public void shouldReadFirstAsNullFromEmptyDynamicLongArray() { // GIVEN Long expectedId = null; long[] ids = new long[]{}; DynamicRecord firstRecord = new DynamicRecord( 0L ); allocateFromNumbers( new ArrayList<>(), ids, new ReusableRecordsAllocator( 60, firstRecord ) ); // WHEN Long firstId = readOwnerFromDynamicLabelsRecord( firstRecord ); // THEN assertEquals( expectedId, firstId ); }
private static NodeRecord withDynamicLabels( RecordAccessStub recordAccess, NodeRecord nodeRecord, long... labelIds ) { List<DynamicRecord> preAllocatedRecords = new ArrayList<>(); for ( int i = 0; i < 10; i++ ) { preAllocatedRecords.add( inUse( new DynamicRecord( i ) ) ); } Collection<DynamicRecord> dynamicRecords = new ArrayList<>(); DynamicArrayStore.allocateFromNumbers( dynamicRecords, prependNodeId( nodeRecord.getId(), labelIds ), new ReusableRecordsAllocator( 4, preAllocatedRecords ) ); for ( DynamicRecord dynamicRecord : dynamicRecords ) { recordAccess.addNodeDynamicLabels( dynamicRecord ); } nodeRecord.setLabelField( dynamicPointer( dynamicRecords ), dynamicRecords ); return nodeRecord; }
@Test void shouldReportOwningNodeRecordNotInUse() { // given NodeRecord nodeRecord = notInUse( new NodeRecord( 12L, false, -1, -1 ) ); add( nodeRecord ); DynamicRecord nodeDynamicLabelRecord = inUse( new DynamicRecord( 0 ) ); allocateFromNumbers( new ArrayList<>(), new long[]{12L}, new ReusableRecordsAllocator( 66, nodeDynamicLabelRecord ) ); // when DynamicLabelConsistencyReport report = check( nodeDynamicLabelRecord ); // then verify( report ).orphanDynamicLabelRecordDueToInvalidOwner( nodeRecord ); }
@Test public void shouldReadFirstFromTwoRecordDynamicLongArray() { // GIVEN Long expectedId = 12L; long[] ids = new long[]{expectedId, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L}; DynamicRecord firstRecord = new DynamicRecord( 0L ); allocateFromNumbers( new ArrayList<>(), ids, new ReusableRecordsAllocator( 8, firstRecord, new DynamicRecord( 1L ) ) ); // WHEN Long firstId = readOwnerFromDynamicLabelsRecord( firstRecord ); // THEN assertEquals( expectedId, firstId ); }
@Test void shouldReportOwningNodeRecordNotPointingBack() { // given long nodeId = 12L; Collection<DynamicRecord> validLabelRecords = new ArrayList<>(); DynamicRecord dynamicRecord = inUse( new DynamicRecord( 0 ) ); allocateFromNumbers( validLabelRecords, new long[] {nodeId}, new ReusableRecordsAllocator( 66, dynamicRecord ) ); Collection<DynamicRecord> fakePointedToRecords = new ArrayList<>(); DynamicRecord dynamicRecord1 = inUse( new DynamicRecord( 1 ) ); allocateFromNumbers( fakePointedToRecords, new long[] {nodeId}, new ReusableRecordsAllocator( 66, dynamicRecord1 ) ); NodeRecord nodeRecord = inUse( new NodeRecord( nodeId, false, -1, -1 ) ); nodeRecord.setLabelField( dynamicPointer( fakePointedToRecords ), fakePointedToRecords ); add( nodeRecord ); // when DynamicLabelConsistencyReport report = check( Iterators.single( validLabelRecords.iterator() ) ); // then verify( report ).orphanDynamicLabelRecordDueToInvalidOwner( nodeRecord ); } }
@Override protected void transactionData( GraphStoreFixture.TransactionDataBuilder tx, GraphStoreFixture.IdGenerator next ) { NodeRecord node = new NodeRecord( nodeId, false, -1, -1 ); node.setInUse( true ); List<DynamicRecord> labelRecords = labels.first(); node.setLabelField( dynamicPointer( labelRecords ), labelRecords ); tx.create( node ); Integer labelId = labels.other().get( 0 ); DynamicRecord record = inUse( new DynamicRecord( labelId ) ); allocateFromNumbers( duplicatedLabel, new long[]{nodeId, labelId, labelId}, new ReusableRecordsAllocator( 60, record ) ); } } );
@Override protected void transactionData( GraphStoreFixture.TransactionDataBuilder tx, GraphStoreFixture.IdGenerator next ) { NodeRecord nodeRecord = new NodeRecord( next.node(), false, -1, -1 ); DynamicRecord record = inUse( new DynamicRecord( next.nodeLabel() ) ); Collection<DynamicRecord> newRecords = new ArrayList<>(); allocateFromNumbers( newRecords, prependNodeId( nodeRecord.getId(), new long[]{42L} ), new ReusableRecordsAllocator( 60, record ) ); nodeRecord.setLabelField( dynamicPointer( newRecords ), newRecords ); tx.create( nodeRecord ); } } );
@Override protected void transactionData( GraphStoreFixture.TransactionDataBuilder tx, GraphStoreFixture.IdGenerator next ) { tx.nodeLabel( 42, "Label" ); NodeRecord nodeRecord = new NodeRecord( next.node(), false, -1, -1 ); DynamicRecord record = inUse( new DynamicRecord( next.nodeLabel() ) ); Collection<DynamicRecord> newRecords = new ArrayList<>(); allocateFromNumbers( newRecords, prependNodeId( next.node(), new long[]{42L} ), new ReusableRecordsAllocator( 60, record ) ); nodeRecord.setLabelField( dynamicPointer( newRecords ), newRecords ); tx.create( nodeRecord ); } } );
@Test void shouldDynamicLabelRecordsNotInUse() { // given long[] labelIds = createLabels( 100 ); NodeRecord node = inUse( new NodeRecord( 42, false, NONE, NONE ) ); add( node ); DynamicRecord labelsRecord1 = notInUse( array( new DynamicRecord( 1 ) ) ); DynamicRecord labelsRecord2 = notInUse( array( new DynamicRecord( 2 ) ) ); Collection<DynamicRecord> labelRecords = asList( labelsRecord1, labelsRecord2 ); DynamicArrayStore.allocateFromNumbers( new ArrayList<>(), labelIds, new NotUsedReusableRecordsAllocator( 52, labelRecords ) ); assertDynamicRecordChain( labelsRecord1, labelsRecord2 ); node.setLabelField( DynamicNodeLabels.dynamicPointer( labelRecords ), labelRecords ); addNodeDynamicLabels( labelsRecord1 ); addNodeDynamicLabels( labelsRecord2 ); // when ConsistencyReport.NodeConsistencyReport report = check( node ); // then verify( report ).dynamicLabelRecordNotInUse( labelsRecord1 ); verify( report ).dynamicLabelRecordNotInUse( labelsRecord2 ); }
@Test void shouldReportDuplicateDynamicLabels() { // given long[] labelIds = createLabels( 100 ); NodeRecord node = inUse( new NodeRecord( 42, false, NONE, NONE ) ); add( node ); DynamicRecord labelsRecord1 = inUse( array( new DynamicRecord( 1 ) ) ); DynamicRecord labelsRecord2 = inUse( array( new DynamicRecord( 2 ) ) ); Collection<DynamicRecord> labelRecords = asList( labelsRecord1, labelsRecord2 ); labelIds[12] = 11; DynamicArrayStore.allocateFromNumbers( new ArrayList<>(), labelIds, new ReusableRecordsAllocator( 52, labelRecords ) ); assertDynamicRecordChain( labelsRecord1, labelsRecord2 ); node.setLabelField( DynamicNodeLabels.dynamicPointer( labelRecords ), labelRecords ); addNodeDynamicLabels( labelsRecord1 ); addNodeDynamicLabels( labelsRecord2 ); // when ConsistencyReport.NodeConsistencyReport report = check( node ); // then verify( report ).labelDuplicate( 11 ); }
@Test void shouldReportOutOfOrderDynamicLabels() { // given long[] labelIds = createLabels( 100 ); NodeRecord node = inUse( new NodeRecord( 42, false, NONE, NONE ) ); add( node ); DynamicRecord labelsRecord1 = inUse( array( new DynamicRecord( 1 ) ) ); DynamicRecord labelsRecord2 = inUse( array( new DynamicRecord( 2 ) ) ); Collection<DynamicRecord> labelRecords = asList( labelsRecord1, labelsRecord2 ); long temp = labelIds[12]; labelIds[12] = labelIds[11]; labelIds[11] = temp; DynamicArrayStore.allocateFromNumbers( new ArrayList<>(), labelIds, new ReusableRecordsAllocator( 52, labelRecords ) ); assertDynamicRecordChain( labelsRecord1, labelsRecord2 ); node.setLabelField( DynamicNodeLabels.dynamicPointer( labelRecords ), labelRecords ); addNodeDynamicLabels( labelsRecord1 ); addNodeDynamicLabels( labelsRecord2 ); // when ConsistencyReport.NodeConsistencyReport report = check( node ); // then verify( report ).labelsOutOfOrder( labelIds[11], labelIds[12] ); }
@Test void shouldReportDynamicLabelsNotInUse() { // given long[] labelIds = createLabels( 100 ); LabelTokenRecord labelRecordNotInUse = notInUse( new LabelTokenRecord( labelIds.length ) ); add( labelRecordNotInUse ); NodeRecord node = inUse( new NodeRecord( 42, false, NONE, NONE ) ); add( node ); DynamicRecord labelsRecord1 = inUse( array( new DynamicRecord( 1 ) ) ); DynamicRecord labelsRecord2 = inUse( array( new DynamicRecord( 2 ) ) ); Collection<DynamicRecord> labelRecords = asList( labelsRecord1, labelsRecord2 ); labelIds[12] = labelIds.length; DynamicArrayStore.allocateFromNumbers( new ArrayList<>(), labelIds, new ReusableRecordsAllocator( 52, labelRecords ) ); assertDynamicRecordChain( labelsRecord1, labelsRecord2 ); node.setLabelField( DynamicNodeLabels.dynamicPointer( labelRecords ), labelRecords ); addNodeDynamicLabels( labelsRecord1 ); addNodeDynamicLabels( labelsRecord2 ); // when ConsistencyReport.NodeConsistencyReport report = check( node ); // then verify( report ).labelNotInUse( labelRecordNotInUse ); }
@Override protected void transactionData( GraphStoreFixture.TransactionDataBuilder tx, GraphStoreFixture.IdGenerator next ) { NodeRecord nodeRecord = new NodeRecord( next.node(), false, -1, -1 ); DynamicRecord record1 = inUse( new DynamicRecord( next.nodeLabel() ) ); DynamicRecord record2 = inUse( new DynamicRecord( next.nodeLabel() ) ); DynamicRecord record3 = inUse( new DynamicRecord( next.nodeLabel() ) ); labels[0] = nodeRecord.getId(); // the first id should not be a label id, but the id of the node ReusableRecordsAllocator allocator = new ReusableRecordsAllocator( 60, record1, record2, record3 ); allocateFromNumbers( chain, labels, allocator ); nodeRecord.setLabelField( dynamicPointer( chain ), chain ); tx.create( nodeRecord ); } } );
@Test public void shouldReportMissingOwnerId() throws Exception { // given DynamicRecord nodeDynamicLabelRecord = inUse( new DynamicRecord( 0 ) ) ; allocateFromNumbers( new ArrayList<DynamicRecord>(), new long[] { }, iterator( nodeDynamicLabelRecord ), RECORD_ALLOCATOR ); // when DynamicLabelConsistencyReport report = check( nodeDynamicLabelRecord ); // then verify( report ).orphanDynamicLabelRecord(); }
@Test public void shouldReportOwningNodeRecordNotInUse() throws Exception { // given NodeRecord nodeRecord = notInUse( new NodeRecord( 12l, false, -1, -1 ) ); add( nodeRecord ); DynamicRecord nodeDynamicLabelRecord = inUse( new DynamicRecord( 0 ) ); allocateFromNumbers( new ArrayList<DynamicRecord>(), new long[]{12l}, iterator( nodeDynamicLabelRecord ), RECORD_ALLOCATOR ); // when DynamicLabelConsistencyReport report = check( nodeDynamicLabelRecord ); // then verify( report ).orphanDynamicLabelRecordDueToInvalidOwner( nodeRecord ); }
@Override protected void transactionData( GraphStoreFixture.TransactionDataBuilder tx, GraphStoreFixture.IdGenerator next ) { NodeRecord nodeRecord = new NodeRecord( next.node(), false, -1, -1 ); DynamicRecord record = inUse( new DynamicRecord( next.nodeLabel() ) ); Collection<DynamicRecord> newRecords = new ArrayList<>(); allocateFromNumbers( newRecords, prependNodeId( nodeRecord.getLongId(), new long[]{42l} ), iterator( record ), new PreAllocatedRecords( 60 ) ); nodeRecord.setLabelField( dynamicPointer( newRecords ), newRecords ); tx.create( nodeRecord ); } } );
@Override protected void transactionData( GraphStoreFixture.TransactionDataBuilder tx, GraphStoreFixture.IdGenerator next ) { NodeRecord nodeRecord = new NodeRecord( next.node(), false, -1, -1 ); DynamicRecord record1 = inUse( new DynamicRecord( next.nodeLabel() ) ); DynamicRecord record2 = inUse( new DynamicRecord( next.nodeLabel() ) ); DynamicRecord record3 = inUse( new DynamicRecord( next.nodeLabel() ) ); labels[0] = nodeRecord.getLongId(); // the first id should not be a label id, but the id of the node PreAllocatedRecords allocator = new PreAllocatedRecords( 60 ); allocateFromNumbers( chain, labels, iterator( record1, record2, record3 ), allocator ); nodeRecord.setLabelField( dynamicPointer( chain ), chain ); tx.create( nodeRecord ); } } );