From b45a805a8f33a29c220b1b2051ce51c1064ac88b Mon Sep 17 00:00:00 2001
From: Niels Basjes
* If the specified row does not exist, the Scanner will start from the next closest row after the
* specified row.
+ *
+ * Note:Do NOT use this in combination with
+ * {@link #setRowPrefixFilter(byte[])}.
+ * Doing so will make the scan result unexpected or even undefined.
+ *
- * Note: When use {@link #setRowPrefixFilter(byte[])}, the result might be unexpected.
+ * Note:Do NOT use this in combination with
+ * {@link #setRowPrefixFilter(byte[])}.
+ * Doing so will make the scan result unexpected or even undefined.
*
* The scan will include rows that are lexicographically less than the provided stopRow.
*
- * Note: When doing a filter for a rowKey Prefix use
- * {@link #setRowPrefixFilter(byte[])}. The 'trailing 0' will not yield the desired result.
+ * Note:Do NOT use this in combination with
+ * {@link #setRowPrefixFilter(byte[])}.
+ * Doing so will make the scan result unexpected or even undefined.
*
* The scan will include rows that are lexicographically less than (or equal to if
* {@code inclusive} is {@code true}) the provided stopRow.
+ *
+ * Note:Do NOT use this in combination with
+ * {@link #setRowPrefixFilter(byte[])}.
+ * Doing so will make the scan result unexpected or even undefined.
+ * This is a utility method that converts the desired rowPrefix into the appropriate values
* for the startRow and stopRow to achieve the desired result. This can safely be used in combination with setFilter. NOTE: Doing a {@link #withStartRow(byte[])} and/or {@link #withStopRow(byte[])}
- * after this method will yield undefined results. This CANNOT be used in combination with withStartRow and/or withStopRow.
+ * Such a combination will yield unexpected and even undefined results.
- * Note:Do NOT use this in combination with
- * {@link #setRowPrefixFilter(byte[])}.
+ * Note: Do NOT use this in combination with
+ * {@link #setRowPrefixFilter(byte[])} or {@link #setStartStopRowForPrefixScan(byte[])}.
* Doing so will make the scan result unexpected or even undefined.
*
- * Note:Do NOT use this in combination with
- * {@link #setRowPrefixFilter(byte[])}.
+ * Note: Do NOT use this in combination with
+ * {@link #setRowPrefixFilter(byte[])} or {@link #setStartStopRowForPrefixScan(byte[])}.
* Doing so will make the scan result unexpected or even undefined.
*
* The scan will include rows that are lexicographically less than the provided stopRow.
*
- * Note:Do NOT use this in combination with
- * {@link #setRowPrefixFilter(byte[])}.
+ * Note: Do NOT use this in combination with
+ * {@link #setRowPrefixFilter(byte[])} or {@link #setStartStopRowForPrefixScan(byte[])}.
* Doing so will make the scan result unexpected or even undefined.
*
- * Note:Do NOT use this in combination with
- * {@link #setRowPrefixFilter(byte[])}.
+ * Note: Do NOT use this in combination with
+ * {@link #setRowPrefixFilter(byte[])} or {@link #setStartStopRowForPrefixScan(byte[])}.
* Doing so will make the scan result unexpected or even undefined.
*
Set a filter (using stopRow and startRow) so the result set only contains rows where the + * rowKey starts with the specified prefix.
+ *This is a utility method that converts the desired rowPrefix into the appropriate values + * for the startRow and stopRow to achieve the desired result.
+ *This can safely be used in combination with setFilter.
+ *This CANNOT be used in combination with withStartRow and/or withStopRow. + * Such a combination will yield unexpected and even undefined results.
+ * @param rowPrefix the prefix all rows must start with. (Set null to remove the filter.) + * @return this + */ + public Scan setStartStopRowForPrefixScan(byte[] rowPrefix) { if (rowPrefix == null) { withStartRow(HConstants.EMPTY_START_ROW); withStopRow(HConstants.EMPTY_END_ROW); diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/quotas/QuotaTableUtil.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/quotas/QuotaTableUtil.java index 624b4751b3d2..d83b4ec43e38 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/quotas/QuotaTableUtil.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/quotas/QuotaTableUtil.java @@ -288,7 +288,7 @@ public static Scan makeQuotaSnapshotScanForTable(TableName tn) { // Limit to "u:v" column s.addColumn(QUOTA_FAMILY_USAGE, QUOTA_QUALIFIER_POLICY); if (null == tn) { - s.setRowPrefixFilter(QUOTA_TABLE_ROW_KEY_PREFIX); + s.setStartStopRowForPrefixScan(QUOTA_TABLE_ROW_KEY_PREFIX); } else { byte[] row = getTableRowKey(tn); // Limit rowspace to the "t:" prefix @@ -637,7 +637,7 @@ static void deleteTableUsageSnapshotsForNamespace(Connection connection, String throws IOException { Scan s = new Scan(); //Get rows for all tables in namespace - s.setRowPrefixFilter(Bytes.add(QUOTA_TABLE_ROW_KEY_PREFIX, Bytes.toBytes(namespace + TableName.NAMESPACE_DELIM))); + s.setStartStopRowForPrefixScan(Bytes.add(QUOTA_TABLE_ROW_KEY_PREFIX, Bytes.toBytes(namespace + TableName.NAMESPACE_DELIM))); //Scan for table usage column (u:p) in quota table s.addColumn(QUOTA_FAMILY_USAGE,QUOTA_QUALIFIER_POLICY); //Scan for table quota column (q:s) if table has a space quota defined @@ -706,7 +706,7 @@ static Scan createScanForNamespaceSnapshotSizes(String namespace) { Scan s = new Scan(); if (namespace == null || namespace.isEmpty()) { // Read all namespaces, just look at the row prefix - s.setRowPrefixFilter(QUOTA_NAMESPACE_ROW_KEY_PREFIX); + s.setStartStopRowForPrefixScan(QUOTA_NAMESPACE_ROW_KEY_PREFIX); } else { // Fetch the exact row for the table byte[] rowkey = getNamespaceRowKey(namespace); @@ -727,7 +727,7 @@ static Scan createScanForSpaceSnapshotSizes(TableName table) { Scan s = new Scan(); if (null == table) { // Read all tables, just look at the row prefix - s.setRowPrefixFilter(QUOTA_TABLE_ROW_KEY_PREFIX); + s.setStartStopRowForPrefixScan(QUOTA_TABLE_ROW_KEY_PREFIX); } else { // Fetch the exact row for the table byte[] rowkey = getTableRowKey(table); diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestImmutableScan.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestImmutableScan.java index cc8cc29b18a1..f31a50f30d36 100644 --- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestImmutableScan.java +++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestImmutableScan.java @@ -84,7 +84,7 @@ public void testScanCopyConstructor() throws Exception { .setReplicaId(3) .setReversed(true) .setRowOffsetPerColumnFamily(5) - .setRowPrefixFilter(Bytes.toBytes("row_")) + .setStartStopRowForPrefixScan(Bytes.toBytes("row_")) .setScanMetricsEnabled(true) .setReadType(Scan.ReadType.STREAM) .withStartRow(Bytes.toBytes("row_1")) @@ -181,10 +181,10 @@ private void testUnmodifiableSetters(Scan scanCopy) throws IOException { assertEquals("ImmutableScan does not allow access to withStopRow", e.getMessage()); } try { - scanCopy.setRowPrefixFilter(new byte[] { 1, 2 }); + scanCopy.setStartStopRowForPrefixScan(new byte[] { 1, 2 }); throw new RuntimeException("Should not reach here"); } catch (UnsupportedOperationException e) { - assertEquals("ImmutableScan does not allow access to setRowPrefixFilter", e.getMessage()); + assertEquals("ImmutableScan does not allow access to setStartStopRowForPrefixScan", e.getMessage()); } try { scanCopy.readAllVersions(); diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestScan.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestScan.java index fea6333b66d1..0fbf4bb07962 100644 --- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestScan.java +++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestScan.java @@ -246,7 +246,7 @@ public void testScanCopyConstructor() throws Exception { .setReplicaId(3) .setReversed(true) .setRowOffsetPerColumnFamily(5) - .setRowPrefixFilter(Bytes.toBytes("row_")) + .setStartStopRowForPrefixScan(Bytes.toBytes("row_")) .setScanMetricsEnabled(true) .setReadType(ReadType.STREAM) .withStartRow(Bytes.toBytes("row_1")) diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestScanRowPrefix.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestScanRowPrefix.java index f53195471b99..da5586fb75d3 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestScanRowPrefix.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestScanRowPrefix.java @@ -42,7 +42,7 @@ import org.slf4j.LoggerFactory; /** - * Test if Scan.setRowPrefixFilter works as intended. + * Test if Scan.setStartStopRowForPrefixScan works as intended. */ @Category({FilterTests.class, MediumTests.class}) public class TestScanRowPrefix extends FilterTestingCluster { @@ -64,8 +64,8 @@ public void testPrefixScanning() throws IOException { Table table = openTable(tableName); /** - * Note that about half of these tests were relevant for an different implementation approach - * of setRowPrefixFilter. These test cases have been retained to ensure that also the + * Note that about half of these tests were relevant for a different implementation approach + * of setStartStopRowForPrefixScan. These test cases have been retained to ensure that also the * edge cases found there are still covered. */ @@ -119,16 +119,16 @@ public void testPrefixScanning() throws IOException { // ======== // PREFIX 0 Scan scan = new Scan(); - scan.setRowPrefixFilter(prefix0); + scan.setStartStopRowForPrefixScan(prefix0); verifyScanResult(table, scan, expected0, "Scan empty prefix failed"); // ======== // PREFIX 1 scan = new Scan(); - scan.setRowPrefixFilter(prefix1); + scan.setStartStopRowForPrefixScan(prefix1); verifyScanResult(table, scan, expected1, "Scan normal prefix failed"); - scan.setRowPrefixFilter(null); + scan.setStartStopRowForPrefixScan(null); verifyScanResult(table, scan, expected0, "Scan after prefix reset failed"); scan = new Scan(); @@ -138,10 +138,10 @@ public void testPrefixScanning() throws IOException { // ======== // PREFIX 2 scan = new Scan(); - scan.setRowPrefixFilter(prefix2); + scan.setStartStopRowForPrefixScan(prefix2); verifyScanResult(table, scan, expected2, "Scan edge 0xFF prefix failed"); - scan.setRowPrefixFilter(null); + scan.setStartStopRowForPrefixScan(null); verifyScanResult(table, scan, expected0, "Scan after prefix reset failed"); scan = new Scan(); @@ -151,10 +151,10 @@ public void testPrefixScanning() throws IOException { // ======== // PREFIX 3 scan = new Scan(); - scan.setRowPrefixFilter(prefix3); + scan.setStartStopRowForPrefixScan(prefix3); verifyScanResult(table, scan, expected3, "Scan normal with 0x00 ends failed"); - scan.setRowPrefixFilter(null); + scan.setStartStopRowForPrefixScan(null); verifyScanResult(table, scan, expected0, "Scan after prefix reset failed"); scan = new Scan(); @@ -164,10 +164,10 @@ public void testPrefixScanning() throws IOException { // ======== // PREFIX 4 scan = new Scan(); - scan.setRowPrefixFilter(prefix4); + scan.setStartStopRowForPrefixScan(prefix4); verifyScanResult(table, scan, expected4, "Scan end prefix failed"); - scan.setRowPrefixFilter(null); + scan.setStartStopRowForPrefixScan(null); verifyScanResult(table, scan, expected0, "Scan after prefix reset failed"); scan = new Scan(); @@ -178,13 +178,13 @@ public void testPrefixScanning() throws IOException { // COMBINED // Prefix + Filter scan = new Scan(); - scan.setRowPrefixFilter(prefix1); + scan.setStartStopRowForPrefixScan(prefix1); verifyScanResult(table, scan, expected1, "Prefix filter failed"); scan.setFilter(new ColumnPrefixFilter(prefix2)); verifyScanResult(table, scan, expected2, "Combined Prefix + Filter failed"); - scan.setRowPrefixFilter(null); + scan.setStartStopRowForPrefixScan(null); verifyScanResult(table, scan, expected2, "Combined Prefix + Filter; removing Prefix failed"); scan.setFilter(null); @@ -196,13 +196,13 @@ public void testPrefixScanning() throws IOException { scan.setFilter(new ColumnPrefixFilter(prefix2)); verifyScanResult(table, scan, expected2, "Test filter failed"); - scan.setRowPrefixFilter(prefix1); + scan.setStartStopRowForPrefixScan(prefix1); verifyScanResult(table, scan, expected2, "Combined Filter + Prefix failed"); scan.setFilter(null); verifyScanResult(table, scan, expected1, "Combined Filter + Prefix ; removing Filter failed"); - scan.setRowPrefixFilter(null); + scan.setStartStopRowForPrefixScan(null); verifyScanResult(table, scan, expected0, "Scan after prefix reset failed"); } diff --git a/hbase-shell/src/main/ruby/hbase/table.rb b/hbase-shell/src/main/ruby/hbase/table.rb index 0cd917efcc16..68d7349c00ae 100644 --- a/hbase-shell/src/main/ruby/hbase/table.rb +++ b/hbase-shell/src/main/ruby/hbase/table.rb @@ -208,7 +208,7 @@ def _deleterows_internal(row, column = nil, # create scan to get table names using prefix scan = org.apache.hadoop.hbase.client.Scan.new - scan.setRowPrefixFilter(prefix.to_java_bytes) + scan.setStartStopRowForPrefixScan(prefix.to_java_bytes) # Run the scanner to get all rowkeys scanner = @table.getScanner(scan) # Create a list to store all deletes @@ -536,7 +536,7 @@ def _hash_to_scan(args) end # This will overwrite any startrow/stoprow settings - scan.setRowPrefixFilter(rowprefixfilter.to_java_bytes) if rowprefixfilter + scan.setStartStopRowForPrefixScan(rowprefixfilter.to_java_bytes) if rowprefixfilter # Clear converters from last scan. @converters.clear diff --git a/src/main/asciidoc/_chapters/datamodel.adoc b/src/main/asciidoc/_chapters/datamodel.adoc index dd54b1cc04cf..c8164e4696a8 100644 --- a/src/main/asciidoc/_chapters/datamodel.adoc +++ b/src/main/asciidoc/_chapters/datamodel.adoc @@ -300,7 +300,7 @@ Table table = ... // instantiate a Table instance Scan scan = new Scan(); scan.addColumn(CF, ATTR); -scan.setRowPrefixFilter(Bytes.toBytes("row")); +scan.setStartStopRowForPrefixScan(Bytes.toBytes("row")); ResultScanner rs = table.getScanner(scan); try { for (Result r = rs.next(); r != null; r = rs.next()) { From 2f040276ccf9fdd5b8905e80efb3771e09044503 Mon Sep 17 00:00:00 2001 From: Niels Basjes