@@ -103,6 +103,28 @@ func (db *RoseDB) ZCard(key []byte) int {
103103
104104// ZRange returns the specified range of elements in the sorted set stored at key.
105105func (db * RoseDB ) ZRange (key []byte , start , stop int ) ([][]byte , error ) {
106+ return db .zRangeInternal (key , start , stop , false )
107+ }
108+
109+ // ZRevRange returns the specified range of elements in the sorted set stored at key.
110+ // The elements are considered to be ordered from the highest to the lowest score.
111+ func (db * RoseDB ) ZRevRange (key []byte , start , stop int ) ([][]byte , error ) {
112+ return db .zRangeInternal (key , start , stop , true )
113+ }
114+
115+ // ZRank returns the rank of member in the sorted set stored at key, with the scores ordered from low to high.
116+ // The rank (or index) is 0-based, which means that the member with the lowest score has rank 0.
117+ func (db * RoseDB ) ZRank (key []byte , member []byte ) (ok bool , rank int ) {
118+ return db .zRankInternal (key , member , false )
119+ }
120+
121+ // ZRevRank returns the rank of member in the sorted set stored at key, with the scores ordered from high to low.
122+ // The rank (or index) is 0-based, which means that the member with the highest score has rank 0.
123+ func (db * RoseDB ) ZRevRank (key []byte , member []byte ) (ok bool , rank int ) {
124+ return db .zRankInternal (key , member , true )
125+ }
126+
127+ func (db * RoseDB ) zRangeInternal (key []byte , start , stop int , rev bool ) ([][]byte , error ) {
106128 db .zsetIndex .mu .RLock ()
107129 defer db .zsetIndex .mu .RUnlock ()
108130 if db .zsetIndex .trees [string (key )] == nil {
@@ -111,7 +133,12 @@ func (db *RoseDB) ZRange(key []byte, start, stop int) ([][]byte, error) {
111133 idxTree := db .zsetIndex .trees [string (key )]
112134
113135 var res [][]byte
114- values := db .zsetIndex .indexes .ZRange (string (key ), start , stop )
136+ var values []interface {}
137+ if rev {
138+ values = db .zsetIndex .indexes .ZRevRange (string (key ), start , stop )
139+ } else {
140+ values = db .zsetIndex .indexes .ZRange (string (key ), start , stop )
141+ }
115142 for _ , val := range values {
116143 v , _ := val .(string )
117144 if val , err := db .getVal (idxTree , []byte (v ), ZSet ); err != nil {
@@ -122,3 +149,29 @@ func (db *RoseDB) ZRange(key []byte, start, stop int) ([][]byte, error) {
122149 }
123150 return res , nil
124151}
152+
153+ func (db * RoseDB ) zRankInternal (key []byte , member []byte , rev bool ) (ok bool , rank int ) {
154+ db .zsetIndex .mu .RLock ()
155+ defer db .zsetIndex .mu .RUnlock ()
156+ if db .zsetIndex .trees [string (key )] == nil {
157+ return
158+ }
159+
160+ if err := db .zsetIndex .murhash .Write (member ); err != nil {
161+ return
162+ }
163+ sum := db .zsetIndex .murhash .EncodeSum128 ()
164+ db .zsetIndex .murhash .Reset ()
165+
166+ var result int64
167+ if rev {
168+ result = db .zsetIndex .indexes .ZRevRank (string (key ), string (sum ))
169+ } else {
170+ result = db .zsetIndex .indexes .ZRank (string (key ), string (sum ))
171+ }
172+ if result != - 1 {
173+ ok = true
174+ rank = int (result )
175+ }
176+ return
177+ }
0 commit comments