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.
Files changed (290) hide show
  1. data/LICENSE +38 -0
  2. data/README.md +33 -0
  3. data/bin/redis +114 -0
  4. data/redis/Makefile +5 -0
  5. data/redis/extconf.rb +3 -0
  6. data/redis/redis-2.2.11/00-RELEASENOTES +199 -0
  7. data/redis/redis-2.2.11/BUGS +1 -0
  8. data/redis/redis-2.2.11/CONTRIBUTING +13 -0
  9. data/redis/redis-2.2.11/COPYING +10 -0
  10. data/redis/redis-2.2.11/Changelog +1032 -0
  11. data/redis/redis-2.2.11/INSTALL +30 -0
  12. data/redis/redis-2.2.11/Makefile +22 -0
  13. data/redis/redis-2.2.11/README +83 -0
  14. data/redis/redis-2.2.11/TODO +4 -0
  15. data/redis/redis-2.2.11/client-libraries/README +11 -0
  16. data/redis/redis-2.2.11/deps/hiredis/COPYING +10 -0
  17. data/redis/redis-2.2.11/deps/hiredis/Makefile +115 -0
  18. data/redis/redis-2.2.11/deps/hiredis/README.md +311 -0
  19. data/redis/redis-2.2.11/deps/hiredis/TODO +2 -0
  20. data/redis/redis-2.2.11/deps/hiredis/adapters/ae.h +95 -0
  21. data/redis/redis-2.2.11/deps/hiredis/adapters/libev.h +113 -0
  22. data/redis/redis-2.2.11/deps/hiredis/adapters/libevent.h +76 -0
  23. data/redis/redis-2.2.11/deps/hiredis/async.c +321 -0
  24. data/redis/redis-2.2.11/deps/hiredis/async.h +112 -0
  25. data/redis/redis-2.2.11/deps/hiredis/example-ae.c +53 -0
  26. data/redis/redis-2.2.11/deps/hiredis/example-libev.c +47 -0
  27. data/redis/redis-2.2.11/deps/hiredis/example-libevent.c +48 -0
  28. data/redis/redis-2.2.11/deps/hiredis/example.c +67 -0
  29. data/redis/redis-2.2.11/deps/hiredis/fmacros.h +15 -0
  30. data/redis/redis-2.2.11/deps/hiredis/hiredis.c +1058 -0
  31. data/redis/redis-2.2.11/deps/hiredis/hiredis.h +170 -0
  32. data/redis/redis-2.2.11/deps/hiredis/net.c +170 -0
  33. data/redis/redis-2.2.11/deps/hiredis/net.h +43 -0
  34. data/redis/redis-2.2.11/deps/hiredis/sds.c +479 -0
  35. data/redis/redis-2.2.11/deps/hiredis/sds.h +77 -0
  36. data/redis/redis-2.2.11/deps/hiredis/test.c +479 -0
  37. data/redis/redis-2.2.11/deps/hiredis/util.h +40 -0
  38. data/redis/redis-2.2.11/deps/linenoise/Makefile +10 -0
  39. data/redis/redis-2.2.11/deps/linenoise/README.markdown +45 -0
  40. data/redis/redis-2.2.11/deps/linenoise/example.c +27 -0
  41. data/redis/redis-2.2.11/deps/linenoise/linenoise.c +609 -0
  42. data/redis/redis-2.2.11/deps/linenoise/linenoise.h +55 -0
  43. data/redis/redis-2.2.11/design-documents/REDIS-CLUSTER +214 -0
  44. data/redis/redis-2.2.11/design-documents/REDIS-CLUSTER-2 +343 -0
  45. data/redis/redis-2.2.11/doc/AppendCommand.html +48 -0
  46. data/redis/redis-2.2.11/doc/AppendOnlyFileHowto.html +41 -0
  47. data/redis/redis-2.2.11/doc/AuthCommand.html +39 -0
  48. data/redis/redis-2.2.11/doc/Benchmarks.html +129 -0
  49. data/redis/redis-2.2.11/doc/BgrewriteaofCommand.html +41 -0
  50. data/redis/redis-2.2.11/doc/BgsaveCommand.html +39 -0
  51. data/redis/redis-2.2.11/doc/BlpopCommand.html +51 -0
  52. data/redis/redis-2.2.11/doc/BrpoplpushCommand.html +39 -0
  53. data/redis/redis-2.2.11/doc/CommandReference.html +47 -0
  54. data/redis/redis-2.2.11/doc/Comparisons.html +42 -0
  55. data/redis/redis-2.2.11/doc/ConfigCommand.html +76 -0
  56. data/redis/redis-2.2.11/doc/Configuration.html +38 -0
  57. data/redis/redis-2.2.11/doc/ConnectionHandlingSidebar.html +36 -0
  58. data/redis/redis-2.2.11/doc/ControlCommandsSidebar.html +36 -0
  59. data/redis/redis-2.2.11/doc/Credits.html +38 -0
  60. data/redis/redis-2.2.11/doc/DbsizeCommand.html +38 -0
  61. data/redis/redis-2.2.11/doc/DelCommand.html +41 -0
  62. data/redis/redis-2.2.11/doc/DesignPatterns.html +37 -0
  63. data/redis/redis-2.2.11/doc/EventLibray.html +44 -0
  64. data/redis/redis-2.2.11/doc/ExistsCommand.html +42 -0
  65. data/redis/redis-2.2.11/doc/ExpireCommand.html +96 -0
  66. data/redis/redis-2.2.11/doc/FAQ.html +70 -0
  67. data/redis/redis-2.2.11/doc/Features.html +38 -0
  68. data/redis/redis-2.2.11/doc/FlushallCommand.html +39 -0
  69. data/redis/redis-2.2.11/doc/FlushdbCommand.html +39 -0
  70. data/redis/redis-2.2.11/doc/FromSqlToDataStructures.html +37 -0
  71. data/redis/redis-2.2.11/doc/GenericCommandsSidebar.html +36 -0
  72. data/redis/redis-2.2.11/doc/GetCommand.html +39 -0
  73. data/redis/redis-2.2.11/doc/GetbitCommand.html +39 -0
  74. data/redis/redis-2.2.11/doc/GetsetCommand.html +38 -0
  75. data/redis/redis-2.2.11/doc/HackingStrings.html +83 -0
  76. data/redis/redis-2.2.11/doc/HashCommandsSidebar.html +36 -0
  77. data/redis/redis-2.2.11/doc/Hashes.html +37 -0
  78. data/redis/redis-2.2.11/doc/HdelCommand.html +39 -0
  79. data/redis/redis-2.2.11/doc/HexistsCommand.html +39 -0
  80. data/redis/redis-2.2.11/doc/HgetCommand.html +39 -0
  81. data/redis/redis-2.2.11/doc/HgetallCommand.html +40 -0
  82. data/redis/redis-2.2.11/doc/HincrbyCommand.html +45 -0
  83. data/redis/redis-2.2.11/doc/HlenCommand.html +38 -0
  84. data/redis/redis-2.2.11/doc/HmgetCommand.html +40 -0
  85. data/redis/redis-2.2.11/doc/HmsetCommand.html +40 -0
  86. data/redis/redis-2.2.11/doc/HsetCommand.html +40 -0
  87. data/redis/redis-2.2.11/doc/HsetnxCommand.html +41 -0
  88. data/redis/redis-2.2.11/doc/IncrCommand.html +43 -0
  89. data/redis/redis-2.2.11/doc/InfoCommand.html +48 -0
  90. data/redis/redis-2.2.11/doc/IntroductionToRedisDataTypes.html +152 -0
  91. data/redis/redis-2.2.11/doc/KeysCommand.html +43 -0
  92. data/redis/redis-2.2.11/doc/LastsaveCommand.html +39 -0
  93. data/redis/redis-2.2.11/doc/LindexCommand.html +40 -0
  94. data/redis/redis-2.2.11/doc/ListCommandsSidebar.html +36 -0
  95. data/redis/redis-2.2.11/doc/Lists.html +42 -0
  96. data/redis/redis-2.2.11/doc/LlenCommand.html +41 -0
  97. data/redis/redis-2.2.11/doc/LpopCommand.html +41 -0
  98. data/redis/redis-2.2.11/doc/LrangeCommand.html +47 -0
  99. data/redis/redis-2.2.11/doc/LremCommand.html +41 -0
  100. data/redis/redis-2.2.11/doc/LsetCommand.html +38 -0
  101. data/redis/redis-2.2.11/doc/LtrimCommand.html +47 -0
  102. data/redis/redis-2.2.11/doc/MgetCommand.html +52 -0
  103. data/redis/redis-2.2.11/doc/MonitorCommand.html +63 -0
  104. data/redis/redis-2.2.11/doc/MoveCommand.html +42 -0
  105. data/redis/redis-2.2.11/doc/MsetCommand.html +44 -0
  106. data/redis/redis-2.2.11/doc/MultiExecCommand.html +166 -0
  107. data/redis/redis-2.2.11/doc/NonexistentCommands.html +51 -0
  108. data/redis/redis-2.2.11/doc/ObjectHashMappers.html +39 -0
  109. data/redis/redis-2.2.11/doc/Pipelining.html +36 -0
  110. data/redis/redis-2.2.11/doc/ProgrammingExamples.html +38 -0
  111. data/redis/redis-2.2.11/doc/ProtocolSpecification.html +137 -0
  112. data/redis/redis-2.2.11/doc/PublishSubscribe.html +115 -0
  113. data/redis/redis-2.2.11/doc/QuickStart.html +68 -0
  114. data/redis/redis-2.2.11/doc/QuitCommand.html +38 -0
  115. data/redis/redis-2.2.11/doc/README.html +119 -0
  116. data/redis/redis-2.2.11/doc/RandomkeyCommand.html +39 -0
  117. data/redis/redis-2.2.11/doc/Redis0100ChangeLog.html +67 -0
  118. data/redis/redis-2.2.11/doc/Redis0900ChangeLog.html +56 -0
  119. data/redis/redis-2.2.11/doc/RedisBigData.html +61 -0
  120. data/redis/redis-2.2.11/doc/RedisCLI.html +37 -0
  121. data/redis/redis-2.2.11/doc/RedisEventLibrary.html +70 -0
  122. data/redis/redis-2.2.11/doc/RedisGuides.html +37 -0
  123. data/redis/redis-2.2.11/doc/RedisInternals.html +38 -0
  124. data/redis/redis-2.2.11/doc/RedisPipelining.html +93 -0
  125. data/redis/redis-2.2.11/doc/RedisStatus.html +56 -0
  126. data/redis/redis-2.2.11/doc/Redis_1_2_0_Changelog.html +40 -0
  127. data/redis/redis-2.2.11/doc/Redis_2_0_0_Changelog.html +62 -0
  128. data/redis/redis-2.2.11/doc/Redis_2_0_Whats_new.html +59 -0
  129. data/redis/redis-2.2.11/doc/RenameCommand.html +39 -0
  130. data/redis/redis-2.2.11/doc/RenamenxCommand.html +42 -0
  131. data/redis/redis-2.2.11/doc/ReplicationHowto.html +43 -0
  132. data/redis/redis-2.2.11/doc/ReplyTypes.html +42 -0
  133. data/redis/redis-2.2.11/doc/RoadMap.html +38 -0
  134. data/redis/redis-2.2.11/doc/RpoplpushCommand.html +44 -0
  135. data/redis/redis-2.2.11/doc/RpushCommand.html +40 -0
  136. data/redis/redis-2.2.11/doc/SaddCommand.html +41 -0
  137. data/redis/redis-2.2.11/doc/SaveCommand.html +39 -0
  138. data/redis/redis-2.2.11/doc/ScardCommand.html +41 -0
  139. data/redis/redis-2.2.11/doc/SdiffCommand.html +45 -0
  140. data/redis/redis-2.2.11/doc/SdiffstoreCommand.html +38 -0
  141. data/redis/redis-2.2.11/doc/SelectCommand.html +39 -0
  142. data/redis/redis-2.2.11/doc/SetCommand.html +39 -0
  143. data/redis/redis-2.2.11/doc/SetCommandsSidebar.html +36 -0
  144. data/redis/redis-2.2.11/doc/SetbitCommand.html +45 -0
  145. data/redis/redis-2.2.11/doc/SetexCommand.html +42 -0
  146. data/redis/redis-2.2.11/doc/SetnxCommand.html +51 -0
  147. data/redis/redis-2.2.11/doc/SetrangeCommand.html +58 -0
  148. data/redis/redis-2.2.11/doc/Sets.html +36 -0
  149. data/redis/redis-2.2.11/doc/ShutdownCommand.html +39 -0
  150. data/redis/redis-2.2.11/doc/SideBar.html +36 -0
  151. data/redis/redis-2.2.11/doc/SinterCommand.html +40 -0
  152. data/redis/redis-2.2.11/doc/SinterstoreCommand.html +39 -0
  153. data/redis/redis-2.2.11/doc/SismemberCommand.html +42 -0
  154. data/redis/redis-2.2.11/doc/SlaveofCommand.html +41 -0
  155. data/redis/redis-2.2.11/doc/SmembersCommand.html +38 -0
  156. data/redis/redis-2.2.11/doc/SmoveCommand.html +44 -0
  157. data/redis/redis-2.2.11/doc/SortCommand.html +75 -0
  158. data/redis/redis-2.2.11/doc/SortedSetCommandsSidebar.html +36 -0
  159. data/redis/redis-2.2.11/doc/SortedSets.html +36 -0
  160. data/redis/redis-2.2.11/doc/Speed.html +38 -0
  161. data/redis/redis-2.2.11/doc/SponsorshipHistory.html +38 -0
  162. data/redis/redis-2.2.11/doc/SpopCommand.html +40 -0
  163. data/redis/redis-2.2.11/doc/SrandmemberCommand.html +40 -0
  164. data/redis/redis-2.2.11/doc/SremCommand.html +42 -0
  165. data/redis/redis-2.2.11/doc/StringCommandsSidebar.html +36 -0
  166. data/redis/redis-2.2.11/doc/Strings.html +37 -0
  167. data/redis/redis-2.2.11/doc/StrlenCommand.html +39 -0
  168. data/redis/redis-2.2.11/doc/SubstrCommand.html +52 -0
  169. data/redis/redis-2.2.11/doc/SunionCommand.html +40 -0
  170. data/redis/redis-2.2.11/doc/SunionstoreCommand.html +38 -0
  171. data/redis/redis-2.2.11/doc/SupportedLanguages.html +60 -0
  172. data/redis/redis-2.2.11/doc/SupportedPlatforms.html +37 -0
  173. data/redis/redis-2.2.11/doc/TemplateCommand.html +38 -0
  174. data/redis/redis-2.2.11/doc/TtlCommand.html +38 -0
  175. data/redis/redis-2.2.11/doc/TwitterAlikeExample.html +250 -0
  176. data/redis/redis-2.2.11/doc/TypeCommand.html +46 -0
  177. data/redis/redis-2.2.11/doc/UnstableSource.html +39 -0
  178. data/redis/redis-2.2.11/doc/VirtualMemorySpecification.html +156 -0
  179. data/redis/redis-2.2.11/doc/VirtualMemoryUserGuide.html +66 -0
  180. data/redis/redis-2.2.11/doc/ZaddCommand.html +43 -0
  181. data/redis/redis-2.2.11/doc/ZcardCommand.html +41 -0
  182. data/redis/redis-2.2.11/doc/ZincrbyCommand.html +42 -0
  183. data/redis/redis-2.2.11/doc/ZrangeCommand.html +42 -0
  184. data/redis/redis-2.2.11/doc/ZrangebyscoreCommand.html +77 -0
  185. data/redis/redis-2.2.11/doc/ZrankCommand.html +43 -0
  186. data/redis/redis-2.2.11/doc/ZremCommand.html +42 -0
  187. data/redis/redis-2.2.11/doc/ZremrangebyrankCommand.html +39 -0
  188. data/redis/redis-2.2.11/doc/ZremrangebyscoreCommand.html +39 -0
  189. data/redis/redis-2.2.11/doc/ZscoreCommand.html +41 -0
  190. data/redis/redis-2.2.11/doc/ZunionCommand.html +42 -0
  191. data/redis/redis-2.2.11/doc/ZunionstoreCommand.html +43 -0
  192. data/redis/redis-2.2.11/doc/index.html +43 -0
  193. data/redis/redis-2.2.11/doc/redis.png +0 -0
  194. data/redis/redis-2.2.11/doc/style.css +25 -0
  195. data/redis/redis-2.2.11/redis.conf +417 -0
  196. data/redis/redis-2.2.11/src/Makefile +177 -0
  197. data/redis/redis-2.2.11/src/adlist.c +325 -0
  198. data/redis/redis-2.2.11/src/adlist.h +92 -0
  199. data/redis/redis-2.2.11/src/ae.c +390 -0
  200. data/redis/redis-2.2.11/src/ae.h +117 -0
  201. data/redis/redis-2.2.11/src/ae_epoll.c +91 -0
  202. data/redis/redis-2.2.11/src/ae_kqueue.c +93 -0
  203. data/redis/redis-2.2.11/src/ae_select.c +72 -0
  204. data/redis/redis-2.2.11/src/anet.c +347 -0
  205. data/redis/redis-2.2.11/src/anet.h +57 -0
  206. data/redis/redis-2.2.11/src/aof.c +675 -0
  207. data/redis/redis-2.2.11/src/config.c +627 -0
  208. data/redis/redis-2.2.11/src/config.h +64 -0
  209. data/redis/redis-2.2.11/src/db.c +543 -0
  210. data/redis/redis-2.2.11/src/debug.c +314 -0
  211. data/redis/redis-2.2.11/src/dict.c +721 -0
  212. data/redis/redis-2.2.11/src/dict.h +156 -0
  213. data/redis/redis-2.2.11/src/fmacros.h +15 -0
  214. data/redis/redis-2.2.11/src/help.h +638 -0
  215. data/redis/redis-2.2.11/src/intset.c +422 -0
  216. data/redis/redis-2.2.11/src/intset.h +19 -0
  217. data/redis/redis-2.2.11/src/lzf.h +100 -0
  218. data/redis/redis-2.2.11/src/lzfP.h +159 -0
  219. data/redis/redis-2.2.11/src/lzf_c.c +295 -0
  220. data/redis/redis-2.2.11/src/lzf_d.c +150 -0
  221. data/redis/redis-2.2.11/src/mkreleasehdr.sh +9 -0
  222. data/redis/redis-2.2.11/src/multi.c +268 -0
  223. data/redis/redis-2.2.11/src/networking.c +899 -0
  224. data/redis/redis-2.2.11/src/object.c +484 -0
  225. data/redis/redis-2.2.11/src/pqsort.c +197 -0
  226. data/redis/redis-2.2.11/src/pqsort.h +15 -0
  227. data/redis/redis-2.2.11/src/pubsub.c +267 -0
  228. data/redis/redis-2.2.11/src/rdb.c +1020 -0
  229. data/redis/redis-2.2.11/src/redis-benchmark.c +530 -0
  230. data/redis/redis-2.2.11/src/redis-check-aof.c +185 -0
  231. data/redis/redis-2.2.11/src/redis-check-dump.c +681 -0
  232. data/redis/redis-2.2.11/src/redis-cli.c +773 -0
  233. data/redis/redis-2.2.11/src/redis.c +1677 -0
  234. data/redis/redis-2.2.11/src/redis.h +1022 -0
  235. data/redis/redis-2.2.11/src/release.c +13 -0
  236. data/redis/redis-2.2.11/src/replication.c +557 -0
  237. data/redis/redis-2.2.11/src/sds.c +639 -0
  238. data/redis/redis-2.2.11/src/sds.h +78 -0
  239. data/redis/redis-2.2.11/src/sha1.c +276 -0
  240. data/redis/redis-2.2.11/src/sha1.h +17 -0
  241. data/redis/redis-2.2.11/src/solarisfixes.h +22 -0
  242. data/redis/redis-2.2.11/src/sort.c +389 -0
  243. data/redis/redis-2.2.11/src/syncio.c +154 -0
  244. data/redis/redis-2.2.11/src/t_hash.c +476 -0
  245. data/redis/redis-2.2.11/src/t_list.c +986 -0
  246. data/redis/redis-2.2.11/src/t_set.c +610 -0
  247. data/redis/redis-2.2.11/src/t_string.c +438 -0
  248. data/redis/redis-2.2.11/src/t_zset.c +1084 -0
  249. data/redis/redis-2.2.11/src/testhelp.h +54 -0
  250. data/redis/redis-2.2.11/src/util.c +243 -0
  251. data/redis/redis-2.2.11/src/valgrind.sup +5 -0
  252. data/redis/redis-2.2.11/src/version.h +1 -0
  253. data/redis/redis-2.2.11/src/vm.c +1149 -0
  254. data/redis/redis-2.2.11/src/ziplist.c +1323 -0
  255. data/redis/redis-2.2.11/src/ziplist.h +15 -0
  256. data/redis/redis-2.2.11/src/zipmap.c +455 -0
  257. data/redis/redis-2.2.11/src/zipmap.h +48 -0
  258. data/redis/redis-2.2.11/src/zmalloc.c +278 -0
  259. data/redis/redis-2.2.11/src/zmalloc.h +47 -0
  260. data/redis/redis-2.2.11/tests/assets/default.conf +308 -0
  261. data/redis/redis-2.2.11/tests/integration/aof.tcl +104 -0
  262. data/redis/redis-2.2.11/tests/integration/redis-cli.tcl +208 -0
  263. data/redis/redis-2.2.11/tests/integration/replication.tcl +98 -0
  264. data/redis/redis-2.2.11/tests/support/redis.tcl +241 -0
  265. data/redis/redis-2.2.11/tests/support/server.tcl +294 -0
  266. data/redis/redis-2.2.11/tests/support/test.tcl +190 -0
  267. data/redis/redis-2.2.11/tests/support/tmpfile.tcl +15 -0
  268. data/redis/redis-2.2.11/tests/support/util.tcl +296 -0
  269. data/redis/redis-2.2.11/tests/test_helper.tcl +221 -0
  270. data/redis/redis-2.2.11/tests/unit/auth.tcl +15 -0
  271. data/redis/redis-2.2.11/tests/unit/basic.tcl +616 -0
  272. data/redis/redis-2.2.11/tests/unit/cas.tcl +135 -0
  273. data/redis/redis-2.2.11/tests/unit/expire.tcl +74 -0
  274. data/redis/redis-2.2.11/tests/unit/other.tcl +240 -0
  275. data/redis/redis-2.2.11/tests/unit/printver.tcl +6 -0
  276. data/redis/redis-2.2.11/tests/unit/protocol.tcl +62 -0
  277. data/redis/redis-2.2.11/tests/unit/pubsub.tcl +195 -0
  278. data/redis/redis-2.2.11/tests/unit/quit.tcl +40 -0
  279. data/redis/redis-2.2.11/tests/unit/sort.tcl +189 -0
  280. data/redis/redis-2.2.11/tests/unit/type/hash.tcl +300 -0
  281. data/redis/redis-2.2.11/tests/unit/type/list.tcl +819 -0
  282. data/redis/redis-2.2.11/tests/unit/type/set.tcl +334 -0
  283. data/redis/redis-2.2.11/tests/unit/type/zset.tcl +587 -0
  284. data/redis/redis-2.2.11/utils/build-static-symbols.tcl +22 -0
  285. data/redis/redis-2.2.11/utils/generate-command-help.rb +112 -0
  286. data/redis/redis-2.2.11/utils/mktarball.sh +13 -0
  287. data/redis/redis-2.2.11/utils/redis-copy.rb +78 -0
  288. data/redis/redis-2.2.11/utils/redis-sha1.rb +52 -0
  289. data/redis/redis-2.2.11/utils/redis_init_script +42 -0
  290. 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
+ }