rediska 0.3.1 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -0
- data/lib/rediska/driver.rb +65 -8
- data/lib/rediska/version.rb +1 -1
- data/spec/support/sorted_sets.rb +40 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ace76e76418b38e8b9b46fcdb5c4db0455e89c95
|
4
|
+
data.tar.gz: 902e598e4cd72baae2e0f376edb6c9215a3873c3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 19eb6136ff931a2cd42f2c71fd17ab6e83433822fcb7105c1993f30a1b39102e11fd04feded16da5a317abc294149f9c42c876461fe44b0f8bafda00856dd744
|
7
|
+
data.tar.gz: 4393f6c7a5f98b32c8bb0a6432ed3248c702344cac9221fcc4c44b138a1ff1f1d433045d0e7a7ee2a888a2a61dff215db94fc03296f822d9b8c294df93058f25
|
data/README.md
CHANGED
data/lib/rediska/driver.rb
CHANGED
@@ -915,14 +915,8 @@ module Rediska
|
|
915
915
|
data_type_check(key, ZSet)
|
916
916
|
return [] unless data[key]
|
917
917
|
|
918
|
-
|
919
|
-
|
920
|
-
if v1 == v2
|
921
|
-
k1 <=> k2
|
922
|
-
else
|
923
|
-
v1 <=> v2
|
924
|
-
end
|
925
|
-
end
|
918
|
+
results = sort_keys(data[key])
|
919
|
+
|
926
920
|
# Select just the keys unless we want scores
|
927
921
|
results = results.map(&:first) unless with_scores
|
928
922
|
results[start..stop].flatten.map(&:to_s)
|
@@ -1008,6 +1002,58 @@ module Rediska
|
|
1008
1002
|
data[out].size
|
1009
1003
|
end
|
1010
1004
|
|
1005
|
+
def zscan(key, start_cursor, *args)
|
1006
|
+
data_type_check(key, ZSet)
|
1007
|
+
return [] unless data[key]
|
1008
|
+
|
1009
|
+
match = '*'
|
1010
|
+
count = 10
|
1011
|
+
|
1012
|
+
if args.size.odd?
|
1013
|
+
raise_argument_error('zscan')
|
1014
|
+
end
|
1015
|
+
|
1016
|
+
if idx = args.index('MATCH')
|
1017
|
+
match = args[idx + 1]
|
1018
|
+
end
|
1019
|
+
|
1020
|
+
if idx = args.index('COUNT')
|
1021
|
+
count = args[idx + 1]
|
1022
|
+
end
|
1023
|
+
|
1024
|
+
start_cursor = start_cursor.to_i
|
1025
|
+
data_type_check(start_cursor, Fixnum)
|
1026
|
+
|
1027
|
+
cursor = start_cursor
|
1028
|
+
next_keys = []
|
1029
|
+
|
1030
|
+
sorted_keys = sort_keys(data[key])
|
1031
|
+
|
1032
|
+
if start_cursor + count >= sorted_keys.length
|
1033
|
+
next_keys = sorted_keys.to_a.select { |k| File.fnmatch(match, k[0]) } [start_cursor..-1]
|
1034
|
+
cursor = 0
|
1035
|
+
else
|
1036
|
+
cursor = start_cursor + count
|
1037
|
+
next_keys = sorted_keys.to_a.select { |k| File.fnmatch(match, k[0]) } [start_cursor..cursor-1]
|
1038
|
+
end
|
1039
|
+
|
1040
|
+
return "#{cursor}", next_keys.flatten.map(&:to_s)
|
1041
|
+
end
|
1042
|
+
|
1043
|
+
# Originally from redis-rb
|
1044
|
+
def zscan_each(key, *args, &block)
|
1045
|
+
data_type_check(key, ZSet)
|
1046
|
+
return [] unless data[key]
|
1047
|
+
|
1048
|
+
return to_enum(:zscan_each, key, options) unless block_given?
|
1049
|
+
cursor = 0
|
1050
|
+
loop do
|
1051
|
+
cursor, values = zscan(key, cursor, options)
|
1052
|
+
values.each(&block)
|
1053
|
+
break if cursor == '0'
|
1054
|
+
end
|
1055
|
+
end
|
1056
|
+
|
1011
1057
|
private
|
1012
1058
|
def raise_argument_error(command, match_string = command)
|
1013
1059
|
error_message = if %w(hmset mset_odd).include?(match_string.downcase)
|
@@ -1064,5 +1110,16 @@ module Rediska
|
|
1064
1110
|
(1..-number).map { data[key].to_a[rand(data[key].size)] }.flatten
|
1065
1111
|
end
|
1066
1112
|
end
|
1113
|
+
|
1114
|
+
def sort_keys(arr)
|
1115
|
+
# Sort by score, or if scores are equal, key alphanum
|
1116
|
+
arr.sort do |(k1, v1), (k2, v2)|
|
1117
|
+
if v1 == v2
|
1118
|
+
k1 <=> k2
|
1119
|
+
else
|
1120
|
+
v1 <=> v2
|
1121
|
+
end
|
1122
|
+
end
|
1123
|
+
end
|
1067
1124
|
end
|
1068
1125
|
end
|
data/lib/rediska/version.rb
CHANGED
data/spec/support/sorted_sets.rb
CHANGED
@@ -448,6 +448,46 @@ shared_examples 'sorted sets' do
|
|
448
448
|
expect(subject.zscore('key1', 3)).to be_nil
|
449
449
|
end
|
450
450
|
|
451
|
+
describe '#zscan' do
|
452
|
+
before do
|
453
|
+
50.times { |x| subject.zadd('key', x, "key #{x}") }
|
454
|
+
end
|
455
|
+
|
456
|
+
it 'with no arguments should return 10 numbers in ascending order' do
|
457
|
+
result = subject.zscan('key', 0)[1]
|
458
|
+
expect(result).to eq(result.sort { |x, y| x[1] <=> y[1] })
|
459
|
+
expect(result.count).to eq(10)
|
460
|
+
end
|
461
|
+
|
462
|
+
it 'with a count should return that number of members' do
|
463
|
+
expect(subject.zscan('key', 0, count: 2)).to eq(['2', [['key 0', 0.0], ['key 1', 1.0]]])
|
464
|
+
end
|
465
|
+
|
466
|
+
it 'with a count greater than the number of members, returns all the members in asc order' do
|
467
|
+
result = subject.zscan('key', 0, count: 1000)[1]
|
468
|
+
expect(result).to eq(result.sort { |x, y| x[1] <=> y[1] })
|
469
|
+
expect(result.size).to eq(50)
|
470
|
+
end
|
471
|
+
|
472
|
+
it 'with match, should return key-values where the key matches' do
|
473
|
+
subject.zadd('key', 1.0, 'blah')
|
474
|
+
subject.zadd('key', 2.0, 'bluh')
|
475
|
+
result = subject.zscan('key', 0, count: 100, match: 'key*')[1]
|
476
|
+
expect(result).to_not include(['blah', 1.0])
|
477
|
+
expect(result).to_not include(['bluh', 2.0])
|
478
|
+
end
|
479
|
+
end
|
480
|
+
|
481
|
+
describe '#zscan_each' do
|
482
|
+
before do
|
483
|
+
50.times { |x| subject.zadd('key', x, "key #{x}") }
|
484
|
+
end
|
485
|
+
|
486
|
+
it 'enumerates over the items in the sorted set' do
|
487
|
+
expect(subject.zscan_each('key').to_a).to eq(subject.zscan('key', 0, count: 50)[1])
|
488
|
+
end
|
489
|
+
end
|
490
|
+
|
451
491
|
#it 'should remove all members in a sorted set within the given indexes'
|
452
492
|
#it 'should return a range of members in a sorted set, by index, with scores ordered from high to low'
|
453
493
|
#it 'should return a range of members in a sorted set, by score, with scores ordered from high to low'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rediska
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Leonid Beder
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-07-
|
11
|
+
date: 2015-07-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|