From f2a54548fcd553b99a94fdfc26697a25e6d79ede Mon Sep 17 00:00:00 2001 From: guangzhixu Date: Wed, 27 Mar 2024 14:46:15 +0800 Subject: [PATCH] cover bitFlip --- db.go | 8 ++++---- db_test.go | 32 ++++++++++++++++++++++---------- structx/bitmap.go | 4 ++-- 3 files changed, 28 insertions(+), 16 deletions(-) diff --git a/db.go b/db.go index a40f4c1..85744f0 100644 --- a/db.go +++ b/db.go @@ -184,7 +184,7 @@ var cmdTable = []Cmd{ }}, {OpBitFlip, func(db *DB, reader *codeman.Reader) error { // key, offset - return db.BitFlip(reader.Str(), reader.Uint32()) + return db.BitFlip(reader.Str(), reader.Uint32(), reader.Uint32()) }}, {OpBitMerge, func(db *DB, reader *codeman.Reader) error { // op, key, items @@ -709,13 +709,13 @@ func (db *DB) BitSet(key string, val bool, offsets ...uint32) (int, error) { } // BitFlip -func (db *DB) BitFlip(key string, offset uint32) error { +func (db *DB) BitFlip(key string, start, end uint32) error { bm, err := db.fetchBitMap(key) if err != nil { return err } - db.encode(newCodec(OpBitFlip).Str(key).Uint32(offset)) - bm.Flip(uint64(offset)) + db.encode(newCodec(OpBitFlip).Str(key).Uint32(start).Uint32(end)) + bm.Flip(uint64(start), uint64(end)) return nil } diff --git a/db_test.go b/db_test.go index 62af859..44e2a5e 100644 --- a/db_test.go +++ b/db_test.go @@ -28,12 +28,13 @@ func createDB() (*DB, error) { func TestDB(t *testing.T) { println("===== TestDB =====") assert := assert.New(t) + const N = 5000 db, err := createDB() assert.Nil(err) // Test db operations - for i := 0; i < 20000; i++ { + for i := 0; i < N; i++ { key := strconv.Itoa(i) val := []byte(strconv.Itoa(i)) db.Set("set-"+key, val) @@ -47,7 +48,7 @@ func TestDB(t *testing.T) { var ts int64 now := time.Now().UnixNano() - for i := 0; i < 10000; i++ { + for i := 0; i < N; i++ { key := strconv.Itoa(i) // set val, _, err := db.Get("set-" + key) @@ -76,8 +77,8 @@ func TestDB(t *testing.T) { count++ return true }) - assert.Equal(count, 40000) - assert.Equal(int(db.Len()), 60000) + assert.Equal(count, N*2) + assert.Equal(int(db.Len()), N*3) // GC db.GC() @@ -86,8 +87,8 @@ func TestDB(t *testing.T) { count++ return true }) - assert.Equal(count, 40000) - assert.Equal(int(db.Len()), 40000) + assert.Equal(count, N*2) + assert.Equal(int(db.Len()), N*2) // Error val, _, err := db.Get("map") @@ -459,9 +460,6 @@ func TestBitmap(t *testing.T) { assert.True(ok) assert.Nil(err) - // TODO - db.BitFlip(key, uint32(i)) - // Error db.BitSet("my-bitset", true, 1) db.Set("none", []byte("1")) @@ -474,7 +472,7 @@ func TestBitmap(t *testing.T) { assert.False(ok) assert.ErrorContains(err, ErrWrongType.Error()) - err = db.BitFlip("none", uint32(i)) + err = db.BitFlip("none", uint32(i), uint32(i+1)) assert.ErrorContains(err, ErrWrongType.Error()) m, err := db.BitArray("none") @@ -533,6 +531,20 @@ func TestBitmap(t *testing.T) { assert.ElementsMatch(m1, m2) } + // flip + for i := 0; i < 1000; i++ { + db.BitSet("bf", true, uint32(i)) + } + db.BitFlip("bf", 500, 1500) + for i := 500; i < 1000; i++ { + ok, _ := db.BitTest("bf", uint32(i)) + assert.False(ok) + } + for i := 1000; i < 1500; i++ { + ok, _ := db.BitTest("bf", uint32(i)) + assert.True(ok) + } + // reload db.Close() db, err = Open(db.GetOptions()) diff --git a/structx/bitmap.go b/structx/bitmap.go index 8428aab..e1d7a24 100644 --- a/structx/bitmap.go +++ b/structx/bitmap.go @@ -49,9 +49,9 @@ func (b *Bitmap) Test(i uint32) bool { } // Flip -func (b *Bitmap) Flip(i uint64) { +func (b *Bitmap) Flip(start, end uint64) { b.Lock() - b.bm.Flip(i, i) + b.bm.Flip(start, end) b.Unlock() }