Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
029e5577
Commit
029e5577
authored
Aug 21, 2010
by
Pieter Noordhuis
Browse files
Make SORT use the hybrid set accessors to allow sorting intsets
parent
2b9a5947
Changes
2
Show whitespace changes
Inline
Side-by-side
src/sort.c
View file @
029e5577
...
@@ -202,7 +202,7 @@ void sortCommand(redisClient *c) {
...
@@ -202,7 +202,7 @@ void sortCommand(redisClient *c) {
/* Load the sorting vector with all the objects to sort */
/* Load the sorting vector with all the objects to sort */
switch
(
sortval
->
type
)
{
switch
(
sortval
->
type
)
{
case
REDIS_LIST
:
vectorlen
=
listTypeLength
(
sortval
);
break
;
case
REDIS_LIST
:
vectorlen
=
listTypeLength
(
sortval
);
break
;
case
REDIS_SET
:
vectorlen
=
dictSize
((
dict
*
)
sortval
->
ptr
);
break
;
case
REDIS_SET
:
vectorlen
=
setTypeSize
(
sortval
);
break
;
case
REDIS_ZSET
:
vectorlen
=
dictSize
(((
zset
*
)
sortval
->
ptr
)
->
dict
);
break
;
case
REDIS_ZSET
:
vectorlen
=
dictSize
(((
zset
*
)
sortval
->
ptr
)
->
dict
);
break
;
default:
vectorlen
=
0
;
redisPanic
(
"Bad SORT type"
);
/* Avoid GCC warning */
default:
vectorlen
=
0
;
redisPanic
(
"Bad SORT type"
);
/* Avoid GCC warning */
}
}
...
@@ -219,18 +219,20 @@ void sortCommand(redisClient *c) {
...
@@ -219,18 +219,20 @@ void sortCommand(redisClient *c) {
j
++
;
j
++
;
}
}
listTypeReleaseIterator
(
li
);
listTypeReleaseIterator
(
li
);
}
else
{
}
else
if
(
sortval
->
type
==
REDIS_SET
)
{
dict
*
set
;
setIterator
*
si
=
setTypeInitIterator
(
sortval
);
robj
*
ele
;
while
((
ele
=
setTypeNext
(
si
))
!=
NULL
)
{
vector
[
j
].
obj
=
ele
;
vector
[
j
].
u
.
score
=
0
;
vector
[
j
].
u
.
cmpobj
=
NULL
;
j
++
;
}
setTypeReleaseIterator
(
si
);
}
else
if
(
sortval
->
type
==
REDIS_ZSET
)
{
dict
*
set
=
((
zset
*
)
sortval
->
ptr
)
->
dict
;
dictIterator
*
di
;
dictIterator
*
di
;
dictEntry
*
setele
;
dictEntry
*
setele
;
if
(
sortval
->
type
==
REDIS_SET
)
{
set
=
sortval
->
ptr
;
}
else
{
zset
*
zs
=
sortval
->
ptr
;
set
=
zs
->
dict
;
}
di
=
dictGetIterator
(
set
);
di
=
dictGetIterator
(
set
);
while
((
setele
=
dictNext
(
di
))
!=
NULL
)
{
while
((
setele
=
dictNext
(
di
))
!=
NULL
)
{
vector
[
j
].
obj
=
dictGetEntryKey
(
setele
);
vector
[
j
].
obj
=
dictGetEntryKey
(
setele
);
...
@@ -239,6 +241,8 @@ void sortCommand(redisClient *c) {
...
@@ -239,6 +241,8 @@ void sortCommand(redisClient *c) {
j
++
;
j
++
;
}
}
dictReleaseIterator
(
di
);
dictReleaseIterator
(
di
);
}
else
{
redisPanic
(
"Unknown type"
);
}
}
redisAssert
(
j
==
vectorlen
);
redisAssert
(
j
==
vectorlen
);
...
@@ -369,7 +373,7 @@ void sortCommand(redisClient *c) {
...
@@ -369,7 +373,7 @@ void sortCommand(redisClient *c) {
}
}
/* Cleanup */
/* Cleanup */
if
(
sortval
->
type
==
REDIS_LIST
)
if
(
sortval
->
type
==
REDIS_LIST
||
sortval
->
type
==
REDIS_SET
)
for
(
j
=
0
;
j
<
vectorlen
;
j
++
)
for
(
j
=
0
;
j
<
vectorlen
;
j
++
)
decrRefCount
(
vector
[
j
].
obj
);
decrRefCount
(
vector
[
j
].
obj
);
decrRefCount
(
sortval
);
decrRefCount
(
sortval
);
...
...
tests/unit/sort.tcl
View file @
029e5577
...
@@ -38,6 +38,7 @@ start_server {
...
@@ -38,6 +38,7 @@ start_server {
foreach
{
num cmd enc title
}
{
foreach
{
num cmd enc title
}
{
16 lpush ziplist
"Ziplist"
16 lpush ziplist
"Ziplist"
64 lpush linkedlist
"Linked list"
64 lpush linkedlist
"Linked list"
16 sadd intset
"Intset"
64 sadd hashtable
"Hash table"
64 sadd hashtable
"Hash table"
}
{
}
{
set result
[
create_random_dataset $num $cmd
]
set result
[
create_random_dataset $num $cmd
]
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment