aggregate_columns 0.9.5 → 0.9.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -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 result_column
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}, #{function}(#{field}) AS #{result_column}" ).from( aggregate_table_name ).group( 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( "#{function}(#{field}) AS #{result_column}" ).from( aggregate_table_name ).where( "#{table_name}.id = #{foreign_key}" )
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}" ).
@@ -1,3 +1,3 @@
1
1
  module AggregateColumns
2
- VERSION = "0.9.5"
2
+ VERSION = "0.9.6"
3
3
  end
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
- hash: 49
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
- date: 2012-01-03 00:00:00 +01:00
19
- default_executable:
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
- prerelease: false
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
- hash: 7
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
- requirement: &id002 !ruby/object:Gem::Requirement
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
- hash: 3
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
- requirement: &id003 !ruby/object:Gem::Requirement
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
- hash: 7
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
- requirement: &id004 !ruby/object:Gem::Requirement
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
- hash: 7
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
- requirement: &id005 !ruby/object:Gem::Requirement
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
- hash: 3
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
- version_requirements: *id005
91
- description: ""
92
- email:
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
- has_rdoc: true
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
- hash: 3
126
- segments:
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
- hash: 3
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.6.2
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