ledisdb/ledis/sort_test.go

124 lines
5.3 KiB
Go

package ledis
import (
"runtime/debug"
"testing"
)
func testBuildValues(values ...string) [][]byte {
v := make([][]byte, 0, len(values))
for _, value := range values {
v = append(v, []byte(value))
}
return v
}
func checkSortRes(t *testing.T, res [][]byte, values ...string) {
if len(res) != len(values) {
debug.PrintStack()
t.Fatalf("invalid xsort res len, %d = %d", len(res), len(values))
}
for i := 0; i < len(res); i++ {
if string(res[i]) != values[i] {
debug.PrintStack()
t.Fatalf("invalid xsort res at %d, %s != %s", i, res[i], values[i])
}
}
}
func checkTestSort(t *testing.T, db *DB, items []string, offset int, size int, alpha bool,
desc bool, sortBy []byte, sortGet [][]byte, checkValues []string) {
vv := testBuildValues(items...)
res, err := db.xsort(vv, offset, size, alpha, desc, sortBy, sortGet)
if err != nil {
t.Fatal(err)
}
checkSortRes(t, res, checkValues...)
}
func TestSort(t *testing.T) {
db := getTestDB()
db.FlushAll()
// Prepare data
db.MSet(
KVPair{[]byte("weight_1"), []byte("30")},
KVPair{[]byte("weight_2"), []byte("20")},
KVPair{[]byte("weight_3"), []byte("10")},
KVPair{[]byte("weight_a"), []byte("60")},
KVPair{[]byte("weight_b"), []byte("50")},
KVPair{[]byte("weight_c"), []byte("40")})
db.HSet([]byte("hash_weight_1"), []byte("index"), []byte("30"))
db.HSet([]byte("hash_weight_2"), []byte("index"), []byte("20"))
db.HSet([]byte("hash_weight_3"), []byte("index"), []byte("10"))
db.HSet([]byte("hash_weight_a"), []byte("index"), []byte("60"))
db.HSet([]byte("hash_weight_b"), []byte("index"), []byte("50"))
db.HSet([]byte("hash_weight_c"), []byte("index"), []byte("40"))
db.MSet(
KVPair{[]byte("object_1"), []byte("30")},
KVPair{[]byte("object_2"), []byte("20")},
KVPair{[]byte("object_3"), []byte("10")},
KVPair{[]byte("number_1"), []byte("10")},
KVPair{[]byte("number_2"), []byte("20")},
KVPair{[]byte("number_3"), []byte("30")},
KVPair{[]byte("object_a"), []byte("60")},
KVPair{[]byte("object_b"), []byte("50")},
KVPair{[]byte("object_c"), []byte("40")},
KVPair{[]byte("number_a"), []byte("40")},
KVPair{[]byte("number_b"), []byte("50")},
KVPair{[]byte("number_c"), []byte("60")})
db.HSet([]byte("hash_object_1"), []byte("index"), []byte("30"))
db.HSet([]byte("hash_object_2"), []byte("index"), []byte("20"))
db.HSet([]byte("hash_object_3"), []byte("index"), []byte("10"))
db.HSet([]byte("hash_number_1"), []byte("index"), []byte("10"))
db.HSet([]byte("hash_number_2"), []byte("index"), []byte("20"))
db.HSet([]byte("hash_number_3"), []byte("index"), []byte("30"))
db.HSet([]byte("hash_object_a"), []byte("index"), []byte("60"))
db.HSet([]byte("hash_object_b"), []byte("index"), []byte("50"))
db.HSet([]byte("hash_object_c"), []byte("index"), []byte("40"))
db.HSet([]byte("hash_number_a"), []byte("index"), []byte("40"))
db.HSet([]byte("hash_number_b"), []byte("index"), []byte("50"))
db.HSet([]byte("hash_number_c"), []byte("index"), []byte("60"))
checkTestSort(t, db, []string{"3", "2", "1"}, 0, -1, false, false, nil, nil, []string{"1", "2", "3"})
checkTestSort(t, db, []string{"3", "2", "1"}, 0, 1, false, false, nil, nil, []string{"1"})
checkTestSort(t, db, []string{"3", "2", "1"}, 0, 2, false, false, nil, nil, []string{"1", "2"})
checkTestSort(t, db, []string{"3", "2", "1"}, 0, 3, false, false, nil, nil, []string{"1", "2", "3"})
checkTestSort(t, db, []string{"3", "2", "1"}, 0, 4, false, false, nil, nil, []string{"1", "2", "3"})
checkTestSort(t, db, []string{"3", "2", "1"}, 0, -1, true, false, nil, nil, []string{"1", "2", "3"})
checkTestSort(t, db, []string{"3", "2", "1"}, 0, -1, false, true, nil, nil, []string{"3", "2", "1"})
if _, err := db.xsort(testBuildValues("c", "b", "a"), 0, -1, false, false, nil, nil); err == nil {
t.Fatal("must nil")
}
checkTestSort(t, db, []string{"c", "b", "a"}, 0, -1, true, false, nil, nil, []string{"a", "b", "c"})
checkTestSort(t, db, []string{"c", "b", "a"}, 0, -1, true, true, nil, nil, []string{"c", "b", "a"})
checkTestSort(t, db, []string{"1", "2", "3"}, 0, 1, false, false, nil, nil, []string{"1"})
checkTestSort(t, db, []string{"1", "2", "3"}, 0, 1, false, true, nil, nil, []string{"3"})
checkTestSort(t, db, []string{"3", "2", "1"}, 0, -1, false, false, []byte("abc"), nil, []string{"3", "2", "1"})
checkTestSort(t, db, []string{"3", "2", "1"}, 0, -1, false, false, []byte("weight_*"), nil, []string{"3", "2", "1"})
checkTestSort(t, db, []string{"3", "2", "1"}, 0, -1, false, true, []byte("weight_*"), nil, []string{"1", "2", "3"})
checkTestSort(t, db, []string{"3", "2", "1"}, 0, -1, false, false, []byte("hash_weight_*->index"), nil, []string{"3", "2", "1"})
checkTestSort(t, db, []string{"3", "2", "1"}, 0, -1, false, false, nil, [][]byte{[]byte("object_*")}, []string{"30", "20", "10"})
checkTestSort(t, db, []string{"3", "2", "1"}, 0, -1, false, false, nil, [][]byte{[]byte("number_*")}, []string{"10", "20", "30"})
checkTestSort(t, db, []string{"3", "2", "1"}, 0, -1, false, false, nil, [][]byte{[]byte("#"), []byte("number_*")},
[]string{"1", "10", "2", "20", "3", "30"})
checkTestSort(t, db, []string{"3", "2", "1"}, 0, -1, false, false, nil, [][]byte{[]byte("object_*"), []byte("number_*")},
[]string{"30", "10", "20", "20", "10", "30"})
checkTestSort(t, db, []string{"3", "2", "1"}, 0, -1, false, false, nil, [][]byte{[]byte("object_*_abc")}, []string{"", "", ""})
}