Skip to content

Commit

Permalink
[jsapi] fix RangeSet::addRange when there are ranges remaining post m…
Browse files Browse the repository at this point in the history
…erge of a range (#1534)

Also cherry-picks related DH-11277.
  • Loading branch information
nbauernfeind authored Nov 8, 2021
1 parent 92f67ec commit 985c1cc
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,7 @@ public int compareTo(@Nonnull Range o) {

public Range overlap(Range range) {
if (range.first > last + 1 || range.last < first - 1) {
// no overlap at all

// TODO should actually check adjacency too
// no overlap at all; note that adjacent ranges overlap/merge
return null;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,11 @@ public void addRange(Range range) {
end = i - 1;
break;
}
if (overlap.equals(existing)) {
// the entire range to be added existed within an existing range, we're done
return;
}

// grow the region used for replacing
merged = overlap;
}
Expand All @@ -101,7 +106,7 @@ public void addRange(Range range) {
}
newArray[index] = merged;
if (end < sortedRanges.length - 1) {
System.arraycopy(sortedRanges, end, newArray, index + 1, sortedRanges.length - end);
System.arraycopy(sortedRanges, end + 1, newArray, index + 1, sortedRanges.length - 1 - end);
}
sortedRanges = newArray;
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,48 @@ public void testOverlappingRanges() {
rangeSet.addRange(new Range(0, 1));
assertEquals(26, rangeSet.size());
assertEquals(Collections.singletonList(new Range(0, 25)), asList(rangeSet));

rangeSet = new RangeSet();
rangeSet.addRange(new Range(1, 1));
rangeSet.addRange(new Range(20, 21));

// shared start; ranges follow
rangeSet.addRange(new Range(1, 10));
assertEquals(12, rangeSet.size());
}

@Test
public void testAddExistingRange() {
RangeSet rangeSet = RangeSet.ofRange(5, 10);
rangeSet.addRange(new Range(5, 10));
rangeSet.addRange(new Range(5, 6));
rangeSet.addRange(new Range(6, 8));
rangeSet.addRange(new Range(8, 10));
assertEquals(RangeSet.ofRange(5, 10), rangeSet);

rangeSet = RangeSet.ofItems(5, 10, 15);
rangeSet.addRange(new Range(5, 5));
rangeSet.addRange(new Range(10, 10));
rangeSet.addRange(new Range(15, 15));
assertEquals(rangeSet, RangeSet.ofItems(5, 10, 15));

rangeSet = RangeSet.ofItems(5, 6, 7, 11, 12, 13, 26, 27, 28);
rangeSet.addRange(new Range(5, 7));
rangeSet.addRange(new Range(11, 13));
rangeSet.addRange(new Range(26, 28));

rangeSet.addRange(new Range(5, 6));
rangeSet.addRange(new Range(6, 6));
rangeSet.addRange(new Range(6, 7));

rangeSet.addRange(new Range(11, 12));
rangeSet.addRange(new Range(12, 12));
rangeSet.addRange(new Range(12, 13));

rangeSet.addRange(new Range(26, 27));
rangeSet.addRange(new Range(27, 27));
rangeSet.addRange(new Range(27, 28));
assertEquals(RangeSet.ofItems(5, 6, 7, 11, 12, 13, 26, 27, 28), rangeSet);
}

@Test
Expand Down

0 comments on commit 985c1cc

Please sign in to comment.