Skip to content

golsombe/Ran-a-lytics

Repository files navigation

Ruby Analytics or Ran_A_Lytics is an ActiveRecord extension that provides simple yet effective pivoting of pure Ansi92 SQL though MySQL and Infobright. Though it is not required to pivot a query of an Infobright database, the heavy cost of aggregates in analytical make it impractical to pivot large datasets of INNODB or MYISAM stored data. You can check out a demo or the community edition of Infobright by going to http://www.infobright.org. 

Quickstart
1) Follow the instructins on setting up an Infobright MySQL instance
2) Grab the sample database from http://bit.ly/gBQnaD

# -*- encoding: utf-8 -*-
$:.push File.expand_path("../lib", __FILE__)
require 'rubygems'
require 'ran_a_lytics'
require 'active_record'
require 'time'
puts "Gathering data"
#Connect to a database
ActiveRecord::Base.establish_connection(
  :adapter  => "mysql",
 :host     => "localhost",
 :username => "root",
 :password => "",”
 :database => "carsales",
 :socket => "/tmp/mysql-ib.sock"
)


#Define the model
class FactSalesWide < ActiveRecord::Basero
   set_table_name "fact_sales_wide"
   make_pivotable
end

#Pivot  a query for 10,000 rows into car_make rows, by transaction types columns for two measures 
starttime = Time.now
ma = FactSalesWide.PivotTable(:columns=> ['dlr_trans_type as Transaction'],:rows=>['dim_cars.make_name as make'],:measures=>['sum(sales_commission) as sum_sales_commission', 'sum(sales_discount) as sum_sales_discount'], :joins => ['JOIN dim_cars ON fact_sales_wide.make_id = dim_cars.make_id'])
endtime = Time.now
puts ma.to_json

Details

Model
make_pivotable
end

Controller
def pivot_me
	rows = ['sql_field_or_exp as alias','...'] # Get combined as row_fld1-row_fld2-...
	columns = ['sql_field_or_exp as alias','...'] #Get converted into unique col1_value1-col2_value1-...
	measures = ['aggregate_fn(field(s)) as alias','...'] #Indivual measure totals by pivot columsn,rows, gtotl
	
	pvt_ary = Model_singualr.PivotTable(:rows=>rows, :columns=>columns,:measures=>measures, :conditions=>[sql_exp(s),...], :joins=>['join dim on fact.fk_dim = dim.id']
	puts pvt_ary.to_json #Displays an array of hashes
			     #[row_alias=>'value', :col_alias1=>{measure1_alias=>value,measure2_alias=>value,...}, :col[2-N]..., {measure1_alias=>value,measure2_alias=>value,...} as row_totals]
			     #[{measure1_alias=>value,measure2_alias=>value,...} as grand_totals]
end

About

Ruby Analytical processing with Infobright columnar data stores

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages