This is an automated email from the ASF dual-hosted git repository.

stoty pushed a commit to branch branch-3
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/branch-3 by this push:
     new 6104a943d15 HBASE-28627 REST ScannerModel doesn't support 
includeStartRow/includeStopRow (addendum)
6104a943d15 is described below

commit 6104a943d1535f2c60a596f18d4d1eb26be68496
Author: chandrasekhar-188k 
<[email protected]>
AuthorDate: Thu Nov 28 21:26:32 2024 +0530

    HBASE-28627 REST ScannerModel doesn't support 
includeStartRow/includeStopRow (addendum)
    
    (cherry picked from commit 4095c689154b97e5ef3ef51e7ad47defe0997530)
---
 .../hadoop/hbase/rest/model/ScannerModel.java      | 12 +++++
 .../hadoop/hbase/rest/model/TestScannerModel.java  | 60 +++++++++++++++++++++-
 2 files changed, 70 insertions(+), 2 deletions(-)

diff --git 
a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/ScannerModel.java 
b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/ScannerModel.java
index d68e36ad6ff..a050dc9e54f 100644
--- 
a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/ScannerModel.java
+++ 
b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/ScannerModel.java
@@ -121,8 +121,10 @@ public class ScannerModel implements 
ProtobufMessageHandler, Serializable {
   private boolean cacheBlocks = true;
   private int limit = -1;
 
+  @JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = 
IncludeStartRowFilter.class)
   private boolean includeStartRow = true;
 
+  @JsonInclude(value = JsonInclude.Include.NON_DEFAULT)
   private boolean includeStopRow = false;
 
   @XmlAttribute
@@ -143,6 +145,16 @@ public class ScannerModel implements 
ProtobufMessageHandler, Serializable {
     this.includeStartRow = includeStartRow;
   }
 
+  @edu.umd.cs.findbugs.annotations.SuppressWarnings(
+      value = { "EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_THIS", 
"HE_EQUALS_NO_HASHCODE" },
+      justification = "1.The supplied value from the JSON Value Filter is of 
Type Boolean, hence supressing the check, 2.hashCode method will not be 
invoked, hence supressing the check")
+  private static class IncludeStartRowFilter {
+    @Override
+    public boolean equals(Object value) {
+      return Boolean.TRUE.equals(value);
+    }
+  }
+
   /**
    * Implement lazily-instantiated singleton as per recipe here:
    * http://literatejava.com/jvm/fastest-threadsafe-singleton-jvm/
diff --git 
a/hbase-rest/src/test/java/org/apache/hadoop/hbase/rest/model/TestScannerModel.java
 
b/hbase-rest/src/test/java/org/apache/hadoop/hbase/rest/model/TestScannerModel.java
index 79984af62df..f68358de634 100644
--- 
a/hbase-rest/src/test/java/org/apache/hadoop/hbase/rest/model/TestScannerModel.java
+++ 
b/hbase-rest/src/test/java/org/apache/hadoop/hbase/rest/model/TestScannerModel.java
@@ -22,6 +22,7 @@ import static org.junit.Assert.assertTrue;
 
 import com.fasterxml.jackson.core.JsonParseException;
 import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.rest.ScannerResultGenerator;
 import org.apache.hadoop.hbase.testclassification.RestTests;
@@ -62,8 +63,7 @@ public class TestScannerModel extends 
TestModelBase<ScannerModel> {
     AS_JSON = 
"{\"batch\":100,\"caching\":1000,\"cacheBlocks\":false,\"endRow\":\"enp5eng=\","
       + 
"\"endTime\":1245393318192,\"maxVersions\":2147483647,\"startRow\":\"YWJyYWNhZGFicmE=\","
       + 
"\"startTime\":1245219839331,\"column\":[\"Y29sdW1uMQ==\",\"Y29sdW1uMjpmb28=\"],"
-      + "\"labels\":[\"private\",\"public\"]," + "\"limit\":10000,"
-      + "\"includeStartRow\":true,\"includeStopRow\":false}";
+      + "\"labels\":[\"private\",\"public\"]," + "\"limit\":10000}";
 
     AS_PB = 
"CgthYnJhY2FkYWJyYRIFenp5engaB2NvbHVtbjEaC2NvbHVtbjI6Zm9vIGQo47qL554kMLDi57mfJDj"
       + "/////B0joB1IHcHJpdmF0ZVIGcHVibGljWABgkE4=";
@@ -151,4 +151,60 @@ public class TestScannerModel extends 
TestModelBase<ScannerModel> {
     model.setFilter(FILTER);
     ScannerResultGenerator.buildFilterFromModel(model);
   }
+
+  @Test()
+  public void testToJsonWithIncludeStartRowAndIncludeStopRow() throws 
Exception {
+    String jsonStr =
+      
"{\"batch\":100,\"caching\":1000,\"cacheBlocks\":false,\"endRow\":\"enp5eng=\","
+        + 
"\"endTime\":1245393318192,\"maxVersions\":2147483647,\"startRow\":\"YWJyYWNhZGFicmE=\","
+        + 
"\"startTime\":1245219839331,\"column\":[\"Y29sdW1uMQ==\",\"Y29sdW1uMjpmb28=\"],"
+        + "\"labels\":[\"private\",\"public\"]," + "\"limit\":10000,"
+        + "\"includeStartRow\":false,\"includeStopRow\":true}";
+
+    ObjectNode expObj = mapper.readValue(jsonStr, ObjectNode.class);
+    ObjectNode actObj = mapper.readValue(
+      toJSON(buildTestModelWithIncludeStartRowAndIncludeStopRow(false, true)), 
ObjectNode.class);
+    assertEquals(expObj, actObj);
+
+    jsonStr = 
"{\"batch\":100,\"caching\":1000,\"cacheBlocks\":false,\"endRow\":\"enp5eng=\","
+      + 
"\"endTime\":1245393318192,\"maxVersions\":2147483647,\"startRow\":\"YWJyYWNhZGFicmE=\","
+      + 
"\"startTime\":1245219839331,\"column\":[\"Y29sdW1uMQ==\",\"Y29sdW1uMjpmb28=\"],"
+      + "\"labels\":[\"private\",\"public\"]," + "\"limit\":10000," + 
"\"includeStopRow\":true}";
+
+    expObj = mapper.readValue(jsonStr, ObjectNode.class);
+    actObj = mapper.readValue(
+      toJSON(buildTestModelWithIncludeStartRowAndIncludeStopRow(true, true)), 
ObjectNode.class);
+    assertEquals(expObj, actObj);
+
+    jsonStr = 
"{\"batch\":100,\"caching\":1000,\"cacheBlocks\":false,\"endRow\":\"enp5eng=\","
+      + 
"\"endTime\":1245393318192,\"maxVersions\":2147483647,\"startRow\":\"YWJyYWNhZGFicmE=\","
+      + 
"\"startTime\":1245219839331,\"column\":[\"Y29sdW1uMQ==\",\"Y29sdW1uMjpmb28=\"],"
+      + "\"labels\":[\"private\",\"public\"]," + "\"limit\":10000," + 
"\"includeStartRow\":false}";
+
+    expObj = mapper.readValue(jsonStr, ObjectNode.class);
+    actObj = mapper.readValue(
+      toJSON(buildTestModelWithIncludeStartRowAndIncludeStopRow(false, 
false)), ObjectNode.class);
+    assertEquals(expObj, actObj);
+
+  }
+
+  protected ScannerModel 
buildTestModelWithIncludeStartRowAndIncludeStopRow(boolean includeStartRow,
+    boolean includeStopRow) {
+    ScannerModel model = new ScannerModel();
+    model.setStartRow(START_ROW);
+    model.setEndRow(END_ROW);
+    model.addColumn(COLUMN1);
+    model.addColumn(COLUMN2);
+    model.setStartTime(START_TIME);
+    model.setEndTime(END_TIME);
+    model.setBatch(BATCH);
+    model.setCaching(CACHING);
+    model.addLabel(PRIVATE);
+    model.addLabel(PUBLIC);
+    model.setCacheBlocks(CACHE_BLOCKS);
+    model.setLimit(LIMIT);
+    model.setIncludeStartRow(includeStartRow);
+    model.setIncludeStopRow(includeStopRow);
+    return model;
+  }
 }

Reply via email to