| the Report#run method only accepts :conditions and _limit options - reportable … | |
| Log | |
| Files | |
| Refs | |
| README | |
| --- | |
| commit 6a2014d4aef05d98e682c1f0db51caa6e885be45 | |
| parent 9a449b3f4445570df2178ccb549b16124f22cc18 | |
| Author: marcoow <[email protected]> | |
| Date: Fri, 5 Dec 2008 23:49:37 +0800 | |
| the Report#run method only accepts :conditions and _limit options | |
| Signed-off-by: Marco Otte-Witte <[email protected]> | |
| Diffstat: | |
| M lib/kvlr/reports_as_sparkline/repo… | 31 +++++++++++++++------------… | |
| M lib/kvlr/reports_as_sparkline/repo… | 21 +++++++++++---------- | |
| M spec/db/schema.rb | 16 ++++++++++------ | |
| M spec/other/cumulated_report_spec.rb | 3 ++- | |
| M spec/other/report_cache_spec.rb | 10 +++++----- | |
| M spec/other/report_spec.rb | 17 +++++++++-------- | |
| 6 files changed, 52 insertions(+), 46 deletions(-) | |
| --- | |
| diff --git a/lib/kvlr/reports_as_sparkline/report.rb b/lib/kvlr/reports_as_spar… | |
| @@ -4,18 +4,18 @@ module Kvlr #:nodoc: | |
| class Report | |
| - attr_reader :klass, :name | |
| + attr_reader :klass, :name, :date_column_name, :value_column_name, :group… | |
| def initialize(klass, name, options = {}) | |
| ensure_valid_options(options) | |
| - @klass = klass | |
| - @name = name | |
| + @klass = klass | |
| + @name = name | |
| + @date_column_name = (options[:date_column_name] || 'created_at').to_s | |
| + @value_column_name = (options[:value_column_name] || (options[:aggrega… | |
| + @aggregation = options[:aggregation] || :count | |
| + @grouping = Grouping.new(options[:grouping] || :day) | |
| @options = { | |
| :limit => options[:limit] || 100, | |
| - :aggregation => options[:aggregation] || :count, | |
| - :grouping => options[:grouping] || :day, | |
| - :date_column_name => (options[:date_column_name] || 'created_at').t… | |
| - :value_column_name => (options[:value_column_name] || (options[:aggr… | |
| :conditions => options[:conditions] || [''] | |
| } | |
| @options.merge!(options) | |
| @@ -25,21 +25,20 @@ module Kvlr #:nodoc: | |
| def run(options = {}) | |
| ensure_valid_options(options) | |
| options = @options.merge(options) | |
| - grouping = Grouping.new(options[:grouping]) | |
| - ReportCache.cached_transaction(self, grouping, options[:limit], option… | |
| - conditions = setup_conditions(begin_at, options[:date_column_name], … | |
| - @klass.send(options[:aggregation], | |
| - options[:value_column_name].to_s, | |
| + ReportCache.cached_transaction(self, options[:limit]) do |begin_at| | |
| + conditions = setup_conditions(begin_at, options[:conditions]) | |
| + @klass.send(@aggregation, | |
| + @value_column_name, | |
| :conditions => conditions, | |
| - :group => grouping.to_sql(options[:date_column_name]), | |
| - :order => "#{grouping.to_sql(options[:date_column_name])} DESC" | |
| + :group => @grouping.to_sql(@date_column_name), | |
| + :order => "#{@grouping.to_sql(@date_column_name)} DESC" | |
| ) | |
| end | |
| end | |
| private | |
| - def setup_conditions(begin_at, date_column_name, custom_conditions = [… | |
| + def setup_conditions(begin_at, custom_conditions = []) | |
| conditions = [''] | |
| if custom_conditions.is_a?(Hash) | |
| conditions = [ | |
| @@ -49,7 +48,7 @@ module Kvlr #:nodoc: | |
| elsif custom_conditions.size > 0 | |
| conditions = [(custom_conditions[0] || ''), *custom_conditions[1..… | |
| end | |
| - conditions[0] += "#{(conditions[0].blank? ? '' : ' AND ') + date_col… | |
| + conditions[0] += "#{(conditions[0].blank? ? '' : ' AND ') + @date_co… | |
| conditions << begin_at | |
| end | |
| diff --git a/lib/kvlr/reports_as_sparkline/report_cache.rb b/lib/kvlr/reports_a… | |
| @@ -4,25 +4,25 @@ module Kvlr #:nodoc: | |
| class ReportCache < ActiveRecord::Base | |
| - def self.cached_transaction(report, grouping, limit, date_column_name, &… | |
| + def self.cached_transaction(report, limit, &block) | |
| raise ArgumentError.new('A block must be given') unless block_given? | |
| self.transaction do | |
| cached_data = self.find( | |
| :all, | |
| - :conditions => { :model_name => report.klass.to_s, :report_name =>… | |
| + :conditions => { :model_name => report.klass.to_s, :report_name =>… | |
| :limit => limit, | |
| - :order => "#{date_column_name.to_s} DESC" | |
| + :order => "#{report.date_column_name.to_s} DESC" | |
| ) | |
| - last_reporting_period_to_read = get_last_reporting_period(cached_dat… | |
| + last_reporting_period_to_read = get_last_reporting_period(cached_dat… | |
| new_data = yield(last_reporting_period_to_read) | |
| - return update_cache(new_data, cached_data, report, grouping) | |
| + return update_cache(new_data, cached_data, report) | |
| end | |
| end | |
| private | |
| - def self.get_last_reporting_period(cached_data, grouping, acc) | |
| - return acc if cached_data.empty? | |
| + def self.get_last_reporting_period(cached_data, grouping, limit) | |
| + return grouping.first_reporting_period(limit) if cached_data.empty? | |
| puts cached_data[0].reporting_period.class.inspect | |
| period = grouping.to_reporting_period(cached_data[0].reporting_perio… | |
| cached_data[1..-2].each_with_index do |cached, i| | |
| @@ -33,7 +33,7 @@ module Kvlr #:nodoc: | |
| return grouping.to_reporting_period(cached_data[-1].reporting_period) | |
| end | |
| - def self.update_cache(new_data, cached_data, report, grouping) | |
| + def self.update_cache(new_data, cached_data, report) | |
| rows_to_write = (0..-1) | |
| if cached_data.size > 0 && new_data.size > 0 | |
| cached_data.last.update_attributes!(:value => new_data.first[1]) | |
| @@ -43,8 +43,9 @@ module Kvlr #:nodoc: | |
| self.create!( | |
| :model_name => report.klass.to_s, | |
| :report_name => report.name.to_s, | |
| - :report_grouping => grouping.identifier.to_s, | |
| - :reporting_period => grouping.to_reporting_period(DateTime.parse… | |
| + :grouping => report.grouping.identifier.to_s, | |
| + :aggregation => report.aggregation.to_s, | |
| + :reporting_period => report.grouping.to_reporting_period(DateTim… | |
| :value => row[1] | |
| ) | |
| end | |
| diff --git a/spec/db/schema.rb b/spec/db/schema.rb | |
| @@ -10,7 +10,8 @@ ActiveRecord::Schema.define(:version => 1) do | |
| create_table :report_caches, :force => true do |t| | |
| t.string :model_name, :null => false | |
| t.string :report_name, :null => false | |
| - t.string :report_grouping, :null => false | |
| + t.string :grouping, :null => false | |
| + t.string :aggregation, :null => false | |
| t.float :value, :null => false, :default => 0 | |
| t.datetime :reporting_period, :null => false | |
| @@ -19,12 +20,15 @@ ActiveRecord::Schema.define(:version => 1) do | |
| add_index :report_caches, [ | |
| :model_name, | |
| :report_name, | |
| - :report_grouping | |
| - ], :name => 'name_klass_grouping' | |
| + :grouping, | |
| + :aggregation | |
| + ], :name => 'name_model_grouping_agregation' | |
| add_index :report_caches, [ | |
| - :model_name, :report_name, | |
| - :report_grouping, | |
| + :model_name, | |
| + :report_name, | |
| + :grouping, | |
| + :aggregation, | |
| :reporting_period | |
| - ], :unique => true, :name => 'name_klass_grouping_period' | |
| + ], :unique => true, :name => 'name_model_grouping_aggregation_period' | |
| end | |
| diff --git a/spec/other/cumulated_report_spec.rb b/spec/other/cumulated_report_… | |
| @@ -24,7 +24,8 @@ describe Kvlr::ReportsAsSparkline::CumulatedReport do | |
| end | |
| it 'should return correct data for :aggregation => :sum' do | |
| - result = @report.run(:aggregation => :sum, :value_column_name => :prof… | |
| + @report = Kvlr::ReportsAsSparkline::CumulatedReport.new(User, :registr… | |
| + result = @report.run().to_a | |
| result[0][1].should == 1 | |
| result[1][1].should == 6 | |
| diff --git a/spec/other/report_cache_spec.rb b/spec/other/report_cache_spec.rb | |
| @@ -10,14 +10,14 @@ describe Kvlr::ReportsAsSparkline::ReportCache do | |
| it 'should raise an ArgumentError if no block is given' do | |
| lambda do | |
| - Kvlr::ReportsAsSparkline::ReportCache.cached_transaction(@report, :cou… | |
| + Kvlr::ReportsAsSparkline::ReportCache.cached_transaction(@report, 100) | |
| end.should raise_error(ArgumentError) | |
| end | |
| it 'sould start a transaction' do | |
| Kvlr::ReportsAsSparkline::ReportCache.should_receive(:transaction) | |
| - Kvlr::ReportsAsSparkline::ReportCache.cached_transaction(@report, :count… | |
| + Kvlr::ReportsAsSparkline::ReportCache.cached_transaction(@report, 100) {} | |
| end | |
| end | |
| @@ -38,7 +38,7 @@ describe Kvlr::ReportsAsSparkline::ReportCache do | |
| :get_last_reporting_period, | |
| cached_data, | |
| @grouping, | |
| - @grouping.first_reporting_period(3) | |
| + 10 | |
| ).should == @grouping.to_reporting_period(Time.now - 2.days) | |
| end | |
| @@ -47,8 +47,8 @@ describe Kvlr::ReportsAsSparkline::ReportCache do | |
| :get_last_reporting_period, | |
| [], | |
| @grouping, | |
| - @grouping.first_reporting_period(3) | |
| - ).should == @grouping.to_reporting_period(Time.now - 3.days) | |
| + 10 | |
| + ).should == @grouping.to_reporting_period(Time.now - 10.days) | |
| end | |
| end | |
| diff --git a/spec/other/report_spec.rb b/spec/other/report_spec.rb | |
| @@ -64,9 +64,9 @@ describe Kvlr::ReportsAsSparkline::Report do | |
| end | |
| it 'should validate the specified options' do | |
| - @report.should_receive(:ensure_valid_options).once.with(:aggregation =… | |
| + @report.should_receive(:ensure_valid_options).once.with(:limit => 3) | |
| - result = @report.run(:aggregation => :sum, :value_column_name => :prof… | |
| + result = @report.run(:limit => 3) | |
| end | |
| it 'should return correct data for :aggregation => :count' do | |
| @@ -77,7 +77,8 @@ describe Kvlr::ReportsAsSparkline::Report do | |
| end | |
| it 'should return correct data for :aggregation => :sum' do | |
| - result = @report.run(:aggregation => :sum, :value_column_name => :prof… | |
| + @report = Kvlr::ReportsAsSparkline::Report.new(User, :registrations, :… | |
| + result = @report.run().to_a | |
| result[0][1].should == 1 | |
| result[1][1].should == 5 | |
| @@ -104,26 +105,26 @@ describe Kvlr::ReportsAsSparkline::Report do | |
| it 'should return conditions for date_column_name >= begin_at only if no c… | |
| begin_at = Time.now | |
| - @report.send(:setup_conditions, begin_at, 'created_at').should == ['crea… | |
| + @report.send(:setup_conditions, begin_at).should == ['created_at >= ?', … | |
| end | |
| it 'should return conditions for date_column_name >= begin_at only if an e… | |
| begin_at = Time.now | |
| - @report.send(:setup_conditions, begin_at, 'created_at', {}).should == ['… | |
| + @report.send(:setup_conditions, begin_at, {}).should == ['created_at >= … | |
| end | |
| it 'should return conditions for date_column_name >= begin_at only if an e… | |
| begin_at = Time.now | |
| - @report.send(:setup_conditions, begin_at, 'created_at', []).should == ['… | |
| + @report.send(:setup_conditions, begin_at, []).should == ['created_at >= … | |
| end | |
| it 'should correctly include custom conditions if they are specified as a … | |
| begin_at = Time.now | |
| custom_conditions = { :first_name => 'first name', :last_name => 'last n… | |
| - conditions = @report.send(:setup_conditions, begin_at, 'created_at', cus… | |
| + conditions = @report.send(:setup_conditions, begin_at, custom_conditions) | |
| #cannot check for equality of complete conditions array since hashes are… | |
| conditions[0].should include('first_name = ?') | |
| conditions[0].should include('last_name = ?') | |
| @@ -137,7 +138,7 @@ describe Kvlr::ReportsAsSparkline::Report do | |
| begin_at = Time.now | |
| custom_conditions = ['first_name = ? AND last_name = ?', 'first name', '… | |
| - @report.send(:setup_conditions, begin_at, 'created_at', custom_condition… | |
| + @report.send(:setup_conditions, begin_at, custom_conditions).should == [ | |
| 'first_name = ? AND last_name = ? AND created_at >= ?', | |
| 'first name', | |
| 'last name', |