OlapReport
Olap-like queries & aggregations for activerecord models using defined hierarchies & measures
Installation
Add this line to your application's Gemfile:
gem 'olap_report'
And then execute:
$ bundle
Or install it yourself as:
$ gem install olap_report
Usage
Define dimensions, measures & aggregations (if needed) in your ActiveRecord model.
class Fact < ActiveRecord::Base
# include OlapReport::Cube module to your ActiveRecord model
include OlapReport::Cube
belongs_to :user
# define dimensions for your model
# define_dimension <dimension name> do |d|
define_dimension :user do
level :user_id
level :group_id, joins: :user
level :category, joins: {user: :group}
end
define_dimension :date do
# define layers by date periods
# dates <column name>, by: <Array of periods (:minute, :hour, :day, :week, :month, :year)>
dates :created_at, by: [:day, :week, :month, :quoter, :year]
end
# define_measure <measure name>, <function name, :sum by default>, hash of options
define_measure :score_avg, :avg, column: :score
define_measure :score_sum, :sum, column: :score
define_measure :score_count, :count, column: :score
# define table aggregations if needed
# define_aggregation <dimension name> => <level name>
define_aggregation user: :category
define_aggregation user: :group_id, date: :month
end
Use #projection method of your model class to calculate summaries by levels
Fact.slice(dimensions: {<dimension name> => <level name>, ...}, measures: [<measure name>, <measure_name>, ...])
Use # aggregate! method of your model class to create aggregation tables for defined aggregations
Fact.aggregate!
Contributing
- Fork it
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create new Pull Request