if ( currentRangeId + 1 == nextFromSource.id() ) if ( currentRangeId < nextFromSource.id() ) return new NodeLabelRange( ++currentRangeId, emptyRangeData ); nextFromSource = new NodeLabelRange( highestRangeId, emptyRangeData );
@Override public String toString() { return nodeLabelRange.toString(); } }
@Test public void shouldRebaseOnRangeId() { // given long[][] labelsPerNode = new long[][] { {1}, {1, 3}, {3, 5, 7}, {}, {1, 5, 7}, {}, {}, {1, 2, 3, 4} }; // when NodeLabelRange range = new NodeLabelRange( 10, labelsPerNode ); // then long baseNodeId = range.id() * labelsPerNode.length; long[] expectedNodeIds = new long[labelsPerNode.length]; for ( int i = 0; i < expectedNodeIds.length; i++ ) { expectedNodeIds[i] = baseNodeId + i; } assertArrayEquals( expectedNodeIds, range.nodes() ); } }
@Test public void shouldTransposeNodeIdsAndLabelIds() { // given long[][] labelsPerNode = new long[][] { {1}, {1, 3}, {3, 5, 7}, {}, {1, 5, 7}, {}, {}, {1, 2, 3, 4} }; // when NodeLabelRange range = new NodeLabelRange( 0, labelsPerNode ); // then assertArrayEquals( new long[] {0, 1, 2, 3, 4, 5, 6, 7}, range.nodes() ); for ( int i = 0; i < labelsPerNode.length; i++ ) { assertArrayEquals( labelsPerNode[i], range.labels( i ) ); } }
private static void assertRanges( Iterator<NodeLabelRange> iterator, int[] expectedRanges ) { for ( int expectedRangeId = 0; expectedRangeId < expectedRanges.length; expectedRangeId++ ) { assertTrue( iterator.hasNext() ); NodeLabelRange actualRange = iterator.next(); assertEquals( expectedRangeId, actualRange.id() ); int expectedRange = expectedRanges[expectedRangeId]; long baseNodeId = expectedRangeId * RANGE_SIZE; for ( int i = 0; i < RANGE_SIZE; i++ ) { long nodeId = baseNodeId + i; long[] expectedLabelIds = (expectedRange & (1 << i)) == 0 ? EMPTY_LONG_ARRAY : LABEL_IDS; assertArrayEquals( expectedLabelIds, actualRange.labels( nodeId ) ); assertEquals( nodeId, actualRange.nodes()[i] ); } } assertFalse( iterator.hasNext() ); }
readBitmap( bits, labelId, labelsForEachNode ); NodeLabelRange range = new NodeLabelRange( currentRange, convertState( labelsForEachNode ) ); currentRange = nextLowestRange;
private static void assertRanges( AllEntriesLabelScanReader reader, Labels[] data ) { Iterator<NodeLabelRange> iterator = reader.iterator(); long highestRangeId = highestRangeId( data ); for ( long rangeId = 0; rangeId <= highestRangeId; rangeId++ ) { SortedMap<Long/*nodeId*/,List<Long>/*labelIds*/> expected = rangeOf( data, rangeId ); if ( expected != null ) { assertTrue( "Was expecting range " + expected, iterator.hasNext() ); NodeLabelRange range = iterator.next(); assertEquals( rangeId, range.id() ); for ( Map.Entry<Long,List<Long>> expectedEntry : expected.entrySet() ) { long[] labels = range.labels( expectedEntry.getKey() ); assertArrayEquals( asArray( expectedEntry.getValue().iterator() ), labels ); } } // else there was nothing in this range } assertFalse( iterator.hasNext() ); }
private static AllEntriesLabelScanReader ranges( int rangeSize, int... ranges ) { List<NodeLabelRange> rangeList = new ArrayList<>(); for ( int rangeId = 0; rangeId < ranges.length; rangeId++ ) { rangeList.add( new NodeLabelRange( rangeId, labelsPerNode( ranges[rangeId] ) ) ); } return new AllEntriesLabelScanReader() { @Override public void close() { // Nothing to close } @Override public Iterator<NodeLabelRange> iterator() { return rangeList.iterator(); } @Override public long maxCount() { return ranges.length * rangeSize; } @Override public int rangeSize() { return RANGE_SIZE; } }; }
@Test public void shouldScanMultipleRanges() { // GIVEN int labelId1 = 1; int labelId2 = 2; long nodeId1 = 10; long nodeId2 = 1280; start( asList( labelChanges( nodeId1, NO_LABELS, new long[]{labelId1} ), labelChanges( nodeId2, NO_LABELS, new long[]{labelId1, labelId2} ) ) ); // WHEN BoundedIterable<NodeLabelRange> reader = store.allNodeLabelRanges(); Iterator<NodeLabelRange> iterator = reader.iterator(); NodeLabelRange range1 = iterator.next(); NodeLabelRange range2 = iterator.next(); assertFalse( iterator.hasNext() ); // THEN assertArrayEquals( new long[]{nodeId1}, reducedNodes( range1 ) ); assertArrayEquals( new long[]{nodeId2}, reducedNodes( range2 ) ); assertArrayEquals( new long[]{labelId1}, sorted( range1.labels( nodeId1 ) ) ); assertArrayEquals( new long[]{labelId1, labelId2}, sorted( range2.labels( nodeId2 ) ) ); }
public LabelScanDocument( NodeLabelRange nodeLabelRange ) { super( nodeLabelRange.id() ); this.nodeLabelRange = nodeLabelRange; setInUse( true ); }
readBitmap( bits, labelId, labelsForEachNode ); NodeLabelRange range = new NodeLabelRange( currentRange, convertState( labelsForEachNode ) ); currentRange = nextLowestRange;
return new LabelScanDocument( new NodeLabelRange( 0, new long[][] {} ) );
@Test public void shouldScanSingleRange() { // GIVEN int labelId1 = 1; int labelId2 = 2; long nodeId1 = 10; long nodeId2 = 11; start( asList( labelChanges( nodeId1, NO_LABELS, new long[]{labelId1} ), labelChanges( nodeId2, NO_LABELS, new long[]{labelId1, labelId2} ) ) ); // WHEN BoundedIterable<NodeLabelRange> reader = store.allNodeLabelRanges(); NodeLabelRange range = single( reader.iterator() ); // THEN assertArrayEquals( new long[]{nodeId1, nodeId2}, reducedNodes( range ) ); assertArrayEquals( new long[]{labelId1}, sorted( range.labels( nodeId1 ) ) ); assertArrayEquals( new long[]{labelId1, labelId2}, sorted( range.labels( nodeId2 ) ) ); }
@Override public void check( LabelScanDocument record, CheckerEngine<LabelScanDocument, ConsistencyReport.LabelScanConsistencyReport> engine, RecordAccess records ) { NodeLabelRange range = record.getNodeLabelRange(); for ( long nodeId : range.nodes() ) { long[] labels = record.getNodeLabelRange().labels( nodeId ); engine.comparativeCheck( records.node( nodeId ), new NodeInUseWithCorrectLabelsCheck<>( labels, COMPLETE_ALL_TOKENS, true ) ); } } }
@Override public String toString() { String rangeString = idRange * labels.length + "-" + (idRange + 1) * labels.length; String prefix = "NodeLabelRange[idRange=" + rangeString; return toString( prefix, nodes, labels ); }
@Test public void shouldSeeEntriesWhenOnlyLowestIsPresent() { // given long labelId = 0; List<NodeLabelUpdate> labelUpdates = new ArrayList<>(); labelUpdates.add( NodeLabelUpdate.labelChanges( 0L, new long[]{}, new long[]{labelId} ) ); start( labelUpdates ); // when MutableInt count = new MutableInt(); AllEntriesLabelScanReader nodeLabelRanges = store.allNodeLabelRanges(); nodeLabelRanges.forEach( nlr -> { for ( long nodeId : nlr.nodes() ) { count.add( nlr.labels( nodeId ).length ); } } ); assertThat( count.intValue(), is( 1 ) ); }
@Override public String toString() { String rangeString = idRange * labels.length + "-" + (idRange + 1) * labels.length; String prefix = "NodeLabelRange[idRange=" + rangeString; return toString( prefix, nodes, labels ); }