Project

counter

0.0
Repository is archived
No commit activity in last 3 years
No release in over 3 years
count things, either as a one-off or aggregated over time
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

 Project Readme

counter¶ ↑

Count things and rank them, as a one-off or over time.

Major components:

  • Counter - a simple class to track counts, then sort and rank

  • MovingCount - a base class built atop ActiveRecord to aggregate counts over time (think rrdtool for counts)

Getting started¶ ↑

gem install counter
config.gem 'counter'

require 'counter'

To use MovingCount, you’ll also need to

require 'counter/moving_count'

(separate to prevent ActiveRecord dependency pollution)

Counter¶ ↑

c = Counter.new

# Counts can be incremented as a key appears
c.increment('some-key')
c.increment('some-key')

# Or set directly
c.set('another-key', 42)

# You can retrieve all
c.counts
=> [['another-key',42],['some-key',2]]

# Or just the top-n
c.top(1)
=> [['another-key',42]]

See Counter docs for detail.

MovingCount¶ ↑

require 'counter/moving_count'
class PageView < MovingCount
end

# In a migration:
#  create_table :page_views, :force => true do |t|
#    t.string   :category,      :null => false
#    t.integer  :count,         :null => false, :default => 0
#    t.datetime :sample_time,   :null => false
#  end
#
#  add_index :page_views, :category

# First set of samples...
PageView.record_counts(Time.now - 5.minutes) do |c|
  c.increment('a-key')
  c.increment('a-key')
end

# Second set...
PageView.record_counts(Time.now) do |c|
  c.increment('a-key')
  c.increment('another-key')
end

# Both contribute to totals grouped by category.
PageView.totals
=> [['a-key',3],['another-key',1]]

# Get the grand total across all categories.
PageView.grand_total
=> 4

See MovingCount docs for detail (filters available on totals to limit results).

Author¶ ↑

Ben Koski, bkoski@nytimes.com

Copyright © 2010 The New York Times Company. See LICENSE for details.