HBASE-16299 Update REST API scanner with ability to do reverse scan

(Minwoo Kang)
This commit is contained in:
Ramkrishna 2016-08-08 14:27:13 +05:30
parent 0354dbf1ec
commit 6578481447
3 changed files with 55 additions and 1 deletions

View File

@ -69,6 +69,7 @@ public interface Constants {
String SCAN_LIMIT = "limit"; String SCAN_LIMIT = "limit";
String SCAN_FETCH_SIZE = "hbase.rest.scan.fetchsize"; String SCAN_FETCH_SIZE = "hbase.rest.scan.fetchsize";
String SCAN_FILTER = "filter"; String SCAN_FILTER = "filter";
String SCAN_REVERSED = "reversed";
String CUSTOM_FILTERS = "hbase.rest.custom.filters"; String CUSTOM_FILTERS = "hbase.rest.custom.filters";
String ROW_KEYS_PARAM_NAME = "row"; String ROW_KEYS_PARAM_NAME = "row";

View File

@ -134,6 +134,7 @@ public class TableResource extends ResourceBase {
@DefaultValue("0") @QueryParam(Constants.SCAN_START_TIME) long startTime, @DefaultValue("0") @QueryParam(Constants.SCAN_START_TIME) long startTime,
@DefaultValue(Long.MAX_VALUE + "") @QueryParam(Constants.SCAN_END_TIME) long endTime, @DefaultValue(Long.MAX_VALUE + "") @QueryParam(Constants.SCAN_END_TIME) long endTime,
@DefaultValue("true") @QueryParam(Constants.SCAN_BATCH_SIZE) boolean cacheBlocks, @DefaultValue("true") @QueryParam(Constants.SCAN_BATCH_SIZE) boolean cacheBlocks,
@DefaultValue("false") @QueryParam(Constants.SCAN_REVERSED) boolean reversed,
@DefaultValue("") @QueryParam(Constants.SCAN_FILTER) String filters) { @DefaultValue("") @QueryParam(Constants.SCAN_FILTER) String filters) {
try { try {
Filter filter = null; Filter filter = null;
@ -200,6 +201,7 @@ public class TableResource extends ResourceBase {
} }
int fetchSize = this.servlet.getConfiguration().getInt(Constants.SCAN_FETCH_SIZE, 10); int fetchSize = this.servlet.getConfiguration().getInt(Constants.SCAN_FETCH_SIZE, 10);
tableScan.setCaching(fetchSize); tableScan.setCaching(fetchSize);
tableScan.setReversed(reversed);
return new TableScanResource(hTable.getScanner(tableScan), userRequestedLimit); return new TableScanResource(hTable.getScanner(tableScan), userRequestedLimit);
} catch (Exception exp) { } catch (Exception exp) {
servlet.getMetrics().incrementFailedScanRequests(1); servlet.getMetrics().incrementFailedScanRequests(1);

View File

@ -29,6 +29,7 @@ import java.io.InputStream;
import java.io.Serializable; import java.io.Serializable;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MediaType;
@ -547,6 +548,56 @@ public class TestTableScan {
assertEquals(0, count); assertEquals(0, count);
} }
@Test
public void testReversed() throws IOException, JAXBException {
StringBuilder builder = new StringBuilder();
builder.append("/*");
builder.append("?");
builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);
builder.append("&");
builder.append(Constants.SCAN_START_ROW + "=aaa");
builder.append("&");
builder.append(Constants.SCAN_END_ROW + "=aay");
Response response = client.get("/" + TABLE + builder.toString(), Constants.MIMETYPE_XML);
assertEquals(200, response.getCode());
JAXBContext ctx = JAXBContext.newInstance(CellSetModel.class);
Unmarshaller ush = ctx.createUnmarshaller();
CellSetModel model = (CellSetModel) ush.unmarshal(response.getStream());
int count = TestScannerResource.countCellSet(model);
assertEquals(24, count);
List<RowModel> rowModels = model.getRows().subList(1, count);
//reversed
builder = new StringBuilder();
builder.append("/*");
builder.append("?");
builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);
builder.append("&");
builder.append(Constants.SCAN_START_ROW + "=aay");
builder.append("&");
builder.append(Constants.SCAN_END_ROW + "=aaa");
builder.append("&");
builder.append(Constants.SCAN_REVERSED + "=true");
response = client.get("/" + TABLE + builder.toString(), Constants.MIMETYPE_XML);
assertEquals(200, response.getCode());
model = (CellSetModel) ush.unmarshal(response.getStream());
count = TestScannerResource.countCellSet(model);
assertEquals(24, count);
List<RowModel> reversedRowModels = model.getRows().subList(1, count);
Collections.reverse(reversedRowModels);
assertEquals(rowModels.size(), reversedRowModels.size());
for (int i = 0; i < rowModels.size(); i++) {
RowModel rowModel = rowModels.get(i);
RowModel reversedRowModel = reversedRowModels.get(i);
assertEquals(new String(rowModel.getKey(), "UTF-8"),
new String(reversedRowModel.getKey(), "UTF-8"));
assertEquals(new String(rowModel.getCells().get(0).getValue(), "UTF-8"),
new String(reversedRowModel.getCells().get(0).getValue(), "UTF-8"));
}
}
public static class CustomFilter extends PrefixFilter { public static class CustomFilter extends PrefixFilter {
private byte[] key = null; private byte[] key = null;