Introduction
Introduction Statistics Contact Development Disclaimer Help
added specs for Grouping.to_sql - reportable - Fork of reportable required by W…
Log
Files
Refs
README
---
commit 7f02d5870811625ca57691a29a3c9f749203f550
parent 627ddcc78052dbd58ea36f1d405deff5c6f8801d
Author: marcoow <[email protected]>
Date: Mon, 8 Dec 2008 22:48:15 +0800
added specs for Grouping.to_sql
Signed-off-by: Marco Otte-Witte <[email protected]>
Diffstat:
M lib/kvlr/reports_as_sparkline/grou… | 26 ++++++++++++--------------
M lib/kvlr/reports_as_sparkline/repo… | 23 ++++++++++++++++-------
M spec/other/grouping_spec.rb | 80 +++++++++++++++++++++++++++++…
M spec/other/report_cache_spec.rb | 3 +++
4 files changed, 111 insertions(+), 21 deletions(-)
---
diff --git a/lib/kvlr/reports_as_sparkline/grouping.rb b/lib/kvlr/reports_as_sp…
@@ -4,10 +4,10 @@ module Kvlr #:nodoc:
class Grouping
- @@allowed_groupings = [:month, :week, :day, :hour]
+ @@allowed_groupings =
def initialize(grouping)
- raise ArgumentError.new("Argument grouping must be one of #{@@allowed_…
+ raise ArgumentError.new("Invalid grouping #{grouping}") unless [:hour,…
@identifier = grouping
end
@@ -17,6 +17,8 @@ module Kvlr #:nodoc:
def to_reporting_period(date_time)
return case @identifier
+ when :hour
+ DateTime.new(date_time.year, date_time.month, date_time.day, date_…
when :day
date_time.to_date
when :week
@@ -24,13 +26,13 @@ module Kvlr #:nodoc:
Date.new(date_time.year, date_time.month, date_time.day)
when :month
Date.new(date_time.year, date_time.month)
- when :hour
- DateTime.new(date_time.year, date_time.month, date_time.day, date_…
end
end
def first_reporting_period(limit)
return case @identifier
+ when :hour
+ to_reporting_period(Time.now - limit.hours)
when :day
to_reporting_period(Time.now - limit.days)
when :week
@@ -38,14 +40,10 @@ module Kvlr #:nodoc:
when :month
date = Time.now - limit.months
Date.new(date.year, date.month, 1)
- when :hour
- to_reporting_period(Time.now - limit.hours)
end
end
def to_sql(date_column_name)
- #TODO: DATE_FORMAT's format string is different on different RDBMs => …
- # => this can be implemented using ActiveRecord::Base.connection.class
return case ActiveRecord::Base.connection.class.to_s
when 'ActiveRecord::ConnectionAdapters::MysqlAdapter'
mysql_format(date_column_name)
@@ -60,40 +58,40 @@ module Kvlr #:nodoc:
def mysql_format(date_column_name)
return case @identifier
+ when :hour
+ "DATE_FORMAT(#{date_column_name}, '%Y/%m/%d/%H')"
when :day
"DATE_FORMAT(#{date_column_name}, '%Y/%m/%d')"
when :week
"DATE_FORMAT(#{date_column_name}, '%Y-%u')"
when :month
"DATE_FORMAT(#{date_column_name}, '%Y/%m')"
- when :hour
- "DATE_FORMAT(#{date_column_name}, '%Y/%m/%d/%H')"
end
end
def sqlite_format(date_column_name)
return case @identifier
+ when :hour
+ "strftime('%Y/%m/%d/%H', #{date_column_name})"
when :day
"strftime('%Y/%m/%d', #{date_column_name})"
when :week
"strftime('%Y-%W', #{date_column_name})"
when :month
"strftime('%Y/%m', #{date_column_name})"
- when :hour
- "strftime('%Y/%m/%d/%H', #{date_column_name})"
end
end
def postgresql_format(date_column_name)
return case @identifier
+ when :hour
+ "date_trunc('hour', #{date_column_name})"
when :day
"date_trunc('day', #{date_column_name})"
when :week
"date_trunc('week', #{date_column_name})"
when :month
"date_trunc('month', #{date_column_name})"
- when :hour
- "date_trunc('hour', #{date_column_name})"
end
end
diff --git a/lib/kvlr/reports_as_sparkline/report_cache.rb b/lib/kvlr/reports_a…
@@ -10,11 +10,20 @@ module Kvlr #:nodoc:
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 => report.name.to_s,
+ :grouping => report.grouping.identifier.to_s,
+ :aggregation => report.aggregation.to_s
+ },
:limit => limit,
:order => 'reporting_period DESC'
)
- last_reporting_period_to_read = cached_data.empty? ? report.grouping…
+ last_reporting_period_to_read = if cached_data.empty?
+ report.grouping.first_reporting_period(limit)
+ else
+ report.grouping.to_reporting_period(cached_data.last.reporting_p…
+ end
new_data = yield(last_reporting_period_to_read)
return update_cache(new_data, cached_data, report)
end
@@ -30,12 +39,12 @@ module Kvlr #:nodoc:
end
for row in (new_data[rows_to_write] || [])
self.create!(
- :model_name => report.klass.to_s,
- :report_name => report.name.to_s,
- :grouping => report.grouping.identifier.to_s,
- :aggregation => report.aggregation.to_s,
+ :model_name => report.klass.to_s,
+ :report_name => report.name.to_s,
+ :grouping => report.grouping.identifier.to_s,
+ :aggregation => report.aggregation.to_s,
:reporting_period => report.grouping.to_reporting_period(DateTim…
- :value => row[1]
+ :value => row[1]
)
end
result = cached_data.map { |cached| [cached.reporting_period, cached…
diff --git a/spec/other/grouping_spec.rb b/spec/other/grouping_spec.rb
@@ -51,4 +51,84 @@ describe Kvlr::ReportsAsSparkline::Grouping do
end
+ describe '.to_sql' do
+
+ describe 'for MySQL' do
+
+ before do
+ ActiveRecord::Base.connection.class.stub!(:to_s).and_return('ActiveRec…
+ end
+
+ it 'should use DATE_FORMAT with format string "%Y/%m/%d/%H" for grouping…
+ Kvlr::ReportsAsSparkline::Grouping.new(:hour).send(:to_sql, 'created_a…
+ end
+
+ it 'should use DATE_FORMAT with format string "%Y/%m/%d" for grouping :d…
+ Kvlr::ReportsAsSparkline::Grouping.new(:day).send(:to_sql, 'created_at…
+ end
+
+ it 'should use DATE_FORMAT with format string "%Y-%u" for grouping :week…
+ Kvlr::ReportsAsSparkline::Grouping.new(:week).send(:to_sql, 'created_a…
+ end
+
+ it 'should use DATE_FORMAT with format string "%Y/%m" for grouping :mont…
+ Kvlr::ReportsAsSparkline::Grouping.new(:month).send(:to_sql, 'created_…
+ end
+
+ end
+
+ describe 'for PostgreSQL' do
+
+ before do
+ ActiveRecord::Base.connection.class.stub!(:to_s).and_return('ActiveRec…
+ end
+
+ it 'should use date_trunc with trunc "hour" for grouping :hour' do
+ Kvlr::ReportsAsSparkline::Grouping.new(:hour).send(:to_sql, 'created_a…
+ end
+
+ it 'should use date_trunc with trunc "day" for grouping :day' do
+ Kvlr::ReportsAsSparkline::Grouping.new(:day).send(:to_sql, 'created_at…
+ end
+
+ it 'should use date_trunc with trunc "week" for grouping :week' do
+ Kvlr::ReportsAsSparkline::Grouping.new(:week).send(:to_sql, 'created_a…
+ end
+
+ it 'should use date_trunc with trunc "month" for grouping :month' do
+ Kvlr::ReportsAsSparkline::Grouping.new(:month).send(:to_sql, 'created_…
+ end
+
+ end
+
+ describe 'for SQLite3' do
+
+ before do
+ ActiveRecord::Base.connection.class.stub!(:to_s).and_return('ActiveRec…
+ end
+
+ it 'should use strftime with format string "%Y/%m/%d/%H" for grouping :h…
+ Kvlr::ReportsAsSparkline::Grouping.new(:hour).send(:to_sql, 'created_a…
+ end
+
+ it 'should use strftime with format string "%Y/%m/%d" for grouping :day'…
+ Kvlr::ReportsAsSparkline::Grouping.new(:day).send(:to_sql, 'created_at…
+ end
+
+ it 'should use strftime with format string "%Y-%W" for grouping :week' do
+ Kvlr::ReportsAsSparkline::Grouping.new(:week).send(:to_sql, 'created_a…
+ end
+
+ it 'should use strftime with format string "%Y/%m" for grouping :month' …
+ Kvlr::ReportsAsSparkline::Grouping.new(:month).send(:to_sql, 'created_…
+ end
+
+ end
+
+ end
+
end
+
+class ActiveRecord::ConnectionAdapters::MysqlAdapter; end
+class ActiveRecord::ConnectionAdapters::SQLite3Adapter; end
+class ActiveRecord::ConnectionAdapters::PostgreSQLAdapter; end
diff --git a/spec/other/report_cache_spec.rb b/spec/other/report_cache_spec.rb
@@ -98,4 +98,7 @@ describe Kvlr::ReportsAsSparkline::ReportCache do
end
+ describe '#update_cache' do
+ end
+
end
You are viewing proxied material from jay.scot. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.