Skip to content

Commit

Permalink
modify review
Browse files Browse the repository at this point in the history
  • Loading branch information
gengxinMT committed Feb 14, 2019
1 parent 6463cd6 commit 05bd491
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 13 deletions.
37 changes: 28 additions & 9 deletions db/set.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package db
import (
"bytes"
"encoding/binary"
"math/rand"
"time"
)

// SetNilValue is the value set to a tikv key for tikv do not support a real empty value
Expand Down Expand Up @@ -224,12 +226,18 @@ func (set *Set) SIsmember(member []byte) (int64, error) {

// SPop removes and returns one or more random elements from the set value store at key.
func (set *Set) SPop(count int64) (members [][]byte, err error) {
// TODO BUG No rand
// Gets a random number
rand.Seed(time.Now().Unix())
randNum := int64(rand.Intn(1000))
randNum = randNum % (set.meta.Len)

if !set.Exists() {
return nil, nil
}

dkey := DataKey(set.txn.db, set.meta.ID)
prefix := append(dkey, ':')

iter, err := set.txn.t.Iter(prefix, nil)
if err != nil {
return nil, err
Expand All @@ -238,33 +246,44 @@ func (set *Set) SPop(count int64) (members [][]byte, err error) {

var del int64
var ms [][]byte
if count == 0 {
if iter.Valid() && iter.Key().HasPrefix(prefix) {
for iter.Valid() && iter.Key().HasPrefix(prefix) {
if count == 0 {
for randNum > 0 {
if err := iter.Next(); err != nil {
return nil, err
}
randNum--
continue
}
ms = append(ms, iter.Key()[len(prefix):])
if err := set.txn.t.Delete([]byte(iter.Key())); err != nil {
return nil, err
}
del++
}
} else {
for iter.Valid() && iter.Key().HasPrefix(prefix) && count != 0 {
set.meta.Len--
break
} else {
ms = append(ms, iter.Key()[len(prefix):])

if err := set.txn.t.Delete([]byte(iter.Key())); err != nil {
return nil, err
}
del++
count--
if count == 0 {
break
}
if err := iter.Next(); err != nil {
return nil, err

}
}
}
if count < set.meta.Len {

if count == 0 {
set.meta.Len -= del
} else {
set.meta.Len = 0
}

if err := set.updateMeta(); err != nil {
return nil, err
}
Expand Down
8 changes: 4 additions & 4 deletions db/set_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -346,7 +346,7 @@ func TestSet_SCard(t *testing.T) {
assert.NoError(t, err)

if err = txn.Commit(context.TODO()); err != nil {
t.Errorf("SIsmember() txn.Commit error = %v", err)
t.Errorf("SCard() txn.Commit error = %v", err)
return
}
assert.Equal(t, got, tt.want)
Expand Down Expand Up @@ -458,7 +458,7 @@ func TestSet_SPop(t *testing.T) {
assert.NotNil(t, gotMembers)

if err = txn.Commit(context.TODO()); err != nil {
t.Errorf("SIsmember() txn.Commit error = %v", err)
t.Errorf("SPop() txn.Commit error = %v", err)
return
}
assert.Equal(t, int64(len(gotMembers)), tt.wantMembersCount)
Expand Down Expand Up @@ -512,7 +512,7 @@ func TestSet_SRem(t *testing.T) {
assert.NotNil(t, got)

if err = txn.Commit(context.TODO()); err != nil {
t.Errorf("SIsmember() txn.Commit error = %v", err)
t.Errorf("SRem() txn.Commit error = %v", err)
return
}
assert.Equal(t, got, tt.want)
Expand Down Expand Up @@ -608,7 +608,7 @@ func TestSet_SMove(t *testing.T) {
assert.NoError(t, err)
assert.NotNil(t, got)
if err = txn.Commit(context.TODO()); err != nil {
t.Errorf("SIsmember() txn.Commit error = %v", err)
t.Errorf("SMove() txn.Commit error = %v", err)
return
}
iss, err := set.SIsmember(tt.args.member)
Expand Down

0 comments on commit 05bd491

Please sign in to comment.