weighted_average 2.0.0 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,9 @@
1
+ 2.0.1 / 2012-06-06
2
+
3
+ * Bug fixes
4
+
5
+ * Support more than 1 or 2 data columns
6
+
1
7
  2.0.0 / 2012-05-29
2
8
 
3
9
  * Enhancements
@@ -26,6 +26,7 @@ module WeightedAverage
26
26
  #
27
27
  # @return [Arel::SelectManager] A relation you can play around with.
28
28
  def weighted_average_relation(data_column_names, options = {})
29
+ data_column_names = Array.wrap data_column_names
29
30
  left = self.source.left
30
31
 
31
32
  weighted_by_column = case options[:weighted_by]
@@ -43,14 +44,26 @@ module WeightedAverage
43
44
  left[options[:disaggregate_by]]
44
45
  end
45
46
 
46
- data_columns = ::Array.wrap(data_column_names).map do |data_column_name|
47
+ data_columns = data_column_names.map do |data_column_name|
47
48
  left[data_column_name]
48
49
  end
49
50
 
51
+ data_columns_sum = data_columns.inject(nil) do |memo, data_column|
52
+ if memo
53
+ Arel::Nodes::Addition.new(memo, data_column)
54
+ else
55
+ data_column
56
+ end
57
+ end
58
+
59
+ if data_column_names.many?
60
+ data_columns_sum = Arel::Nodes::Grouping.new(data_columns_sum)
61
+ end
62
+
50
63
  if disaggregate_by_column
51
- self.projections = [Arel::Nodes::Division.new(Arel::Nodes::Sum.new(weighted_by_column * (data_columns.inject(:+)) / disaggregate_by_column * 1.0), Arel::Nodes::Sum.new([weighted_by_column]))]
64
+ self.projections = [Arel::Nodes::Division.new(Arel::Nodes::Sum.new(weighted_by_column * data_columns_sum / disaggregate_by_column * 1.0), Arel::Nodes::Sum.new([weighted_by_column]))]
52
65
  else
53
- self.projections = [Arel::Nodes::Division.new(Arel::Nodes::Sum.new(weighted_by_column * (data_columns.inject(:+)) * 1.0), Arel::Nodes::Sum.new([weighted_by_column]))]
66
+ self.projections = [Arel::Nodes::Division.new(Arel::Nodes::Sum.new(weighted_by_column * data_columns_sum * 1.0), Arel::Nodes::Sum.new([weighted_by_column]))]
54
67
  end
55
68
 
56
69
  data_columns_not_eq_nil = data_columns.inject(nil) do |memo, data_column|
@@ -1,3 +1,3 @@
1
1
  module WeightedAverage
2
- VERSION = '2.0.0'
2
+ VERSION = '2.0.1'
3
3
  end
@@ -71,8 +71,8 @@ describe WeightedAverage do
71
71
 
72
72
  it "adds multiple columns before averaging" do
73
73
  should_have_same_sql(
74
- "SELECT SUM(airline_aircraft_seat_classes.weighting * (airline_aircraft_seat_classes.seats + airline_aircraft_seat_classes.pitch) * 1.0) / SUM(airline_aircraft_seat_classes.weighting) FROM airline_aircraft_seat_classes WHERE airline_aircraft_seat_classes.seats IS NOT NULL AND airline_aircraft_seat_classes.pitch IS NOT NULL AND airline_aircraft_seat_classes.weighting > 0",
75
- AirlineAircraftSeatClass.weighted_average_relation(['seats', 'pitch'])
74
+ "SELECT SUM(airline_aircraft_seat_classes.weighting * (airline_aircraft_seat_classes.seats + airline_aircraft_seat_classes.pitch + airline_aircraft_seat_classes.width) * 1.0) / SUM(airline_aircraft_seat_classes.weighting) FROM airline_aircraft_seat_classes WHERE airline_aircraft_seat_classes.seats IS NOT NULL AND airline_aircraft_seat_classes.pitch IS NOT NULL AND airline_aircraft_seat_classes.width IS NOT NULL AND airline_aircraft_seat_classes.weighting > 0",
75
+ AirlineAircraftSeatClass.weighted_average_relation(['seats', 'pitch', 'width'])
76
76
  )
77
77
  end
78
78
 
@@ -186,7 +186,7 @@ describe WeightedAverage do
186
186
 
187
187
  it "does custom weighting, with a cohort" do
188
188
  should_have_same_sql(
189
- "SELECT SUM(segments.passengers * segments.load_factor * 1.0) / SUM(segments.passengers) FROM segments WHERE (segments.payload = 5) AND segments.load_factor IS NOT NULL AND segments.passengers > 0",
189
+ "SELECT SUM(segments.passengers * segments.load_factor * 1.0) / SUM(segments.passengers) FROM segments WHERE segments.payload = 5 AND segments.load_factor IS NOT NULL AND segments.passengers > 0",
190
190
  Segment.cohort(:payload => 5).weighted_average_relation(:load_factor, :weighted_by => :passengers)
191
191
  )
192
192
  end
@@ -234,6 +234,6 @@ describe WeightedAverage do
234
234
  # make sure the "best" SQL is valid
235
235
  ActiveRecord::Base.connection.execute(best)
236
236
  # compare everything to the known good
237
- args.each { |arg| best.must_equal arg }
237
+ args.each { |arg| arg.must_equal best }
238
238
  end
239
239
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: weighted_average
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2012-05-29 00:00:00.000000000 Z
15
+ date: 2012-06-06 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: activesupport
@@ -202,7 +202,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
202
202
  version: '0'
203
203
  requirements: []
204
204
  rubyforge_project: weighted_average
205
- rubygems_version: 1.8.21
205
+ rubygems_version: 1.8.24
206
206
  signing_key:
207
207
  specification_version: 3
208
208
  summary: Perform weighted averages. Rails 3 only.