Commit 6c3b28972eb87282a51f50978a7023d3a4989aa5
1 parent
dd466e7c
Exists in
master
and in
17 other branches
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 | 91 | when "day_of_week", "hour_of_day" |
92 | 92 | max = field == "day_of_week" ? 6 : 23 |
93 | 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 | 97 | end |
95 | 98 | else # MySQL |
96 | 99 | case field |
97 | 100 | when "day_of_week", "hour_of_day" |
98 | 101 | max = field == "day_of_week" ? 6 : 23 |
99 | 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 | 110 | end |
101 | 111 | end |
102 | 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 | 124 | |
125 | 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 | 138 | create_user "2013-05-01 00:00:00 UTC" |
129 | 139 | expected = {} |
130 | 140 | 7.times do |n| |
... | ... | @@ -134,7 +144,7 @@ describe Groupdate do |
134 | 144 | assert_equal(expected, User.group_by_day_of_week(:created_at, Time.zone, true).count(:created_at)) |
135 | 145 | end |
136 | 146 | |
137 | - it "hour_of_day" do | |
147 | + it "group_by_hour_of_day" do | |
138 | 148 | create_user "2013-05-01 20:00:00 UTC" |
139 | 149 | expected = {} |
140 | 150 | 24.times do |n| | ... | ... |