groupdate 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/README.md +42 -34
- data/lib/groupdate.rb +21 -1
- data/lib/groupdate/version.rb +1 -1
- data/test/groupdate_test.rb +59 -45
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ecaeb21da82e1d6200205f6c8f0de7675bd9a047
|
4
|
+
data.tar.gz: 0f5c4ca2715331c187ba9fd343f68b9a5a5143b4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5a21d57c6b249f6de6e27bf27ce6acd5886c3395d5e98edfadb3c5dcebe77a52ec0fb4640a4ca731b59a15a54b398fcca8ecc72e09bbb07386f0c579d0cc3101
|
7
|
+
data.tar.gz: dc3063e2885001609d9ee8cbccd38558b6e33cc2e7ae4af49b0b8b922fa68180c38b92e62b9416536fb399c7f20ad4d10686781f7f9452d6f86f548641b90b7d
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -7,11 +7,13 @@ The simplest way to group by:
|
|
7
7
|
- month
|
8
8
|
- day of the week
|
9
9
|
- hour of the day
|
10
|
-
-
|
10
|
+
- and more (complete list at bottom)
|
11
11
|
|
12
|
-
:tada: Time zones supported!!
|
12
|
+
:tada: Time zones supported!! **The best part**
|
13
13
|
|
14
|
-
|
14
|
+
Works with Rails 3.0+
|
15
|
+
|
16
|
+
Supports PostgreSQL and MySQL
|
15
17
|
|
16
18
|
## Usage
|
17
19
|
|
@@ -77,6 +79,12 @@ User.group_by_hour_of_day(:created_at, "Pacific Time (US & Canada)").count
|
|
77
79
|
# }
|
78
80
|
```
|
79
81
|
|
82
|
+
You can order results with `group_field`.
|
83
|
+
|
84
|
+
```ruby
|
85
|
+
User.group_by_day(:created_at).order("group_field desc").limit(20).count
|
86
|
+
```
|
87
|
+
|
80
88
|
Use it with anything you can use `group` with:
|
81
89
|
|
82
90
|
```ruby
|
@@ -89,7 +97,37 @@ Go nuts!
|
|
89
97
|
Request.where(page: "/home").group_by_minute(:started_at).maximum(:request_time)
|
90
98
|
```
|
91
99
|
|
92
|
-
|
100
|
+
## Installation
|
101
|
+
|
102
|
+
Add this line to your application's Gemfile:
|
103
|
+
|
104
|
+
```ruby
|
105
|
+
gem 'groupdate'
|
106
|
+
```
|
107
|
+
|
108
|
+
#### For MySQL
|
109
|
+
|
110
|
+
[Time zone support](http://dev.mysql.com/doc/refman/5.6/en/time-zone-support.html) must be installed on the server.
|
111
|
+
|
112
|
+
```
|
113
|
+
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
|
114
|
+
```
|
115
|
+
|
116
|
+
## Complete list
|
117
|
+
|
118
|
+
group_by_?
|
119
|
+
|
120
|
+
- second
|
121
|
+
- minute
|
122
|
+
- hour
|
123
|
+
- day
|
124
|
+
- week
|
125
|
+
- month
|
126
|
+
- year
|
127
|
+
- hour_of_day
|
128
|
+
- day_of_week
|
129
|
+
|
130
|
+
## Note
|
93
131
|
|
94
132
|
activerecord <= 4.0.0.beta1 and the pg gem returns String objects instead of Time objects.
|
95
133
|
[This is fixed on activerecord master](https://github.com/rails/rails/commit/2cc09441c2de57b024b11ba666ba1e72c2b20cfe)
|
@@ -122,36 +160,6 @@ User.group_by_day_of_week(:created_at).count
|
|
122
160
|
|
123
161
|
These are *not* a result of groupdate (and unfortunately cannot be fixed by groupdate)
|
124
162
|
|
125
|
-
## Installation
|
126
|
-
|
127
|
-
Add this line to your application's Gemfile:
|
128
|
-
|
129
|
-
```ruby
|
130
|
-
gem 'groupdate'
|
131
|
-
```
|
132
|
-
|
133
|
-
### MySQL only
|
134
|
-
|
135
|
-
[Time zone support](http://dev.mysql.com/doc/refman/5.6/en/time-zone-support.html) must be installed on the server.
|
136
|
-
|
137
|
-
```
|
138
|
-
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
|
139
|
-
```
|
140
|
-
|
141
|
-
## Complete list
|
142
|
-
|
143
|
-
group_by_?
|
144
|
-
|
145
|
-
- second
|
146
|
-
- minute
|
147
|
-
- hour
|
148
|
-
- day
|
149
|
-
- week
|
150
|
-
- month
|
151
|
-
- year
|
152
|
-
- hour_of_day
|
153
|
-
- day_of_week
|
154
|
-
|
155
163
|
## Contributing
|
156
164
|
|
157
165
|
1. Fork it
|
data/lib/groupdate.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "groupdate/version"
|
2
|
+
require "active_record"
|
2
3
|
|
3
4
|
module Groupdate
|
4
5
|
extend ActiveSupport::Concern
|
@@ -81,12 +82,31 @@ module Groupdate
|
|
81
82
|
else
|
82
83
|
raise "Connection adapter not supported"
|
83
84
|
end
|
84
|
-
|
85
|
+
|
86
|
+
group(Groupdate::OrderHack.new(sanitize_sql_array(query)))
|
85
87
|
}
|
86
88
|
end
|
87
89
|
end
|
88
90
|
end
|
89
91
|
|
92
|
+
class OrderHack < String; end
|
90
93
|
end
|
91
94
|
|
92
95
|
ActiveRecord::Base.send :include, Groupdate
|
96
|
+
|
97
|
+
# hack for **unfixed** rails issue
|
98
|
+
# https://github.com/rails/rails/issues/7121
|
99
|
+
module ActiveRecord
|
100
|
+
module Calculations
|
101
|
+
|
102
|
+
def column_alias_for_with_hack(*keys)
|
103
|
+
if keys.first.is_a?(Groupdate::OrderHack)
|
104
|
+
"group_field"
|
105
|
+
else
|
106
|
+
column_alias_for_without_hack(*keys)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
alias_method_chain :column_alias_for, :hack
|
110
|
+
|
111
|
+
end
|
112
|
+
end
|
data/lib/groupdate/version.rb
CHANGED
data/test/groupdate_test.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
+
require "bundler/setup"
|
2
|
+
Bundler.require(:default)
|
1
3
|
require "minitest/autorun"
|
2
4
|
require "minitest/pride"
|
3
|
-
require "active_record"
|
4
|
-
require "groupdate"
|
5
5
|
require "logger"
|
6
6
|
|
7
7
|
# for debugging
|
@@ -31,102 +31,116 @@ describe Groupdate do
|
|
31
31
|
|
32
32
|
it "works!" do
|
33
33
|
[
|
34
|
-
{name: "Andrew", score: 1, created_at: Time.parse("2013-04-01 00:00:
|
35
|
-
{name: "Jordan", score: 2, created_at: Time.parse("2013-04-01 00:00:
|
36
|
-
{name: "Nick", score: 3, created_at: Time.parse("2013-04-02 00:00:
|
34
|
+
{name: "Andrew", score: 1, created_at: Time.parse("2013-04-01 00:00:00 UTC")},
|
35
|
+
{name: "Jordan", score: 2, created_at: Time.parse("2013-04-01 00:00:00 UTC")},
|
36
|
+
{name: "Nick", score: 3, created_at: Time.parse("2013-04-02 00:00:00 UTC")}
|
37
37
|
].each{|u| User.create!(u) }
|
38
38
|
|
39
39
|
assert_equal(
|
40
|
-
{
|
40
|
+
{
|
41
|
+
time_key("2013-04-01 00:00:00 UTC") => 1,
|
42
|
+
time_key("2013-04-02 00:00:00 UTC") => 1
|
43
|
+
},
|
41
44
|
User.where("score > 1").group_by_day(:created_at).count
|
42
45
|
)
|
43
46
|
end
|
44
47
|
|
48
|
+
it "doesn't throw exception with order" do
|
49
|
+
User.group_by_day(:created_at).order("group_field desc").limit(20).count == {}
|
50
|
+
end
|
51
|
+
|
45
52
|
it "group_by_second" do
|
46
|
-
|
47
|
-
assert_equal({"2013-04-01 00:00:01+00".to_time => 1}, User.group_by_second(:created_at).count)
|
53
|
+
assert_group :second, "2013-04-01 00:00:01 UTC", "2013-04-01 00:00:01 UTC"
|
48
54
|
end
|
49
55
|
|
50
56
|
it "group_by_minute" do
|
51
|
-
|
52
|
-
assert_equal({"2013-04-01 00:01:00+00".to_time => 1}, User.group_by_minute(:created_at).count)
|
57
|
+
assert_group :minute, "2013-04-01 00:01:01 UTC", "2013-04-01 00:01:00 UTC"
|
53
58
|
end
|
54
59
|
|
55
60
|
it "group_by_hour" do
|
56
|
-
|
57
|
-
assert_equal({"2013-04-01 01:00:00+00".to_time => 1}, User.group_by_hour(:created_at).count)
|
61
|
+
assert_group :hour, "2013-04-01 01:01:01 UTC", "2013-04-01 01:00:00 UTC"
|
58
62
|
end
|
59
63
|
|
60
64
|
it "group_by_day" do
|
61
|
-
|
62
|
-
assert_equal({"2013-04-01 00:00:00+00".to_time => 1}, User.group_by_day(:created_at).count)
|
65
|
+
assert_group :day, "2013-04-01 01:01:01 UTC", "2013-04-01 00:00:00 UTC"
|
63
66
|
end
|
64
67
|
|
65
68
|
it "group_by_day with time zone" do
|
66
|
-
|
67
|
-
assert_equal({"2013-03-31 07:00:00+00".to_time => 1}, User.group_by_day(:created_at, "Pacific Time (US & Canada)").count)
|
69
|
+
assert_group_tz :day, "2013-04-01 01:01:01 UTC", "2013-03-31 07:00:00 UTC"
|
68
70
|
end
|
69
71
|
|
70
72
|
it "group_by_week" do
|
71
|
-
|
72
|
-
assert_equal({"2013-03-17 00:00:00+00".to_time => 1}, User.group_by_week(:created_at).count)
|
73
|
+
assert_group :week, "2013-03-17 01:01:01 UTC", "2013-03-17 00:00:00 UTC"
|
73
74
|
end
|
74
75
|
|
75
76
|
it "group_by_week with time zone" do # day of DST
|
76
|
-
|
77
|
-
assert_equal({"2013-03-10 08:00:00+00".to_time => 1}, User.group_by_week(:created_at, "Pacific Time (US & Canada)").count)
|
77
|
+
assert_group_tz :week, "2013-03-17 01:01:01 UTC", "2013-03-10 08:00:00 UTC"
|
78
78
|
end
|
79
79
|
|
80
80
|
it "group_by_month" do
|
81
|
-
|
82
|
-
assert_equal({"2013-04-01 00:00:00+00".to_time(:utc) => 1}, User.group_by_month(:created_at).count)
|
81
|
+
assert_group :month, "2013-04-01 01:01:01 UTC", "2013-04-01 00:00:00 UTC"
|
83
82
|
end
|
84
83
|
|
85
84
|
it "group_by_month with time zone" do
|
86
|
-
|
87
|
-
assert_equal({"2013-03-01 08:00:00+00".to_time(:utc) => 1}, User.group_by_month(:created_at, "Pacific Time (US & Canada)").count)
|
85
|
+
assert_group_tz :month, "2013-04-01 01:01:01 UTC", "2013-03-01 08:00:00 UTC"
|
88
86
|
end
|
89
87
|
|
90
88
|
it "group_by_year" do
|
91
|
-
|
92
|
-
assert_equal({"2013-01-01 00:00:00+00".to_time(:utc) => 1}, User.group_by_year(:created_at).count)
|
89
|
+
assert_group :year, "2013-01-01 01:01:01 UTC", "2013-01-01 00:00:00 UTC"
|
93
90
|
end
|
94
91
|
|
95
92
|
it "group_by_year with time zone" do
|
96
|
-
|
97
|
-
assert_equal({"2012-01-01 08:00:00+00".to_time(:utc) => 1}, User.group_by_year(:created_at, "Pacific Time (US & Canada)").count)
|
93
|
+
assert_group_tz :year, "2013-01-01 01:01:01 UTC", "2012-01-01 08:00:00 UTC"
|
98
94
|
end
|
99
95
|
|
100
96
|
it "group_by_hour_of_day" do
|
101
|
-
|
102
|
-
expected = adapter == "mysql2" ? {11 => 1} : {11.0 => 1}
|
103
|
-
assert_equal(expected, User.group_by_hour_of_day(:created_at).count)
|
97
|
+
assert_group_number :hour_of_day, "2013-01-01 11:00:00 UTC", 11
|
104
98
|
end
|
105
99
|
|
106
100
|
it "group_by_hour_of_day with time zone" do
|
107
|
-
|
108
|
-
expected = adapter == "mysql2" ? {3 => 1} : {3.0 => 1}
|
109
|
-
assert_equal(expected, User.group_by_hour_of_day(:created_at, "Pacific Time (US & Canada)").count)
|
101
|
+
assert_group_number_tz :hour_of_day, "2013-01-01 11:00:00 UTC", 3
|
110
102
|
end
|
111
103
|
|
112
104
|
it "group_by_day_of_week" do
|
113
|
-
|
114
|
-
expected = adapter == "mysql2" ? {0 => 1} : {0.0 => 1}
|
115
|
-
assert_equal(expected, User.group_by_day_of_week(:created_at).count)
|
105
|
+
assert_group_number :day_of_week, "2013-03-03 00:00:00 UTC", 0
|
116
106
|
end
|
117
107
|
|
118
108
|
it "group_by_day_of_week with time zone" do
|
119
|
-
|
120
|
-
expected = adapter == "mysql2" ? {6 => 1} : {6.0 => 1}
|
121
|
-
assert_equal(expected, User.group_by_day_of_week(:created_at, "Pacific Time (US & Canada)").count)
|
109
|
+
assert_group_number_tz :day_of_week, "2013-03-03 00:00:00 UTC", 6
|
122
110
|
end
|
111
|
+
end
|
112
|
+
end
|
123
113
|
|
124
|
-
|
114
|
+
# helper methods
|
125
115
|
|
126
|
-
|
127
|
-
|
128
|
-
|
116
|
+
def assert_group(method, created_at, key, time_zone = nil)
|
117
|
+
create_user created_at
|
118
|
+
assert_equal({time_key(key) => 1}, User.send(:"group_by_#{method}", :created_at, time_zone).count)
|
119
|
+
end
|
129
120
|
|
130
|
-
|
121
|
+
def assert_group_tz(method, created_at, key)
|
122
|
+
assert_group method, created_at, key, "Pacific Time (US & Canada)"
|
123
|
+
end
|
124
|
+
|
125
|
+
def assert_group_number(method, created_at, key, time_zone = nil)
|
126
|
+
create_user created_at
|
127
|
+
assert_equal({number_key(key) => 1}, User.send(:"group_by_#{method}", :created_at, time_zone).count)
|
131
128
|
end
|
129
|
+
|
130
|
+
def assert_group_number_tz(method, created_at, key)
|
131
|
+
assert_group_number method, created_at, key, "Pacific Time (US & Canada)"
|
132
|
+
end
|
133
|
+
|
134
|
+
def time_key(key)
|
135
|
+
User.connection.adapter_name == "PostgreSQL" && ActiveRecord::VERSION::MAJOR == 3 ? Time.parse(key).strftime("%Y-%m-%d %H:%M:%S+00") : Time.parse(key)
|
136
|
+
end
|
137
|
+
|
138
|
+
def number_key(key)
|
139
|
+
User.connection.adapter_name == "PostgreSQL" ? (ActiveRecord::VERSION::MAJOR == 3 ? key.to_s : key.to_f) : key
|
140
|
+
end
|
141
|
+
|
142
|
+
def create_user(created_at)
|
143
|
+
User.create!(name: "Andrew", score: 1, created_at: Time.parse(created_at))
|
144
|
+
end
|
145
|
+
|
132
146
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: groupdate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kane
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-04-
|
11
|
+
date: 2013-04-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -136,3 +136,4 @@ specification_version: 4
|
|
136
136
|
summary: The simplest way to group temporal data
|
137
137
|
test_files:
|
138
138
|
- test/groupdate_test.rb
|
139
|
+
has_rdoc:
|