Merge branch 'add-cacheable-option' - reportable - Unnamed repository; edit this file 'description' to name the repository.
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
       ---
 (DIR) commit f8532eeb704c511bb75b5bd4fd9656243c9b118b
 (DIR) parent 96961296ad28658ef018bea8bafb27fd5fe4db00
 (HTM) Author: HD Moore <hd_moore@rapid7.com>
       Date:   Sat, 12 Jan 2013 20:41:04 -0600
       
       Merge branch 'add-cacheable-option'
       
       Diffstat:
         M lib/saulabs/reportable/report.rb    |      10 ++++++++--
         M lib/saulabs/reportable/report_cach… |      14 ++++++++++----
         M spec/classes/report_spec.rb         |       6 +++---
       
       3 files changed, 21 insertions(+), 9 deletions(-)
       ---
 (DIR) diff --git a/lib/saulabs/reportable/report.rb b/lib/saulabs/reportable/report.rb
       @@ -58,6 +58,8 @@ module Saulabs
              #   specifies whether data for the current reporting period is to be read; <b>if +:live_data+ is +true+, you will experience a performance hit since the request cannot be satisfied from the cache alone</b>
              # @option options [DateTime, Boolean] :end_date (false)
              #   when specified, the report will only include data for the +:limit+ reporting periods until this date.
       +      # @option options [Boolean] :cacheable (true)
       +      #   when set to false, the report will never use the cache, which allows reuse of a named report with different conditions
              #
              def initialize(klass, name, options = {})
                ensure_valid_options(options)
       @@ -72,7 +74,8 @@ module Saulabs
                  :conditions => options[:conditions] || [],
                  :grouping   => Grouping.new(options[:grouping] || :day),
                  :live_data  => options[:live_data] || false,
       -          :end_date   => options[:end_date] || false
       +          :end_date   => options[:end_date] || false,
       +          :cacheable  => ( options[:cacheable] == false ? false : true )
                }
                @options.merge!(options)
                @options.freeze
       @@ -94,6 +97,9 @@ module Saulabs
              # @option options [DateTime, Boolean] :end_date (false)
              #   when specified, the report will only include data for the +:limit+ reporting periods until this date.
              #
       +      # @option options [Boolean] :cacheable (true)
       +      #   when set to false, the report will never use the cache, which allows reuse of a named report with different conditions
       +      #
              # @return [Array<Array<DateTime, Float>>]
              #   the result of the report as pairs of {DateTime}s and {Float}s
              #
       @@ -147,7 +153,7 @@ module Saulabs
                  case context
                    when :initialize
                      options.each_key do |k|
       -                raise ArgumentError.new("Invalid option #{k}!") unless [:limit, :aggregation, :grouping, :distinct, :date_column, :value_column, :conditions, :live_data, :end_date].include?(k)
       +                raise ArgumentError.new("Invalid option #{k}!") unless [:limit, :aggregation, :grouping, :distinct, :date_column, :value_column, :conditions, :live_data, :end_date, :cacheable].include?(k)
                      end
                      raise ArgumentError.new("Invalid aggregation #{options[:aggregation]}!") if options[:aggregation] && ![:count, :sum, :maximum, :minimum, :average].include?(options[:aggregation])
                      raise ArgumentError.new('The name of the column holding the value to sum has to be specified for aggregation :sum!') if [:sum, :maximum, :minimum, :average].include?(options[:aggregation]) && !options.key?(:value_column)
 (DIR) diff --git a/lib/saulabs/reportable/report_cache.rb b/lib/saulabs/reportable/report_cache.rb
       @@ -63,6 +63,8 @@ module Saulabs
              #   specifies whether data for the current reporting period is to be read; <b>if +:live_data+ is +true+, you will experience a performance hit since the request cannot be satisfied from the cache alone</b>
              # @option options [DateTime, Boolean] :end_date (false)
              #   when specified, the report will only include data for the +:limit+ reporting periods until this date.
       +      # @option options [Boolean] :cacheable (true)
       +      #   when set to false, the report will never use the cache, which allows reuse of a named report with different conditions
              #
              # @return [ResultSet<Array<DateTime, Float>>]
              #   the result of the report as pairs of {DateTime}s and {Float}s
       @@ -94,12 +96,15 @@ module Saulabs
                  reporting_period = get_first_reporting_period(options)
                  result = []
                  while reporting_period < (options[:end_date] ? ReportingPeriod.new(options[:grouping], options[:end_date]).next : current_reporting_period)
       -            if cached = cached_data.find { |cached| reporting_period == cached[0] }
       +            if options[:cacheable] and cached = cached_data.find { |cached| reporting_period == cached[0] }
                      result << [cached[0].date_time, cached[1]]
                    else
       -              new_cached = build_cached_data(report, options[:grouping], options[:conditions], reporting_period, find_value(new_data, reporting_period))
       -              new_cached.save!
       -              result << [reporting_period.date_time, new_cached.value]
       +              value = find_value(new_data, reporting_period)
       +              if options[:cacheable]
       +                new_cached = build_cached_data(report, options[:grouping], options[:conditions], reporting_period, value)
       +                new_cached.save! if options[:cacheable]
       +              end
       +              result << [reporting_period.date_time, value]
                    end
                    reporting_period = reporting_period.next
                  end
       @@ -137,6 +142,7 @@ module Saulabs
                end
        
                def self.read_cached_data(report, options)
       +          return [] if not options[:cacheable]
                  options[:conditions] ||= []
                  conditions = [
                    %w(model_name report_name grouping aggregation conditions).map do |column_name|
 (DIR) diff --git a/spec/classes/report_spec.rb b/spec/classes/report_spec.rb
       @@ -21,7 +21,7 @@ describe Saulabs::Reportable::Report do
            it 'should process the data with the report cache' do
              Saulabs::Reportable::ReportCache.should_receive(:process).once.with(
                @report,
       -        { :limit => 100, :grouping => @report.options[:grouping], :conditions => [], :live_data => false, :end_date => false, :distinct => false }
       +        { :limit => 100, :grouping => @report.options[:grouping], :conditions => [], :live_data => false, :end_date => false, :distinct => false, :cacheable => true }
              )
        
              @report.run
       @@ -30,7 +30,7 @@ describe Saulabs::Reportable::Report do
            it 'should process the data with the report cache when custom conditions are given' do
              Saulabs::Reportable::ReportCache.should_receive(:process).once.with(
                @report,
       -        { :limit => 100, :grouping => @report.options[:grouping], :conditions => { :some => :condition }, :live_data => false, :end_date => false, :distinct => false }
       +        { :limit => 100, :grouping => @report.options[:grouping], :conditions => { :some => :condition }, :live_data => false, :end_date => false, :distinct => false, :cacheable => true }
              )
        
              @report.run(:conditions => { :some => :condition })
       @@ -47,7 +47,7 @@ describe Saulabs::Reportable::Report do
              Saulabs::Reportable::Grouping.should_receive(:new).once.with(:month).and_return(grouping)
              Saulabs::Reportable::ReportCache.should_receive(:process).once.with(
                @report,
       -        { :limit => 100, :grouping => grouping, :conditions => [], :live_data => false, :end_date => false, :distinct => false }
       +        { :limit => 100, :grouping => grouping, :conditions => [], :live_data => false, :end_date => false, :distinct => false, :cacheable => true  }
              )
        
              @report.run(:grouping => :month)