Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
DSL and engine for segmented multi-dimensional queries with ActiveRecord-3
Ruby
branch: master

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.
lib
spec
.document
.gitignore
.rspec
.travis.yml
Gemfile
Gemfile.lock
LICENSE.txt
README.rdoc
Rakefile
VERSION
mdquery.gemspec

README.rdoc

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

  • Measures are SQL aggregate functions to be computed, e.g. “count(*)” or “avg(age)”

  • Each Dimension consists of 1 or more Segments, and each Segment either fixes a value for the Dimension or extracts values from the Source. Each Segment may narrow the Source scope according to the Dimension value or value-range for the Segment

  • A Source is an ActiveRecord-3 Scope

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

  • Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.

  • Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it.

  • Fork the project.

  • Start a feature/bugfix branch.

  • Commit and push until you are happy with your contribution.

  • Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.

  • Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.

Copyright

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

Something went wrong with that request. Please try again.