[ 
https://issues.apache.org/jira/browse/HBASE-880?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12638045#action_12638045
 ] 

stack commented on HBASE-880:
-----------------------------

I took at the new patch (thanks for exercising the proposal in code J-D).  
Here's some suggestions.  In general, would suggest that HbaseMapWritable with 
all of its generics not be exposed to the user as Dogacan suggests, except we 
don't do getter/setters by the million on Get as he suggests because IMO that 
defeats point of introducing Scope object.  HBW should be wrapped.

Is Specification a better name than Scope?  The HbaseMapWritable making code 
would be replaced by new wrapper class called Specifications where 
Specifications is a map of column names to Specifications (or Scope and Scopes) 
so that for example:

{code}
-        Cell[] cells = this.metaTable.get(Bytes.toBytes(regionName),
-            columnKey, ALL_VERSIONS);
-        if (cells != null) {
-          for (Cell cell : cells) {
+        HbaseMapWritable<byte[], Scope> col = 
+          new HbaseMapWritable<byte[], Scope>();
+        Scope scope = new Scope();
+        col.put(columnKey, scope);
+        Get get = new Get(Bytes.toBytes(regionName), col);
+        RowResult rr = this.metaTable.getRow(get);
+        if (rr != null) {
+          for (Cell cell : rr.values()) {
{code}

became

{code}
-        Cell[] cells = this.metaTable.get(Bytes.toBytes(regionName),
-            columnKey, ALL_VERSIONS);
-        if (cells != null) {
-          for (Cell cell : cells) {
+        Specifications col = new Specifications();
+        col.put(columnKey, new Specification());
+        Get get = new Get(Bytes.toBytes(regionName), col);
+        RowResult rr = this.metaTable.getRow(get);
+        if (rr != null) {
+          for (Cell cell : rr.values()) {
{code}

Specifications could have a constructor that took key/Specification for case 
where only one entry.  Then you could do:

{code}
Get get = new Get(Bytes.toBytes(regionName), new Specifications(columnKey, new 
Specification());
{code}

Or

{code}
-    Cell cell = t.get(row, HConstants.COL_REGIONINFO);
-    if (cell == null) {
+    Scope scope = new Scope();
+    HbaseMapWritable<byte[], Scope> hmw = 
+      new HbaseMapWritable<byte[], Scope>();
+    hmw.put(HConstants.COL_REGIONINFO, scope);
+    Get get = new Get(row,hmw);
+    RowResult rr = t.getRow(get);
+    if (rr == null) {
{code}

becomes

{code}
-    Cell cell = t.get(row, HConstants.COL_REGIONINFO);
-    if (cell == null) {
+    Specifications specs = new Specifications(HConstants.COL_REGIONINFO, new 
Scope());
+    Get get = new Get(row, specs);
+    RowResult rr = t.getRow(get);
+    if (rr == null) {
{code}

If the above pattern where Scope is empty of all but the defaults, then why not 
a constructor on Get that takes just a column name?

Or
{code}
+    Scope scope = new Scope();
+    scope.setTimestamp(timestamp);
+    scope.setVersions(numVersions);
+    HbaseMapWritable<byte[], Scope> hmw = new HbaseMapWritable<byte[], 
Scope>();
+    hmw.put(column, scope);
+    Get get = new Get(row, -1, hmw); 
+    Collection<Cell> cells = getRow(get).values();
+    return cells.toArray(new Cell[cells.size()]);
{code}

becomes

{code}
+    Specification spec = new Specification();
+    spec.setTimestamp(timestamp);
+    spec.setVersions(numVersions);
+    Specifications hmw = new Specifications(column, spec);
+    Get get = new Get(row, -1, hmw); 
+    Collection<Cell> cells = getRow(get).values();
+    return cells.toArray(new Cell[cells.size()]);
{code}

On single-cell get, lets add to Get a getCell that returns the old fashioned 
byte []?

> Improve the current client API by creating new container classes
> ----------------------------------------------------------------
>
>                 Key: HBASE-880
>                 URL: https://issues.apache.org/jira/browse/HBASE-880
>             Project: Hadoop HBase
>          Issue Type: Improvement
>          Components: client
>            Reporter: Jean-Daniel Cryans
>            Assignee: Jean-Daniel Cryans
>             Fix For: 0.19.0
>
>         Attachments: hbase-880-patch.jpg, hbase-880-proposal4.patch, 
> hbase-880-v1.patch, hbase-880-v2.patch, hbase_client_classes.png, 
> NewCilentAPIProposoal4.gif, proposal2.jpg, proposed.jpg
>
>
> The current API does not scale very well. For each new feature, we have to 
> add many methods to take care of all the overloads. Also, the need to batch 
> row operations (gets, inserts, deletes) implies that we have to manage some 
> "entities" like we are able to do with BatchUpdate but not with the other 
> operations. The RowLock should be an attribute of such an entity.
> The scope of this jira is only to replace current API with another 
> feature-compatible one, other methods will be added in other issues.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to