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

Elliott Clark commented on HBASE-7221:
--------------------------------------

I still am against naming anything RowKey.  It just invites confusion. I don't 
think that there's any plan to support passing these objects as a row key.  So 
in my opinion they shouldn't be named that way.  When a user searches on 
google/bing/duck duck go for hbase row key they should get the documentation 
about how they should structure a row key not some class that's named row key, 
but isn't actually the type to be passed in as a row key.

Why not a more general builder style ?  

{code:java}
//Could just use magic numbers to represent replace.  Not sure how I feel about 
that
enum HashPosition {
PREPEND,
APPEND,
REPLACE
}
enum Order {
ASSENDING, //Smaller Numbers first
DESCENGING //Larger numbers first
}
class CompositeRowKeyBuilder {
  public CompositeRowKeyBuilder();
  public CompositeRowKeyBuilder(int numFields); //throw exception if the number 
of fields is off when build is called.
  public CompositeRowKeyBuilder(int numFields, int expectedBytes); //Same as 
above but allows for hint to ByteBuffer.
  private ByteBuffer bb = new ByteBuffer();
  public CompositeRowKeyBuilder addHash(Hash hash, HashPosition position);
  public CompositeRowKeyBuilder add(String s);
  public CompositeRowKeyBuilder add(String s, int length); //We should be 
trying to encourage fixed keys if possible
  public CompositeRowKeyBuilder add(Int i);
  public CompositeRowKeyBuilder add(Int i, Order o);
  public CompositeRowKeyBuilder add(Long l);
  public CompositeRowKeyBuilder add(Long l, Order o);
  public CompositeRowKeyBuilder add(Double d); //Use something like Orderly's() 
formatting allowing the sorting of double and float
  public CompositeRowKeyBuilder add(Double d, Order o);
  public CompositeRowKeyBuilder add(Float f);
  public CompositeRowKeyBuilder add(Float f, Order o);
  public CompositeRowKeyBuilder add(byte[] bytes);
  public byte[] build(); //yes I know this breaks the builder pattern a little 
bit.  But I think it's worth it.
}
class ExamplUsage {
public static void main(String[]args) {
CompositeRowKeyBuilder builder = new Builder();
//rk should = MURUMUR_HASH("TestString".getBytes + 100.toBytes) + 
"TestString".getBytes + 100.getBytes
byte[] rk = builder.addHash(Hash.MURUMUR, 
PREPEND).add(100).add("TestString").build()

//rkTwo = "MyOtherTestString".reverse().getBytes.
byte[] rkTwo = builder.setHash(Hash.REVERSE, 
REPLACE).add("MyOtherTestString").build()
}
}
{code}

Thoughts ?
                
> RowKey utility class for rowkey construction
> --------------------------------------------
>
>                 Key: HBASE-7221
>                 URL: https://issues.apache.org/jira/browse/HBASE-7221
>             Project: HBase
>          Issue Type: Improvement
>            Reporter: Doug Meil
>            Assignee: Doug Meil
>            Priority: Minor
>         Attachments: HBASE_7221.patch, hbase-common_hbase_7221_2.patch, 
> hbase-common_hbase_7221_v3.patch
>
>
> A common question in the dist-lists is how to construct rowkeys, particularly 
> composite keys.  Put/Get/Scan specifies byte[] as the rowkey, but it's up to 
> you to sensibly populate that byte-array, and that's where things tend to go 
> off the rails.
> The intent of this RowKey utility class isn't meant to add functionality into 
> Put/Get/Scan, but rather make it simpler for folks to construct said arrays.  
> Example:
> {code}
>    RowKey key = RowKey.create(RowKey.SIZEOF_MD5_HASH + RowKey.SIZEOF_LONG);
>    key.addHash(a);
>    key.add(b);
>    byte bytes[] = key.getBytes();
> {code} 

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to