mdquery

Defines a DSL for specifying and executing segmented multi-dimensional queries on your ActiveRecord-3 models

Installation

gem install mdquery

Usage

A Dataset consists of some Measures over some Dimensions of a Source

Given the definition of the Dataset, it will query the Sources to extract data points, each of which will have a value for each Dimension and a value for each Measure

require 'mdquery'

Q = MDQuery.dataset do
  source Foo

  measure :count, "count(*)", :int

  dimension :time do
    label "Time"

    segment(:all) do
      fix_dimension :all
    end

    segment(:five_years) do
      narrow{|scope| scope.where("foos.created_at > now() - interval '5 years'")}
      extract_dimension "extract(year from foos.created_at)"
      values{|scope| (Date.today.year-4..Date.today.year).to_a.map(&:to_s)}
      label{|value| "Year: #{value}"}
    end
  end

  dimension :users do
    label "Users"

    segment(:all) do
      fix_dimension :all
    end

    segment(:by_type) do
      extract_dimension "user_types.name"
      narrow{|scope| scope.joins(:user_types)}
    end
  end
end

# run queries, collect data. returns an MDQuery::Dataset::Dataset
dataset = Q.collect

# retrieve dimension values, segment values and labels
dataset.dimensions[:time][:five_years].values # => ["2008", "2009", "2010", "2011", "2012"]
dataset.dimensions[:time].label_for("2008") #=> "Year: 2008"
dataset.datapoint({:time=>'2008', :users=>'all'}, :count) # => 100 # 100 users in 2008

Contributing to mdquery

Copyright © 2012 mccraigmccraig. See LICENSE.txt for further details.