|
1 | 1 | package db
|
2 | 2 |
|
3 | 3 | import (
|
| 4 | + "fmt" |
4 | 5 | "io/ioutil"
|
5 | 6 | "os"
|
6 | 7 | "testing"
|
@@ -46,6 +47,14 @@ func newGoLevelDB(t *testing.T) (DB, string) {
|
46 | 47 | return db, dir
|
47 | 48 | }
|
48 | 49 |
|
| 50 | +func newGoBadgerDB(t *testing.T) (DB, string) { |
| 51 | + dir, err := ioutil.TempDir("", "badgerdb") |
| 52 | + assert.Nil(t, err) |
| 53 | + db, err := NewGoBadgerDB("test", dir, 16) |
| 54 | + assert.Nil(t, err) |
| 55 | + return db, dir |
| 56 | +} |
| 57 | + |
49 | 58 | func TestMergeIterSeek1(t *testing.T) {
|
50 | 59 | db1 := newGoMemDB(t)
|
51 | 60 | db1.Set([]byte("1"), []byte("1"))
|
@@ -279,3 +288,120 @@ func TestIterSearch(t *testing.T) {
|
279 | 288 | assert.Equal(t, "db2-key-3", string(list0[0]))
|
280 | 289 | assert.Equal(t, "db2-key-4", string(list0[1]))
|
281 | 290 | }
|
| 291 | + |
| 292 | +func TestMergeIterList(t *testing.T) { |
| 293 | + levelDB, dir := newGoLevelDB(t) |
| 294 | + testMergeIterList(t, newGoMemDB(t), newGoMemDB(t), levelDB) |
| 295 | + _ = os.RemoveAll(dir) |
| 296 | + badgerDB, dir := newGoBadgerDB(t) |
| 297 | + testMergeIterList(t, newGoMemDB(t), newGoMemDB(t), badgerDB) |
| 298 | + _ = os.RemoveAll(dir) |
| 299 | + levelDB, dir1 := newGoLevelDB(t) |
| 300 | + badgerDB, dir2 := newGoBadgerDB(t) |
| 301 | + testMergeIterList(t, badgerDB, levelDB, newGoMemDB(t)) |
| 302 | + _ = os.RemoveAll(dir1) |
| 303 | + _ = os.RemoveAll(dir2) |
| 304 | +} |
| 305 | + |
| 306 | +func testMergeIterList(t *testing.T, db1, db2, db3 DB) { |
| 307 | + |
| 308 | + for i := 0; i < 10; i++ { |
| 309 | + db3.Set([]byte(fmt.Sprintf("key%d", i)), []byte(fmt.Sprintf("%d", i))) |
| 310 | + } |
| 311 | + //合并以后: |
| 312 | + db := NewMergedIteratorDB([]IteratorDB{db1, db2, db3}) |
| 313 | + it := NewListHelper(db) |
| 314 | + |
| 315 | + //key9 ~ key1 |
| 316 | + listAll := func(totalCount int, direction int32) [][]byte { |
| 317 | + var values [][]byte |
| 318 | + var primary []byte |
| 319 | + for i := 0; i < 3; i++ { |
| 320 | + data := it.List([]byte("key"), primary, 4, direction) |
| 321 | + values = append(values, data...) |
| 322 | + primary = []byte(fmt.Sprintf("key%s", data[len(data)-1])) |
| 323 | + } |
| 324 | + assert.Equal(t, totalCount, len(values)) |
| 325 | + return values |
| 326 | + } |
| 327 | + |
| 328 | + values := listAll(10, ListDESC) |
| 329 | + for i, val := range values { |
| 330 | + assert.Equal(t, []byte(fmt.Sprintf("%d", 9-i)), val) |
| 331 | + } |
| 332 | + values = listAll(10, ListASC) |
| 333 | + for i, val := range values { |
| 334 | + assert.Equal(t, []byte(fmt.Sprintf("%d", i)), val) |
| 335 | + } |
| 336 | + |
| 337 | + // db2数据覆盖 |
| 338 | + db2.Set([]byte("key3"), []byte("33")) |
| 339 | + values = listAll(10, ListDESC) |
| 340 | + for i, val := range values { |
| 341 | + value := []byte(fmt.Sprintf("%d", 9-i)) |
| 342 | + if i == 6 { |
| 343 | + value = []byte("33") |
| 344 | + } |
| 345 | + assert.Equal(t, value, val) |
| 346 | + } |
| 347 | + values = listAll(10, ListASC) |
| 348 | + for i, val := range values { |
| 349 | + value := []byte(fmt.Sprintf("%d", i)) |
| 350 | + if i == 3 { |
| 351 | + value = []byte("33") |
| 352 | + } |
| 353 | + assert.Equal(t, value, val) |
| 354 | + } |
| 355 | + |
| 356 | + // db1数据覆盖 |
| 357 | + db1.Set([]byte("key3"), []byte("333")) |
| 358 | + db1.Set([]byte("key5"), []byte("555")) |
| 359 | + values = listAll(10, ListDESC) |
| 360 | + for i, val := range values { |
| 361 | + value := []byte(fmt.Sprintf("%d", 9-i)) |
| 362 | + if i == 4 { |
| 363 | + value = []byte("555") |
| 364 | + } |
| 365 | + if i == 6 { |
| 366 | + value = []byte("333") |
| 367 | + } |
| 368 | + assert.Equal(t, value, val) |
| 369 | + } |
| 370 | + values = listAll(10, ListASC) |
| 371 | + for i, val := range values { |
| 372 | + value := []byte(fmt.Sprintf("%d", i)) |
| 373 | + if i == 5 { |
| 374 | + value = []byte("555") |
| 375 | + } |
| 376 | + if i == 3 { |
| 377 | + value = []byte("333") |
| 378 | + } |
| 379 | + assert.Equal(t, value, val) |
| 380 | + } |
| 381 | + |
| 382 | + // 新增key |
| 383 | + db1.Set([]byte("key91"), []byte("10")) |
| 384 | + db2.Set([]byte("key92"), []byte("11")) |
| 385 | + values = listAll(12, ListDESC) |
| 386 | + for i, val := range values { |
| 387 | + value := []byte(fmt.Sprintf("%d", 11-i)) |
| 388 | + if i == 6 { |
| 389 | + value = []byte("555") |
| 390 | + } |
| 391 | + if i == 8 { |
| 392 | + value = []byte("333") |
| 393 | + } |
| 394 | + assert.Equal(t, value, val) |
| 395 | + } |
| 396 | + values = listAll(12, ListASC) |
| 397 | + for i, val := range values { |
| 398 | + value := []byte(fmt.Sprintf("%d", i)) |
| 399 | + if i == 5 { |
| 400 | + value = []byte("555") |
| 401 | + } |
| 402 | + if i == 3 { |
| 403 | + value = []byte("333") |
| 404 | + } |
| 405 | + assert.Equal(t, value, val) |
| 406 | + } |
| 407 | +} |
0 commit comments