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.
@@ -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