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,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| |