HBASE-16299 Update REST API scanner with ability to do reverse scan
(Minwoo Kang)
This commit is contained in:
parent
0354dbf1ec
commit
6578481447
|
@ -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";
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue