redis-server 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +38 -0
- data/README.md +33 -0
- data/bin/redis +114 -0
- data/redis/Makefile +5 -0
- data/redis/extconf.rb +3 -0
- data/redis/redis-2.2.11/00-RELEASENOTES +199 -0
- data/redis/redis-2.2.11/BUGS +1 -0
- data/redis/redis-2.2.11/CONTRIBUTING +13 -0
- data/redis/redis-2.2.11/COPYING +10 -0
- data/redis/redis-2.2.11/Changelog +1032 -0
- data/redis/redis-2.2.11/INSTALL +30 -0
- data/redis/redis-2.2.11/Makefile +22 -0
- data/redis/redis-2.2.11/README +83 -0
- data/redis/redis-2.2.11/TODO +4 -0
- data/redis/redis-2.2.11/client-libraries/README +11 -0
- data/redis/redis-2.2.11/deps/hiredis/COPYING +10 -0
- data/redis/redis-2.2.11/deps/hiredis/Makefile +115 -0
- data/redis/redis-2.2.11/deps/hiredis/README.md +311 -0
- data/redis/redis-2.2.11/deps/hiredis/TODO +2 -0
- data/redis/redis-2.2.11/deps/hiredis/adapters/ae.h +95 -0
- data/redis/redis-2.2.11/deps/hiredis/adapters/libev.h +113 -0
- data/redis/redis-2.2.11/deps/hiredis/adapters/libevent.h +76 -0
- data/redis/redis-2.2.11/deps/hiredis/async.c +321 -0
- data/redis/redis-2.2.11/deps/hiredis/async.h +112 -0
- data/redis/redis-2.2.11/deps/hiredis/example-ae.c +53 -0
- data/redis/redis-2.2.11/deps/hiredis/example-libev.c +47 -0
- data/redis/redis-2.2.11/deps/hiredis/example-libevent.c +48 -0
- data/redis/redis-2.2.11/deps/hiredis/example.c +67 -0
- data/redis/redis-2.2.11/deps/hiredis/fmacros.h +15 -0
- data/redis/redis-2.2.11/deps/hiredis/hiredis.c +1058 -0
- data/redis/redis-2.2.11/deps/hiredis/hiredis.h +170 -0
- data/redis/redis-2.2.11/deps/hiredis/net.c +170 -0
- data/redis/redis-2.2.11/deps/hiredis/net.h +43 -0
- data/redis/redis-2.2.11/deps/hiredis/sds.c +479 -0
- data/redis/redis-2.2.11/deps/hiredis/sds.h +77 -0
- data/redis/redis-2.2.11/deps/hiredis/test.c +479 -0
- data/redis/redis-2.2.11/deps/hiredis/util.h +40 -0
- data/redis/redis-2.2.11/deps/linenoise/Makefile +10 -0
- data/redis/redis-2.2.11/deps/linenoise/README.markdown +45 -0
- data/redis/redis-2.2.11/deps/linenoise/example.c +27 -0
- data/redis/redis-2.2.11/deps/linenoise/linenoise.c +609 -0
- data/redis/redis-2.2.11/deps/linenoise/linenoise.h +55 -0
- data/redis/redis-2.2.11/design-documents/REDIS-CLUSTER +214 -0
- data/redis/redis-2.2.11/design-documents/REDIS-CLUSTER-2 +343 -0
- data/redis/redis-2.2.11/doc/AppendCommand.html +48 -0
- data/redis/redis-2.2.11/doc/AppendOnlyFileHowto.html +41 -0
- data/redis/redis-2.2.11/doc/AuthCommand.html +39 -0
- data/redis/redis-2.2.11/doc/Benchmarks.html +129 -0
- data/redis/redis-2.2.11/doc/BgrewriteaofCommand.html +41 -0
- data/redis/redis-2.2.11/doc/BgsaveCommand.html +39 -0
- data/redis/redis-2.2.11/doc/BlpopCommand.html +51 -0
- data/redis/redis-2.2.11/doc/BrpoplpushCommand.html +39 -0
- data/redis/redis-2.2.11/doc/CommandReference.html +47 -0
- data/redis/redis-2.2.11/doc/Comparisons.html +42 -0
- data/redis/redis-2.2.11/doc/ConfigCommand.html +76 -0
- data/redis/redis-2.2.11/doc/Configuration.html +38 -0
- data/redis/redis-2.2.11/doc/ConnectionHandlingSidebar.html +36 -0
- data/redis/redis-2.2.11/doc/ControlCommandsSidebar.html +36 -0
- data/redis/redis-2.2.11/doc/Credits.html +38 -0
- data/redis/redis-2.2.11/doc/DbsizeCommand.html +38 -0
- data/redis/redis-2.2.11/doc/DelCommand.html +41 -0
- data/redis/redis-2.2.11/doc/DesignPatterns.html +37 -0
- data/redis/redis-2.2.11/doc/EventLibray.html +44 -0
- data/redis/redis-2.2.11/doc/ExistsCommand.html +42 -0
- data/redis/redis-2.2.11/doc/ExpireCommand.html +96 -0
- data/redis/redis-2.2.11/doc/FAQ.html +70 -0
- data/redis/redis-2.2.11/doc/Features.html +38 -0
- data/redis/redis-2.2.11/doc/FlushallCommand.html +39 -0
- data/redis/redis-2.2.11/doc/FlushdbCommand.html +39 -0
- data/redis/redis-2.2.11/doc/FromSqlToDataStructures.html +37 -0
- data/redis/redis-2.2.11/doc/GenericCommandsSidebar.html +36 -0
- data/redis/redis-2.2.11/doc/GetCommand.html +39 -0
- data/redis/redis-2.2.11/doc/GetbitCommand.html +39 -0
- data/redis/redis-2.2.11/doc/GetsetCommand.html +38 -0
- data/redis/redis-2.2.11/doc/HackingStrings.html +83 -0
- data/redis/redis-2.2.11/doc/HashCommandsSidebar.html +36 -0
- data/redis/redis-2.2.11/doc/Hashes.html +37 -0
- data/redis/redis-2.2.11/doc/HdelCommand.html +39 -0
- data/redis/redis-2.2.11/doc/HexistsCommand.html +39 -0
- data/redis/redis-2.2.11/doc/HgetCommand.html +39 -0
- data/redis/redis-2.2.11/doc/HgetallCommand.html +40 -0
- data/redis/redis-2.2.11/doc/HincrbyCommand.html +45 -0
- data/redis/redis-2.2.11/doc/HlenCommand.html +38 -0
- data/redis/redis-2.2.11/doc/HmgetCommand.html +40 -0
- data/redis/redis-2.2.11/doc/HmsetCommand.html +40 -0
- data/redis/redis-2.2.11/doc/HsetCommand.html +40 -0
- data/redis/redis-2.2.11/doc/HsetnxCommand.html +41 -0
- data/redis/redis-2.2.11/doc/IncrCommand.html +43 -0
- data/redis/redis-2.2.11/doc/InfoCommand.html +48 -0
- data/redis/redis-2.2.11/doc/IntroductionToRedisDataTypes.html +152 -0
- data/redis/redis-2.2.11/doc/KeysCommand.html +43 -0
- data/redis/redis-2.2.11/doc/LastsaveCommand.html +39 -0
- data/redis/redis-2.2.11/doc/LindexCommand.html +40 -0
- data/redis/redis-2.2.11/doc/ListCommandsSidebar.html +36 -0
- data/redis/redis-2.2.11/doc/Lists.html +42 -0
- data/redis/redis-2.2.11/doc/LlenCommand.html +41 -0
- data/redis/redis-2.2.11/doc/LpopCommand.html +41 -0
- data/redis/redis-2.2.11/doc/LrangeCommand.html +47 -0
- data/redis/redis-2.2.11/doc/LremCommand.html +41 -0
- data/redis/redis-2.2.11/doc/LsetCommand.html +38 -0
- data/redis/redis-2.2.11/doc/LtrimCommand.html +47 -0
- data/redis/redis-2.2.11/doc/MgetCommand.html +52 -0
- data/redis/redis-2.2.11/doc/MonitorCommand.html +63 -0
- data/redis/redis-2.2.11/doc/MoveCommand.html +42 -0
- data/redis/redis-2.2.11/doc/MsetCommand.html +44 -0
- data/redis/redis-2.2.11/doc/MultiExecCommand.html +166 -0
- data/redis/redis-2.2.11/doc/NonexistentCommands.html +51 -0
- data/redis/redis-2.2.11/doc/ObjectHashMappers.html +39 -0
- data/redis/redis-2.2.11/doc/Pipelining.html +36 -0
- data/redis/redis-2.2.11/doc/ProgrammingExamples.html +38 -0
- data/redis/redis-2.2.11/doc/ProtocolSpecification.html +137 -0
- data/redis/redis-2.2.11/doc/PublishSubscribe.html +115 -0
- data/redis/redis-2.2.11/doc/QuickStart.html +68 -0
- data/redis/redis-2.2.11/doc/QuitCommand.html +38 -0
- data/redis/redis-2.2.11/doc/README.html +119 -0
- data/redis/redis-2.2.11/doc/RandomkeyCommand.html +39 -0
- data/redis/redis-2.2.11/doc/Redis0100ChangeLog.html +67 -0
- data/redis/redis-2.2.11/doc/Redis0900ChangeLog.html +56 -0
- data/redis/redis-2.2.11/doc/RedisBigData.html +61 -0
- data/redis/redis-2.2.11/doc/RedisCLI.html +37 -0
- data/redis/redis-2.2.11/doc/RedisEventLibrary.html +70 -0
- data/redis/redis-2.2.11/doc/RedisGuides.html +37 -0
- data/redis/redis-2.2.11/doc/RedisInternals.html +38 -0
- data/redis/redis-2.2.11/doc/RedisPipelining.html +93 -0
- data/redis/redis-2.2.11/doc/RedisStatus.html +56 -0
- data/redis/redis-2.2.11/doc/Redis_1_2_0_Changelog.html +40 -0
- data/redis/redis-2.2.11/doc/Redis_2_0_0_Changelog.html +62 -0
- data/redis/redis-2.2.11/doc/Redis_2_0_Whats_new.html +59 -0
- data/redis/redis-2.2.11/doc/RenameCommand.html +39 -0
- data/redis/redis-2.2.11/doc/RenamenxCommand.html +42 -0
- data/redis/redis-2.2.11/doc/ReplicationHowto.html +43 -0
- data/redis/redis-2.2.11/doc/ReplyTypes.html +42 -0
- data/redis/redis-2.2.11/doc/RoadMap.html +38 -0
- data/redis/redis-2.2.11/doc/RpoplpushCommand.html +44 -0
- data/redis/redis-2.2.11/doc/RpushCommand.html +40 -0
- data/redis/redis-2.2.11/doc/SaddCommand.html +41 -0
- data/redis/redis-2.2.11/doc/SaveCommand.html +39 -0
- data/redis/redis-2.2.11/doc/ScardCommand.html +41 -0
- data/redis/redis-2.2.11/doc/SdiffCommand.html +45 -0
- data/redis/redis-2.2.11/doc/SdiffstoreCommand.html +38 -0
- data/redis/redis-2.2.11/doc/SelectCommand.html +39 -0
- data/redis/redis-2.2.11/doc/SetCommand.html +39 -0
- data/redis/redis-2.2.11/doc/SetCommandsSidebar.html +36 -0
- data/redis/redis-2.2.11/doc/SetbitCommand.html +45 -0
- data/redis/redis-2.2.11/doc/SetexCommand.html +42 -0
- data/redis/redis-2.2.11/doc/SetnxCommand.html +51 -0
- data/redis/redis-2.2.11/doc/SetrangeCommand.html +58 -0
- data/redis/redis-2.2.11/doc/Sets.html +36 -0
- data/redis/redis-2.2.11/doc/ShutdownCommand.html +39 -0
- data/redis/redis-2.2.11/doc/SideBar.html +36 -0
- data/redis/redis-2.2.11/doc/SinterCommand.html +40 -0
- data/redis/redis-2.2.11/doc/SinterstoreCommand.html +39 -0
- data/redis/redis-2.2.11/doc/SismemberCommand.html +42 -0
- data/redis/redis-2.2.11/doc/SlaveofCommand.html +41 -0
- data/redis/redis-2.2.11/doc/SmembersCommand.html +38 -0
- data/redis/redis-2.2.11/doc/SmoveCommand.html +44 -0
- data/redis/redis-2.2.11/doc/SortCommand.html +75 -0
- data/redis/redis-2.2.11/doc/SortedSetCommandsSidebar.html +36 -0
- data/redis/redis-2.2.11/doc/SortedSets.html +36 -0
- data/redis/redis-2.2.11/doc/Speed.html +38 -0
- data/redis/redis-2.2.11/doc/SponsorshipHistory.html +38 -0
- data/redis/redis-2.2.11/doc/SpopCommand.html +40 -0
- data/redis/redis-2.2.11/doc/SrandmemberCommand.html +40 -0
- data/redis/redis-2.2.11/doc/SremCommand.html +42 -0
- data/redis/redis-2.2.11/doc/StringCommandsSidebar.html +36 -0
- data/redis/redis-2.2.11/doc/Strings.html +37 -0
- data/redis/redis-2.2.11/doc/StrlenCommand.html +39 -0
- data/redis/redis-2.2.11/doc/SubstrCommand.html +52 -0
- data/redis/redis-2.2.11/doc/SunionCommand.html +40 -0
- data/redis/redis-2.2.11/doc/SunionstoreCommand.html +38 -0
- data/redis/redis-2.2.11/doc/SupportedLanguages.html +60 -0
- data/redis/redis-2.2.11/doc/SupportedPlatforms.html +37 -0
- data/redis/redis-2.2.11/doc/TemplateCommand.html +38 -0
- data/redis/redis-2.2.11/doc/TtlCommand.html +38 -0
- data/redis/redis-2.2.11/doc/TwitterAlikeExample.html +250 -0
- data/redis/redis-2.2.11/doc/TypeCommand.html +46 -0
- data/redis/redis-2.2.11/doc/UnstableSource.html +39 -0
- data/redis/redis-2.2.11/doc/VirtualMemorySpecification.html +156 -0
- data/redis/redis-2.2.11/doc/VirtualMemoryUserGuide.html +66 -0
- data/redis/redis-2.2.11/doc/ZaddCommand.html +43 -0
- data/redis/redis-2.2.11/doc/ZcardCommand.html +41 -0
- data/redis/redis-2.2.11/doc/ZincrbyCommand.html +42 -0
- data/redis/redis-2.2.11/doc/ZrangeCommand.html +42 -0
- data/redis/redis-2.2.11/doc/ZrangebyscoreCommand.html +77 -0
- data/redis/redis-2.2.11/doc/ZrankCommand.html +43 -0
- data/redis/redis-2.2.11/doc/ZremCommand.html +42 -0
- data/redis/redis-2.2.11/doc/ZremrangebyrankCommand.html +39 -0
- data/redis/redis-2.2.11/doc/ZremrangebyscoreCommand.html +39 -0
- data/redis/redis-2.2.11/doc/ZscoreCommand.html +41 -0
- data/redis/redis-2.2.11/doc/ZunionCommand.html +42 -0
- data/redis/redis-2.2.11/doc/ZunionstoreCommand.html +43 -0
- data/redis/redis-2.2.11/doc/index.html +43 -0
- data/redis/redis-2.2.11/doc/redis.png +0 -0
- data/redis/redis-2.2.11/doc/style.css +25 -0
- data/redis/redis-2.2.11/redis.conf +417 -0
- data/redis/redis-2.2.11/src/Makefile +177 -0
- data/redis/redis-2.2.11/src/adlist.c +325 -0
- data/redis/redis-2.2.11/src/adlist.h +92 -0
- data/redis/redis-2.2.11/src/ae.c +390 -0
- data/redis/redis-2.2.11/src/ae.h +117 -0
- data/redis/redis-2.2.11/src/ae_epoll.c +91 -0
- data/redis/redis-2.2.11/src/ae_kqueue.c +93 -0
- data/redis/redis-2.2.11/src/ae_select.c +72 -0
- data/redis/redis-2.2.11/src/anet.c +347 -0
- data/redis/redis-2.2.11/src/anet.h +57 -0
- data/redis/redis-2.2.11/src/aof.c +675 -0
- data/redis/redis-2.2.11/src/config.c +627 -0
- data/redis/redis-2.2.11/src/config.h +64 -0
- data/redis/redis-2.2.11/src/db.c +543 -0
- data/redis/redis-2.2.11/src/debug.c +314 -0
- data/redis/redis-2.2.11/src/dict.c +721 -0
- data/redis/redis-2.2.11/src/dict.h +156 -0
- data/redis/redis-2.2.11/src/fmacros.h +15 -0
- data/redis/redis-2.2.11/src/help.h +638 -0
- data/redis/redis-2.2.11/src/intset.c +422 -0
- data/redis/redis-2.2.11/src/intset.h +19 -0
- data/redis/redis-2.2.11/src/lzf.h +100 -0
- data/redis/redis-2.2.11/src/lzfP.h +159 -0
- data/redis/redis-2.2.11/src/lzf_c.c +295 -0
- data/redis/redis-2.2.11/src/lzf_d.c +150 -0
- data/redis/redis-2.2.11/src/mkreleasehdr.sh +9 -0
- data/redis/redis-2.2.11/src/multi.c +268 -0
- data/redis/redis-2.2.11/src/networking.c +899 -0
- data/redis/redis-2.2.11/src/object.c +484 -0
- data/redis/redis-2.2.11/src/pqsort.c +197 -0
- data/redis/redis-2.2.11/src/pqsort.h +15 -0
- data/redis/redis-2.2.11/src/pubsub.c +267 -0
- data/redis/redis-2.2.11/src/rdb.c +1020 -0
- data/redis/redis-2.2.11/src/redis-benchmark.c +530 -0
- data/redis/redis-2.2.11/src/redis-check-aof.c +185 -0
- data/redis/redis-2.2.11/src/redis-check-dump.c +681 -0
- data/redis/redis-2.2.11/src/redis-cli.c +773 -0
- data/redis/redis-2.2.11/src/redis.c +1677 -0
- data/redis/redis-2.2.11/src/redis.h +1022 -0
- data/redis/redis-2.2.11/src/release.c +13 -0
- data/redis/redis-2.2.11/src/replication.c +557 -0
- data/redis/redis-2.2.11/src/sds.c +639 -0
- data/redis/redis-2.2.11/src/sds.h +78 -0
- data/redis/redis-2.2.11/src/sha1.c +276 -0
- data/redis/redis-2.2.11/src/sha1.h +17 -0
- data/redis/redis-2.2.11/src/solarisfixes.h +22 -0
- data/redis/redis-2.2.11/src/sort.c +389 -0
- data/redis/redis-2.2.11/src/syncio.c +154 -0
- data/redis/redis-2.2.11/src/t_hash.c +476 -0
- data/redis/redis-2.2.11/src/t_list.c +986 -0
- data/redis/redis-2.2.11/src/t_set.c +610 -0
- data/redis/redis-2.2.11/src/t_string.c +438 -0
- data/redis/redis-2.2.11/src/t_zset.c +1084 -0
- data/redis/redis-2.2.11/src/testhelp.h +54 -0
- data/redis/redis-2.2.11/src/util.c +243 -0
- data/redis/redis-2.2.11/src/valgrind.sup +5 -0
- data/redis/redis-2.2.11/src/version.h +1 -0
- data/redis/redis-2.2.11/src/vm.c +1149 -0
- data/redis/redis-2.2.11/src/ziplist.c +1323 -0
- data/redis/redis-2.2.11/src/ziplist.h +15 -0
- data/redis/redis-2.2.11/src/zipmap.c +455 -0
- data/redis/redis-2.2.11/src/zipmap.h +48 -0
- data/redis/redis-2.2.11/src/zmalloc.c +278 -0
- data/redis/redis-2.2.11/src/zmalloc.h +47 -0
- data/redis/redis-2.2.11/tests/assets/default.conf +308 -0
- data/redis/redis-2.2.11/tests/integration/aof.tcl +104 -0
- data/redis/redis-2.2.11/tests/integration/redis-cli.tcl +208 -0
- data/redis/redis-2.2.11/tests/integration/replication.tcl +98 -0
- data/redis/redis-2.2.11/tests/support/redis.tcl +241 -0
- data/redis/redis-2.2.11/tests/support/server.tcl +294 -0
- data/redis/redis-2.2.11/tests/support/test.tcl +190 -0
- data/redis/redis-2.2.11/tests/support/tmpfile.tcl +15 -0
- data/redis/redis-2.2.11/tests/support/util.tcl +296 -0
- data/redis/redis-2.2.11/tests/test_helper.tcl +221 -0
- data/redis/redis-2.2.11/tests/unit/auth.tcl +15 -0
- data/redis/redis-2.2.11/tests/unit/basic.tcl +616 -0
- data/redis/redis-2.2.11/tests/unit/cas.tcl +135 -0
- data/redis/redis-2.2.11/tests/unit/expire.tcl +74 -0
- data/redis/redis-2.2.11/tests/unit/other.tcl +240 -0
- data/redis/redis-2.2.11/tests/unit/printver.tcl +6 -0
- data/redis/redis-2.2.11/tests/unit/protocol.tcl +62 -0
- data/redis/redis-2.2.11/tests/unit/pubsub.tcl +195 -0
- data/redis/redis-2.2.11/tests/unit/quit.tcl +40 -0
- data/redis/redis-2.2.11/tests/unit/sort.tcl +189 -0
- data/redis/redis-2.2.11/tests/unit/type/hash.tcl +300 -0
- data/redis/redis-2.2.11/tests/unit/type/list.tcl +819 -0
- data/redis/redis-2.2.11/tests/unit/type/set.tcl +334 -0
- data/redis/redis-2.2.11/tests/unit/type/zset.tcl +587 -0
- data/redis/redis-2.2.11/utils/build-static-symbols.tcl +22 -0
- data/redis/redis-2.2.11/utils/generate-command-help.rb +112 -0
- data/redis/redis-2.2.11/utils/mktarball.sh +13 -0
- data/redis/redis-2.2.11/utils/redis-copy.rb +78 -0
- data/redis/redis-2.2.11/utils/redis-sha1.rb +52 -0
- data/redis/redis-2.2.11/utils/redis_init_script +42 -0
- metadata +362 -0
@@ -0,0 +1,334 @@
|
|
1
|
+
start_server {
|
2
|
+
tags {"set"}
|
3
|
+
overrides {
|
4
|
+
"set-max-intset-entries" 512
|
5
|
+
}
|
6
|
+
} {
|
7
|
+
proc create_set {key entries} {
|
8
|
+
r del $key
|
9
|
+
foreach entry $entries { r sadd $key $entry }
|
10
|
+
}
|
11
|
+
|
12
|
+
test {SADD, SCARD, SISMEMBER, SMEMBERS basics - regular set} {
|
13
|
+
create_set myset {foo}
|
14
|
+
assert_encoding hashtable myset
|
15
|
+
assert_equal 1 [r sadd myset bar]
|
16
|
+
assert_equal 0 [r sadd myset bar]
|
17
|
+
assert_equal 2 [r scard myset]
|
18
|
+
assert_equal 1 [r sismember myset foo]
|
19
|
+
assert_equal 1 [r sismember myset bar]
|
20
|
+
assert_equal 0 [r sismember myset bla]
|
21
|
+
assert_equal {bar foo} [lsort [r smembers myset]]
|
22
|
+
}
|
23
|
+
|
24
|
+
test {SADD, SCARD, SISMEMBER, SMEMBERS basics - intset} {
|
25
|
+
create_set myset {17}
|
26
|
+
assert_encoding intset myset
|
27
|
+
assert_equal 1 [r sadd myset 16]
|
28
|
+
assert_equal 0 [r sadd myset 16]
|
29
|
+
assert_equal 2 [r scard myset]
|
30
|
+
assert_equal 1 [r sismember myset 16]
|
31
|
+
assert_equal 1 [r sismember myset 17]
|
32
|
+
assert_equal 0 [r sismember myset 18]
|
33
|
+
assert_equal {16 17} [lsort [r smembers myset]]
|
34
|
+
}
|
35
|
+
|
36
|
+
test {SADD against non set} {
|
37
|
+
r lpush mylist foo
|
38
|
+
assert_error ERR*kind* {r sadd mylist bar}
|
39
|
+
}
|
40
|
+
|
41
|
+
test "SADD a non-integer against an intset" {
|
42
|
+
create_set myset {1 2 3}
|
43
|
+
assert_encoding intset myset
|
44
|
+
assert_equal 1 [r sadd myset a]
|
45
|
+
assert_encoding hashtable myset
|
46
|
+
}
|
47
|
+
|
48
|
+
test "SADD an integer larger than 64 bits" {
|
49
|
+
create_set myset {213244124402402314402033402}
|
50
|
+
assert_encoding hashtable myset
|
51
|
+
assert_equal 1 [r sismember myset 213244124402402314402033402]
|
52
|
+
}
|
53
|
+
|
54
|
+
test "SADD overflows the maximum allowed integers in an intset" {
|
55
|
+
r del myset
|
56
|
+
for {set i 0} {$i < 512} {incr i} { r sadd myset $i }
|
57
|
+
assert_encoding intset myset
|
58
|
+
assert_equal 1 [r sadd myset 512]
|
59
|
+
assert_encoding hashtable myset
|
60
|
+
}
|
61
|
+
|
62
|
+
test "Set encoding after DEBUG RELOAD" {
|
63
|
+
r del myintset myhashset mylargeintset
|
64
|
+
for {set i 0} {$i < 100} {incr i} { r sadd myintset $i }
|
65
|
+
for {set i 0} {$i < 1280} {incr i} { r sadd mylargeintset $i }
|
66
|
+
for {set i 0} {$i < 256} {incr i} { r sadd myhashset [format "i%03d" $i] }
|
67
|
+
assert_encoding intset myintset
|
68
|
+
assert_encoding hashtable mylargeintset
|
69
|
+
assert_encoding hashtable myhashset
|
70
|
+
|
71
|
+
r debug reload
|
72
|
+
assert_encoding intset myintset
|
73
|
+
assert_encoding hashtable mylargeintset
|
74
|
+
assert_encoding hashtable myhashset
|
75
|
+
}
|
76
|
+
|
77
|
+
test {SREM basics - regular set} {
|
78
|
+
create_set myset {foo bar ciao}
|
79
|
+
assert_encoding hashtable myset
|
80
|
+
assert_equal 0 [r srem myset qux]
|
81
|
+
assert_equal 1 [r srem myset foo]
|
82
|
+
assert_equal {bar ciao} [lsort [r smembers myset]]
|
83
|
+
}
|
84
|
+
|
85
|
+
test {SREM basics - intset} {
|
86
|
+
create_set myset {3 4 5}
|
87
|
+
assert_encoding intset myset
|
88
|
+
assert_equal 0 [r srem myset 6]
|
89
|
+
assert_equal 1 [r srem myset 4]
|
90
|
+
assert_equal {3 5} [lsort [r smembers myset]]
|
91
|
+
}
|
92
|
+
|
93
|
+
foreach {type} {hashtable intset} {
|
94
|
+
for {set i 1} {$i <= 5} {incr i} {
|
95
|
+
r del [format "set%d" $i]
|
96
|
+
}
|
97
|
+
for {set i 0} {$i < 200} {incr i} {
|
98
|
+
r sadd set1 $i
|
99
|
+
r sadd set2 [expr $i+195]
|
100
|
+
}
|
101
|
+
foreach i {199 195 1000 2000} {
|
102
|
+
r sadd set3 $i
|
103
|
+
}
|
104
|
+
for {set i 5} {$i < 200} {incr i} {
|
105
|
+
r sadd set4 $i
|
106
|
+
}
|
107
|
+
r sadd set5 0
|
108
|
+
|
109
|
+
# To make sure the sets are encoded as the type we are testing -- also
|
110
|
+
# when the VM is enabled and the values may be swapped in and out
|
111
|
+
# while the tests are running -- an extra element is added to every
|
112
|
+
# set that determines its encoding.
|
113
|
+
set large 200
|
114
|
+
if {$type eq "hashtable"} {
|
115
|
+
set large foo
|
116
|
+
}
|
117
|
+
|
118
|
+
for {set i 1} {$i <= 5} {incr i} {
|
119
|
+
r sadd [format "set%d" $i] $large
|
120
|
+
}
|
121
|
+
|
122
|
+
test "Generated sets must be encoded as $type" {
|
123
|
+
for {set i 1} {$i <= 5} {incr i} {
|
124
|
+
assert_encoding $type [format "set%d" $i]
|
125
|
+
}
|
126
|
+
}
|
127
|
+
|
128
|
+
test "SINTER with two sets - $type" {
|
129
|
+
assert_equal [list 195 196 197 198 199 $large] [lsort [r sinter set1 set2]]
|
130
|
+
}
|
131
|
+
|
132
|
+
test "SINTERSTORE with two sets - $type" {
|
133
|
+
r sinterstore setres set1 set2
|
134
|
+
assert_encoding $type setres
|
135
|
+
assert_equal [list 195 196 197 198 199 $large] [lsort [r smembers setres]]
|
136
|
+
}
|
137
|
+
|
138
|
+
test "SINTERSTORE with two sets, after a DEBUG RELOAD - $type" {
|
139
|
+
r debug reload
|
140
|
+
r sinterstore setres set1 set2
|
141
|
+
assert_encoding $type setres
|
142
|
+
assert_equal [list 195 196 197 198 199 $large] [lsort [r smembers setres]]
|
143
|
+
}
|
144
|
+
|
145
|
+
test "SUNION with two sets - $type" {
|
146
|
+
set expected [lsort -uniq "[r smembers set1] [r smembers set2]"]
|
147
|
+
assert_equal $expected [lsort [r sunion set1 set2]]
|
148
|
+
}
|
149
|
+
|
150
|
+
test "SUNIONSTORE with two sets - $type" {
|
151
|
+
r sunionstore setres set1 set2
|
152
|
+
assert_encoding $type setres
|
153
|
+
set expected [lsort -uniq "[r smembers set1] [r smembers set2]"]
|
154
|
+
assert_equal $expected [lsort [r smembers setres]]
|
155
|
+
}
|
156
|
+
|
157
|
+
test "SINTER against three sets - $type" {
|
158
|
+
assert_equal [list 195 199 $large] [lsort [r sinter set1 set2 set3]]
|
159
|
+
}
|
160
|
+
|
161
|
+
test "SINTERSTORE with three sets - $type" {
|
162
|
+
r sinterstore setres set1 set2 set3
|
163
|
+
assert_equal [list 195 199 $large] [lsort [r smembers setres]]
|
164
|
+
}
|
165
|
+
|
166
|
+
test "SUNION with non existing keys - $type" {
|
167
|
+
set expected [lsort -uniq "[r smembers set1] [r smembers set2]"]
|
168
|
+
assert_equal $expected [lsort [r sunion nokey1 set1 set2 nokey2]]
|
169
|
+
}
|
170
|
+
|
171
|
+
test "SDIFF with two sets - $type" {
|
172
|
+
assert_equal {0 1 2 3 4} [lsort [r sdiff set1 set4]]
|
173
|
+
}
|
174
|
+
|
175
|
+
test "SDIFF with three sets - $type" {
|
176
|
+
assert_equal {1 2 3 4} [lsort [r sdiff set1 set4 set5]]
|
177
|
+
}
|
178
|
+
|
179
|
+
test "SDIFFSTORE with three sets - $type" {
|
180
|
+
r sdiffstore setres set1 set4 set5
|
181
|
+
# The type is determined by type of the first key to diff against.
|
182
|
+
# See the implementation for more information.
|
183
|
+
assert_encoding $type setres
|
184
|
+
assert_equal {1 2 3 4} [lsort [r smembers setres]]
|
185
|
+
}
|
186
|
+
}
|
187
|
+
|
188
|
+
test "SINTER against non-set should throw error" {
|
189
|
+
r set key1 x
|
190
|
+
assert_error "ERR*wrong kind*" {r sinter key1 noset}
|
191
|
+
}
|
192
|
+
|
193
|
+
test "SUNION against non-set should throw error" {
|
194
|
+
r set key1 x
|
195
|
+
assert_error "ERR*wrong kind*" {r sunion key1 noset}
|
196
|
+
}
|
197
|
+
|
198
|
+
test "SINTERSTORE against non existing keys should delete dstkey" {
|
199
|
+
r set setres xxx
|
200
|
+
assert_equal 0 [r sinterstore setres foo111 bar222]
|
201
|
+
assert_equal 0 [r exists setres]
|
202
|
+
}
|
203
|
+
|
204
|
+
test "SUNIONSTORE against non existing keys should delete dstkey" {
|
205
|
+
r set setres xxx
|
206
|
+
assert_equal 0 [r sunionstore setres foo111 bar222]
|
207
|
+
assert_equal 0 [r exists setres]
|
208
|
+
}
|
209
|
+
|
210
|
+
foreach {type contents} {hashtable {a b c} intset {1 2 3}} {
|
211
|
+
test "SPOP basics - $type" {
|
212
|
+
create_set myset $contents
|
213
|
+
assert_encoding $type myset
|
214
|
+
assert_equal $contents [lsort [list [r spop myset] [r spop myset] [r spop myset]]]
|
215
|
+
assert_equal 0 [r scard myset]
|
216
|
+
}
|
217
|
+
|
218
|
+
test "SRANDMEMBER - $type" {
|
219
|
+
create_set myset $contents
|
220
|
+
unset -nocomplain myset
|
221
|
+
array set myset {}
|
222
|
+
for {set i 0} {$i < 100} {incr i} {
|
223
|
+
set myset([r srandmember myset]) 1
|
224
|
+
}
|
225
|
+
assert_equal $contents [lsort [array names myset]]
|
226
|
+
}
|
227
|
+
}
|
228
|
+
|
229
|
+
proc setup_move {} {
|
230
|
+
r del myset3 myset4
|
231
|
+
create_set myset1 {1 a b}
|
232
|
+
create_set myset2 {2 3 4}
|
233
|
+
assert_encoding hashtable myset1
|
234
|
+
assert_encoding intset myset2
|
235
|
+
}
|
236
|
+
|
237
|
+
test "SMOVE basics - from regular set to intset" {
|
238
|
+
# move a non-integer element to an intset should convert encoding
|
239
|
+
setup_move
|
240
|
+
assert_equal 1 [r smove myset1 myset2 a]
|
241
|
+
assert_equal {1 b} [lsort [r smembers myset1]]
|
242
|
+
assert_equal {2 3 4 a} [lsort [r smembers myset2]]
|
243
|
+
assert_encoding hashtable myset2
|
244
|
+
|
245
|
+
# move an integer element should not convert the encoding
|
246
|
+
setup_move
|
247
|
+
assert_equal 1 [r smove myset1 myset2 1]
|
248
|
+
assert_equal {a b} [lsort [r smembers myset1]]
|
249
|
+
assert_equal {1 2 3 4} [lsort [r smembers myset2]]
|
250
|
+
assert_encoding intset myset2
|
251
|
+
}
|
252
|
+
|
253
|
+
test "SMOVE basics - from intset to regular set" {
|
254
|
+
setup_move
|
255
|
+
assert_equal 1 [r smove myset2 myset1 2]
|
256
|
+
assert_equal {1 2 a b} [lsort [r smembers myset1]]
|
257
|
+
assert_equal {3 4} [lsort [r smembers myset2]]
|
258
|
+
}
|
259
|
+
|
260
|
+
test "SMOVE non existing key" {
|
261
|
+
setup_move
|
262
|
+
assert_equal 0 [r smove myset1 myset2 foo]
|
263
|
+
assert_equal {1 a b} [lsort [r smembers myset1]]
|
264
|
+
assert_equal {2 3 4} [lsort [r smembers myset2]]
|
265
|
+
}
|
266
|
+
|
267
|
+
test "SMOVE non existing src set" {
|
268
|
+
setup_move
|
269
|
+
assert_equal 0 [r smove noset myset2 foo]
|
270
|
+
assert_equal {2 3 4} [lsort [r smembers myset2]]
|
271
|
+
}
|
272
|
+
|
273
|
+
test "SMOVE from regular set to non existing destination set" {
|
274
|
+
setup_move
|
275
|
+
assert_equal 1 [r smove myset1 myset3 a]
|
276
|
+
assert_equal {1 b} [lsort [r smembers myset1]]
|
277
|
+
assert_equal {a} [lsort [r smembers myset3]]
|
278
|
+
assert_encoding hashtable myset3
|
279
|
+
}
|
280
|
+
|
281
|
+
test "SMOVE from intset to non existing destination set" {
|
282
|
+
setup_move
|
283
|
+
assert_equal 1 [r smove myset2 myset3 2]
|
284
|
+
assert_equal {3 4} [lsort [r smembers myset2]]
|
285
|
+
assert_equal {2} [lsort [r smembers myset3]]
|
286
|
+
assert_encoding intset myset3
|
287
|
+
}
|
288
|
+
|
289
|
+
test "SMOVE wrong src key type" {
|
290
|
+
r set x 10
|
291
|
+
assert_error "ERR*wrong kind*" {r smove x myset2 foo}
|
292
|
+
}
|
293
|
+
|
294
|
+
test "SMOVE wrong dst key type" {
|
295
|
+
r set x 10
|
296
|
+
assert_error "ERR*wrong kind*" {r smove myset2 x foo}
|
297
|
+
}
|
298
|
+
|
299
|
+
tags {slow} {
|
300
|
+
test {intsets implementation stress testing} {
|
301
|
+
for {set j 0} {$j < 20} {incr j} {
|
302
|
+
unset -nocomplain s
|
303
|
+
array set s {}
|
304
|
+
r del s
|
305
|
+
set len [randomInt 1024]
|
306
|
+
for {set i 0} {$i < $len} {incr i} {
|
307
|
+
randpath {
|
308
|
+
set data [randomInt 65536]
|
309
|
+
} {
|
310
|
+
set data [randomInt 4294967296]
|
311
|
+
} {
|
312
|
+
set data [randomInt 18446744073709551616]
|
313
|
+
}
|
314
|
+
set s($data) {}
|
315
|
+
r sadd s $data
|
316
|
+
}
|
317
|
+
assert_equal [lsort [r smembers s]] [lsort [array names s]]
|
318
|
+
set len [array size s]
|
319
|
+
for {set i 0} {$i < $len} {incr i} {
|
320
|
+
set e [r spop s]
|
321
|
+
if {![info exists s($e)]} {
|
322
|
+
puts "Can't find '$e' on local array"
|
323
|
+
puts "Local array: [lsort [r smembers s]]"
|
324
|
+
puts "Remote array: [lsort [array names s]]"
|
325
|
+
error "exception"
|
326
|
+
}
|
327
|
+
array unset s $e
|
328
|
+
}
|
329
|
+
assert_equal [r scard s] 0
|
330
|
+
assert_equal [array size s] 0
|
331
|
+
}
|
332
|
+
}
|
333
|
+
}
|
334
|
+
}
|
@@ -0,0 +1,587 @@
|
|
1
|
+
start_server {tags {"zset"}} {
|
2
|
+
proc create_zset {key items} {
|
3
|
+
r del $key
|
4
|
+
foreach {score entry} $items {
|
5
|
+
r zadd $key $score $entry
|
6
|
+
}
|
7
|
+
}
|
8
|
+
|
9
|
+
test {ZSET basic ZADD and score update} {
|
10
|
+
r zadd ztmp 10 x
|
11
|
+
r zadd ztmp 20 y
|
12
|
+
r zadd ztmp 30 z
|
13
|
+
set aux1 [r zrange ztmp 0 -1]
|
14
|
+
r zadd ztmp 1 y
|
15
|
+
set aux2 [r zrange ztmp 0 -1]
|
16
|
+
list $aux1 $aux2
|
17
|
+
} {{x y z} {y x z}}
|
18
|
+
|
19
|
+
test {ZCARD basics} {
|
20
|
+
r zcard ztmp
|
21
|
+
} {3}
|
22
|
+
|
23
|
+
test {ZCARD non existing key} {
|
24
|
+
r zcard ztmp-blabla
|
25
|
+
} {0}
|
26
|
+
|
27
|
+
test "ZRANGE basics" {
|
28
|
+
r del ztmp
|
29
|
+
r zadd ztmp 1 a
|
30
|
+
r zadd ztmp 2 b
|
31
|
+
r zadd ztmp 3 c
|
32
|
+
r zadd ztmp 4 d
|
33
|
+
|
34
|
+
assert_equal {a b c d} [r zrange ztmp 0 -1]
|
35
|
+
assert_equal {a b c} [r zrange ztmp 0 -2]
|
36
|
+
assert_equal {b c d} [r zrange ztmp 1 -1]
|
37
|
+
assert_equal {b c} [r zrange ztmp 1 -2]
|
38
|
+
assert_equal {c d} [r zrange ztmp -2 -1]
|
39
|
+
assert_equal {c} [r zrange ztmp -2 -2]
|
40
|
+
|
41
|
+
# out of range start index
|
42
|
+
assert_equal {a b c} [r zrange ztmp -5 2]
|
43
|
+
assert_equal {a b} [r zrange ztmp -5 1]
|
44
|
+
assert_equal {} [r zrange ztmp 5 -1]
|
45
|
+
assert_equal {} [r zrange ztmp 5 -2]
|
46
|
+
|
47
|
+
# out of range end index
|
48
|
+
assert_equal {a b c d} [r zrange ztmp 0 5]
|
49
|
+
assert_equal {b c d} [r zrange ztmp 1 5]
|
50
|
+
assert_equal {} [r zrange ztmp 0 -5]
|
51
|
+
assert_equal {} [r zrange ztmp 1 -5]
|
52
|
+
|
53
|
+
# withscores
|
54
|
+
assert_equal {a 1 b 2 c 3 d 4} [r zrange ztmp 0 -1 withscores]
|
55
|
+
}
|
56
|
+
|
57
|
+
test "ZREVRANGE basics" {
|
58
|
+
r del ztmp
|
59
|
+
r zadd ztmp 1 a
|
60
|
+
r zadd ztmp 2 b
|
61
|
+
r zadd ztmp 3 c
|
62
|
+
r zadd ztmp 4 d
|
63
|
+
|
64
|
+
assert_equal {d c b a} [r zrevrange ztmp 0 -1]
|
65
|
+
assert_equal {d c b} [r zrevrange ztmp 0 -2]
|
66
|
+
assert_equal {c b a} [r zrevrange ztmp 1 -1]
|
67
|
+
assert_equal {c b} [r zrevrange ztmp 1 -2]
|
68
|
+
assert_equal {b a} [r zrevrange ztmp -2 -1]
|
69
|
+
assert_equal {b} [r zrevrange ztmp -2 -2]
|
70
|
+
|
71
|
+
# out of range start index
|
72
|
+
assert_equal {d c b} [r zrevrange ztmp -5 2]
|
73
|
+
assert_equal {d c} [r zrevrange ztmp -5 1]
|
74
|
+
assert_equal {} [r zrevrange ztmp 5 -1]
|
75
|
+
assert_equal {} [r zrevrange ztmp 5 -2]
|
76
|
+
|
77
|
+
# out of range end index
|
78
|
+
assert_equal {d c b a} [r zrevrange ztmp 0 5]
|
79
|
+
assert_equal {c b a} [r zrevrange ztmp 1 5]
|
80
|
+
assert_equal {} [r zrevrange ztmp 0 -5]
|
81
|
+
assert_equal {} [r zrevrange ztmp 1 -5]
|
82
|
+
|
83
|
+
# withscores
|
84
|
+
assert_equal {d 4 c 3 b 2 a 1} [r zrevrange ztmp 0 -1 withscores]
|
85
|
+
}
|
86
|
+
|
87
|
+
test {ZRANK basics} {
|
88
|
+
r zadd zranktmp 10 x
|
89
|
+
r zadd zranktmp 20 y
|
90
|
+
r zadd zranktmp 30 z
|
91
|
+
list [r zrank zranktmp x] [r zrank zranktmp y] [r zrank zranktmp z]
|
92
|
+
} {0 1 2}
|
93
|
+
|
94
|
+
test {ZREVRANK basics} {
|
95
|
+
list [r zrevrank zranktmp x] [r zrevrank zranktmp y] [r zrevrank zranktmp z]
|
96
|
+
} {2 1 0}
|
97
|
+
|
98
|
+
test {ZRANK - after deletion} {
|
99
|
+
r zrem zranktmp y
|
100
|
+
list [r zrank zranktmp x] [r zrank zranktmp z]
|
101
|
+
} {0 1}
|
102
|
+
|
103
|
+
test {ZSCORE} {
|
104
|
+
set aux {}
|
105
|
+
set err {}
|
106
|
+
for {set i 0} {$i < 1000} {incr i} {
|
107
|
+
set score [expr rand()]
|
108
|
+
lappend aux $score
|
109
|
+
r zadd zscoretest $score $i
|
110
|
+
}
|
111
|
+
for {set i 0} {$i < 1000} {incr i} {
|
112
|
+
if {[r zscore zscoretest $i] != [lindex $aux $i]} {
|
113
|
+
set err "Expected score was [lindex $aux $i] but got [r zscore zscoretest $i] for element $i"
|
114
|
+
break
|
115
|
+
}
|
116
|
+
}
|
117
|
+
set _ $err
|
118
|
+
} {}
|
119
|
+
|
120
|
+
test {ZSCORE after a DEBUG RELOAD} {
|
121
|
+
set aux {}
|
122
|
+
set err {}
|
123
|
+
r del zscoretest
|
124
|
+
for {set i 0} {$i < 1000} {incr i} {
|
125
|
+
set score [expr rand()]
|
126
|
+
lappend aux $score
|
127
|
+
r zadd zscoretest $score $i
|
128
|
+
}
|
129
|
+
r debug reload
|
130
|
+
for {set i 0} {$i < 1000} {incr i} {
|
131
|
+
if {[r zscore zscoretest $i] != [lindex $aux $i]} {
|
132
|
+
set err "Expected score was [lindex $aux $i] but got [r zscore zscoretest $i] for element $i"
|
133
|
+
break
|
134
|
+
}
|
135
|
+
}
|
136
|
+
set _ $err
|
137
|
+
} {}
|
138
|
+
|
139
|
+
test {ZSETs stress tester - sorting is working well?} {
|
140
|
+
set delta 0
|
141
|
+
for {set test 0} {$test < 2} {incr test} {
|
142
|
+
unset -nocomplain auxarray
|
143
|
+
array set auxarray {}
|
144
|
+
set auxlist {}
|
145
|
+
r del myzset
|
146
|
+
for {set i 0} {$i < 1000} {incr i} {
|
147
|
+
if {$test == 0} {
|
148
|
+
set score [expr rand()]
|
149
|
+
} else {
|
150
|
+
set score [expr int(rand()*10)]
|
151
|
+
}
|
152
|
+
set auxarray($i) $score
|
153
|
+
r zadd myzset $score $i
|
154
|
+
# Random update
|
155
|
+
if {[expr rand()] < .2} {
|
156
|
+
set j [expr int(rand()*1000)]
|
157
|
+
if {$test == 0} {
|
158
|
+
set score [expr rand()]
|
159
|
+
} else {
|
160
|
+
set score [expr int(rand()*10)]
|
161
|
+
}
|
162
|
+
set auxarray($j) $score
|
163
|
+
r zadd myzset $score $j
|
164
|
+
}
|
165
|
+
}
|
166
|
+
foreach {item score} [array get auxarray] {
|
167
|
+
lappend auxlist [list $score $item]
|
168
|
+
}
|
169
|
+
set sorted [lsort -command zlistAlikeSort $auxlist]
|
170
|
+
set auxlist {}
|
171
|
+
foreach x $sorted {
|
172
|
+
lappend auxlist [lindex $x 1]
|
173
|
+
}
|
174
|
+
set fromredis [r zrange myzset 0 -1]
|
175
|
+
set delta 0
|
176
|
+
for {set i 0} {$i < [llength $fromredis]} {incr i} {
|
177
|
+
if {[lindex $fromredis $i] != [lindex $auxlist $i]} {
|
178
|
+
incr delta
|
179
|
+
}
|
180
|
+
}
|
181
|
+
}
|
182
|
+
format $delta
|
183
|
+
} {0}
|
184
|
+
|
185
|
+
test {ZINCRBY - can create a new sorted set} {
|
186
|
+
r del zset
|
187
|
+
r zincrby zset 1 foo
|
188
|
+
list [r zrange zset 0 -1] [r zscore zset foo]
|
189
|
+
} {foo 1}
|
190
|
+
|
191
|
+
test {ZINCRBY - increment and decrement} {
|
192
|
+
r zincrby zset 2 foo
|
193
|
+
r zincrby zset 1 bar
|
194
|
+
set v1 [r zrange zset 0 -1]
|
195
|
+
r zincrby zset 10 bar
|
196
|
+
r zincrby zset -5 foo
|
197
|
+
r zincrby zset -5 bar
|
198
|
+
set v2 [r zrange zset 0 -1]
|
199
|
+
list $v1 $v2 [r zscore zset foo] [r zscore zset bar]
|
200
|
+
} {{bar foo} {foo bar} -2 6}
|
201
|
+
|
202
|
+
proc create_default_zset {} {
|
203
|
+
create_zset zset {-inf a 1 b 2 c 3 d 4 e 5 f +inf g}
|
204
|
+
}
|
205
|
+
|
206
|
+
test "ZRANGEBYSCORE/ZREVRANGEBYSCORE/ZCOUNT basics" {
|
207
|
+
create_default_zset
|
208
|
+
|
209
|
+
# inclusive range
|
210
|
+
assert_equal {a b c} [r zrangebyscore zset -inf 2]
|
211
|
+
assert_equal {b c d} [r zrangebyscore zset 0 3]
|
212
|
+
assert_equal {d e f} [r zrangebyscore zset 3 6]
|
213
|
+
assert_equal {e f g} [r zrangebyscore zset 4 +inf]
|
214
|
+
assert_equal {c b a} [r zrevrangebyscore zset 2 -inf]
|
215
|
+
assert_equal {d c b} [r zrevrangebyscore zset 3 0]
|
216
|
+
assert_equal {f e d} [r zrevrangebyscore zset 6 3]
|
217
|
+
assert_equal {g f e} [r zrevrangebyscore zset +inf 4]
|
218
|
+
assert_equal 3 [r zcount zset 0 3]
|
219
|
+
|
220
|
+
# exclusive range
|
221
|
+
assert_equal {b} [r zrangebyscore zset (-inf (2]
|
222
|
+
assert_equal {b c} [r zrangebyscore zset (0 (3]
|
223
|
+
assert_equal {e f} [r zrangebyscore zset (3 (6]
|
224
|
+
assert_equal {f} [r zrangebyscore zset (4 (+inf]
|
225
|
+
assert_equal {b} [r zrevrangebyscore zset (2 (-inf]
|
226
|
+
assert_equal {c b} [r zrevrangebyscore zset (3 (0]
|
227
|
+
assert_equal {f e} [r zrevrangebyscore zset (6 (3]
|
228
|
+
assert_equal {f} [r zrevrangebyscore zset (+inf (4]
|
229
|
+
assert_equal 2 [r zcount zset (0 (3]
|
230
|
+
}
|
231
|
+
|
232
|
+
test "ZRANGEBYSCORE with WITHSCORES" {
|
233
|
+
create_default_zset
|
234
|
+
assert_equal {b 1 c 2 d 3} [r zrangebyscore zset 0 3 withscores]
|
235
|
+
assert_equal {d 3 c 2 b 1} [r zrevrangebyscore zset 3 0 withscores]
|
236
|
+
}
|
237
|
+
|
238
|
+
test "ZRANGEBYSCORE with LIMIT" {
|
239
|
+
create_default_zset
|
240
|
+
assert_equal {b c} [r zrangebyscore zset 0 10 LIMIT 0 2]
|
241
|
+
assert_equal {d e f} [r zrangebyscore zset 0 10 LIMIT 2 3]
|
242
|
+
assert_equal {d e f} [r zrangebyscore zset 0 10 LIMIT 2 10]
|
243
|
+
assert_equal {} [r zrangebyscore zset 0 10 LIMIT 20 10]
|
244
|
+
assert_equal {f e} [r zrevrangebyscore zset 10 0 LIMIT 0 2]
|
245
|
+
assert_equal {d c b} [r zrevrangebyscore zset 10 0 LIMIT 2 3]
|
246
|
+
assert_equal {d c b} [r zrevrangebyscore zset 10 0 LIMIT 2 10]
|
247
|
+
assert_equal {} [r zrevrangebyscore zset 10 0 LIMIT 20 10]
|
248
|
+
}
|
249
|
+
|
250
|
+
test "ZRANGEBYSCORE with LIMIT and WITHSCORES" {
|
251
|
+
create_default_zset
|
252
|
+
assert_equal {e 4 f 5} [r zrangebyscore zset 2 5 LIMIT 2 3 WITHSCORES]
|
253
|
+
assert_equal {d 3 c 2} [r zrevrangebyscore zset 5 2 LIMIT 2 3 WITHSCORES]
|
254
|
+
}
|
255
|
+
|
256
|
+
test "ZRANGEBYSCORE with non-value min or max" {
|
257
|
+
assert_error "*not a double*" {r zrangebyscore fooz str 1}
|
258
|
+
assert_error "*not a double*" {r zrangebyscore fooz 1 str}
|
259
|
+
assert_error "*not a double*" {r zrangebyscore fooz 1 NaN}
|
260
|
+
}
|
261
|
+
|
262
|
+
tags {"slow"} {
|
263
|
+
test {ZRANGEBYSCORE fuzzy test, 100 ranges in 1000 elements sorted set} {
|
264
|
+
set err {}
|
265
|
+
r del zset
|
266
|
+
for {set i 0} {$i < 1000} {incr i} {
|
267
|
+
r zadd zset [expr rand()] $i
|
268
|
+
}
|
269
|
+
for {set i 0} {$i < 100} {incr i} {
|
270
|
+
set min [expr rand()]
|
271
|
+
set max [expr rand()]
|
272
|
+
if {$min > $max} {
|
273
|
+
set aux $min
|
274
|
+
set min $max
|
275
|
+
set max $aux
|
276
|
+
}
|
277
|
+
set low [r zrangebyscore zset -inf $min]
|
278
|
+
set ok [r zrangebyscore zset $min $max]
|
279
|
+
set high [r zrangebyscore zset $max +inf]
|
280
|
+
set lowx [r zrangebyscore zset -inf ($min]
|
281
|
+
set okx [r zrangebyscore zset ($min ($max]
|
282
|
+
set highx [r zrangebyscore zset ($max +inf]
|
283
|
+
|
284
|
+
if {[r zcount zset -inf $min] != [llength $low]} {
|
285
|
+
append err "Error, len does not match zcount\n"
|
286
|
+
}
|
287
|
+
if {[r zcount zset $min $max] != [llength $ok]} {
|
288
|
+
append err "Error, len does not match zcount\n"
|
289
|
+
}
|
290
|
+
if {[r zcount zset $max +inf] != [llength $high]} {
|
291
|
+
append err "Error, len does not match zcount\n"
|
292
|
+
}
|
293
|
+
if {[r zcount zset -inf ($min] != [llength $lowx]} {
|
294
|
+
append err "Error, len does not match zcount\n"
|
295
|
+
}
|
296
|
+
if {[r zcount zset ($min ($max] != [llength $okx]} {
|
297
|
+
append err "Error, len does not match zcount\n"
|
298
|
+
}
|
299
|
+
if {[r zcount zset ($max +inf] != [llength $highx]} {
|
300
|
+
append err "Error, len does not match zcount\n"
|
301
|
+
}
|
302
|
+
|
303
|
+
foreach x $low {
|
304
|
+
set score [r zscore zset $x]
|
305
|
+
if {$score > $min} {
|
306
|
+
append err "Error, score for $x is $score > $min\n"
|
307
|
+
}
|
308
|
+
}
|
309
|
+
foreach x $lowx {
|
310
|
+
set score [r zscore zset $x]
|
311
|
+
if {$score >= $min} {
|
312
|
+
append err "Error, score for $x is $score >= $min\n"
|
313
|
+
}
|
314
|
+
}
|
315
|
+
foreach x $ok {
|
316
|
+
set score [r zscore zset $x]
|
317
|
+
if {$score < $min || $score > $max} {
|
318
|
+
append err "Error, score for $x is $score outside $min-$max range\n"
|
319
|
+
}
|
320
|
+
}
|
321
|
+
foreach x $okx {
|
322
|
+
set score [r zscore zset $x]
|
323
|
+
if {$score <= $min || $score >= $max} {
|
324
|
+
append err "Error, score for $x is $score outside $min-$max open range\n"
|
325
|
+
}
|
326
|
+
}
|
327
|
+
foreach x $high {
|
328
|
+
set score [r zscore zset $x]
|
329
|
+
if {$score < $max} {
|
330
|
+
append err "Error, score for $x is $score < $max\n"
|
331
|
+
}
|
332
|
+
}
|
333
|
+
foreach x $highx {
|
334
|
+
set score [r zscore zset $x]
|
335
|
+
if {$score <= $max} {
|
336
|
+
append err "Error, score for $x is $score <= $max\n"
|
337
|
+
}
|
338
|
+
}
|
339
|
+
}
|
340
|
+
set _ $err
|
341
|
+
} {}
|
342
|
+
}
|
343
|
+
|
344
|
+
test "ZREMRANGEBYSCORE basics" {
|
345
|
+
proc remrangebyscore {min max} {
|
346
|
+
create_zset zset {1 a 2 b 3 c 4 d 5 e}
|
347
|
+
r zremrangebyscore zset $min $max
|
348
|
+
}
|
349
|
+
|
350
|
+
# inner range
|
351
|
+
assert_equal 3 [remrangebyscore 2 4]
|
352
|
+
assert_equal {a e} [r zrange zset 0 -1]
|
353
|
+
|
354
|
+
# start underflow
|
355
|
+
assert_equal 1 [remrangebyscore -10 1]
|
356
|
+
assert_equal {b c d e} [r zrange zset 0 -1]
|
357
|
+
|
358
|
+
# end overflow
|
359
|
+
assert_equal 1 [remrangebyscore 5 10]
|
360
|
+
assert_equal {a b c d} [r zrange zset 0 -1]
|
361
|
+
|
362
|
+
# switch min and max
|
363
|
+
assert_equal 0 [remrangebyscore 4 2]
|
364
|
+
assert_equal {a b c d e} [r zrange zset 0 -1]
|
365
|
+
|
366
|
+
# -inf to mid
|
367
|
+
assert_equal 3 [remrangebyscore -inf 3]
|
368
|
+
assert_equal {d e} [r zrange zset 0 -1]
|
369
|
+
|
370
|
+
# mid to +inf
|
371
|
+
assert_equal 3 [remrangebyscore 3 +inf]
|
372
|
+
assert_equal {a b} [r zrange zset 0 -1]
|
373
|
+
|
374
|
+
# -inf to +inf
|
375
|
+
assert_equal 5 [remrangebyscore -inf +inf]
|
376
|
+
assert_equal {} [r zrange zset 0 -1]
|
377
|
+
|
378
|
+
# exclusive min
|
379
|
+
assert_equal 4 [remrangebyscore (1 5]
|
380
|
+
assert_equal {a} [r zrange zset 0 -1]
|
381
|
+
assert_equal 3 [remrangebyscore (2 5]
|
382
|
+
assert_equal {a b} [r zrange zset 0 -1]
|
383
|
+
|
384
|
+
# exclusive max
|
385
|
+
assert_equal 4 [remrangebyscore 1 (5]
|
386
|
+
assert_equal {e} [r zrange zset 0 -1]
|
387
|
+
assert_equal 3 [remrangebyscore 1 (4]
|
388
|
+
assert_equal {d e} [r zrange zset 0 -1]
|
389
|
+
|
390
|
+
# exclusive min and max
|
391
|
+
assert_equal 3 [remrangebyscore (1 (5]
|
392
|
+
assert_equal {a e} [r zrange zset 0 -1]
|
393
|
+
}
|
394
|
+
|
395
|
+
test "ZREMRANGEBYSCORE with non-value min or max" {
|
396
|
+
assert_error "*not a double*" {r zremrangebyscore fooz str 1}
|
397
|
+
assert_error "*not a double*" {r zremrangebyscore fooz 1 str}
|
398
|
+
assert_error "*not a double*" {r zremrangebyscore fooz 1 NaN}
|
399
|
+
}
|
400
|
+
|
401
|
+
test "ZREMRANGEBYRANK basics" {
|
402
|
+
proc remrangebyrank {min max} {
|
403
|
+
create_zset zset {1 a 2 b 3 c 4 d 5 e}
|
404
|
+
r zremrangebyrank zset $min $max
|
405
|
+
}
|
406
|
+
|
407
|
+
# inner range
|
408
|
+
assert_equal 3 [remrangebyrank 1 3]
|
409
|
+
assert_equal {a e} [r zrange zset 0 -1]
|
410
|
+
|
411
|
+
# start underflow
|
412
|
+
assert_equal 1 [remrangebyrank -10 0]
|
413
|
+
assert_equal {b c d e} [r zrange zset 0 -1]
|
414
|
+
|
415
|
+
# start overflow
|
416
|
+
assert_equal 0 [remrangebyrank 10 -1]
|
417
|
+
assert_equal {a b c d e} [r zrange zset 0 -1]
|
418
|
+
|
419
|
+
# end underflow
|
420
|
+
assert_equal 0 [remrangebyrank 0 -10]
|
421
|
+
assert_equal {a b c d e} [r zrange zset 0 -1]
|
422
|
+
|
423
|
+
# end overflow
|
424
|
+
assert_equal 5 [remrangebyrank 0 10]
|
425
|
+
assert_equal {} [r zrange zset 0 -1]
|
426
|
+
}
|
427
|
+
|
428
|
+
test {ZUNIONSTORE against non-existing key doesn't set destination} {
|
429
|
+
r del zseta
|
430
|
+
list [r zunionstore dst_key 1 zseta] [r exists dst_key]
|
431
|
+
} {0 0}
|
432
|
+
|
433
|
+
test {ZUNIONSTORE basics} {
|
434
|
+
r del zseta zsetb zsetc
|
435
|
+
r zadd zseta 1 a
|
436
|
+
r zadd zseta 2 b
|
437
|
+
r zadd zseta 3 c
|
438
|
+
r zadd zsetb 1 b
|
439
|
+
r zadd zsetb 2 c
|
440
|
+
r zadd zsetb 3 d
|
441
|
+
list [r zunionstore zsetc 2 zseta zsetb] [r zrange zsetc 0 -1 withscores]
|
442
|
+
} {4 {a 1 b 3 d 3 c 5}}
|
443
|
+
|
444
|
+
test {ZUNIONSTORE with weights} {
|
445
|
+
list [r zunionstore zsetc 2 zseta zsetb weights 2 3] [r zrange zsetc 0 -1 withscores]
|
446
|
+
} {4 {a 2 b 7 d 9 c 12}}
|
447
|
+
|
448
|
+
test {ZUNIONSTORE with a regular set and weights} {
|
449
|
+
r del seta
|
450
|
+
r sadd seta a
|
451
|
+
r sadd seta b
|
452
|
+
r sadd seta c
|
453
|
+
list [r zunionstore zsetc 2 seta zsetb weights 2 3] [r zrange zsetc 0 -1 withscores]
|
454
|
+
} {4 {a 2 b 5 c 8 d 9}}
|
455
|
+
|
456
|
+
test {ZUNIONSTORE with AGGREGATE MIN} {
|
457
|
+
list [r zunionstore zsetc 2 zseta zsetb aggregate min] [r zrange zsetc 0 -1 withscores]
|
458
|
+
} {4 {a 1 b 1 c 2 d 3}}
|
459
|
+
|
460
|
+
test {ZUNIONSTORE with AGGREGATE MAX} {
|
461
|
+
list [r zunionstore zsetc 2 zseta zsetb aggregate max] [r zrange zsetc 0 -1 withscores]
|
462
|
+
} {4 {a 1 b 2 c 3 d 3}}
|
463
|
+
|
464
|
+
test {ZINTERSTORE basics} {
|
465
|
+
list [r zinterstore zsetc 2 zseta zsetb] [r zrange zsetc 0 -1 withscores]
|
466
|
+
} {2 {b 3 c 5}}
|
467
|
+
|
468
|
+
test {ZINTERSTORE with weights} {
|
469
|
+
list [r zinterstore zsetc 2 zseta zsetb weights 2 3] [r zrange zsetc 0 -1 withscores]
|
470
|
+
} {2 {b 7 c 12}}
|
471
|
+
|
472
|
+
test {ZINTERSTORE with a regular set and weights} {
|
473
|
+
r del seta
|
474
|
+
r sadd seta a
|
475
|
+
r sadd seta b
|
476
|
+
r sadd seta c
|
477
|
+
list [r zinterstore zsetc 2 seta zsetb weights 2 3] [r zrange zsetc 0 -1 withscores]
|
478
|
+
} {2 {b 5 c 8}}
|
479
|
+
|
480
|
+
test {ZINTERSTORE with AGGREGATE MIN} {
|
481
|
+
list [r zinterstore zsetc 2 zseta zsetb aggregate min] [r zrange zsetc 0 -1 withscores]
|
482
|
+
} {2 {b 1 c 2}}
|
483
|
+
|
484
|
+
test {ZINTERSTORE with AGGREGATE MAX} {
|
485
|
+
list [r zinterstore zsetc 2 zseta zsetb aggregate max] [r zrange zsetc 0 -1 withscores]
|
486
|
+
} {2 {b 2 c 3}}
|
487
|
+
|
488
|
+
test {ZINTERSTORE regression with two sets, intset+hashtable} {
|
489
|
+
r del seta setb setc
|
490
|
+
r sadd set1 a
|
491
|
+
r sadd set2 10
|
492
|
+
r zinterstore set3 2 set1 set2
|
493
|
+
} {0}
|
494
|
+
|
495
|
+
foreach cmd {ZUNIONSTORE ZINTERSTORE} {
|
496
|
+
test "$cmd with +inf/-inf scores" {
|
497
|
+
r del zsetinf1 zsetinf2
|
498
|
+
|
499
|
+
r zadd zsetinf1 +inf key
|
500
|
+
r zadd zsetinf2 +inf key
|
501
|
+
r $cmd zsetinf3 2 zsetinf1 zsetinf2
|
502
|
+
assert_equal inf [r zscore zsetinf3 key]
|
503
|
+
|
504
|
+
r zadd zsetinf1 -inf key
|
505
|
+
r zadd zsetinf2 +inf key
|
506
|
+
r $cmd zsetinf3 2 zsetinf1 zsetinf2
|
507
|
+
assert_equal 0 [r zscore zsetinf3 key]
|
508
|
+
|
509
|
+
r zadd zsetinf1 +inf key
|
510
|
+
r zadd zsetinf2 -inf key
|
511
|
+
r $cmd zsetinf3 2 zsetinf1 zsetinf2
|
512
|
+
assert_equal 0 [r zscore zsetinf3 key]
|
513
|
+
|
514
|
+
r zadd zsetinf1 -inf key
|
515
|
+
r zadd zsetinf2 -inf key
|
516
|
+
r $cmd zsetinf3 2 zsetinf1 zsetinf2
|
517
|
+
assert_equal -inf [r zscore zsetinf3 key]
|
518
|
+
}
|
519
|
+
|
520
|
+
test "$cmd with NaN weights" {
|
521
|
+
r del zsetinf1 zsetinf2
|
522
|
+
|
523
|
+
r zadd zsetinf1 1.0 key
|
524
|
+
r zadd zsetinf2 1.0 key
|
525
|
+
assert_error "*weight value is not a double*" {
|
526
|
+
r $cmd zsetinf3 2 zsetinf1 zsetinf2 weights nan nan
|
527
|
+
}
|
528
|
+
}
|
529
|
+
}
|
530
|
+
|
531
|
+
tags {"slow"} {
|
532
|
+
test {ZSETs skiplist implementation backlink consistency test} {
|
533
|
+
set diff 0
|
534
|
+
set elements 10000
|
535
|
+
for {set j 0} {$j < $elements} {incr j} {
|
536
|
+
r zadd myzset [expr rand()] "Element-$j"
|
537
|
+
r zrem myzset "Element-[expr int(rand()*$elements)]"
|
538
|
+
}
|
539
|
+
set l1 [r zrange myzset 0 -1]
|
540
|
+
set l2 [r zrevrange myzset 0 -1]
|
541
|
+
for {set j 0} {$j < [llength $l1]} {incr j} {
|
542
|
+
if {[lindex $l1 $j] ne [lindex $l2 end-$j]} {
|
543
|
+
incr diff
|
544
|
+
}
|
545
|
+
}
|
546
|
+
format $diff
|
547
|
+
} {0}
|
548
|
+
|
549
|
+
test {ZSETs ZRANK augmented skip list stress testing} {
|
550
|
+
set err {}
|
551
|
+
r del myzset
|
552
|
+
for {set k 0} {$k < 10000} {incr k} {
|
553
|
+
set i [expr {$k%1000}]
|
554
|
+
if {[expr rand()] < .2} {
|
555
|
+
r zrem myzset $i
|
556
|
+
} else {
|
557
|
+
set score [expr rand()]
|
558
|
+
r zadd myzset $score $i
|
559
|
+
}
|
560
|
+
set card [r zcard myzset]
|
561
|
+
if {$card > 0} {
|
562
|
+
set index [randomInt $card]
|
563
|
+
set ele [lindex [r zrange myzset $index $index] 0]
|
564
|
+
set rank [r zrank myzset $ele]
|
565
|
+
if {$rank != $index} {
|
566
|
+
set err "$ele RANK is wrong! ($rank != $index)"
|
567
|
+
break
|
568
|
+
}
|
569
|
+
}
|
570
|
+
}
|
571
|
+
set _ $err
|
572
|
+
} {}
|
573
|
+
}
|
574
|
+
|
575
|
+
test {ZSET element can't be set to NaN with ZADD} {
|
576
|
+
assert_error "*not a double*" {r zadd myzset nan abc}
|
577
|
+
}
|
578
|
+
|
579
|
+
test {ZSET element can't be set to NaN with ZINCRBY} {
|
580
|
+
assert_error "*not a double*" {r zadd myzset nan abc}
|
581
|
+
}
|
582
|
+
|
583
|
+
test {ZINCRBY calls leading to NaN result in error} {
|
584
|
+
r zincrby myzset +inf abc
|
585
|
+
assert_error "*NaN*" {r zincrby myzset -inf abc}
|
586
|
+
}
|
587
|
+
}
|