aggregate_columns 0.9.5 → 0.9.6
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.
- data/aggregate_columns.gemspec +1 -1
- data/lib/aggregate_columns.rb +10 -6
- data/lib/aggregate_columns/version.rb +1 -1
- data/test/rails_3_test.rb +9 -0
- metadata +63 -98
data/aggregate_columns.gemspec
CHANGED
@@ -22,6 +22,6 @@ Gem::Specification.new do |s|
|
|
22
22
|
s.add_development_dependency "rake"
|
23
23
|
s.add_development_dependency "activerecord", ">= 2"
|
24
24
|
s.add_development_dependency "activesupport", ">= 2"
|
25
|
-
s.add_development_dependency "activerecord-nulldb-adapter"
|
25
|
+
s.add_development_dependency "activerecord-nulldb-adapter", "0.2.0" # 0.2.1 explicitly forbids Rails >= 3.1
|
26
26
|
|
27
27
|
end
|
data/lib/aggregate_columns.rb
CHANGED
@@ -50,15 +50,19 @@ module AggregateColumns
|
|
50
50
|
def aggregate_columns( options )
|
51
51
|
rel = self.select( "#{table_name}.*" )
|
52
52
|
# Process options
|
53
|
-
options.assert_valid_keys( :association, :column, :function, :result_column, :join_type )
|
53
|
+
options.assert_valid_keys( :association, :column, :function, :result_column, :join_type, :expression )
|
54
54
|
association = options[:association]
|
55
55
|
unless association
|
56
56
|
raise ArgumentError, "No association given"
|
57
57
|
end
|
58
|
-
field = options[:column] || '*'
|
59
|
-
function = options[:function] || :count
|
58
|
+
#field = options[:column] || '*'
|
59
|
+
#function = options[:function] || :count
|
60
|
+
aggregate_expression = options[:expression]
|
60
61
|
result_column = options[:result_column]
|
61
|
-
unless
|
62
|
+
unless aggregate_expression
|
63
|
+
field = options[:column] || '*'
|
64
|
+
function = options[:function] || :count
|
65
|
+
aggregate_expression = "#{function}(#{field})"
|
62
66
|
# Defaults:
|
63
67
|
# count(*) on comments => comment_count
|
64
68
|
# sum(votes) on comment => comments_votes_sum
|
@@ -74,14 +78,14 @@ module AggregateColumns
|
|
74
78
|
join_type = options[:join_type] # TODO: check if within allowed values
|
75
79
|
|
76
80
|
if join_type
|
77
|
-
aggregate_rel = klass.select( "#{foreign_key}, #{
|
81
|
+
aggregate_rel = klass.select( "#{foreign_key}, #{aggregate_expression} AS #{result_column}" ).from( aggregate_table_name ).group( foreign_key )
|
78
82
|
aggregate_rel = yield( aggregate_rel ) if block_given?
|
79
83
|
rel = rel.
|
80
84
|
joins( "#{join_type.to_s.upcase} JOIN (#{aggregate_rel.to_sql}) #{result_column}_join ON #{table_name}.id = #{result_column}_join.#{foreign_key}" ).
|
81
85
|
select( result_column.to_s ).
|
82
86
|
order( "#{result_column} DESC" ) # You might reorder if you want to have it differently
|
83
87
|
else
|
84
|
-
aggregate_rel = klass.select( "#{
|
88
|
+
aggregate_rel = klass.select( "#{aggregate_expression} AS #{result_column}" ).from( aggregate_table_name ).where( "#{table_name}.id = #{foreign_key}" )
|
85
89
|
aggregate_rel = yield( aggregate_rel ) if block_given?
|
86
90
|
rel = rel.
|
87
91
|
select( "(#{aggregate_rel.to_sql}) AS #{result_column}" ).
|
data/test/rails_3_test.rb
CHANGED
@@ -45,6 +45,15 @@ if Rails::VERSION::MAJOR == 3
|
|
45
45
|
assert_empty relation.joins_values
|
46
46
|
end
|
47
47
|
|
48
|
+
def test_expression
|
49
|
+
relation = Post.aggregate_columns( :association => :comments, :expression => "(created_at + updated_at)", :result_column => :ultimate_at )
|
50
|
+
assert_equal 2, relation.select_values.count
|
51
|
+
assert relation.select_values.include?( "(SELECT (created_at + updated_at) AS ultimate_at FROM comments WHERE (posts.id = post_id)) AS ultimate_at" )
|
52
|
+
assert_equal relation.order_values, ["ultimate_at DESC"]
|
53
|
+
assert_empty relation.where_values
|
54
|
+
assert_empty relation.joins_values
|
55
|
+
end
|
56
|
+
|
48
57
|
def test_result_column
|
49
58
|
relation = Post.aggregate_columns( :association => :comments, :function => :max, :column => :created_at, :result_column => :max_created_at )
|
50
59
|
assert_equal 2, relation.select_values.count
|
metadata
CHANGED
@@ -1,103 +1,78 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: aggregate_columns
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.9.6
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 9
|
9
|
-
- 5
|
10
|
-
version: 0.9.5
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Marek Janukowicz/Starware
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
dependencies:
|
21
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-01-26 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
22
15
|
name: activerecord
|
23
|
-
|
24
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &7063280 !ruby/object:Gem::Requirement
|
25
17
|
none: false
|
26
|
-
requirements:
|
27
|
-
- -
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
|
30
|
-
segments:
|
31
|
-
- 2
|
32
|
-
version: "2"
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '2'
|
33
22
|
type: :runtime
|
34
|
-
version_requirements: *id001
|
35
|
-
- !ruby/object:Gem::Dependency
|
36
|
-
name: rake
|
37
23
|
prerelease: false
|
38
|
-
|
24
|
+
version_requirements: *7063280
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rake
|
27
|
+
requirement: &7061440 !ruby/object:Gem::Requirement
|
39
28
|
none: false
|
40
|
-
requirements:
|
41
|
-
- -
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
|
44
|
-
segments:
|
45
|
-
- 0
|
46
|
-
version: "0"
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
47
33
|
type: :development
|
48
|
-
version_requirements: *id002
|
49
|
-
- !ruby/object:Gem::Dependency
|
50
|
-
name: activerecord
|
51
34
|
prerelease: false
|
52
|
-
|
35
|
+
version_requirements: *7061440
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: activerecord
|
38
|
+
requirement: &7055400 !ruby/object:Gem::Requirement
|
53
39
|
none: false
|
54
|
-
requirements:
|
55
|
-
- -
|
56
|
-
- !ruby/object:Gem::Version
|
57
|
-
|
58
|
-
segments:
|
59
|
-
- 2
|
60
|
-
version: "2"
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '2'
|
61
44
|
type: :development
|
62
|
-
version_requirements: *id003
|
63
|
-
- !ruby/object:Gem::Dependency
|
64
|
-
name: activesupport
|
65
45
|
prerelease: false
|
66
|
-
|
46
|
+
version_requirements: *7055400
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: activesupport
|
49
|
+
requirement: &7052700 !ruby/object:Gem::Requirement
|
67
50
|
none: false
|
68
|
-
requirements:
|
69
|
-
- -
|
70
|
-
- !ruby/object:Gem::Version
|
71
|
-
|
72
|
-
segments:
|
73
|
-
- 2
|
74
|
-
version: "2"
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '2'
|
75
55
|
type: :development
|
76
|
-
version_requirements: *id004
|
77
|
-
- !ruby/object:Gem::Dependency
|
78
|
-
name: activerecord-nulldb-adapter
|
79
56
|
prerelease: false
|
80
|
-
|
57
|
+
version_requirements: *7052700
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: activerecord-nulldb-adapter
|
60
|
+
requirement: &7051800 !ruby/object:Gem::Requirement
|
81
61
|
none: false
|
82
|
-
requirements:
|
83
|
-
- -
|
84
|
-
- !ruby/object:Gem::Version
|
85
|
-
|
86
|
-
segments:
|
87
|
-
- 0
|
88
|
-
version: "0"
|
62
|
+
requirements:
|
63
|
+
- - =
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: 0.2.0
|
89
66
|
type: :development
|
90
|
-
|
91
|
-
|
92
|
-
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *7051800
|
69
|
+
description: ''
|
70
|
+
email:
|
93
71
|
- marek@janukowicz.net
|
94
72
|
executables: []
|
95
|
-
|
96
73
|
extensions: []
|
97
|
-
|
98
74
|
extra_rdoc_files: []
|
99
|
-
|
100
|
-
files:
|
75
|
+
files:
|
101
76
|
- .hgignore
|
102
77
|
- Gemfile
|
103
78
|
- README
|
@@ -108,41 +83,31 @@ files:
|
|
108
83
|
- test/rails_2_test.rb
|
109
84
|
- test/rails_3_test.rb
|
110
85
|
- test/test_helper.rb
|
111
|
-
|
112
|
-
homepage: ""
|
86
|
+
homepage: ''
|
113
87
|
licenses: []
|
114
|
-
|
115
88
|
post_install_message:
|
116
89
|
rdoc_options: []
|
117
|
-
|
118
|
-
require_paths:
|
90
|
+
require_paths:
|
119
91
|
- lib
|
120
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
92
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
121
93
|
none: false
|
122
|
-
requirements:
|
123
|
-
- -
|
124
|
-
- !ruby/object:Gem::Version
|
125
|
-
|
126
|
-
|
127
|
-
- 0
|
128
|
-
version: "0"
|
129
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - ! '>='
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0'
|
98
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
130
99
|
none: false
|
131
|
-
requirements:
|
132
|
-
- -
|
133
|
-
- !ruby/object:Gem::Version
|
134
|
-
|
135
|
-
segments:
|
136
|
-
- 0
|
137
|
-
version: "0"
|
100
|
+
requirements:
|
101
|
+
- - ! '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
138
104
|
requirements: []
|
139
|
-
|
140
105
|
rubyforge_project:
|
141
|
-
rubygems_version: 1.
|
106
|
+
rubygems_version: 1.8.11
|
142
107
|
signing_key:
|
143
108
|
specification_version: 3
|
144
109
|
summary: Create and use aggregate columns in Rails applications
|
145
|
-
test_files:
|
110
|
+
test_files:
|
146
111
|
- test/rails_2_test.rb
|
147
112
|
- test/rails_3_test.rb
|
148
113
|
- test/test_helper.rb
|