Project

devlin

0.0
No commit activity in last 3 years
No release in over 3 years
Devlin gives users the ability to define reporting database queries
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Runtime

 Project Readme

Devlin

Devlin gives users the ability to define reporting database queries. The queries are defined in yaml and using predefined scopes. Since the sql statements are defined by the developer, the user is not able to corrupt the database.

Installation

Add this line to your application's Gemfile:

gem 'devlin', :git => 'https://github.com/spieker/devlin.git'

And then execute:

$ bundle

Usage

First you have to setup Devlin and define base scopes which can be used to define queries. In Rails you can do this in an initializer.

# config/initializers/devlin.rb

class ReportBuilder < Devlin::Base 
  scope :transaction do |params|
    relation Transaction.where(user_id: params[:user_id]).scoped
    
    column :manufacturer, "manufacturer"
    column :year, "YEAR(date)"
    column :month, "MONTH(date)" do |value|
      months = %W(~ Jan Feb Mar Apr May Jun Jul Aug Sep Okt Nov Dec)
      months[value]
    end
    column :earnings, "SUM(costs*IF(direction='in', -1, 1))"
  end

  # more scopes ...
end

Now you can define queries on the configured scopes

# app/controllers/report_controller.rb

...
def report
  @relation = Devlin.new(user_id: current_user.id).query(params[:q]).result
end
...

The parameter "q" has to contain the query defined in yaml. The query can look like this:

scope: transaction
select:
  - manufacturer
  - month
  - earnings
conditions:
  year: 2012
  month.geq: 1
  month.leq: 3
group:
  - manufacturer
  - month

The generated query returns a sum of earnings for each manufacturer in the year 2012 and the months of January, February and Mach.

Possible modifiers for conditions are

g   # > ...
geq # >= ...
l   # < ...
leq # <= ...
in  # IN (...)

Todo

  • Params for columns to have i.e. one column for each month and a list of manufacturers

Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Added some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request