Commit 6c3b28972eb87282a51f50978a7023d3a4989aa5

Authored by Andrew Kane
1 parent dd466e7c

Added zeros to group_by_day without time zone

Showing 2 changed files with 22 additions and 2 deletions   Show diff stats
lib/groupdate.rb
@@ -91,12 +91,22 @@ module Groupdate @@ -91,12 +91,22 @@ module Groupdate
91 when "day_of_week", "hour_of_day" 91 when "day_of_week", "hour_of_day"
92 max = field == "day_of_week" ? 6 : 23 92 max = field == "day_of_week" ? 6 : 23
93 "SELECT generate_series(0, #{max}, 1) AS #{field}" 93 "SELECT generate_series(0, #{max}, 1) AS #{field}"
  94 + when "day"
  95 + starts_at = args[2].first.in_time_zone(time_zone).beginning_of_day
  96 + sanitize_sql_array(["SELECT generate_series(CAST(? AS timestamptz), ?, '1 day') AS #{field}", starts_at, args[2].last])
94 end 97 end
95 else # MySQL 98 else # MySQL
96 case field 99 case field
97 when "day_of_week", "hour_of_day" 100 when "day_of_week", "hour_of_day"
98 max = field == "day_of_week" ? 6 : 23 101 max = field == "day_of_week" ? 6 : 23
99 (0..max).map{|i| "SELECT #{i} AS #{field}" }.join(" UNION ") 102 (0..max).map{|i| "SELECT #{i} AS #{field}" }.join(" UNION ")
  103 + when "day"
  104 + starts_at = args[2].first.in_time_zone(time_zone).beginning_of_day
  105 + series = [starts_at]
  106 + while series.last < args[2].last
  107 + series << series.last + 1.day
  108 + end
  109 + sanitize_sql_array([series.map{|i| "SELECT CAST(? AS DATETIME) AS #{field}" }.join(" UNION ")] + series)
100 end 110 end
101 end 111 end
102 joins("RIGHT OUTER JOIN (#{derived_table}) groupdate_series ON groupdate_series.#{field} = (#{sanitize_sql_array(query)})").group(Groupdate::OrderHack.new("groupdate_series.#{field}", field)) 112 joins("RIGHT OUTER JOIN (#{derived_table}) groupdate_series ON groupdate_series.#{field} = (#{sanitize_sql_array(query)})").group(Groupdate::OrderHack.new("groupdate_series.#{field}", field))
test/groupdate_test.rb
@@ -124,7 +124,17 @@ describe Groupdate do @@ -124,7 +124,17 @@ describe Groupdate do
124 124
125 describe "returns zeros" do 125 describe "returns zeros" do
126 126
127 - it "day_of_week" do 127 + it "group_by_day" do
  128 + create_user "2013-05-01 20:00:00 UTC"
  129 + expected = {
  130 + time_key("2013-04-30 00:00:00 UTC") => 0,
  131 + time_key("2013-05-01 00:00:00 UTC") => 1,
  132 + time_key("2013-05-02 00:00:00 UTC") => 0
  133 + }
  134 + 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))
  135 + end
  136 +
  137 + it "group_by_day_of_week" do
128 create_user "2013-05-01 00:00:00 UTC" 138 create_user "2013-05-01 00:00:00 UTC"
129 expected = {} 139 expected = {}
130 7.times do |n| 140 7.times do |n|
@@ -134,7 +144,7 @@ describe Groupdate do @@ -134,7 +144,7 @@ describe Groupdate do
134 assert_equal(expected, User.group_by_day_of_week(:created_at, Time.zone, true).count(:created_at)) 144 assert_equal(expected, User.group_by_day_of_week(:created_at, Time.zone, true).count(:created_at))
135 end 145 end
136 146
137 - it "hour_of_day" do 147 + it "group_by_hour_of_day" do
138 create_user "2013-05-01 20:00:00 UTC" 148 create_user "2013-05-01 20:00:00 UTC"
139 expected = {} 149 expected = {}
140 24.times do |n| 150 24.times do |n|