Sha256: c5794c687b79b3656862536d597e0bf638216196100f1ab00e0a09dfa2d27999
Contents?: true
Size: 1.11 KB
Versions: 62
Compression:
Stored size: 1.11 KB
Contents
module Workarea module Metrics class CalculatePercentiles delegate :[], to: :results def initialize(collection, field) @collection = collection @field = field end def results @results ||= (aggregation.first || {}).except('_id') end def aggregation @collection.aggregate( [ { '$project' => { @field => 1 } }, { '$match' => { @field => { '$gt' => 0 } } }, { '$sort' => { @field => 1 } }, { '$group' => { '_id' => nil, 'values' => { '$push' => "$#{@field}" } } }, { '$project' => (0..99).reduce({}) do |memo, percentile| memo.merge(percentile => { '$arrayElemAt' => [ '$values', { '$floor' => { '$multiply' => [percentile / 100.to_f, { '$size' => '$values' }] } } ] }) end } ], allow_disk_use: true ) end end end end
Version data entries
62 entries across 62 versions & 1 rubygems