diff --git a/storage/leveldb.go b/storage/leveldb.go index 1c429e2..fb34f6b 100644 --- a/storage/leveldb.go +++ b/storage/leveldb.go @@ -2,6 +2,10 @@ package storage import ( "bytes" + "strconv" + "strings" + + "git.pyer.club/kingecg/godocdb/utils" "github.com/syndtr/goleveldb/leveldb" ) @@ -56,4 +60,83 @@ func (s *LevelDBStorage) Scan(prefix []byte) (keys [][]byte, values [][]byte, er // Close 关闭数据库连接 func (s *LevelDBStorage) Close() { s.db.Close() -} \ No newline at end of file +} + +type LevelDBComparator struct { +} + +func (c *LevelDBComparator) Compare(a, b []byte) int { + ka := string(a) + kb := string(b) + + if strings.HasPrefix(ka, utils.Prefix_Index_Data) && strings.HasPrefix(kb, utils.Prefix_Index_Data) { + kas := strings.Split(ka, utils.Separator_Key) + kab := strings.Split(kb, utils.Separator_Key) + if kas[1] == kab[1] { + typestr := kas[2] + orderstr := kas[3] + kav := kas[4] + kbv := kab[4] + return c.mycompare(typestr, orderstr, kav, kbv) + } + + } + return bytes.Compare(a, b) +} + +// LevelDBComparator 的 mycompare 方法用于按照指定类型和排序规则比较两个字符串 +// 参数: +// types: 比较类型字符串(每个字符对应一种类型) +// orders: 排序方向字符串(每个字符对应升序/降序) +// a: 待比较的第一个字符串 +// b: 待比较的第二个字符串 +// 返回值: +// 0: 相等 +// -1: a 小于 b +// 1: a 大于 b +// +// 支持的比较类型: +// Type_String: 字符串比较 +// Type_Int: 整数比较(当前未实现) +// Type_Date: 日期比较(基于时间戳数值) +// Type_Float: 浮点数比较 +// +// 排序方向: +// 'a' 表示升序,其他值表示降序 +func (c *LevelDBComparator) mycompare(types, orders, a, b string) int { + ret := 0 + // 遍历所有比较类型 + for i := 0; i < len(types); i++ { + switch string(types[i]) { + case utils.Type_String: + ret = strings.Compare(a, b) + case utils.Type_Int: + case utils.Type_Date: + // 将字符串转换为时间戳进行比较 + ai, _ := strconv.ParseInt(a, 10, 64) + bi, _ := strconv.ParseInt(b, 10, 64) + if ai < bi { + ret = -1 + } else if ai > bi { + ret = 1 + } + case utils.Type_Float: + // 将字符串转换为浮点数进行比较 + af, _ := strconv.ParseFloat(a, 64) + bf, _ := strconv.ParseFloat(b, 64) + if af < bf { + ret = -1 + } else if af > bf { + ret = 1 + } + } + // 根据排序方向调整比较结果 + if ret != 0 { + if string(orders[i]) == "a" { + return ret + } + return -1 * ret + } + } + return ret +} diff --git a/utils/constant.go b/utils/constant.go new file mode 100644 index 0000000..9a30ecc --- /dev/null +++ b/utils/constant.go @@ -0,0 +1,13 @@ +package utils + +const ( + Prefix_Index_Data = "indexes:data:" + Prefix_Index_Meta = "indexes:meta:" + Separator_Key = ":" + Separator_IndexField = "|" + Type_String = "s" + Type_Int = "i" + Type_Float = "f" + Type_Bool = "b" + Type_Date = "d" +)