Browse Source

Merge pull request #4453 from heyitsanthony/v3-withoption

clientv3: withOption for Get
Anthony Romano 10 years ago
parent
commit
70006da092
4 changed files with 42 additions and 47 deletions
  1. 11 7
      clientv3/integration/kv_test.go
  2. 3 3
      clientv3/integration/txn_test.go
  3. 10 19
      clientv3/kv.go
  4. 18 18
      clientv3/op.go

+ 11 - 7
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)
 		}

+ 3 - 3
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)
 	}

+ 10 - 19
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
 	}

+ 18 - 18
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) }
+}