lib/redistat/finder.rb in redistat-0.3.0 vs lib/redistat/finder.rb in redistat-0.4.0

- old
+ new

@@ -1,163 +1,163 @@ require 'redistat/finder/date_set' module Redistat class Finder include Database - + class << self def find(*args) new.find(*args) end - + 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 - + attr_reader :options - + def initialize(opts = {}) set_options(opts) end - + def options @options ||= {} end - + def all(reload = false) @result = nil if reload @result ||= find end - + def total all.total end - + def each(&block) all.each(&block) end - + def map(&block) all.map(&block) end - + def each_with_index(&block) all.each_with_index(&block) end - + def parent @parent ||= self.class.new(options.merge(:label => options[:label].parent)) unless options[:label].nil? end - + def children build_key.children.map { |key| self.class.new(options.merge(:label => key.label.to_s)) } end - + def connection_ref(ref = nil) return options[:connection_ref] if ref.nil? reset! if options[:connection_ref] != ref options[:connection_ref] = ref self end - + def scope(input = nil) return options[:scope] if input.nil? reset! if !options[:scope].nil? && options[:scope].to_s != input.to_s options[:scope] = Scope.new(input) self end - + def label(input = nil) return options[:label] if input.nil? reset! if options.has_key?(:label) && options[:label].to_s != input.to_s options[:label] = (!input.nil?) ? Label.new(input) : nil self end - + def dates(start, finish) from(start).till(finish) end alias :date :dates - + def from(date = nil) return options[:from] if date.nil? reset! if options[:from] != date options[:from] = date self end - + def till(date = nil) return options[:till] if date.nil? reset! if options[:till] != date options[:till] = date self end alias :until :till - + def depth(unit = nil) return options[:depth] if unit.nil? reset! if options[:depth] != unit options[:depth] = unit self end - + def interval(unit = nil) return options[:interval] if unit.nil? reset! if options[:interval] != unit options[:interval] = unit self end - + def find(opts = {}) set_options(opts) raise InvalidOptions.new if !valid_options? if options[:interval].nil? || !options[:interval] find_by_magic else find_by_interval end end - + private - + def set_options(opts = {}) opts = opts.clone opts.each do |key, value| self.send(key, opts.delete(key)) if self.respond_to?(key) end self.options.merge!(opts) end - + def find_by_interval raise InvalidOptions.new if !valid_options? key = build_key col = Collection.new(options) col.total = Result.new(options) @@ -172,11 +172,11 @@ col << result end end col end - + def find_by_magic raise InvalidOptions.new if !valid_options? key = build_key col = Collection.new(options) col.total = Result.new(options) @@ -194,43 +194,43 @@ def reset! @result = nil @parent = nil end - + def valid_options? return true if !options[:scope].blank? && !options[:label].blank? && !options[:from].blank? && !options[:till].blank? false end - + def build_date_sets Finder::DateSet.new(options[:from], options[:till], options[:depth], options[:interval]) end - + def build_key Key.new(options[:scope], options[:label]) end - + def summarize_add_keys(sets, key, sum) sets.each do |date| db.hgetall("#{key.prefix}#{date}").each do |k, v| sum.set_or_incr(k, v.to_i) end end sum end - + def summarize_rem_keys(sets, key, sum) sets.each do |date| db.hgetall("#{key.prefix}#{date}").each do |k, v| sum.set_or_incr(k, -v.to_i) end end sum end - + def db super(options[:connection_ref]) end - + end -end \ No newline at end of file +end