From f89c442730bff59a5038fe5e66cb2555e117ffa7 Mon Sep 17 00:00:00 2001 From: zhitomirskiyi <ilya@joindiaspora.com> Date: Thu, 20 Jan 2011 12:48:21 -0800 Subject: [PATCH] statistics class does distributions and averages on its DataPoints --- app/models/statistc.rb | 3 - app/models/statistic.rb | 32 +++++++++++ ...rb => 20110120181553_create_statistics.rb} | 4 +- db/schema.rb | 2 +- lib/tasks/statistics.rake | 4 +- spec/models/statistc_spec.rb | 5 -- spec/models/statistic_spec.rb | 55 +++++++++++++++++++ 7 files changed, 92 insertions(+), 13 deletions(-) delete mode 100644 app/models/statistc.rb create mode 100644 app/models/statistic.rb rename db/migrate/{20110120181553_create_statistcs.rb => 20110120181553_create_statistics.rb} (63%) delete mode 100644 spec/models/statistc_spec.rb create mode 100644 spec/models/statistic_spec.rb diff --git a/app/models/statistc.rb b/app/models/statistc.rb deleted file mode 100644 index f8a133bb89..0000000000 --- a/app/models/statistc.rb +++ /dev/null @@ -1,3 +0,0 @@ -class Statistc < ActiveRecord::Base - has_many :data_points, :class_name => 'DataPoint' -end diff --git a/app/models/statistic.rb b/app/models/statistic.rb new file mode 100644 index 0000000000..48b82e0cf8 --- /dev/null +++ b/app/models/statistic.rb @@ -0,0 +1,32 @@ +class Statistic < ActiveRecord::Base + has_many :data_points, :class_name => 'DataPoint' + + def compute_average + users = 0 + sum = 0 + self.data_points.each do |d| + sum += d.key*d.value + users += d.value + end + self.average = sum.to_f/users + end + + def distribution + @dist ||= lambda { + dist = {} + self.data_points.each do |d| + dist[d.key] = d.value.to_f/users_in_sample + end + dist + }.call + end + + def users_in_sample + @users ||= lambda { + users = self.data_points.map{|d| d.value} + users.inject do |total,curr| + total += curr + end + }.call + end +end diff --git a/db/migrate/20110120181553_create_statistcs.rb b/db/migrate/20110120181553_create_statistics.rb similarity index 63% rename from db/migrate/20110120181553_create_statistcs.rb rename to db/migrate/20110120181553_create_statistics.rb index 0313ebf439..63eb758f66 100644 --- a/db/migrate/20110120181553_create_statistcs.rb +++ b/db/migrate/20110120181553_create_statistics.rb @@ -1,6 +1,6 @@ -class CreateStatistcs < ActiveRecord::Migration +class CreateStatistics < ActiveRecord::Migration def self.up - create_table :statistcs do |t| + create_table :statistics do |t| t.integer :average t.string :type diff --git a/db/schema.rb b/db/schema.rb index 6bde3fdeee..46d3e7f0c1 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -417,7 +417,7 @@ ActiveRecord::Schema.define(:version => 20110120182100) do add_index "services", ["mongo_id"], :name => "index_services_on_mongo_id" add_index "services", ["user_id"], :name => "index_services_on_user_id" - create_table "statistcs", :force => true do |t| + create_table "statistics", :force => true do |t| t.integer "average" t.string "type" t.datetime "created_at" diff --git a/lib/tasks/statistics.rake b/lib/tasks/statistics.rake index d59a14f834..e7099b2bcb 100644 --- a/lib/tasks/statistics.rake +++ b/lib/tasks/statistics.rake @@ -60,8 +60,8 @@ namespace :statistics do [0..15].each do |n| stat.data_points << DataPoint.posts_per_day(n) end - stat.compute_avg - stat.save! + stat.compute_average + stat.save end task :splunk => :environment do diff --git a/spec/models/statistc_spec.rb b/spec/models/statistc_spec.rb deleted file mode 100644 index 92530eb408..0000000000 --- a/spec/models/statistc_spec.rb +++ /dev/null @@ -1,5 +0,0 @@ -require 'spec_helper' - -describe Statistc do - pending "add some examples to (or delete) #{__FILE__}" -end diff --git a/spec/models/statistic_spec.rb b/spec/models/statistic_spec.rb new file mode 100644 index 0000000000..f730d9d229 --- /dev/null +++ b/spec/models/statistic_spec.rb @@ -0,0 +1,55 @@ +require 'spec_helper' + +describe Statistic do + before(:all) do + @stat = Statistic.new + + 1.times do |n| + alice.post(:status_message, :message => 'hi', :to => alice.aspects.first) + end + + 5.times do |n| + bob.post(:status_message, :message => 'hi', :to => bob.aspects.first) + end + + 10.times do |n| + eve.post(:status_message, :message => 'hi', :to => eve.aspects.first) + end + + (0..10).each do |n| + @stat.data_points << DataPoint.users_with_posts_today(n) + end + end + + context '#compute_average' do + it 'computes the average of all its DataPoints' do + @stat.compute_average.should == 16.to_f/3 + end + end + + context '#distribution' do + it 'generates a hash' do + @stat.distribution.class.should == Hash + end + + it 'correctly sets values' do + dist = @stat.distribution + [dist[1], dist[5], dist[10]].each do |d| + d.should == 1.to_f/3 + end + end + + it 'generates a distribution' do + values = @stat.distribution.map{|d| d[1]} + values.inject{ |sum, curr| + sum += curr + }.should == 1 + end + end + + context '#users_in_sample' do + it 'returns a count' do + @stat.users_in_sample.should == 3 + end + end +end -- GitLab