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

Jim Kellerman commented on HBASE-880:
-------------------------------------

Overall, I think the patch is moving in the right direction, but I think that 
the current patch is not much less complicated than the current implementation. 
I would change it as follows:

RowOperation becomes a concrete class
- remove the timestamp as timestamps are associated with columns and not rows 
(for getRow and deleteAll see below)
- change the constuctor so it takes a row lock and not a timestamp
- add new member that is List<ColumnOperation> (see below).

Add a new base class for columns:

{code}
public class ColumnOperation implements Writable, Comparable<ColumnOperation> {
  // An empty column family means all columns in row.
  protected byte[] columnFamily = HConstants.EMPTY_BYTE_ARRAY;

  // An empty member means all members in the column.
  protected byte[] familyMember = HConstants.EMPTY_BYTE_ARRAY;

  protected long timestamp = HConstants.LATEST_TIMESTAMP;
  protected int numVersions = 1;

  public ColumnOperation(){}                    // for serialization
  protected ColumnOperation(byte[] family, byte[] member, long timestamp, int 
numVersions) {
    ...
  }
  ...
}
{code}

The class above can be used to replace get and getRow.
get(RowOperation) assumes that the List<ColumnOperation> is a list of 
ColumnOperation.

Deprecate both BatchOperation and BatchUpdate.

Add a new class that replaces BatchOperation:

{code}
public class ColumnMutation extends ColumnOperation {
  // An empty value means delete the specified column.
  protected byte[] value = HConstants.EMPTY_BYTE_ARRAY;

  public ColumnMutation() {}                    // for serialization

  // For updates (put)
  public ColumnMutation(byte[] family, byte[] member, byte[] value, long 
timestamp) {
    ...
  }

  // For deletes
  public ColumnMutation(byte[] family, byte[] member, long timestamp) {
    ...
  }
}
{code}

HTable.commit is used for both updates and deletes. It assumes that the 
List<ColumnOperation> is a list of ColumnMutation.

deleteAll becomes a commit of a RowOperation with one or more ColumnMutations:
- A single ColumnMutation with empty value, empty family, member, and default 
timestamp deletes all values for that row. With a timestamp, all the entries in 
the row that correspond to timestamp.
- A single ColumnMutation with empty value, non-empty family corresponds to 
deleteFamily (with or without timestamp as above)
- A single ColumnMutation with empty value, non-empty family and non-empty 
member corresponds to current batchUpdate delete behavior
- Multiple ColumnMutations with empty value can delete multiple families or 
multiple members.

Thus commit replaces current commit, deleteAll and deleteFamily.



> 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-v1.patch, hbase-880-v2.patch
>
>
> 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