Skip to content

Commit d7935ba

Browse files
HBASE-28627 REST ScannerModel doesn't support includeStartRow/includeStopRow (addendum)
1 parent 7658672 commit d7935ba

File tree

2 files changed

+67
-2
lines changed

2 files changed

+67
-2
lines changed

hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/ScannerModel.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,10 @@ public class ScannerModel implements ProtobufMessageHandler, Serializable {
121121
private boolean cacheBlocks = true;
122122
private int limit = -1;
123123

124+
@JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = IncludeStartRowFilter.class)
124125
private boolean includeStartRow = true;
125126

127+
@JsonInclude(value = JsonInclude.Include.NON_DEFAULT)
126128
private boolean includeStopRow = false;
127129

128130
@XmlAttribute
@@ -143,6 +145,13 @@ public void setIncludeStartRow(boolean includeStartRow) {
143145
this.includeStartRow = includeStartRow;
144146
}
145147

148+
private static class IncludeStartRowFilter {
149+
@Override
150+
public boolean equals(Object value) {
151+
return Boolean.TRUE.equals(value);
152+
}
153+
}
154+
146155
/**
147156
* Implement lazily-instantiated singleton as per recipe here:
148157
* http://literatejava.com/jvm/fastest-threadsafe-singleton-jvm/

hbase-rest/src/test/java/org/apache/hadoop/hbase/rest/model/TestScannerModel.java

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
import com.fasterxml.jackson.core.JsonParseException;
2424
import com.fasterxml.jackson.databind.JsonMappingException;
25+
import com.fasterxml.jackson.databind.node.ObjectNode;
2526
import org.apache.hadoop.hbase.HBaseClassTestRule;
2627
import org.apache.hadoop.hbase.rest.ScannerResultGenerator;
2728
import org.apache.hadoop.hbase.testclassification.RestTests;
@@ -62,8 +63,7 @@ public TestScannerModel() throws Exception {
6263
AS_JSON = "{\"batch\":100,\"caching\":1000,\"cacheBlocks\":false,\"endRow\":\"enp5eng=\","
6364
+ "\"endTime\":1245393318192,\"maxVersions\":2147483647,\"startRow\":\"YWJyYWNhZGFicmE=\","
6465
+ "\"startTime\":1245219839331,\"column\":[\"Y29sdW1uMQ==\",\"Y29sdW1uMjpmb28=\"],"
65-
+ "\"labels\":[\"private\",\"public\"]," + "\"limit\":10000,"
66-
+ "\"includeStartRow\":true,\"includeStopRow\":false}";
66+
+ "\"labels\":[\"private\",\"public\"]," + "\"limit\":10000}";
6767

6868
AS_PB = "CgthYnJhY2FkYWJyYRIFenp5engaB2NvbHVtbjEaC2NvbHVtbjI6Zm9vIGQo47qL554kMLDi57mfJDj"
6969
+ "/////B0joB1IHcHJpdmF0ZVIGcHVibGljWABgkE4=";
@@ -151,4 +151,60 @@ private void verifyException(final String FILTER) throws Exception {
151151
model.setFilter(FILTER);
152152
ScannerResultGenerator.buildFilterFromModel(model);
153153
}
154+
155+
@Test()
156+
public void testToJsonWithIncludeStartRowAndIncludeStopRow() throws Exception {
157+
String jsonStr =
158+
"{\"batch\":100,\"caching\":1000,\"cacheBlocks\":false,\"endRow\":\"enp5eng=\","
159+
+ "\"endTime\":1245393318192,\"maxVersions\":2147483647,\"startRow\":\"YWJyYWNhZGFicmE=\","
160+
+ "\"startTime\":1245219839331,\"column\":[\"Y29sdW1uMQ==\",\"Y29sdW1uMjpmb28=\"],"
161+
+ "\"labels\":[\"private\",\"public\"]," + "\"limit\":10000,"
162+
+ "\"includeStartRow\":false,\"includeStopRow\":true}";
163+
164+
ObjectNode expObj = mapper.readValue(jsonStr, ObjectNode.class);
165+
ObjectNode actObj = mapper.readValue(
166+
toJSON(buildTestModelWithIncludeStartRowAndIncludeStopRow(false, true)), ObjectNode.class);
167+
assertEquals(expObj, actObj);
168+
169+
jsonStr = "{\"batch\":100,\"caching\":1000,\"cacheBlocks\":false,\"endRow\":\"enp5eng=\","
170+
+ "\"endTime\":1245393318192,\"maxVersions\":2147483647,\"startRow\":\"YWJyYWNhZGFicmE=\","
171+
+ "\"startTime\":1245219839331,\"column\":[\"Y29sdW1uMQ==\",\"Y29sdW1uMjpmb28=\"],"
172+
+ "\"labels\":[\"private\",\"public\"]," + "\"limit\":10000," + "\"includeStopRow\":true}";
173+
174+
expObj = mapper.readValue(jsonStr, ObjectNode.class);
175+
actObj = mapper.readValue(
176+
toJSON(buildTestModelWithIncludeStartRowAndIncludeStopRow(true, true)), ObjectNode.class);
177+
assertEquals(expObj, actObj);
178+
179+
jsonStr = "{\"batch\":100,\"caching\":1000,\"cacheBlocks\":false,\"endRow\":\"enp5eng=\","
180+
+ "\"endTime\":1245393318192,\"maxVersions\":2147483647,\"startRow\":\"YWJyYWNhZGFicmE=\","
181+
+ "\"startTime\":1245219839331,\"column\":[\"Y29sdW1uMQ==\",\"Y29sdW1uMjpmb28=\"],"
182+
+ "\"labels\":[\"private\",\"public\"]," + "\"limit\":10000," + "\"includeStartRow\":false}";
183+
184+
expObj = mapper.readValue(jsonStr, ObjectNode.class);
185+
actObj = mapper.readValue(
186+
toJSON(buildTestModelWithIncludeStartRowAndIncludeStopRow(false, false)), ObjectNode.class);
187+
assertEquals(expObj, actObj);
188+
189+
}
190+
191+
protected ScannerModel buildTestModelWithIncludeStartRowAndIncludeStopRow(boolean includeStartRow,
192+
boolean includeStopRow) {
193+
ScannerModel model = new ScannerModel();
194+
model.setStartRow(START_ROW);
195+
model.setEndRow(END_ROW);
196+
model.addColumn(COLUMN1);
197+
model.addColumn(COLUMN2);
198+
model.setStartTime(START_TIME);
199+
model.setEndTime(END_TIME);
200+
model.setBatch(BATCH);
201+
model.setCaching(CACHING);
202+
model.addLabel(PRIVATE);
203+
model.addLabel(PUBLIC);
204+
model.setCacheBlocks(CACHE_BLOCKS);
205+
model.setLimit(LIMIT);
206+
model.setIncludeStartRow(includeStartRow);
207+
model.setIncludeStopRow(includeStopRow);
208+
return model;
209+
}
154210
}

0 commit comments

Comments
 (0)