xref: /redis-3.2.3/tests/unit/type/zset.tcl (revision f166bb1d)
1start_server default.conf {} {
2    test {ZSET basic ZADD and score update} {
3        r zadd ztmp 10 x
4        r zadd ztmp 20 y
5        r zadd ztmp 30 z
6        set aux1 [r zrange ztmp 0 -1]
7        r zadd ztmp 1 y
8        set aux2 [r zrange ztmp 0 -1]
9        list $aux1 $aux2
10    } {{x y z} {y x z}}
11
12    test {ZCARD basics} {
13        r zcard ztmp
14    } {3}
15
16    test {ZCARD non existing key} {
17        r zcard ztmp-blabla
18    } {0}
19
20    test {ZRANK basics} {
21        r zadd zranktmp 10 x
22        r zadd zranktmp 20 y
23        r zadd zranktmp 30 z
24        list [r zrank zranktmp x] [r zrank zranktmp y] [r zrank zranktmp z]
25    } {0 1 2}
26
27    test {ZREVRANK basics} {
28        list [r zrevrank zranktmp x] [r zrevrank zranktmp y] [r zrevrank zranktmp z]
29    } {2 1 0}
30
31    test {ZRANK - after deletion} {
32        r zrem zranktmp y
33        list [r zrank zranktmp x] [r zrank zranktmp z]
34    } {0 1}
35
36    test {ZSCORE} {
37        set aux {}
38        set err {}
39        for {set i 0} {$i < 1000} {incr i} {
40            set score [expr rand()]
41            lappend aux $score
42            r zadd zscoretest $score $i
43        }
44        for {set i 0} {$i < 1000} {incr i} {
45            if {[r zscore zscoretest $i] != [lindex $aux $i]} {
46                set err "Expected score was [lindex $aux $i] but got [r zscore zscoretest $i] for element $i"
47                break
48            }
49        }
50        set _ $err
51    } {}
52
53    test {ZSCORE after a DEBUG RELOAD} {
54        set aux {}
55        set err {}
56        r del zscoretest
57        for {set i 0} {$i < 1000} {incr i} {
58            set score [expr rand()]
59            lappend aux $score
60            r zadd zscoretest $score $i
61        }
62        r debug reload
63        for {set i 0} {$i < 1000} {incr i} {
64            if {[r zscore zscoretest $i] != [lindex $aux $i]} {
65                set err "Expected score was [lindex $aux $i] but got [r zscore zscoretest $i] for element $i"
66                break
67            }
68        }
69        set _ $err
70    } {}
71
72    test {ZRANGE and ZREVRANGE basics} {
73        list [r zrange ztmp 0 -1] [r zrevrange ztmp 0 -1] \
74            [r zrange ztmp 1 -1] [r zrevrange ztmp 1 -1]
75    } {{y x z} {z x y} {x z} {x y}}
76
77    test {ZRANGE WITHSCORES} {
78        r zrange ztmp 0 -1 withscores
79    } {y 1 x 10 z 30}
80
81    test {ZSETs stress tester - sorting is working well?} {
82        set delta 0
83        for {set test 0} {$test < 2} {incr test} {
84            unset -nocomplain auxarray
85            array set auxarray {}
86            set auxlist {}
87            r del myzset
88            for {set i 0} {$i < 1000} {incr i} {
89                if {$test == 0} {
90                    set score [expr rand()]
91                } else {
92                    set score [expr int(rand()*10)]
93                }
94                set auxarray($i) $score
95                r zadd myzset $score $i
96                # Random update
97                if {[expr rand()] < .2} {
98                    set j [expr int(rand()*1000)]
99                    if {$test == 0} {
100                        set score [expr rand()]
101                    } else {
102                        set score [expr int(rand()*10)]
103                    }
104                    set auxarray($j) $score
105                    r zadd myzset $score $j
106                }
107            }
108            foreach {item score} [array get auxarray] {
109                lappend auxlist [list $score $item]
110            }
111            set sorted [lsort -command zlistAlikeSort $auxlist]
112            set auxlist {}
113            foreach x $sorted {
114                lappend auxlist [lindex $x 1]
115            }
116            set fromredis [r zrange myzset 0 -1]
117            set delta 0
118            for {set i 0} {$i < [llength $fromredis]} {incr i} {
119                if {[lindex $fromredis $i] != [lindex $auxlist $i]} {
120                    incr delta
121                }
122            }
123        }
124        format $delta
125    } {0}
126
127    test {ZINCRBY - can create a new sorted set} {
128        r del zset
129        r zincrby zset 1 foo
130        list [r zrange zset 0 -1] [r zscore zset foo]
131    } {foo 1}
132
133    test {ZINCRBY - increment and decrement} {
134        r zincrby zset 2 foo
135        r zincrby zset 1 bar
136        set v1 [r zrange zset 0 -1]
137        r zincrby zset 10 bar
138        r zincrby zset -5 foo
139        r zincrby zset -5 bar
140        set v2 [r zrange zset 0 -1]
141        list $v1 $v2 [r zscore zset foo] [r zscore zset bar]
142    } {{bar foo} {foo bar} -2 6}
143
144    test {ZRANGEBYSCORE and ZCOUNT basics} {
145        r del zset
146        r zadd zset 1 a
147        r zadd zset 2 b
148        r zadd zset 3 c
149        r zadd zset 4 d
150        r zadd zset 5 e
151        list [r zrangebyscore zset 2 4] [r zrangebyscore zset (2 (4] \
152             [r zcount zset 2 4] [r zcount zset (2 (4]
153    } {{b c d} c 3 1}
154
155    test {ZRANGEBYSCORE withscores} {
156        r del zset
157        r zadd zset 1 a
158        r zadd zset 2 b
159        r zadd zset 3 c
160        r zadd zset 4 d
161        r zadd zset 5 e
162        r zrangebyscore zset 2 4 withscores
163    } {b 2 c 3 d 4}
164
165    test {ZRANGEBYSCORE fuzzy test, 100 ranges in 1000 elements sorted set} {
166        set err {}
167        r del zset
168        for {set i 0} {$i < 1000} {incr i} {
169            r zadd zset [expr rand()] $i
170        }
171        for {set i 0} {$i < 100} {incr i} {
172            set min [expr rand()]
173            set max [expr rand()]
174            if {$min > $max} {
175                set aux $min
176                set min $max
177                set max $aux
178            }
179            set low [r zrangebyscore zset -inf $min]
180            set ok [r zrangebyscore zset $min $max]
181            set high [r zrangebyscore zset $max +inf]
182            set lowx [r zrangebyscore zset -inf ($min]
183            set okx [r zrangebyscore zset ($min ($max]
184            set highx [r zrangebyscore zset ($max +inf]
185
186            if {[r zcount zset -inf $min] != [llength $low]} {
187                append err "Error, len does not match zcount\n"
188            }
189            if {[r zcount zset $min $max] != [llength $ok]} {
190                append err "Error, len does not match zcount\n"
191            }
192            if {[r zcount zset $max +inf] != [llength $high]} {
193                append err "Error, len does not match zcount\n"
194            }
195            if {[r zcount zset -inf ($min] != [llength $lowx]} {
196                append err "Error, len does not match zcount\n"
197            }
198            if {[r zcount zset ($min ($max] != [llength $okx]} {
199                append err "Error, len does not match zcount\n"
200            }
201            if {[r zcount zset ($max +inf] != [llength $highx]} {
202                append err "Error, len does not match zcount\n"
203            }
204
205            foreach x $low {
206                set score [r zscore zset $x]
207                if {$score > $min} {
208                    append err "Error, score for $x is $score > $min\n"
209                }
210            }
211            foreach x $lowx {
212                set score [r zscore zset $x]
213                if {$score >= $min} {
214                    append err "Error, score for $x is $score >= $min\n"
215                }
216            }
217            foreach x $ok {
218                set score [r zscore zset $x]
219                if {$score < $min || $score > $max} {
220                    append err "Error, score for $x is $score outside $min-$max range\n"
221                }
222            }
223            foreach x $okx {
224                set score [r zscore zset $x]
225                if {$score <= $min || $score >= $max} {
226                    append err "Error, score for $x is $score outside $min-$max open range\n"
227                }
228            }
229            foreach x $high {
230                set score [r zscore zset $x]
231                if {$score < $max} {
232                    append err "Error, score for $x is $score < $max\n"
233                }
234            }
235            foreach x $highx {
236                set score [r zscore zset $x]
237                if {$score <= $max} {
238                    append err "Error, score for $x is $score <= $max\n"
239                }
240            }
241        }
242        set _ $err
243    } {}
244
245    test {ZRANGEBYSCORE with LIMIT} {
246        r del zset
247        r zadd zset 1 a
248        r zadd zset 2 b
249        r zadd zset 3 c
250        r zadd zset 4 d
251        r zadd zset 5 e
252        list \
253            [r zrangebyscore zset 0 10 LIMIT 0 2] \
254            [r zrangebyscore zset 0 10 LIMIT 2 3] \
255            [r zrangebyscore zset 0 10 LIMIT 2 10] \
256            [r zrangebyscore zset 0 10 LIMIT 20 10]
257    } {{a b} {c d e} {c d e} {}}
258
259    test {ZRANGEBYSCORE with LIMIT and withscores} {
260        r del zset
261        r zadd zset 10 a
262        r zadd zset 20 b
263        r zadd zset 30 c
264        r zadd zset 40 d
265        r zadd zset 50 e
266        r zrangebyscore zset 20 50 LIMIT 2 3 withscores
267    } {d 40 e 50}
268
269    test {ZREMRANGEBYSCORE basics} {
270        r del zset
271        r zadd zset 1 a
272        r zadd zset 2 b
273        r zadd zset 3 c
274        r zadd zset 4 d
275        r zadd zset 5 e
276        list [r zremrangebyscore zset 2 4] [r zrange zset 0 -1]
277    } {3 {a e}}
278
279    test {ZREMRANGEBYSCORE from -inf to +inf} {
280        r del zset
281        r zadd zset 1 a
282        r zadd zset 2 b
283        r zadd zset 3 c
284        r zadd zset 4 d
285        r zadd zset 5 e
286        list [r zremrangebyscore zset -inf +inf] [r zrange zset 0 -1]
287    } {5 {}}
288
289    test {ZREMRANGEBYRANK basics} {
290        r del zset
291        r zadd zset 1 a
292        r zadd zset 2 b
293        r zadd zset 3 c
294        r zadd zset 4 d
295        r zadd zset 5 e
296        list [r zremrangebyrank zset 1 3] [r zrange zset 0 -1]
297    } {3 {a e}}
298
299    test {ZUNIONSTORE against non-existing key doesn't set destination} {
300      r del zseta
301      list [r zunionstore dst_key 1 zseta] [r exists dst_key]
302    } {0 0}
303
304    test {ZUNIONSTORE basics} {
305        r del zseta zsetb zsetc
306        r zadd zseta 1 a
307        r zadd zseta 2 b
308        r zadd zseta 3 c
309        r zadd zsetb 1 b
310        r zadd zsetb 2 c
311        r zadd zsetb 3 d
312        list [r zunionstore zsetc 2 zseta zsetb] [r zrange zsetc 0 -1 withscores]
313    } {4 {a 1 b 3 d 3 c 5}}
314
315    test {ZUNIONSTORE with weights} {
316        list [r zunionstore zsetc 2 zseta zsetb weights 2 3] [r zrange zsetc 0 -1 withscores]
317    } {4 {a 2 b 7 d 9 c 12}}
318
319    test {ZUNIONSTORE with AGGREGATE MIN} {
320        list [r zunionstore zsetc 2 zseta zsetb aggregate min] [r zrange zsetc 0 -1 withscores]
321    } {4 {a 1 b 1 c 2 d 3}}
322
323    test {ZUNIONSTORE with AGGREGATE MAX} {
324        list [r zunionstore zsetc 2 zseta zsetb aggregate max] [r zrange zsetc 0 -1 withscores]
325    } {4 {a 1 b 2 c 3 d 3}}
326
327    test {ZINTERSTORE basics} {
328        list [r zinterstore zsetc 2 zseta zsetb] [r zrange zsetc 0 -1 withscores]
329    } {2 {b 3 c 5}}
330
331    test {ZINTERSTORE with weights} {
332        list [r zinterstore zsetc 2 zseta zsetb weights 2 3] [r zrange zsetc 0 -1 withscores]
333    } {2 {b 7 c 12}}
334
335    test {ZINTERSTORE with AGGREGATE MIN} {
336        list [r zinterstore zsetc 2 zseta zsetb aggregate min] [r zrange zsetc 0 -1 withscores]
337    } {2 {b 1 c 2}}
338
339    test {ZINTERSTORE with AGGREGATE MAX} {
340        list [r zinterstore zsetc 2 zseta zsetb aggregate max] [r zrange zsetc 0 -1 withscores]
341    } {2 {b 2 c 3}}
342
343    test {ZSETs skiplist implementation backlink consistency test} {
344        set diff 0
345        set elements 10000
346        for {set j 0} {$j < $elements} {incr j} {
347            r zadd myzset [expr rand()] "Element-$j"
348            r zrem myzset "Element-[expr int(rand()*$elements)]"
349        }
350        set l1 [r zrange myzset 0 -1]
351        set l2 [r zrevrange myzset 0 -1]
352        for {set j 0} {$j < [llength $l1]} {incr j} {
353            if {[lindex $l1 $j] ne [lindex $l2 end-$j]} {
354                incr diff
355            }
356        }
357        format $diff
358    } {0}
359
360    test {ZSETs ZRANK augmented skip list stress testing} {
361        set err {}
362        r del myzset
363        for {set k 0} {$k < 10000} {incr k} {
364            set i [expr {$k%1000}]
365            if {[expr rand()] < .2} {
366                r zrem myzset $i
367            } else {
368                set score [expr rand()]
369                r zadd myzset $score $i
370            }
371            set card [r zcard myzset]
372            if {$card > 0} {
373                set index [randomInt $card]
374                set ele [lindex [r zrange myzset $index $index] 0]
375                set rank [r zrank myzset $ele]
376                if {$rank != $index} {
377                    set err "$ele RANK is wrong! ($rank != $index)"
378                    break
379                }
380            }
381        }
382        set _ $err
383    } {}
384}
385