Code coverage report for oy/lib/Stats.js

Statements: 94.55% (52 / 55)      Branches: 87.5% (28 / 32)      Functions: 100% (13 / 13)      Lines: 96.3% (52 / 54)     

All files » oy/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 115 116 117 118 119 120 121              1 1   1   1   1 58     1 34 34   34 8 26 2   24       1 3     1 18                       18 18     1 24 24 126 126             1 24 24 18   24     1 24 24 22   24 24       1 2 34 24     2     1   2   18   16   16                 16               1 2 2 2 2  
/*
 * oy
 *
 * Copyright(c) 2013 Artur Cistov
 * MIT Licensed
 */
 
var stats = require('statsjs');
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;
  Iif(!fromType) {
    return false;
  } else 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) {
  Iif(!journey) { return; }
  return _.find(Stats.journeys, function(item) {
    Eif(journey.to) {
      return _.isEqual(journey.from, item.from) && _.isEqual(journey.to, item.to);
    } else {
      return _.isEqual(journey.from, item.from);
    }
  });
};
 
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 : Math.round(journeyStats.stdDev() * 100) / 100
      };
 
      journey.durations.stats = journeyStatsSummary;
 
    }
 
  });
 
};
 
Stats.generate = function(journeys) {
  this.reset();
  this.summarizeJourneys(journeys);
  this.calculateMetrics();
  return this.journeys;
};