Code coverage report for lib/Stats.js

Statements: 100% (49 / 49)      Branches: 96.15% (25 / 26)      Functions: 100% (13 / 13)      Lines: 100% (49 / 49)     

All files » lib/ » Stats.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114              1 1 1   1   1   1 29     1 17 17 4 13 1   12       1 1     1 9                       9 9     1 12 63       1 12 12 9   12     1 12 12 11   12 12       1 1 17 12     1     1   1   9   8   8                 8               1 1 1 1  
/*
 * oy
 *
 * Copyright(c) 2013 Artur Cistov
 * MIT Licensed
 */
 
var stats = require('statsjs');
var stdev = require('stdev');
var _ = require('underscore');
 
var Stats = module.exports = {};
 
Stats.journeys = [];
 
Stats.isValidType = function(type) {
  return type && type !== 'admin' && type !== 'no_touchout' && type !== 'no_touchin';
};
 
Stats.isValidJourney = function(from, to) {
  var fromType = from.type;
  if(!this.isValidType(fromType)) {
    return false;
  } else if (fromType === 'bus') {
    return true;
  } else {
    return to && this.isValidType(to.type);
  }
};
 
Stats.reset = function() {
  this.journeys = [];
};
 
Stats.createJourneySummary = function(journey) {
  var summary = {
    from: journey.from,
    to: journey.to,
    durations: {
      data: [],
      stats: {}
    },
    times: {
      data: [],
      stats: {}
    }
  }
  this.journeys.push(summary);
  return summary;
};
 
Stats.findJourneySummary = function(journey) {
  return _.find(Stats.journeys, function(item) { 
    return _.isEqual(journey.from, item.from) && _.isEqual(journey.to, item.to); 
   });
};
 
Stats.findOrCreateJourneySummary = function(journey) {
  var summary = this.findJourneySummary(journey);
  if(!summary) {
    summary = this.createJourneySummary(journey);
  }
  return summary;
};
 
Stats.updateJourneySummary = function(journey) {
  var summary = this.findOrCreateJourneySummary(journey);
  if(journey.duration && journey.duration.inMinutes) {
    summary.durations.data.push(journey.duration.inMinutes);
  }
  Eif(journey.startDate) {
    summary.times.data.push(journey.startDate);
  }
};
 
Stats.summarizeJourneys = function(journeys) {
  journeys.forEach(function(journey) {
    if(Stats.isValidJourney(journey.from, journey.to)) {
      Stats.updateJourneySummary(journey);
    }
  });
  return this.journeys;
};
 
Stats.calculateMetrics = function() {
 
  this.journeys.forEach(function(journey) {
 
    if(journey.durations.data.length) {
 
      var journeyStats = stats(journey.durations.data);
 
      var journeyStatsSummary = {
          size: journeyStats.size(),
          min: journeyStats.min(),
          max: journeyStats.max(),
          mean: journeyStats.mean(),
          median: journeyStats.median(),
          stdev: isNaN(journeyStats.stdDev()) ? 0 : journeyStats.stdDev()
      };
 
      journey.durations.stats = journeyStatsSummary;
 
    }
 
  });
 
};
 
Stats.generate = function(journeys) {
  this.summarizeJourneys(journeys);
  this.calculateMetrics();
  return this.journeys;
};