4 "list-max-ziplist-value" 16
5 "list-max-ziplist-entries" 32
6 "set-max-intset-entries" 32
9 proc create_random_dataset
{num cmd
} {
14 for {set i
0} {$i < $num} {incr i
} {
15 # Make sure all the weights are different because
16 # Redis does not use a stable sort but Tcl does.
19 set rint
[expr int
(rand
()*1000000)]
21 set rint
[expr rand
()]
23 if {![info exists seenrand
($rint)]} break
28 r hset wobj_
$i weight
$rint
29 lappend tosort
[list $i $rint]
31 set sorted
[lsort -index 1 -real $tosort]
32 for {set i
0} {$i < $num} {incr i
} {
33 lappend result
[lindex $sorted $i 0]
38 foreach {num cmd enc title
} {
39 16 lpush ziplist
"Ziplist"
40 1000 lpush linkedlist
"Linked list"
41 10000 lpush linkedlist
"Big Linked list"
42 16 sadd intset
"Intset"
43 1000 sadd hashtable
"Hash table"
44 10000 sadd hashtable
"Big Hash table"
46 set result
[create_random_dataset
$num $cmd]
47 assert_encoding
$enc tosort
49 test
"$title: SORT BY key" {
50 assert_equal
$result [r sort tosort
{BY weight_
*}]
53 test
"$title: SORT BY hash field" {
54 assert_equal
$result [r sort tosort
{BY wobj_
*->weight
}]
58 set result
[create_random_dataset
16 lpush
]
60 assert_equal
[lsort -integer $result] [r sort tosort GET
#]
63 test
"SORT GET <const>" {
65 set res
[r sort tosort GET foo
]
66 assert_equal
16 [llength $res]
67 foreach item
$res { assert_equal
{} $item }
70 test
"SORT GET (key and hash) with sanity check" {
71 set l1
[r sort tosort GET
# GET weight_*]
72 set l2
[r sort tosort GET
# GET wobj_*->weight]
73 foreach {id1 w1
} $l1 {id2 w2
} $l2 {
74 assert_equal
$id1 $id2
75 assert_equal
$w1 [r get weight_
$id1]
76 assert_equal
$w2 [r get weight_
$id1]
80 test
"SORT BY key STORE" {
81 r sort tosort
{BY weight_
*} store sort-res
82 assert_equal
$result [r
lrange sort-res
0 -1]
83 assert_equal
16 [r llen sort-res
]
84 assert_encoding ziplist sort-res
87 test
"SORT BY hash field STORE" {
88 r sort tosort
{BY wobj_
*->weight
} store sort-res
89 assert_equal
$result [r
lrange sort-res
0 -1]
90 assert_equal
16 [r llen sort-res
]
91 assert_encoding ziplist sort-res
95 assert_equal
[lsort -decreasing -integer $result] [r sort tosort
{DESC
}]
98 test
"SORT ALPHA against integer encoded strings" {
107 test
"SORT sorted set" {
114 r sort zset alpha desc
117 test
"SORT sorted set: +inf and -inf handling" {
122 r zadd zset
1000000 d
128 test
"SORT regression for issue #19, sorting floats" {
130 set floats
{1.1 5.10 3.10 7.44 2.1 5.75 6.12 0.25 1.15}
134 assert_equal
[lsort -real $floats] [r sort mylist
]
139 set res
[create_random_dataset
$num lpush
]
141 test
"SORT speed, $num element list BY key, 100 times" {
142 set start
[clock clicks
-milliseconds]
143 for {set i
0} {$i < 100} {incr i
} {
144 set sorted
[r sort tosort
{BY weight_
* LIMIT
0 10}]
146 set elapsed
[expr [clock clicks
-milliseconds]-$start]
147 puts -nonewline "\n Average time to sort: [expr double($elapsed)/100] milliseconds "
151 test
"SORT speed, $num element list BY hash field, 100 times" {
152 set start
[clock clicks
-milliseconds]
153 for {set i
0} {$i < 100} {incr i
} {
154 set sorted
[r sort tosort
{BY wobj_
*->weight LIMIT
0 10}]
156 set elapsed
[expr [clock clicks
-milliseconds]-$start]
157 puts -nonewline "\n Average time to sort: [expr double($elapsed)/100] milliseconds "
161 test
"SORT speed, $num element list directly, 100 times" {
162 set start
[clock clicks
-milliseconds]
163 for {set i
0} {$i < 100} {incr i
} {
164 set sorted
[r sort tosort
{LIMIT
0 10}]
166 set elapsed
[expr [clock clicks
-milliseconds]-$start]
167 puts -nonewline "\n Average time to sort: [expr double($elapsed)/100] milliseconds "
171 test
"SORT speed, $num element list BY <const>, 100 times" {
172 set start
[clock clicks
-milliseconds]
173 for {set i
0} {$i < 100} {incr i
} {
174 set sorted
[r sort tosort
{BY nokey LIMIT
0 10}]
176 set elapsed
[expr [clock clicks
-milliseconds]-$start]
177 puts -nonewline "\n Average time to sort: [expr double($elapsed)/100] milliseconds "