From 6c3b28972eb87282a51f50978a7023d3a4989aa5 Mon Sep 17 00:00:00 2001 From: Andrew Kane Date: Wed, 1 May 2013 10:22:46 -0700 Subject: [PATCH] Added zeros to group_by_day without time zone --- lib/groupdate.rb | 10 ++++++++++ test/groupdate_test.rb | 14 ++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/lib/groupdate.rb b/lib/groupdate.rb index 7b3efaf..d3875e0 100644 --- a/lib/groupdate.rb +++ b/lib/groupdate.rb @@ -91,12 +91,22 @@ module Groupdate when "day_of_week", "hour_of_day" max = field == "day_of_week" ? 6 : 23 "SELECT generate_series(0, #{max}, 1) AS #{field}" + when "day" + starts_at = args[2].first.in_time_zone(time_zone).beginning_of_day + sanitize_sql_array(["SELECT generate_series(CAST(? AS timestamptz), ?, '1 day') AS #{field}", starts_at, args[2].last]) end else # MySQL case field when "day_of_week", "hour_of_day" max = field == "day_of_week" ? 6 : 23 (0..max).map{|i| "SELECT #{i} AS #{field}" }.join(" UNION ") + when "day" + starts_at = args[2].first.in_time_zone(time_zone).beginning_of_day + series = [starts_at] + while series.last < args[2].last + series << series.last + 1.day + end + sanitize_sql_array([series.map{|i| "SELECT CAST(? AS DATETIME) AS #{field}" }.join(" UNION ")] + series) end end joins("RIGHT OUTER JOIN (#{derived_table}) groupdate_series ON groupdate_series.#{field} = (#{sanitize_sql_array(query)})").group(Groupdate::OrderHack.new("groupdate_series.#{field}", field)) diff --git a/test/groupdate_test.rb b/test/groupdate_test.rb index a806577..41eb0cb 100644 --- a/test/groupdate_test.rb +++ b/test/groupdate_test.rb @@ -124,7 +124,17 @@ describe Groupdate do describe "returns zeros" do - it "day_of_week" do + it "group_by_day" do + create_user "2013-05-01 20:00:00 UTC" + expected = { + time_key("2013-04-30 00:00:00 UTC") => 0, + time_key("2013-05-01 00:00:00 UTC") => 1, + time_key("2013-05-02 00:00:00 UTC") => 0 + } + assert_equal(expected, User.group_by_day(:created_at, Time.zone, Time.parse("2013-04-30 00:00:00 UTC")..Time.parse("2013-05-02 00:00:00 UTC")).count(:created_at)) + end + + it "group_by_day_of_week" do create_user "2013-05-01 00:00:00 UTC" expected = {} 7.times do |n| @@ -134,7 +144,7 @@ describe Groupdate do assert_equal(expected, User.group_by_day_of_week(:created_at, Time.zone, true).count(:created_at)) end - it "hour_of_day" do + it "group_by_hour_of_day" do create_user "2013-05-01 20:00:00 UTC" expected = {} 24.times do |n| -- libgit2 0.21.0