@Test public void testContainsRange() { HTableDescriptor tableDesc = new HTableDescriptor("testtable"); HRegionInfo hri = new HRegionInfo(tableDesc, Bytes.toBytes("a"), Bytes.toBytes("g")); // Single row range at start of region assertTrue(hri.containsRange(Bytes.toBytes("a"), Bytes.toBytes("a"))); // Fully contained range assertTrue(hri.containsRange(Bytes.toBytes("b"), Bytes.toBytes("c"))); // Range overlapping start of region assertTrue(hri.containsRange(Bytes.toBytes("a"), Bytes.toBytes("c"))); // Fully contained single-row range assertTrue(hri.containsRange(Bytes.toBytes("c"), Bytes.toBytes("c"))); // Range that overlaps end key and hence doesn't fit assertFalse(hri.containsRange(Bytes.toBytes("a"), Bytes.toBytes("g"))); // Single row range on end key assertFalse(hri.containsRange(Bytes.toBytes("g"), Bytes.toBytes("g"))); // Single row range entirely outside assertFalse(hri.containsRange(Bytes.toBytes("z"), Bytes.toBytes("z"))); // Degenerate range try { hri.containsRange(Bytes.toBytes("z"), Bytes.toBytes("a")); fail("Invalid range did not throw IAE"); } catch (IllegalArgumentException iae) { } }
private static List<HBaseMRRowRange> binRanges( final List<HBaseMRRowRange> inputRanges, final Map<HRegionLocation, Map<HRegionInfo, List<HBaseMRRowRange>>> binnedRanges, final RegionLocator regionLocator) throws IOException { // Loop through ranges, getting RegionLocation and RegionInfo for // startKey, clipping range by that regionInfo's extent, and leaving // remainder in the List to be region'd final ListIterator<HBaseMRRowRange> i = inputRanges.listIterator(); while (i.hasNext()) { final HBaseMRRowRange range = i.next(); final HRegionLocation location = regionLocator.getRegionLocation(range.getStart().getBytes()); Map<HRegionInfo, List<HBaseMRRowRange>> regionInfoMap = binnedRanges.get(location); if (regionInfoMap == null) { regionInfoMap = new HashMap<HRegionInfo, List<HBaseMRRowRange>>(); binnedRanges.put(location, regionInfoMap); } final HRegionInfo regionInfo = location.getRegionInfo(); List<HBaseMRRowRange> rangeList = regionInfoMap.get(regionInfo); if (rangeList == null) { rangeList = new ArrayList<HBaseMRRowRange>(); regionInfoMap.put(regionInfo, rangeList); } if (regionInfo.containsRange(range.getStart().getBytes(), range.getEnd().getBytes())) { rangeList.add(range); i.remove(); } else { final ByteArrayRange overlappingRange = range.intersection( new ByteArrayRange( new ByteArrayId(regionInfo.getStartKey()), new ByteArrayId(regionInfo.getEndKey()))); rangeList.add(new HBaseMRRowRange(overlappingRange)); final HBaseMRRowRange uncoveredRange = new HBaseMRRowRange( new ByteArrayId(HBaseUtils.getNextPrefix(regionInfo.getEndKey())), range.getEnd()); i.add(uncoveredRange); } } return inputRanges; }