From d74dc41110031e0bebca60141e202d88a3dbda47 Mon Sep 17 00:00:00 2001 From: Jim Myhrberg Date: Wed, 9 Mar 2011 10:59:53 +0000 Subject: [PATCH] added label indexing features when using label groupings --- lib/redistat.rb | 1 + lib/redistat/key.rb | 4 +++ lib/redistat/label.rb | 18 ++++++++++- lib/redistat/summary.rb | 1 + spec/label_spec.rb | 69 ++++++++++++++++++++++++++++------------- 5 files changed, 70 insertions(+), 23 deletions(-) diff --git a/lib/redistat.rb b/lib/redistat.rb index 6a230b5..274cd56 100644 --- a/lib/redistat.rb +++ b/lib/redistat.rb @@ -36,6 +36,7 @@ module Redistat KEY_EVENT = ".event:" KEY_LEBELS = "Redistat.lables:" KEY_EVENT_IDS = ".event_ids" + LABEL_INDEX = ".label_index:" GROUP_SEPARATOR = "/" class InvalidOptions < ArgumentError; end diff --git a/lib/redistat/key.rb b/lib/redistat/key.rb index 3231757..5ac23fc 100644 --- a/lib/redistat/key.rb +++ b/lib/redistat/key.rb @@ -57,6 +57,10 @@ module Redistat @label.parent_group end + def update_label_index + @label.update_index + end + def to_s(depth = nil) depth ||= @options[:depth] key = self.prefix diff --git a/lib/redistat/label.rb b/lib/redistat/label.rb index 44b9656..9e99f40 100644 --- a/lib/redistat/label.rb +++ b/lib/redistat/label.rb @@ -49,8 +49,24 @@ module Redistat @groups.reverse! end + def parent + @parent ||= self.class.new(parent_group) + end + def parent_group - groups[-2] + groups[1] + end + + def sub_group + @raw.split(GROUP_SEPARATOR).last + end + + def update_index + groups.each do |group| + label = self.class.new(group) + break if label.parent_group.nil? + db.sadd("#{LABEL_INDEX}#{label.parent_group}", label.sub_group) == "OK" ? true : false + end end end diff --git a/lib/redistat/summary.rb b/lib/redistat/summary.rb index ed03f99..938baaa 100644 --- a/lib/redistat/summary.rb +++ b/lib/redistat/summary.rb @@ -13,6 +13,7 @@ module Redistat stats = inject_group_summaries(stats) key.groups.each { |k| update_key(k, stats, depth_limit, connection_ref) + k.update_label_index # TODO: add a label_indexing option } else update_key(key, stats, depth_limit, connection_ref) diff --git a/spec/label_spec.rb b/spec/label_spec.rb index cd77ea0..825a4a2 100644 --- a/spec/label_spec.rb +++ b/spec/label_spec.rb @@ -25,30 +25,55 @@ describe Redistat::Label do db.get("#{Redistat::KEY_LEBELS}#{label.hash}").should == name end - it "should separate label names into groups" do - name = "message/public/offensive" - label = Redistat::Label.new(name) - label.name.should == name - label.groups.should == [ "message/public/offensive", - "message/public", - "message" ] + describe "Grouping" do + before(:each) do + @name = "message/public/offensive" + @label = Redistat::Label.new(@name) + end + + it "should separate label names into groups" do + @label.name.should == @name + @label.groups.should == [ "message/public/offensive", + "message/public", + "message" ] - name = "/message/public/" - label = Redistat::Label.new(name) - label.name.should == name - label.groups.should == [ "message/public", - "message" ] + @name = "/message/public/" + @label = Redistat::Label.new(@name) + @label.name.should == @name + @label.groups.should == [ "message/public", + "message" ] - name = "message" - label = Redistat::Label.new(name) - label.name.should == name - label.groups.should == [ "message" ] - end - - it "should know it's parent label group" do - name = "message/public/offensive" - label = Redistat::Label.new(name) - label.parent_group.should == 'message/public' + @name = "message" + @label = Redistat::Label.new(@name) + @label.name.should == @name + @label.groups.should == [ "message" ] + end + + it "should know it's parent label group" do + @label.parent_group.should == 'message/public' + Redistat::Label.new('hello').parent_group.should be_nil + end + + it "should update label index" do + db.smembers("#{Redistat::LABEL_INDEX}#{@label.parent_group}").should == [] + @label.update_index + members = db.smembers("#{Redistat::LABEL_INDEX}#{@label.parent_group}") # checking 'message/public' + members.should have(1).item + members.should include('offensive') + + name = "message/public/nice" + label = Redistat::Label.new(name) + label.update_index + members = db.smembers("#{Redistat::LABEL_INDEX}#{label.parent_group}") # checking 'message/public' + members.should have(2).items + members.should include('offensive') + members.should include('nice') + + label = @label.parent + members = db.smembers("#{Redistat::LABEL_INDEX}#{label.parent_group}") # checking 'message' + members.should have(1).item + members.should include('public') + end end end \ No newline at end of file