From 8dcd24bd6495beb6b54e033c8abd4b8aefd17809 Mon Sep 17 00:00:00 2001 From: Anthony Romano Date: Mon, 8 Feb 2016 13:11:55 -0800 Subject: [PATCH] clientv3: withOption for Gets --- clientv3/integration/kv_test.go | 18 +++++++++------- clientv3/integration/txn_test.go | 6 +++--- clientv3/kv.go | 29 +++++++++---------------- clientv3/op.go | 36 ++++++++++++++++---------------- 4 files changed, 42 insertions(+), 47 deletions(-) diff --git a/clientv3/integration/kv_test.go b/clientv3/integration/kv_test.go index 856dbc876..d83a86dba 100644 --- a/clientv3/integration/kv_test.go +++ b/clientv3/integration/kv_test.go @@ -57,7 +57,7 @@ func TestKVPut(t *testing.T) { if _, err := kv.Put(tt.key, tt.val, tt.leaseID); err != nil { t.Fatalf("#%d: couldn't put %q (%v)", i, tt.key, err) } - resp, err := kv.Get(tt.key, 0) + resp, err := kv.Get(tt.key) if err != nil { t.Fatalf("#%d: couldn't get key (%v)", i, err) } @@ -87,7 +87,7 @@ func TestKVRange(t *testing.T) { t.Fatalf("#%d: couldn't put %q (%v)", i, key, err) } } - resp, err := kv.Get(keySet[0], 0) + resp, err := kv.Get(keySet[0]) if err != nil { t.Fatalf("couldn't get key (%v)", err) } @@ -169,7 +169,11 @@ func TestKVRange(t *testing.T) { } for i, tt := range tests { - resp, err := kv.Range(tt.begin, tt.end, 0, tt.rev, tt.sortOption) + opts := []clientv3.OpOption{clientv3.WithRange(tt.end), clientv3.WithRev(tt.rev)} + if tt.sortOption != nil { + opts = append(opts, clientv3.WithSort(tt.sortOption.Target, tt.sortOption.Order)) + } + resp, err := kv.Get(tt.begin, opts...) if err != nil { t.Fatalf("#%d: couldn't range (%v)", i, err) } @@ -213,7 +217,7 @@ func TestKVDeleteRange(t *testing.T) { if dresp.Header.Revision != tt.delRev { t.Fatalf("#%d: dresp.Header.Revision got %d, want %d", i, dresp.Header.Revision, tt.delRev) } - resp, err := kv.Range(tt.key, tt.end, 0, 0, nil) + resp, err := kv.Get(tt.key, clientv3.WithRange(tt.end)) if err != nil { t.Fatalf("#%d: couldn't get key (%v)", i, err) } @@ -245,7 +249,7 @@ func TestKVDelete(t *testing.T) { if resp.Header.Revision != 3 { t.Fatalf("resp.Header.Revision got %d, want %d", resp.Header.Revision, 3) } - gresp, err := kv.Get("foo", 0) + gresp, err := kv.Get("foo") if err != nil { t.Fatalf("couldn't get key (%v)", err) } @@ -311,7 +315,7 @@ func TestKVGetRetry(t *testing.T) { donec := make(chan struct{}) go func() { // Get will fail, but reconnect will trigger - gresp, gerr := kv.Get("foo", 0) + gresp, gerr := kv.Get("foo") if gerr != nil { t.Fatal(gerr) } @@ -359,7 +363,7 @@ func TestKVPutFailGetRetry(t *testing.T) { donec := make(chan struct{}) go func() { // Get will fail, but reconnect will trigger - gresp, gerr := kv.Get("foo", 0) + gresp, gerr := kv.Get("foo") if gerr != nil { t.Fatal(gerr) } diff --git a/clientv3/integration/txn_test.go b/clientv3/integration/txn_test.go index 43e8f0f4a..2c4f87524 100644 --- a/clientv3/integration/txn_test.go +++ b/clientv3/integration/txn_test.go @@ -57,7 +57,7 @@ func TestTxnWriteFail(t *testing.T) { donec <- struct{}{} // and ensure the put didn't take - gresp, gerr := kv.Get("foo", 0) + gresp, gerr := kv.Get("foo") if gerr != nil { t.Fatal(gerr) } @@ -92,7 +92,7 @@ func TestTxnReadRetry(t *testing.T) { donec := make(chan struct{}) go func() { - _, err := kv.Txn().Then(clientv3.OpGet("foo", 0)).Commit() + _, err := kv.Txn().Then(clientv3.OpGet("foo")).Commit() if err != nil { t.Fatalf("expected response, got error %v", err) } @@ -122,7 +122,7 @@ func TestTxnSuccess(t *testing.T) { t.Fatal(err) } - resp, err := kv.Get("foo", 0) + resp, err := kv.Get("foo") if err != nil { t.Fatal(err) } diff --git a/clientv3/kv.go b/clientv3/kv.go index d71e7da8a..2ea7444de 100644 --- a/clientv3/kv.go +++ b/clientv3/kv.go @@ -25,7 +25,6 @@ import ( type ( PutResponse pb.PutResponse - RangeResponse pb.RangeResponse GetResponse pb.RangeResponse DeleteRangeResponse pb.DeleteRangeResponse DeleteResponse pb.DeleteRangeResponse @@ -39,14 +38,14 @@ type KV interface { // To get a string of bytes, do string([]byte(0x10, 0x20)). Put(key, val string, leaseID lease.LeaseID) (*PutResponse, error) - // Range gets the keys [key, end) in the range at rev. - // If rev <=0, range gets the keys at currentRev. - // Limit limits the number of keys returned. - // If the required rev is compacted, ErrCompacted will be returned. - Range(key, end string, limit, rev int64, sort *SortOption) (*RangeResponse, error) - - // Get is like Range. A shortcut for ranging single key like [key, key+1). - Get(key string, rev int64) (*GetResponse, error) + // Get retrieves keys. + // By default, Get will return the value for "key", if any. + // When passed WithRange(end), Get will return the keys in the range [key, end). + // When passed WithRev(rev) with rev > 0, Get retrieves keys at the given revision; + // if the required revision is compacted, the request will fail with ErrCompacted . + // When passed WithLimit(limit), the number of returned keys is bounded by limit. + // When passed WithSort(), the keys will be sorted. + Get(key string, opts ...OpOption) (*GetResponse, error) // DeleteRange deletes the given range [key, end). DeleteRange(key, end string) (*DeleteRangeResponse, error) @@ -89,16 +88,8 @@ func (kv *kv) Put(key, val string, leaseID lease.LeaseID) (*PutResponse, error) return (*PutResponse)(r.GetResponsePut()), nil } -func (kv *kv) Range(key, end string, limit, rev int64, sort *SortOption) (*RangeResponse, error) { - r, err := kv.do(OpRange(key, end, limit, rev, sort)) - if err != nil { - return nil, err - } - return (*RangeResponse)(r.GetResponseRange()), nil -} - -func (kv *kv) Get(key string, rev int64) (*GetResponse, error) { - r, err := kv.do(OpGet(key, rev)) +func (kv *kv) Get(key string, opts ...OpOption) (*GetResponse, error) { + r, err := kv.do(OpGet(key, opts...)) if err != nil { return nil, err } diff --git a/clientv3/op.go b/clientv3/op.go index 07c80c0d6..532cd87c7 100644 --- a/clientv3/op.go +++ b/clientv3/op.go @@ -68,25 +68,12 @@ func (op Op) isWrite() bool { return op.t != tRange } -func OpRange(key, end string, limit, rev int64, sort *SortOption) Op { - return Op{ - t: tRange, - key: []byte(key), - end: []byte(end), - - limit: limit, - rev: rev, - sort: sort, - } -} - -func OpGet(key string, rev int64) Op { - return Op{ - t: tRange, - key: []byte(key), - - rev: rev, +func OpGet(key string, opts ...OpOption) Op { + ret := Op{t: tRange, key: []byte(key)} + for _, opt := range opts { + opt(&ret) } + return ret } func OpDeleteRange(key, end string) Op { @@ -113,3 +100,16 @@ func OpPut(key, val string, leaseID lease.LeaseID) Op { leaseID: leaseID, } } + +type OpOption func(*Op) + +func WithLimit(n int64) OpOption { return func(op *Op) { op.limit = n } } +func WithRev(rev int64) OpOption { return func(op *Op) { op.rev = rev } } +func WithSort(tgt SortTarget, order SortOrder) OpOption { + return func(op *Op) { + op.sort = &SortOption{tgt, order} + } +} +func WithRange(endKey string) OpOption { + return func(op *Op) { op.end = []byte(endKey) } +}