From 855b0d0cc71f690081c1f18e45b67e7985849e28 Mon Sep 17 00:00:00 2001 From: George Ogata Date: Thu, 19 Jul 2012 10:46:57 -0400 Subject: [PATCH] Handle redis-rb 3.0 API for zrevrange with scores. --- lib/redness/red.rb | 4 ++++ lib/redness/red_set.rb | 10 ++++++++-- spec/redness/red_set_spec.rb | 30 ++++++++++++++++++++++-------- 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/lib/redness/red.rb b/lib/redness/red.rb index 6d3fd4f..70e3cc9 100644 --- a/lib/redness/red.rb +++ b/lib/redness/red.rb @@ -7,6 +7,10 @@ def self.redis $redis end + def self.client_version + @version ||= Redis::VERSION.scan(/\d+/).map { |s| s.to_i } + end + def self.delete(key) redis.del(key) end diff --git a/lib/redness/red_set.rb b/lib/redness/red_set.rb index 78f5074..f5b033b 100644 --- a/lib/redness/red_set.rb +++ b/lib/redness/red_set.rb @@ -45,8 +45,14 @@ def self.get(key, options = {}) results = redis.zrevrange(key, lower_bound, upper_bound, :with_scores => with_scores) if with_scores [].tap do |memo| - results.each_slice(2) do |slice| - memo << [slice[0].to_i, scoring.call(slice[1].to_i)] + if Red.client_version.first < 3 + results.each_slice(2) do |slice| + memo << [slice[0].to_i, scoring.call(slice[1].to_i)] + end + else + results.each do |member, score| + memo << [member.to_i, scoring.call(score)] + end end end else diff --git a/spec/redness/red_set_spec.rb b/spec/redness/red_set_spec.rb index 21a755b..028dbbc 100644 --- a/spec/redness/red_set_spec.rb +++ b/spec/redness/red_set_spec.rb @@ -98,14 +98,28 @@ end describe ".get" do - describe "pagination" do - it "should return results bounded by provided options" do - RedSet.add("somekey", 1) - RedSet.add("somekey", 2) - - RedSet.get("somekey", :lower => 0, :upper => 0).should == [2] - RedSet.get("somekey", :lower => 1, :upper => 1).should == [1] - end + it "should return the elements in reverse-inserted order" do + RedSet.add('somekey', 1) + RedSet.add('somekey', 2) + RedSet.add('somekey', 3) + + RedSet.get('somekey').should == [3, 2, 1] + end + + it "should pair the elements with their scores if :with_scores is true" do + RedSet.add('somekey', 1) + RedSet.add('somekey', 2) + RedSet.add('somekey', 3) + + RedSet.get('somekey', :with_scores => true).should == [[3, 2], [2, 1], [1, 0]] + end + + it "should return results bounded by provided pagination options" do + RedSet.add("somekey", 1) + RedSet.add("somekey", 2) + + RedSet.get("somekey", :lower => 0, :upper => 0).should == [2] + RedSet.get("somekey", :lower => 1, :upper => 1).should == [1] end end