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