Repository: hbase Updated Branches: refs/heads/branch-1.3 37a49a0fa -> a5a8e9fa4
HBASE-17688 MultiRowRangeFilter not working correctly if given same start and stop RowKey Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/a5a8e9fa Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/a5a8e9fa Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/a5a8e9fa Branch: refs/heads/branch-1.3 Commit: a5a8e9fa439a59d54ff04dd2089f94bb8cbad840 Parents: 37a49a0 Author: Jingcheng Du <jingchen...@apache.org> Authored: Tue Feb 28 12:53:22 2017 +0800 Committer: Jingcheng Du <jingchen...@apache.org> Committed: Tue Feb 28 12:53:22 2017 +0800 ---------------------------------------------------------------------- .../hbase/filter/MultiRowRangeFilter.java | 15 +++++----- .../hbase/filter/TestMultiRowRangeFilter.java | 31 ++++++++++++++++++++ 2 files changed, 38 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/a5a8e9fa/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.java ---------------------------------------------------------------------- diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.java index 9df5249..7e9503c 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/MultiRowRangeFilter.java @@ -117,7 +117,9 @@ public class MultiRowRangeFilter extends FilterBase { } else { if (range.contains(buffer, offset, length)) { currentReturnCode = ReturnCode.INCLUDE; - } else currentReturnCode = ReturnCode.SEEK_NEXT_USING_HINT; + } else { + currentReturnCode = ReturnCode.SEEK_NEXT_USING_HINT; + } } } else { currentReturnCode = ReturnCode.INCLUDE; @@ -151,7 +153,6 @@ public class MultiRowRangeFilter extends FilterBase { if (range.stopRow != null) rangebuilder.setStopRow(ByteStringer.wrap(range.stopRow)); rangebuilder.setStopRowInclusive(range.stopRowInclusive); - range.isScan = Bytes.equals(range.startRow, range.stopRow) ? 1 : 0; builder.addRowRangeList(rangebuilder.build()); } } @@ -422,7 +423,6 @@ public class MultiRowRangeFilter extends FilterBase { private boolean startRowInclusive = true; private byte[] stopRow; private boolean stopRowInclusive = false; - private int isScan = 0; public RowRange() { } @@ -445,7 +445,6 @@ public class MultiRowRangeFilter extends FilterBase { this.startRowInclusive = startRowInclusive; this.stopRow = (stopRow == null) ? HConstants.EMPTY_BYTE_ARRAY :stopRow; this.stopRowInclusive = stopRowInclusive; - isScan = Bytes.equals(startRow, stopRow) ? 1 : 0; } public byte[] getStartRow() { @@ -479,21 +478,21 @@ public class MultiRowRangeFilter extends FilterBase { if(stopRowInclusive) { return Bytes.compareTo(buffer, offset, length, startRow, 0, startRow.length) >= 0 && (Bytes.equals(stopRow, HConstants.EMPTY_BYTE_ARRAY) || - Bytes.compareTo(buffer, offset, length, stopRow, 0, stopRow.length) <= isScan); + Bytes.compareTo(buffer, offset, length, stopRow, 0, stopRow.length) <= 0); } else { return Bytes.compareTo(buffer, offset, length, startRow, 0, startRow.length) >= 0 && (Bytes.equals(stopRow, HConstants.EMPTY_BYTE_ARRAY) || - Bytes.compareTo(buffer, offset, length, stopRow, 0, stopRow.length) < isScan); + Bytes.compareTo(buffer, offset, length, stopRow, 0, stopRow.length) < 0); } } else { if(stopRowInclusive) { return Bytes.compareTo(buffer, offset, length, startRow, 0, startRow.length) > 0 && (Bytes.equals(stopRow, HConstants.EMPTY_BYTE_ARRAY) || - Bytes.compareTo(buffer, offset, length, stopRow, 0, stopRow.length) <= isScan); + Bytes.compareTo(buffer, offset, length, stopRow, 0, stopRow.length) <= 0); } else { return Bytes.compareTo(buffer, offset, length, startRow, 0, startRow.length) > 0 && (Bytes.equals(stopRow, HConstants.EMPTY_BYTE_ARRAY) || - Bytes.compareTo(buffer, offset, length, stopRow, 0, stopRow.length) < isScan); + Bytes.compareTo(buffer, offset, length, stopRow, 0, stopRow.length) < 0); } } } http://git-wip-us.apache.org/repos/asf/hbase/blob/a5a8e9fa/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestMultiRowRangeFilter.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestMultiRowRangeFilter.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestMultiRowRangeFilter.java index dfa8bfa..9ba5ec3 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestMultiRowRangeFilter.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestMultiRowRangeFilter.java @@ -457,6 +457,35 @@ public class TestMultiRowRangeFilter { ht.close(); } + @Test + public void testOneRowRange() throws IOException { + tableName = Bytes.toBytes("testOneRowRange"); + HTable ht = TEST_UTIL.createTable(tableName, family, Integer.MAX_VALUE); + generateRows(numRows, ht, family, qf, value); + ArrayList<MultiRowRangeFilter.RowRange> rowRangesList = new ArrayList<>(); + rowRangesList + .add(new MultiRowRangeFilter.RowRange(Bytes.toBytes(50), true, Bytes.toBytes(50), true)); + Scan scan = new Scan(); + scan.setFilter(new MultiRowRangeFilter(rowRangesList)); + int resultsSize = getResultsSize(ht, scan); + assertEquals(1, resultsSize); + rowRangesList.clear(); + rowRangesList + .add(new MultiRowRangeFilter.RowRange(Bytes.toBytes(50), true, Bytes.toBytes(51), false)); + scan = new Scan(); + scan.setFilter(new MultiRowRangeFilter(rowRangesList)); + resultsSize = getResultsSize(ht, scan); + assertEquals(1, resultsSize); + rowRangesList.clear(); + rowRangesList + .add(new MultiRowRangeFilter.RowRange(Bytes.toBytes(50), true, Bytes.toBytes(51), true)); + scan = new Scan(); + scan.setFilter(new MultiRowRangeFilter(rowRangesList)); + resultsSize = getResultsSize(ht, scan); + assertEquals(2, resultsSize); + ht.close(); + } + private void generateRows(int numberOfRows, HTable ht, byte[] family, byte[] qf, byte[] value) throws IOException { for (int i = 0; i < numberOfRows; i++) { @@ -485,6 +514,7 @@ public class TestMultiRowRangeFilter { kvList.add(kv); } } + scanner.close(); return kvList; } @@ -497,6 +527,7 @@ public class TestMultiRowRangeFilter { results.add(kv); } } + scanner.close(); return results.size(); } }