From be464ec298b97581f88a81c0f375bdd28dcb34af Mon Sep 17 00:00:00 2001 From: Jim Myhrberg Date: Tue, 24 Aug 2010 13:17:18 +0300 Subject: [PATCH] Replaced KeySelection class with a more logical Finder class. --- lib/redistat.rb | 3 +- lib/redistat/finder.rb | 90 +++++ lib/redistat/finder/date_set.rb | 95 +++++ lib/redistat/key.rb | 13 +- lib/redistat/key_selection.rb | 93 ----- ...ection_spec.rb => finder_date_set_spec.rb} | 331 +++++++++++------- spec/finder_spec.rb | 36 ++ 7 files changed, 447 insertions(+), 214 deletions(-) create mode 100644 lib/redistat/finder.rb create mode 100644 lib/redistat/finder/date_set.rb delete mode 100644 lib/redistat/key_selection.rb rename spec/{key_selection_spec.rb => finder_date_set_spec.rb} (51%) create mode 100644 spec/finder_spec.rb diff --git a/lib/redistat.rb b/lib/redistat.rb index 0849339..6fe64f0 100644 --- a/lib/redistat.rb +++ b/lib/redistat.rb @@ -11,8 +11,9 @@ require 'digest/sha1' require 'redistat/database' require 'redistat/date' require 'redistat/event' +require 'redistat/finder' +require 'redistat/finder/date_set' require 'redistat/key' -require 'redistat/key_selection' require 'redistat/label' require 'redistat/model' require 'redistat/scope' diff --git a/lib/redistat/finder.rb b/lib/redistat/finder.rb new file mode 100644 index 0000000..1eee4bb --- /dev/null +++ b/lib/redistat/finder.rb @@ -0,0 +1,90 @@ +module Redistat + class Finder + + attr_reader :options + + def initialize(options = {}) + @options = options + end + + def builder + + end + + def valid_options? + return true if !@options[:scope].blank? && !@options[:label].blank? && !@options[:from].blank? && !@options[:till].blank? + false + end + + class << self + + def scope(scope) + new.scope(scope) + end + + def label(label) + new.label(label) + end + + def dates(from, till) + new.dates(from, till) + end + alias :date :dates + + def from(date) + new.from(date) + end + + def till(date) + new.till(date) + end + alias :untill :till + + def depth(unit) + new.depth(unit) + end + + def interval(unit) + new.interval(unit) + end + + end + + def scope(scope) + @options[:scope] = scope + self + end + + def label(label) + @options[:label] = label + self + end + + def dates(from, till) + from(from).till(till) + end + alias :date :dates + + def from(date) + @options[:from] = date + self + end + + def till(date) + @options[:till] = date + self + end + alias :until :till + + def depth(unit) + @options[:depth] = unit + self + end + + def interval(unit) + @options[:interval] = unit + self + end + + end +end \ No newline at end of file diff --git a/lib/redistat/finder/date_set.rb b/lib/redistat/finder/date_set.rb new file mode 100644 index 0000000..80d2a77 --- /dev/null +++ b/lib/redistat/finder/date_set.rb @@ -0,0 +1,95 @@ +module Redistat + class Finder + class DateSet < Array + + def initialize(start_date = nil, end_date = nil, depth = nil, interval = false) + if !start_date.nil? && !end_date.nil? + find_date_sets(start_date, end_date, depth, interval) + end + end + + def find_date_sets(start_date, end_date, depth = nil, interval = false) + start_date = start_date.to_time if start_date.is_a?(::Date) + end_date = end_date.to_time if end_date.is_a?(::Date) + if !interval + find_date_sets_by_magic(start_date, end_date, depth) + else + find_date_sets_by_interval(start_date, end_date, depth) + end + end + + private + + def find_date_sets_by_magic(start_date, end_date, depth = nil) + depth ||= :hour + depths = Date::DEPTHS[Date::DEPTHS.index(:year), Date::DEPTHS.index(depth)+1].reverse + depths.each_with_index do |d, i| + sets = [find_start_keys_for(d, start_date, end_date, (i == 0))] + sets << find_end_keys_for(d, start_date, end_date, (i == 0)) + sets.each do |set| + self << set if set != { :add => [], :sub => [] } + end + end + self + end + + def find_date_sets_by_interval(start_date, end_date, depth, inclusive = true) + depth ||= :hour + self << { :add => start_date.map_beginning_of_each(depth, :include_start => inclusive, :include_end => inclusive).until(end_date) { |t| t.to_rs.to_s(depth) }, :sub => [] } + end + + def find_start_keys_for(unit, start_date, end_date, lowest_depth = false) + return find_start_year_for(start_date, end_date, lowest_depth) if unit == :year + index = Date::DEPTHS.index(unit) + nunit = Date::DEPTHS[(index > 0) ? index-1 : index] + if start_date < start_date.round(nunit) || start_date.next(nunit).beginning_of(nunit) > end_date.beginning_of(nunit) + add = [] + start_date.beginning_of_each(unit, :include_start => lowest_depth).until(start_date.end_of(nunit)) do |t| + add << t.to_rs.to_s(unit) if t < end_date.beginning_of(unit) + end + { :add => add, :sub => [] } + else + { :add => [start_date.beginning_of(nunit).to_rs.to_s(nunit)], + :sub => start_date.beginning_of(nunit).map_beginning_of_each(unit, :include_start => true, :include_end => !lowest_depth).until(start_date) { |t| t.to_rs.to_s(unit) } } + end + end + + def find_end_keys_for(unit, start_date, end_date, lowest_depth = false) + return find_end_year_for(start_date, end_date, lowest_depth) if unit == :year + index = Date::DEPTHS.index(unit) + nunit = Date::DEPTHS[(index > 0) ? index-1 : index] + has_nunit = end_date.prev(nunit).beginning_of(nunit) >= start_date.beginning_of(nunit) + nearest_nunit = end_date.round(nunit) + if end_date >= nearest_nunit && has_nunit + add = [] + end_date.beginning_of(nunit).beginning_of_each(unit, :include_start => true, :include_end => lowest_depth).until(end_date) do |t| + add << t.to_rs.to_s(unit) if t > start_date.beginning_of(unit) + end + { :add => add, :sub => [] } + elsif has_nunit + { :add => [end_date.beginning_of(nunit).to_rs.to_s(nunit)], + :sub => end_date.map_beginning_of_each(unit, :include_start => !lowest_depth).until(end_date.end_of(nunit)) { |t| t.to_rs.to_s(unit) } } + else + { :add => [], :sub => [] } + end + end + + def find_start_year_for(start_date, end_date, lowest_depth = false) + if start_date.years_since(1).beginning_of_year < end_date.beginning_of_year + { :add => start_date.map_beginning_of_each_year(:include_end => lowest_depth).until(end_date) { |t| t.to_rs.to_s(:year) }, :sub => [] } + else + { :add => [], :sub => [] } + end + end + + def find_end_year_for(start_date, end_date, lowest_depth = false) + if lowest_depth + { :add => [end_date.beginning_of_year.to_rs.to_s(:year)], :sub => [] } + else + { :add => [], :sub => [] } + end + end + + end + end +end \ No newline at end of file diff --git a/lib/redistat/key.rb b/lib/redistat/key.rb index 72112d9..fbcaf4c 100644 --- a/lib/redistat/key.rb +++ b/lib/redistat/key.rb @@ -16,6 +16,13 @@ module Redistat { :depth => :day } end + def prefix + key = "#{@scope}" + key << "/" + ((@options[:label_hash].nil? || @options[:label_hash] == true) ? @label.hash : @label.name) if !label.nil? + key << ":" + key + end + def date=(input) @date = (input.instance_of?(Redistat::Date)) ? input : Date.new(input) # Redistat::Date, not ::Date end @@ -38,9 +45,9 @@ module Redistat def to_s(depth = nil) depth ||= @options[:depth] - key = "#{@scope}" - key << "/" + ((@options[:label_hash].nil? || @options[:label_hash] == true) ? @label.hash : @label.name) if !label.nil? - key << ":#{@date.to_s(depth)}" + key = self.prefix + key << @date.to_s(depth) + key end end diff --git a/lib/redistat/key_selection.rb b/lib/redistat/key_selection.rb deleted file mode 100644 index 3578bb3..0000000 --- a/lib/redistat/key_selection.rb +++ /dev/null @@ -1,93 +0,0 @@ -module Redistat - class KeySelection - - attr_reader :sets - - def initialize(start_date, end_date, depth = nil, interval = false) - @sets = self.class.find_date_sets(start_date, end_date, depth, interval) - end - - def self.find_date_sets(start_date, end_date, depth = nil, interval = false) - start_date = start_date.to_time if start_date.is_a?(::Date) - end_date = end_date.to_time if end_date.is_a?(::Date) - if !interval - find_date_sets_by_magic(start_date, end_date, depth) - else - find_date_sets_by_interval(start_date, end_date, depth) - end - end - - private - - def self.find_date_sets_by_magic(start_date, end_date, depth = nil) - depth ||= :hour - depths = Date::DEPTHS[Date::DEPTHS.index(:year), Date::DEPTHS.index(depth)+1].reverse - sets = [] - depths.each_with_index do |d, i| - sets << find_start_keys_for(d, start_date, end_date, (i == 0)) - sets << find_end_keys_for(d, start_date, end_date, (i == 0)) - end - sets - end - - def self.find_date_sets_by_interval(start_date, end_date, depth) - depth ||= :hour - [{ :add => start_date.map_beginning_of_each(depth, :include_start => true, :include_end => true).until(end_date) { |t| t.to_rs.to_s(depth) }, - :sub => [] }] - - end - - def self.find_start_keys_for(unit, start_date, end_date, lowest_depth = false) - return find_start_year_for(start_date, end_date, lowest_depth) if unit == :year - index = Date::DEPTHS.index(unit) - nunit = Date::DEPTHS[(index > 0) ? index-1 : index] - if start_date < start_date.round(nunit) || start_date.next(nunit).beginning_of(nunit) > end_date.beginning_of(nunit) - add = [] - start_date.beginning_of_each(unit, :include_start => lowest_depth).until(start_date.end_of(nunit)) do |t| - add << t.to_rs.to_s(unit) if t < end_date.beginning_of(unit) - end - { :add => add, :sub => [] } - else - { :add => [start_date.beginning_of(nunit).to_rs.to_s(nunit)], - :sub => start_date.beginning_of(nunit).map_beginning_of_each(unit, :include_start => true, :include_end => !lowest_depth).until(start_date) { |t| t.to_rs.to_s(unit) } } - end - end - - def self.find_end_keys_for(unit, start_date, end_date, lowest_depth = false) - return find_end_year_for(start_date, end_date, lowest_depth) if unit == :year - index = Date::DEPTHS.index(unit) - nunit = Date::DEPTHS[(index > 0) ? index-1 : index] - has_nunit = end_date.prev(nunit).beginning_of(nunit) >= start_date.beginning_of(nunit) - nearest_nunit = end_date.round(nunit) - if end_date >= nearest_nunit - add = [] - end_date.beginning_of(nunit).beginning_of_each(unit, :include_start => true, :include_end => lowest_depth).until(end_date) do |t| - add << t.to_rs.to_s(unit) if t > start_date.beginning_of(unit) - end - { :add => add, :sub => [] } - elsif has_nunit - { :add => [end_date.beginning_of(nunit).to_rs.to_s(nunit)], - :sub => end_date.map_beginning_of_each(unit, :include_start => !lowest_depth).until(end_date.end_of(nunit)) { |t| t.to_rs.to_s(unit) } } - else - { :add => [], :sub => [] } - end - end - - def self.find_start_year_for(start_date, end_date, lowest_depth = false) - if start_date.years_since(1).beginning_of_year < end_date.beginning_of_year - { :add => start_date.map_beginning_of_each_year(:include_end => lowest_depth).until(end_date) { |t| t.to_rs.to_s(:year) }, :sub => [] } - else - { :add => [], :sub => [] } - end - end - - def self.find_end_year_for(start_date, end_date, lowest_depth = false) - if lowest_depth - { :add => [end_date.beginning_of_year.to_rs.to_s(:year)], :sub => [] } - else - { :add => [], :sub => [] } - end - end - - end -end \ No newline at end of file diff --git a/spec/key_selection_spec.rb b/spec/finder_date_set_spec.rb similarity index 51% rename from spec/key_selection_spec.rb rename to spec/finder_date_set_spec.rb index af59412..9c92863 100644 --- a/spec/key_selection_spec.rb +++ b/spec/finder_date_set_spec.rb @@ -1,12 +1,15 @@ require "spec_helper" -describe Redistat::KeySelection do - include Redistat::Database +describe Redistat::Finder::DateSet do - it "should find date sets" do + before(:all) do + @finder = Redistat::Finder::DateSet.new + end + + it "should initialize properly" do t_start = Time.utc(2010, 8, 28, 22, 54, 57) t_end = Time.utc(2013, 12, 4, 22, 52, 3) - result = Redistat::KeySelection.new(t_start, t_end).sets + result = Redistat::Finder::DateSet.new(t_start, t_end) result.should == [ { :add => ["2010082822", "2010082823"], :sub => [] }, { :add => ["20131204"], :sub => ["2013120423"] }, @@ -14,8 +17,7 @@ describe Redistat::KeySelection do { :add => ["20131201", "20131202", "20131203"], :sub => [] }, { :add => ["201009", "201010", "201011", "201012"], :sub => [] }, { :add => ["2013"], :sub => ["201312"] }, - { :add => ["2011", "2012"], :sub => [] }, - { :add => [], :sub => [] } + { :add => ["2011", "2012"], :sub => [] } ] end @@ -23,12 +25,12 @@ describe Redistat::KeySelection do t_start = Time.utc(2010, 8, 28, 18, 54, 57) t_end = t_start + 4.hours - result = Redistat::KeySelection.find_date_sets(t_start, t_end, :hour, true) + result = Redistat::Finder::DateSet.new.find_date_sets(t_start, t_end, :hour, true) result[0][:add].should == ["2010082818", "2010082819", "2010082820", "2010082821", "2010082822"] result[0][:sub].should == [] t_end = t_start + 4.days - result = Redistat::KeySelection.find_date_sets(t_start, t_end, :day, true) + result = Redistat::Finder::DateSet.new.find_date_sets(t_start, t_end, :day, true) result[0][:add].should == ["20100828", "20100829", "20100830", "20100831", "20100901"] result[0][:sub].should == [] end @@ -42,28 +44,28 @@ describe Redistat::KeySelection do t_start = Time.utc(2010, 8, 26, 22, 54, 57) t_end = Time.utc(2013, 12, 14, 22, 52, 3) - - result = Redistat::KeySelection.send(:find_start_keys_for, :sec, t_start, t_end) + + result = @finder.send(:find_start_keys_for, :sec, t_start, t_end) result[:add].should == ["20100826225458", "20100826225459"] result[:sub].should == [] - result = Redistat::KeySelection.send(:find_start_keys_for, :min, t_start, t_end) + result = @finder.send(:find_start_keys_for, :min, t_start, t_end) result[:add].should == ["201008262255", "201008262256", "201008262257", "201008262258", "201008262259"] result[:sub].should == [] - result = Redistat::KeySelection.send(:find_start_keys_for, :hour, t_start, t_end) + result = @finder.send(:find_start_keys_for, :hour, t_start, t_end) result[:add].should == ["2010082623"] result[:sub].should == [] - result = Redistat::KeySelection.send(:find_start_keys_for, :day, t_start, t_end) + result = @finder.send(:find_start_keys_for, :day, t_start, t_end) result[:add].should == ["20100827", "20100828", "20100829", "20100830", "20100831"] result[:sub].should == [] - result = Redistat::KeySelection.send(:find_start_keys_for, :month, t_start, t_end) + result = @finder.send(:find_start_keys_for, :month, t_start, t_end) result[:add].should == ["201009", "201010", "201011", "201012"] result[:sub].should == [] - result = Redistat::KeySelection.send(:find_start_keys_for, :year, t_start, t_end) + result = @finder.send(:find_start_keys_for, :year, t_start, t_end) result[:add].should == ["2011", "2012"] result[:sub].should == [] @@ -74,28 +76,28 @@ describe Redistat::KeySelection do t_start = Time.utc(2010, 4, 4, 5, 6, 4) t_end = Time.utc(2011, 2, 14, 22, 52, 3) - - result = Redistat::KeySelection.send(:find_start_keys_for, :sec, t_start, t_end) + + result = @finder.send(:find_start_keys_for, :sec, t_start, t_end) result[:add].should == ["201004040506"] result[:sub].should == ["20100404050600", "20100404050601", "20100404050602", "20100404050603", "20100404050604"] - result = Redistat::KeySelection.send(:find_start_keys_for, :min, t_start, t_end) + result = @finder.send(:find_start_keys_for, :min, t_start, t_end) result[:add].should == ["2010040405"] result[:sub].should == ["201004040500", "201004040501", "201004040502", "201004040503", "201004040504", "201004040505", "201004040506"] - result = Redistat::KeySelection.send(:find_start_keys_for, :hour, t_start, t_end) + result = @finder.send(:find_start_keys_for, :hour, t_start, t_end) result[:add].should == ["20100404"] result[:sub].should == ["2010040400", "2010040401", "2010040402", "2010040403", "2010040404", "2010040405"] - result = Redistat::KeySelection.send(:find_start_keys_for, :day, t_start, t_end) + result = @finder.send(:find_start_keys_for, :day, t_start, t_end) result[:add].should == ["201004"] result[:sub].should == ["20100401", "20100402", "20100403", "20100404"] - result = Redistat::KeySelection.send(:find_start_keys_for, :month, t_start, t_end) + result = @finder.send(:find_start_keys_for, :month, t_start, t_end) result[:add].should == ["2010"] result[:sub].should == ["201001", "201002", "201003", "201004"] - result = Redistat::KeySelection.send(:find_start_keys_for, :year, t_start, t_end) + result = @finder.send(:find_start_keys_for, :year, t_start, t_end) result[:add].should == [] result[:sub].should == [] @@ -110,28 +112,28 @@ describe Redistat::KeySelection do t_start = Time.utc(2007, 12, 26, 22, 4, 4) t_end = Time.utc(2010, 5, 7, 5, 6, 3) - - result = Redistat::KeySelection.send(:find_end_keys_for, :sec, t_start, t_end) + + result = @finder.send(:find_end_keys_for, :sec, t_start, t_end) result[:add].should == ["20100507050600", "20100507050601", "20100507050602"] result[:sub].should == [] - result = Redistat::KeySelection.send(:find_end_keys_for, :min, t_start, t_end) + result = @finder.send(:find_end_keys_for, :min, t_start, t_end) result[:add].should == ["201005070500", "201005070501", "201005070502", "201005070503", "201005070504", "201005070505"] result[:sub].should == [] - result = Redistat::KeySelection.send(:find_end_keys_for, :hour, t_start, t_end) + result = @finder.send(:find_end_keys_for, :hour, t_start, t_end) result[:add].should == ["2010050700", "2010050701", "2010050702", "2010050703", "2010050704"] result[:sub].should == [] - result = Redistat::KeySelection.send(:find_end_keys_for, :day, t_start, t_end) + result = @finder.send(:find_end_keys_for, :day, t_start, t_end) result[:add].should == ["20100501", "20100502", "20100503", "20100504", "20100505", "20100506"] result[:sub].should == [] - result = Redistat::KeySelection.send(:find_end_keys_for, :month, t_start, t_end) + result = @finder.send(:find_end_keys_for, :month, t_start, t_end) result[:add].should == ["201001", "201002", "201003", "201004"] result[:sub].should == [] - result = Redistat::KeySelection.send(:find_end_keys_for, :year, t_start, t_end) + result = @finder.send(:find_end_keys_for, :year, t_start, t_end) result[:add].should == [] result[:sub].should == [] @@ -142,28 +144,28 @@ describe Redistat::KeySelection do t_start = Time.utc(2009, 12, 26, 22, 4, 4) t_end = Time.utc(2010, 10, 27, 22, 56, 57) - - result = Redistat::KeySelection.send(:find_end_keys_for, :sec, t_start, t_end) + + result = @finder.send(:find_end_keys_for, :sec, t_start, t_end) result[:add].should == ["201010272256"] result[:sub].should == ["20101027225657", "20101027225658", "20101027225659"] - result = Redistat::KeySelection.send(:find_end_keys_for, :min, t_start, t_end) + result = @finder.send(:find_end_keys_for, :min, t_start, t_end) result[:add].should == ["2010102722"] result[:sub].should == ["201010272256", "201010272257", "201010272258", "201010272259"] - result = Redistat::KeySelection.send(:find_end_keys_for, :hour, t_start, t_end) + result = @finder.send(:find_end_keys_for, :hour, t_start, t_end) result[:add].should == ["20101027"] result[:sub].should == ["2010102722", "2010102723"] - result = Redistat::KeySelection.send(:find_end_keys_for, :day, t_start, t_end) + result = @finder.send(:find_end_keys_for, :day, t_start, t_end) result[:add].should == ["201010"] result[:sub].should == ["20101027", "20101028", "20101029", "20101030", "20101031"] - result = Redistat::KeySelection.send(:find_end_keys_for, :month, t_start, t_end) + result = @finder.send(:find_end_keys_for, :month, t_start, t_end) result[:add].should == ["2010"] result[:sub].should == ["201010", "201011", "201012"] - result = Redistat::KeySelection.send(:find_end_keys_for, :year, t_start, t_end) + result = @finder.send(:find_end_keys_for, :year, t_start, t_end) result[:add].should == [] result[:sub].should == [] @@ -175,99 +177,217 @@ describe Redistat::KeySelection do # Simple fetching with Limits # - t_start = Time.utc(2010, 8, 26, 20, 54) - # seconds + t_start = Time.utc(2010, 8, 26, 20, 54, 45) t_end = t_start + 4.seconds - result = Redistat::KeySelection.send(:find_start_keys_for, :sec, t_start, t_end) - result[:add].should == ["20100826205401", "20100826205402", "20100826205403"] + result = @finder.send(:find_start_keys_for, :sec, t_start, t_end) + result[:add].should == ["20100826205446", "20100826205447", "20100826205448"] result[:sub].should == [] - result = Redistat::KeySelection.send(:find_end_keys_for, :sec, t_start, t_end) - result[:add].should == ["20100826205401", "20100826205402", "20100826205403"] + result = @finder.send(:find_end_keys_for, :sec, t_start, t_end) + result[:add].should == [] + result[:sub].should == [] + + t_start = Time.utc(2010, 8, 26, 20, 54, 4) + t_end = t_start + 4.seconds + + result = @finder.send(:find_start_keys_for, :sec, t_start, t_end) + result[:add].should == ["20100826205405", "20100826205406", "20100826205407"] + result[:sub].should == [] + + result = @finder.send(:find_end_keys_for, :sec, t_start, t_end) + result[:add].should == [] result[:sub].should == [] # minutes + t_start = Time.utc(2010, 8, 26, 20, 54) t_end = t_start + 4.minutes - result = Redistat::KeySelection.send(:find_start_keys_for, :min, t_start, t_end) + result = @finder.send(:find_start_keys_for, :min, t_start, t_end) result[:add].should == ["201008262055", "201008262056", "201008262057"] result[:sub].should == [] - result = Redistat::KeySelection.send(:find_end_keys_for, :min, t_start, t_end) + result = @finder.send(:find_end_keys_for, :min, t_start, t_end) + result[:add].should == [] + result[:sub].should == [] + + t_start = Time.utc(2010, 8, 26, 20, 4) + t_end = t_start + 4.minutes + + result = @finder.send(:find_start_keys_for, :min, t_start, t_end) + result[:add].should == ["201008262005", "201008262006", "201008262007"] + result[:sub].should == [] + + result = @finder.send(:find_end_keys_for, :min, t_start, t_end) result[:add].should == [] result[:sub].should == [] # hours + t_start = Time.utc(2010, 8, 26, 20, 54) t_end = t_start + 2.hours - - result = Redistat::KeySelection.send(:find_start_keys_for, :min, t_start, t_end) + + result = @finder.send(:find_start_keys_for, :min, t_start, t_end) result[:add].should == ["201008262055", "201008262056", "201008262057", "201008262058", "201008262059"] result[:sub].should == [] - result = Redistat::KeySelection.send(:find_start_keys_for, :hour, t_start, t_end) + result = @finder.send(:find_start_keys_for, :hour, t_start, t_end) result[:add].should == ["2010082621"] result[:sub].should == [] - result = Redistat::KeySelection.send(:find_end_keys_for, :hour, t_start, t_end) + result = @finder.send(:find_end_keys_for, :hour, t_start, t_end) result[:add].should == [] result[:sub].should == [] - result = Redistat::KeySelection.send(:find_end_keys_for, :min, t_start, t_end) + result = @finder.send(:find_end_keys_for, :min, t_start, t_end) result[:add].should == ["2010082622"] result[:sub].should == ["201008262254", "201008262255", "201008262256", "201008262257", "201008262258", "201008262259"] + t_start = Time.utc(2010, 8, 26, 4, 54) + t_end = t_start + 5.hours + + result = @finder.send(:find_start_keys_for, :min, t_start, t_end) + result[:add].should == ["201008260455", "201008260456", "201008260457", "201008260458", "201008260459"] + result[:sub].should == [] + + result = @finder.send(:find_start_keys_for, :hour, t_start, t_end) + result[:add].should == ["2010082605", "2010082606", "2010082607", "2010082608"] + result[:sub].should == [] + + result = @finder.send(:find_end_keys_for, :hour, t_start, t_end) + result[:add].should == [] + result[:sub].should == [] + + result = @finder.send(:find_end_keys_for, :min, t_start, t_end) + result[:add].should == ["2010082609"] + result[:sub].should == ["201008260954", "201008260955", "201008260956", "201008260957", "201008260958", "201008260959"] + # days + t_start = Time.utc(2010, 8, 26, 20, 54) t_end = t_start + 2.day - - result = Redistat::KeySelection.send(:find_start_keys_for, :hour, t_start, t_end) + + result = @finder.send(:find_start_keys_for, :min, t_start, t_end) + result[:add].should == ["201008262055", "201008262056", "201008262057", "201008262058", "201008262059"] + result[:sub].should == [] + + result = @finder.send(:find_start_keys_for, :hour, t_start, t_end) result[:add].should == ["2010082621", "2010082622", "2010082623"] result[:sub].should == [] - result = Redistat::KeySelection.send(:find_start_keys_for, :day, t_start, t_end) + result = @finder.send(:find_start_keys_for, :day, t_start, t_end) result[:add].should == ["20100827"] result[:sub].should == [] - result = Redistat::KeySelection.send(:find_end_keys_for, :day, t_start, t_end) + result = @finder.send(:find_end_keys_for, :day, t_start, t_end) result[:add].should == [] result[:sub].should == [] - result = Redistat::KeySelection.send(:find_end_keys_for, :hour, t_start, t_end) + result = @finder.send(:find_end_keys_for, :hour, t_start, t_end) result[:add].should == ["20100828"] result[:sub].should == ["2010082820", "2010082821", "2010082822", "2010082823"] - result = Redistat::KeySelection.send(:find_end_keys_for, :min, t_start, t_end) + result = @finder.send(:find_end_keys_for, :min, t_start, t_end) result[:add].should == ["2010082820"] result[:sub].should == ["201008282054", "201008282055", "201008282056", "201008282057", "201008282058", "201008282059"] - # months - t_end = t_start + 3.months + t_start = Time.utc(2010, 8, 6, 20, 54) + t_end = t_start + 2.day - result = Redistat::KeySelection.send(:find_start_keys_for, :day, t_start, t_end) - result[:add].should == ["20100827", "20100828", "20100829", "20100830", "20100831"] + result = @finder.send(:find_start_keys_for, :min, t_start, t_end) + result[:add].should == ["201008062055", "201008062056", "201008062057", "201008062058", "201008062059"] result[:sub].should == [] - result = Redistat::KeySelection.send(:find_start_keys_for, :month, t_start, t_end) - result[:add].should == ["201009", "201010"] + result = @finder.send(:find_start_keys_for, :hour, t_start, t_end) + result[:add].should == ["2010080621", "2010080622", "2010080623"] result[:sub].should == [] - result = Redistat::KeySelection.send(:find_end_keys_for, :month, t_start, t_end) + result = @finder.send(:find_start_keys_for, :day, t_start, t_end) + result[:add].should == ["20100807"] + result[:sub].should == [] + + result = @finder.send(:find_end_keys_for, :day, t_start, t_end) result[:add].should == [] result[:sub].should == [] - result = Redistat::KeySelection.send(:find_end_keys_for, :day, t_start, t_end) + result = @finder.send(:find_end_keys_for, :hour, t_start, t_end) + result[:add].should == ["20100808"] + result[:sub].should == ["2010080820", "2010080821", "2010080822", "2010080823"] + + result = @finder.send(:find_end_keys_for, :min, t_start, t_end) + result[:add].should == ["2010080820"] + result[:sub].should == ["201008082054", "201008082055", "201008082056", "201008082057", "201008082058", "201008082059"] + + # months + t_start = Time.utc(2010, 8, 26, 20, 54) + t_end = t_start + 3.months + + result = @finder.send(:find_start_keys_for, :min, t_start, t_end) + result[:add].should == ["201008262055", "201008262056", "201008262057", "201008262058", "201008262059"] + result[:sub].should == [] + + result = @finder.send(:find_start_keys_for, :hour, t_start, t_end) + result[:add].should == ["2010082621", "2010082622", "2010082623"] + result[:sub].should == [] + + result = @finder.send(:find_start_keys_for, :day, t_start, t_end) + result[:add].should == ["20100827", "20100828", "20100829", "20100830", "20100831"] + result[:sub].should == [] + + result = @finder.send(:find_start_keys_for, :month, t_start, t_end) + result[:add].should == ["201009", "201010"] + result[:sub].should == [] + + result = @finder.send(:find_end_keys_for, :month, t_start, t_end) + result[:add].should == [] + result[:sub].should == [] + + result = @finder.send(:find_end_keys_for, :day, t_start, t_end) result[:add].should == ["201011"] result[:sub].should == ["20101126", "20101127", "20101128", "20101129", "20101130"] - result = Redistat::KeySelection.send(:find_end_keys_for, :hour, t_start, t_end) + result = @finder.send(:find_end_keys_for, :hour, t_start, t_end) result[:add].should == ["20101126"] result[:sub].should == ["2010112620", "2010112621", "2010112622", "2010112623"] - result = Redistat::KeySelection.send(:find_end_keys_for, :min, t_start, t_end) + result = @finder.send(:find_end_keys_for, :min, t_start, t_end) result[:add].should == ["2010112620"] result[:sub].should == ["201011262054", "201011262055", "201011262056", "201011262057", "201011262058", "201011262059"] + t_start = Time.utc(2010, 4, 26, 20, 54) + t_end = t_start + 3.months + + result = @finder.send(:find_start_keys_for, :min, t_start, t_end) + result[:add].should == ["201004262055", "201004262056", "201004262057", "201004262058", "201004262059"] + result[:sub].should == [] + + result = @finder.send(:find_start_keys_for, :hour, t_start, t_end) + result[:add].should == ["2010042621", "2010042622", "2010042623"] + result[:sub].should == [] + + result = @finder.send(:find_start_keys_for, :day, t_start, t_end) + result[:add].should == ["20100427", "20100428", "20100429", "20100430"] + result[:sub].should == [] + + result = @finder.send(:find_start_keys_for, :month, t_start, t_end) + result[:add].should == ["201005", "201006"] + result[:sub].should == [] + + result = @finder.send(:find_end_keys_for, :month, t_start, t_end) + result[:add].should == [] + result[:sub].should == [] + + result = @finder.send(:find_end_keys_for, :day, t_start, t_end) + result[:add].should == ["201007"] + result[:sub].should == ["20100726", "20100727", "20100728", "20100729", "20100730", "20100731"] + + result = @finder.send(:find_end_keys_for, :hour, t_start, t_end) + result[:add].should == ["20100726"] + result[:sub].should == ["2010072620", "2010072621", "2010072622", "2010072623"] + + result = @finder.send(:find_end_keys_for, :min, t_start, t_end) + result[:add].should == ["2010072620"] + result[:sub].should == ["201007262054", "201007262055", "201007262056", "201007262057", "201007262058", "201007262059"] + end it "should find inclusive keys on lowest depth" do @@ -279,28 +399,28 @@ describe Redistat::KeySelection do t_start = Time.utc(2010, 8, 26, 22, 54, 57) t_end = Time.utc(2013, 12, 14, 22, 52, 3) - - result = Redistat::KeySelection.send(:find_start_keys_for, :sec, t_start, t_end, true) + + result = @finder.send(:find_start_keys_for, :sec, t_start, t_end, true) result[:add].should == ["20100826225457", "20100826225458", "20100826225459"] result[:sub].should == [] - result = Redistat::KeySelection.send(:find_start_keys_for, :min, t_start, t_end, true) + result = @finder.send(:find_start_keys_for, :min, t_start, t_end, true) result[:add].should == ["201008262254", "201008262255", "201008262256", "201008262257", "201008262258", "201008262259"] result[:sub].should == [] - result = Redistat::KeySelection.send(:find_start_keys_for, :hour, t_start, t_end, true) + result = @finder.send(:find_start_keys_for, :hour, t_start, t_end, true) result[:add].should == ["2010082622", "2010082623"] result[:sub].should == [] - result = Redistat::KeySelection.send(:find_start_keys_for, :day, t_start, t_end, true) + result = @finder.send(:find_start_keys_for, :day, t_start, t_end, true) result[:add].should == ["20100826", "20100827", "20100828", "20100829", "20100830", "20100831"] result[:sub].should == [] - result = Redistat::KeySelection.send(:find_start_keys_for, :month, t_start, t_end, true) + result = @finder.send(:find_start_keys_for, :month, t_start, t_end, true) result[:add].should == ["201008", "201009", "201010", "201011", "201012"] result[:sub].should == [] - result = Redistat::KeySelection.send(:find_start_keys_for, :year, t_start, t_end, true) + result = @finder.send(:find_start_keys_for, :year, t_start, t_end, true) result[:add].should == ["2011", "2012", "2013"] result[:sub].should == [] @@ -311,28 +431,28 @@ describe Redistat::KeySelection do t_start = Time.utc(2010, 4, 4, 5, 6, 4) t_end = Time.utc(2013, 2, 14, 22, 52, 3) - - result = Redistat::KeySelection.send(:find_start_keys_for, :sec, t_start, t_end, true) + + result = @finder.send(:find_start_keys_for, :sec, t_start, t_end, true) result[:add].should == ["201004040506"] result[:sub].should == ["20100404050600", "20100404050601", "20100404050602", "20100404050603"] - result = Redistat::KeySelection.send(:find_start_keys_for, :min, t_start, t_end, true) + result = @finder.send(:find_start_keys_for, :min, t_start, t_end, true) result[:add].should == ["2010040405"] result[:sub].should == ["201004040500", "201004040501", "201004040502", "201004040503", "201004040504", "201004040505"] - result = Redistat::KeySelection.send(:find_start_keys_for, :hour, t_start, t_end, true) + result = @finder.send(:find_start_keys_for, :hour, t_start, t_end, true) result[:add].should == ["20100404"] result[:sub].should == ["2010040400", "2010040401", "2010040402", "2010040403", "2010040404"] - result = Redistat::KeySelection.send(:find_start_keys_for, :day, t_start, t_end, true) + result = @finder.send(:find_start_keys_for, :day, t_start, t_end, true) result[:add].should == ["201004"] result[:sub].should == ["20100401", "20100402", "20100403"] - result = Redistat::KeySelection.send(:find_start_keys_for, :month, t_start, t_end, true) + result = @finder.send(:find_start_keys_for, :month, t_start, t_end, true) result[:add].should == ["2010"] result[:sub].should == ["201001", "201002", "201003"] - result = Redistat::KeySelection.send(:find_start_keys_for, :year, t_start, t_end, true) + result = @finder.send(:find_start_keys_for, :year, t_start, t_end, true) result[:add].should == ["2011", "2012", "2013"] result[:sub].should == [] @@ -343,28 +463,28 @@ describe Redistat::KeySelection do t_start = Time.utc(2007, 12, 26, 22, 4, 4) t_end = Time.utc(2010, 5, 7, 5, 6, 3) - - result = Redistat::KeySelection.send(:find_end_keys_for, :sec, t_start, t_end, true) + + result = @finder.send(:find_end_keys_for, :sec, t_start, t_end, true) result[:add].should == ["20100507050600", "20100507050601", "20100507050602", "20100507050603"] result[:sub].should == [] - result = Redistat::KeySelection.send(:find_end_keys_for, :min, t_start, t_end, true) + result = @finder.send(:find_end_keys_for, :min, t_start, t_end, true) result[:add].should == ["201005070500", "201005070501", "201005070502", "201005070503", "201005070504", "201005070505", "201005070506"] result[:sub].should == [] - result = Redistat::KeySelection.send(:find_end_keys_for, :hour, t_start, t_end, true) + result = @finder.send(:find_end_keys_for, :hour, t_start, t_end, true) result[:add].should == ["2010050700", "2010050701", "2010050702", "2010050703", "2010050704", "2010050705"] result[:sub].should == [] - result = Redistat::KeySelection.send(:find_end_keys_for, :day, t_start, t_end, true) + result = @finder.send(:find_end_keys_for, :day, t_start, t_end, true) result[:add].should == ["20100501", "20100502", "20100503", "20100504", "20100505", "20100506", "20100507"] result[:sub].should == [] - result = Redistat::KeySelection.send(:find_end_keys_for, :month, t_start, t_end, true) + result = @finder.send(:find_end_keys_for, :month, t_start, t_end, true) result[:add].should == ["201001", "201002", "201003", "201004", "201005"] result[:sub].should == [] - result = Redistat::KeySelection.send(:find_end_keys_for, :year, t_start, t_end, true) + result = @finder.send(:find_end_keys_for, :year, t_start, t_end, true) result[:add].should == ["2010"] result[:sub].should == [] @@ -375,54 +495,31 @@ describe Redistat::KeySelection do t_start = Time.utc(2009, 12, 26, 22, 4, 4) t_end = Time.utc(2010, 10, 27, 22, 56, 57) - - result = Redistat::KeySelection.send(:find_end_keys_for, :sec, t_start, t_end, true) + + result = @finder.send(:find_end_keys_for, :sec, t_start, t_end, true) result[:add].should == ["201010272256"] result[:sub].should == ["20101027225658", "20101027225659"] - result = Redistat::KeySelection.send(:find_end_keys_for, :min, t_start, t_end, true) + result = @finder.send(:find_end_keys_for, :min, t_start, t_end, true) result[:add].should == ["2010102722"] result[:sub].should == ["201010272257", "201010272258", "201010272259"] - result = Redistat::KeySelection.send(:find_end_keys_for, :hour, t_start, t_end, true) + result = @finder.send(:find_end_keys_for, :hour, t_start, t_end, true) result[:add].should == ["20101027"] result[:sub].should == ["2010102723"] - result = Redistat::KeySelection.send(:find_end_keys_for, :day, t_start, t_end, true) + result = @finder.send(:find_end_keys_for, :day, t_start, t_end, true) result[:add].should == ["201010"] result[:sub].should == ["20101028", "20101029", "20101030", "20101031"] - result = Redistat::KeySelection.send(:find_end_keys_for, :month, t_start, t_end, true) + result = @finder.send(:find_end_keys_for, :month, t_start, t_end, true) result[:add].should == ["2010"] result[:sub].should == ["201011", "201012"] - result = Redistat::KeySelection.send(:find_end_keys_for, :year, t_start, t_end, true) + result = @finder.send(:find_end_keys_for, :year, t_start, t_end, true) result[:add].should == ["2010"] result[:sub].should == [] end -end - - - - - - - - - - - - - - - - - - - - - - - +end \ No newline at end of file diff --git a/spec/finder_spec.rb b/spec/finder_spec.rb new file mode 100644 index 0000000..54f9504 --- /dev/null +++ b/spec/finder_spec.rb @@ -0,0 +1,36 @@ +require "spec_helper" + +describe Redistat::Finder do + + it "should initialize properly" do + two_hours_ago = 2.hours.ago + one_hour_ago = 1.hour.ago + options = {:scope => "PageViews", :label => "Label", :from => two_hours_ago, :till => one_hour_ago, :depth => :hour, :interval => :hour} + + finder = Redistat::Finder.new(options) + finder.options.should == options + + finder = Redistat::Finder.dates(two_hours_ago, one_hour_ago).scope("PageViews").label("Label").depth(:hour).interval(:hour) + finder.options.should == options + + finder = Redistat::Finder.scope("PageViews").label("Label").from(two_hours_ago).till(one_hour_ago).depth(:hour).interval(:hour) + finder.options.should == options + + finder = Redistat::Finder.label("Label").from(two_hours_ago).till(one_hour_ago).depth(:hour).interval(:hour).scope("PageViews") + finder.options.should == options + + finder = Redistat::Finder.from(two_hours_ago).till(one_hour_ago).depth(:hour).interval(:hour).scope("PageViews").label("Label") + finder.options.should == options + + finder = Redistat::Finder.till(one_hour_ago).depth(:hour).interval(:hour).scope("PageViews").label("Label").from(two_hours_ago) + finder.options.should == options + + finder = Redistat::Finder.depth(:hour).interval(:hour).scope("PageViews").label("Label").from(two_hours_ago).till(one_hour_ago) + finder.options.should == options + + finder = Redistat::Finder.interval(:hour).scope("PageViews").label("Label").from(two_hours_ago).till(one_hour_ago).depth(:hour) + finder.options.should == options + + end + +end \ No newline at end of file