activewarehouse 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +41 -0
- data/Rakefile +121 -0
- data/TODO +4 -0
- data/db/migrations/001_create_table_reports.rb +28 -0
- data/doc/agg_queries.txt +26 -0
- data/doc/agg_queries_results.txt +150 -0
- data/doc/queries.txt +35 -0
- data/generators/cube/USAGE +1 -0
- data/generators/cube/cube_generator.rb +28 -0
- data/generators/cube/templates/model.rb +3 -0
- data/generators/cube/templates/unit_test.rb +8 -0
- data/generators/dimension/USAGE +1 -0
- data/generators/dimension/dimension_generator.rb +46 -0
- data/generators/dimension/templates/fixture.yml +5 -0
- data/generators/dimension/templates/migration.rb +20 -0
- data/generators/dimension/templates/model.rb +3 -0
- data/generators/dimension/templates/unit_test.rb +10 -0
- data/generators/fact/USAGE +1 -0
- data/generators/fact/fact_generator.rb +46 -0
- data/generators/fact/templates/fixture.yml +5 -0
- data/generators/fact/templates/migration.rb +11 -0
- data/generators/fact/templates/model.rb +3 -0
- data/generators/fact/templates/unit_test.rb +10 -0
- data/install.rb +5 -0
- data/lib/active_warehouse.rb +65 -0
- data/lib/active_warehouse/builder.rb +2 -0
- data/lib/active_warehouse/builder/date_dimension_builder.rb +65 -0
- data/lib/active_warehouse/builder/random_data_builder.rb +13 -0
- data/lib/active_warehouse/core_ext.rb +1 -0
- data/lib/active_warehouse/core_ext/time.rb +5 -0
- data/lib/active_warehouse/core_ext/time/calculations.rb +40 -0
- data/lib/active_warehouse/migrations.rb +65 -0
- data/lib/active_warehouse/model.rb +5 -0
- data/lib/active_warehouse/model/aggregate.rb +244 -0
- data/lib/active_warehouse/model/cube.rb +273 -0
- data/lib/active_warehouse/model/dimension.rb +3 -0
- data/lib/active_warehouse/model/dimension/bridge.rb +32 -0
- data/lib/active_warehouse/model/dimension/dimension.rb +152 -0
- data/lib/active_warehouse/model/dimension/hierarchical_dimension.rb +35 -0
- data/lib/active_warehouse/model/fact.rb +96 -0
- data/lib/active_warehouse/model/report.rb +3 -0
- data/lib/active_warehouse/model/report/abstract_report.rb +121 -0
- data/lib/active_warehouse/model/report/chart_report.rb +9 -0
- data/lib/active_warehouse/model/report/table_report.rb +23 -0
- data/lib/active_warehouse/version.rb +9 -0
- data/lib/active_warehouse/view.rb +2 -0
- data/lib/active_warehouse/view/report_helper.rb +213 -0
- data/tasks/active_warehouse_tasks.rake +50 -0
- metadata +144 -0
data/README
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
ActiveWarehouse
|
2
|
+
===============
|
3
|
+
The ActiveWarehouse library provides classes and functions which help with building Data Warehouses using Rails. It can be installed either as a plugin or as a Gem. If you install it as a gem you must include the following in your config/environment.rb:
|
4
|
+
|
5
|
+
require_gem 'activewarehouse'
|
6
|
+
require 'active_warehouse'
|
7
|
+
|
8
|
+
Additionally, to use the Rake tasks you must include the following in your Rakefile:
|
9
|
+
|
10
|
+
load 'tasks/active_warehouse_tasks.rake'
|
11
|
+
|
12
|
+
Generators
|
13
|
+
===============
|
14
|
+
ActiveWarehouse comes with several generators
|
15
|
+
|
16
|
+
script/generate fact Sales
|
17
|
+
script/generate fact sales
|
18
|
+
|
19
|
+
Creates a SalesFact class and a sales_facts table.
|
20
|
+
|
21
|
+
script/generate dimension Region
|
22
|
+
script/generate dimension region
|
23
|
+
|
24
|
+
Creates a RegionDimension class and a region_dimension table.
|
25
|
+
|
26
|
+
script/generate cube RegionalSales
|
27
|
+
script/generate cube regional_sales
|
28
|
+
|
29
|
+
Creates a RegionalSalesCube class.
|
30
|
+
|
31
|
+
The rules for naming are as follows:
|
32
|
+
|
33
|
+
Facts:
|
34
|
+
Fact classes and tables follow the typical Rails rules: classes are singular and tables are pluralized.
|
35
|
+
Both the class and table name are suffixed by "_fact".
|
36
|
+
Dimensions:
|
37
|
+
Dimension classes and tables are both singular.
|
38
|
+
Both the class name and the table name are suffixed by "_dimension".
|
39
|
+
Cube:
|
40
|
+
Cube class is singular. If a cube table is created it will also be singular.
|
41
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'rake/rdoctask'
|
4
|
+
require 'rake/gempackagetask'
|
5
|
+
require 'rake/contrib/rubyforgepublisher'
|
6
|
+
|
7
|
+
require File.join(File.dirname(__FILE__), 'lib/active_warehouse', 'version')
|
8
|
+
|
9
|
+
PKG_BUILD = ENV['PKG_BUILD'] ? '.' + ENV['PKG_BUILD'] : ''
|
10
|
+
PKG_NAME = 'activewarehouse'
|
11
|
+
PKG_VERSION = ActiveWarehouse::VERSION::STRING + PKG_BUILD
|
12
|
+
PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
|
13
|
+
PKG_DESTINATION = ENV["PKG_DESTINATION"] || "../#{PKG_NAME}"
|
14
|
+
|
15
|
+
RELEASE_NAME = "REL #{PKG_VERSION}"
|
16
|
+
|
17
|
+
RUBY_FORGE_PROJECT = "activewarehouse"
|
18
|
+
RUBY_FORGE_USER = "aeden"
|
19
|
+
|
20
|
+
desc 'Default: run unit tests.'
|
21
|
+
task :default => :test
|
22
|
+
|
23
|
+
desc 'Test the active_warehouse plugin.'
|
24
|
+
Rake::TestTask.new(:test) do |t|
|
25
|
+
t.libs << 'lib'
|
26
|
+
t.pattern = 'test/**/*_test.rb'
|
27
|
+
t.verbose = true
|
28
|
+
end
|
29
|
+
|
30
|
+
desc 'Generate documentation for the active_warehouse plugin.'
|
31
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
32
|
+
rdoc.rdoc_dir = 'rdoc'
|
33
|
+
rdoc.title = 'ActiveWarehouse'
|
34
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
35
|
+
rdoc.rdoc_files.include('README')
|
36
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
37
|
+
end
|
38
|
+
|
39
|
+
# Gem Spec
|
40
|
+
PKG_FILES = FileList[
|
41
|
+
'[a-zA-Z]*.rb',
|
42
|
+
'README',
|
43
|
+
'TODO',
|
44
|
+
'Rakefile',
|
45
|
+
'db/**/*',
|
46
|
+
'doc/**/*',
|
47
|
+
'generators/**/*',
|
48
|
+
'lib/**/*',
|
49
|
+
'tasks/**/*'
|
50
|
+
] - [ 'test' ]
|
51
|
+
|
52
|
+
spec = Gem::Specification.new do |s|
|
53
|
+
s.name = 'activewarehouse'
|
54
|
+
s.version = PKG_VERSION
|
55
|
+
s.summary = "Build data warehouses with Rails."
|
56
|
+
s.description = <<-EOF
|
57
|
+
ActiveWarehouse extends Rails to provide functionality specific for building data warehouses.
|
58
|
+
EOF
|
59
|
+
|
60
|
+
s.add_dependency('rake', '>= 0.7.1')
|
61
|
+
s.add_dependency('activesupport', '>= 1.3.1.5618')
|
62
|
+
s.add_dependency('activerecord', '>= 1.14.4.5618')
|
63
|
+
s.add_dependency('actionpack', '>= 1.12.5.5618')
|
64
|
+
|
65
|
+
s.rdoc_options << '--exclude' << '.'
|
66
|
+
s.has_rdoc = false
|
67
|
+
|
68
|
+
s.files = PKG_FILES.to_a.delete_if {|f| f.include?('.svn')}
|
69
|
+
s.require_path = 'lib'
|
70
|
+
|
71
|
+
#s.bindir = "bin" # Use these for applications.
|
72
|
+
#s.executables = []
|
73
|
+
#s.default_executable = ""
|
74
|
+
|
75
|
+
s.author = "Anthony Eden"
|
76
|
+
s.email = "anthonyeden@gmail.com"
|
77
|
+
s.homepage = "http://activewarehouse.rubyforge.org"
|
78
|
+
s.rubyforge_project = "activewarehouse"
|
79
|
+
end
|
80
|
+
|
81
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
82
|
+
pkg.gem_spec = spec
|
83
|
+
pkg.need_tar = true
|
84
|
+
pkg.need_zip = true
|
85
|
+
end
|
86
|
+
|
87
|
+
desc "Generate code statistics"
|
88
|
+
task :lines do
|
89
|
+
lines, codelines, total_lines, total_codelines = 0, 0, 0, 0
|
90
|
+
|
91
|
+
for file_name in FileList["lib/**/*.rb"]
|
92
|
+
next if file_name =~ /vendor/
|
93
|
+
f = File.open(file_name)
|
94
|
+
|
95
|
+
while line = f.gets
|
96
|
+
lines += 1
|
97
|
+
next if line =~ /^\s*$/
|
98
|
+
next if line =~ /^\s*#/
|
99
|
+
codelines += 1
|
100
|
+
end
|
101
|
+
puts "L: #{sprintf("%4d", lines)}, LOC #{sprintf("%4d", codelines)} | #{file_name}"
|
102
|
+
|
103
|
+
total_lines += lines
|
104
|
+
total_codelines += codelines
|
105
|
+
|
106
|
+
lines, codelines = 0, 0
|
107
|
+
end
|
108
|
+
|
109
|
+
puts "Total: Lines #{total_lines}, LOC #{total_codelines}"
|
110
|
+
end
|
111
|
+
|
112
|
+
desc "Publish the release files to RubyForge."
|
113
|
+
task :release => [ :package ] do
|
114
|
+
`rubyforge login`
|
115
|
+
|
116
|
+
for ext in %w( gem tgz zip )
|
117
|
+
release_command = "rubyforge add_release activewarehouse #{PKG_NAME} 'REL #{PKG_VERSION}' pkg/#{PKG_NAME}-#{PKG_VERSION}.#{ext}"
|
118
|
+
puts release_command
|
119
|
+
system(release_command)
|
120
|
+
end
|
121
|
+
end
|
data/TODO
ADDED
@@ -0,0 +1,4 @@
|
|
1
|
+
TODO list:
|
2
|
+
|
3
|
+
* Modify the fact generator so that the migration has a map for foreign key and a map for fact attributes. The foreign keys can then automatically be indexed as that is pretty much standard behavior.
|
4
|
+
* Make the belongs_to connection between facts and dimensions automatic.
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class CreateTableReports < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_table :table_reports do |t|
|
4
|
+
t.column :title, :string
|
5
|
+
t.column :cube_name, :string, :null => false
|
6
|
+
|
7
|
+
t.column :column_dimension_name, :string
|
8
|
+
t.column :column_hierarchy, :string
|
9
|
+
t.column :column_constraints, :text
|
10
|
+
t.column :column_stage, :integer
|
11
|
+
t.column :column_param_prefix, :string
|
12
|
+
|
13
|
+
t.column :row_dimension_name, :string
|
14
|
+
t.column :row_hierarchy, :string
|
15
|
+
t.column :row_constraints, :text
|
16
|
+
t.column :row_stage, :integer
|
17
|
+
t.column :row_param_prefix, :string
|
18
|
+
|
19
|
+
t.column :fact_attributes, :text
|
20
|
+
|
21
|
+
t.column :created_at, :datetime
|
22
|
+
t.column :updated_at, :datetime
|
23
|
+
end
|
24
|
+
end
|
25
|
+
def self.down
|
26
|
+
drop_table :table_reports
|
27
|
+
end
|
28
|
+
end
|
data/doc/agg_queries.txt
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
Aggregate 1:
|
2
|
+
|
3
|
+
select d1.calendar_year, d2.store_state,sum(f.sales_quantity) as sales_quantity,sum(f.sales_dollar_amount) as sales_dollar_amount from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d2.store_state;
|
4
|
+
select d1.calendar_year, d2.store_state, d2.store_county,sum(f.sales_quantity) as sales_quantity,sum(f.sales_dollar_amount) as sales_dollar_amount from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d2.store_state, d2.store_county;
|
5
|
+
select d1.calendar_year, d2.store_state, d2.store_county, d2.store_city,sum(f.sales_quantity) as sales_quantity,sum(f.sales_dollar_amount) as sales_dollar_amount from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d2.store_state, d2.store_county, d2.store_city;
|
6
|
+
select d1.calendar_year, d1.calendar_month_name, d2.store_state,sum(f.sales_quantity) as sales_quantity,sum(f.sales_dollar_amount) as sales_dollar_amount from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d1.calendar_month_name, d2.store_state;
|
7
|
+
select d1.calendar_year, d1.calendar_month_name, d2.store_state, d2.store_county,sum(f.sales_quantity) as sales_quantity,sum(f.sales_dollar_amount) as sales_dollar_amount from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d1.calendar_month_name, d2.store_state, d2.store_county;
|
8
|
+
select d1.calendar_year, d1.calendar_month_name, d2.store_state, d2.store_county, d2.store_city,sum(f.sales_quantity) as sales_quantity,sum(f.sales_dollar_amount) as sales_dollar_amount from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d1.calendar_month_name, d2.store_state, d2.store_county, d2.store_city;
|
9
|
+
select d1.calendar_year, d1.calendar_month_name, d1.calendar_week, d2.store_state,sum(f.sales_quantity) as sales_quantity,sum(f.sales_dollar_amount) as sales_dollar_amount from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d1.calendar_month_name, d1.calendar_week, d2.store_state;
|
10
|
+
select d1.calendar_year, d1.calendar_month_name, d1.calendar_week, d2.store_state, d2.store_county,sum(f.sales_quantity) as sales_quantity,sum(f.sales_dollar_amount) as sales_dollar_amount from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d1.calendar_month_name, d1.calendar_week, d2.store_state, d2.store_county;
|
11
|
+
select d1.calendar_year, d1.calendar_month_name, d1.calendar_week, d2.store_state, d2.store_county, d2.store_city,sum(f.sales_quantity) as sales_quantity,sum(f.sales_dollar_amount) as sales_dollar_amount from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d1.calendar_month_name, d1.calendar_week, d2.store_state, d2.store_county, d2.store_city;
|
12
|
+
select d1.calendar_year, d1.calendar_month_name, d1.calendar_week, d1.day_number_in_calendar_month, d2.store_state,sum(f.sales_quantity) as sales_quantity,sum(f.sales_dollar_amount) as sales_dollar_amount from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d1.calendar_month_name, d1.calendar_week, d1.day_number_in_calendar_month, d2.store_state;
|
13
|
+
select d1.calendar_year, d1.calendar_month_name, d1.calendar_week, d1.day_number_in_calendar_month, d2.store_state, d2.store_county,sum(f.sales_quantity) as sales_quantity,sum(f.sales_dollar_amount) as sales_dollar_amount from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d1.calendar_month_name, d1.calendar_week, d1.day_number_in_calendar_month, d2.store_state, d2.store_county;
|
14
|
+
select d1.calendar_year, d1.calendar_month_name, d1.calendar_week, d1.day_number_in_calendar_month, d2.store_state, d2.store_county, d2.store_city,sum(f.sales_quantity) as sales_quantity,sum(f.sales_dollar_amount) as sales_dollar_amount from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d1.calendar_month_name, d1.calendar_week, d1.day_number_in_calendar_month, d2.store_state, d2.store_county, d2.store_city;
|
15
|
+
|
16
|
+
|
17
|
+
Aggregate 2:
|
18
|
+
|
19
|
+
select d1.calendar_year, d2.store_region,sum(f.sales_quantity) as sales_quantity,sum(f.sales_dollar_amount) as sales_dollar_amount from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d2.store_region;
|
20
|
+
select d1.calendar_year, d2.store_region, d2.store_district,sum(f.sales_quantity) as sales_quantity,sum(f.sales_dollar_amount) as sales_dollar_amount from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d2.store_region, d2.store_district;
|
21
|
+
select d1.calendar_year, d1.calendar_month_name, d2.store_region,sum(f.sales_quantity) as sales_quantity,sum(f.sales_dollar_amount) as sales_dollar_amount from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d1.calendar_month_name, d2.store_region;
|
22
|
+
select d1.calendar_year, d1.calendar_month_name, d2.store_region, d2.store_district,sum(f.sales_quantity) as sales_quantity,sum(f.sales_dollar_amount) as sales_dollar_amount from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d1.calendar_month_name, d2.store_region, d2.store_district;
|
23
|
+
select d1.calendar_year, d1.calendar_month_name, d1.calendar_week, d2.store_region,sum(f.sales_quantity) as sales_quantity,sum(f.sales_dollar_amount) as sales_dollar_amount from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d1.calendar_month_name, d1.calendar_week, d2.store_region;
|
24
|
+
select d1.calendar_year, d1.calendar_month_name, d1.calendar_week, d2.store_region, d2.store_district,sum(f.sales_quantity) as sales_quantity,sum(f.sales_dollar_amount) as sales_dollar_amount from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d1.calendar_month_name, d1.calendar_week, d2.store_region, d2.store_district;
|
25
|
+
select d1.calendar_year, d1.calendar_month_name, d1.calendar_week, d1.day_number_in_calendar_month, d2.store_region,sum(f.sales_quantity) as sales_quantity,sum(f.sales_dollar_amount) as sales_dollar_amount from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d1.calendar_month_name, d1.calendar_week, d1.day_number_in_calendar_month, d2.store_region;
|
26
|
+
select d1.calendar_year, d1.calendar_month_name, d1.calendar_week, d1.day_number_in_calendar_month, d2.store_region, d2.store_district,sum(f.sales_quantity) as sales_quantity,sum(f.sales_dollar_amount) as sales_dollar_amount from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d1.calendar_month_name, d1.calendar_week, d1.day_number_in_calendar_month, d2.store_region, d2.store_district;
|
@@ -0,0 +1,150 @@
|
|
1
|
+
mysql> select d1.calendar_year, d2.store_state,sum(f.sales_quantity) as sales_quantity,sum(f.sales_dollar_amount) as sales_dollar_amount from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d2.store_state;
|
2
|
+
+---------------+-------------+----------------+---------------------+
|
3
|
+
| calendar_year | store_state | sales_quantity | sales_dollar_amount |
|
4
|
+
+---------------+-------------+----------------+---------------------+
|
5
|
+
| 2001 | Florida | 6 | 6.90000009536743 |
|
6
|
+
| 2002 | Florida | 2 | 2.6800000667572 |
|
7
|
+
| 2003 | Florida | 4 | 5.3600001335144 |
|
8
|
+
| 2006 | Florida | 5 | 6.30000013113022 |
|
9
|
+
+---------------+-------------+----------------+---------------------+
|
10
|
+
4 rows in set (0.00 sec)
|
11
|
+
|
12
|
+
mysql> select d1.calendar_year, d2.store_state, d2.store_county,sum(f.sales_quantity) as sales_quantity,sum(f.sales_dollar_amount) as sales_dollar_amount from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d2.store_state, d2.store_county;
|
13
|
+
+---------------+-------------+--------------+----------------+---------------------+
|
14
|
+
| calendar_year | store_state | store_county | sales_quantity | sales_dollar_amount |
|
15
|
+
+---------------+-------------+--------------+----------------+---------------------+
|
16
|
+
| 2001 | Florida | Miami-Dade | 6 | 6.90000009536743 |
|
17
|
+
| 2002 | Florida | Miami-Dade | 2 | 2.6800000667572 |
|
18
|
+
| 2003 | Florida | Miami-Dade | 4 | 5.3600001335144 |
|
19
|
+
| 2006 | Florida | Miami-Dade | 5 | 6.30000013113022 |
|
20
|
+
+---------------+-------------+--------------+----------------+---------------------+
|
21
|
+
4 rows in set (0.00 sec)
|
22
|
+
|
23
|
+
mysql> select d1.calendar_year, d2.store_state, d2.store_county, d2.store_city,sum(f.sales_quantity) as sales_quantity,sum(f.sales_dollar_amount) as sales_dollar_amount from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d2.store_state, d2.store_county, d2.store_city;
|
24
|
+
+---------------+-------------+--------------+-------------+----------------+---------------------+
|
25
|
+
| calendar_year | store_state | store_county | store_city | sales_quantity | sales_dollar_amount |
|
26
|
+
+---------------+-------------+--------------+-------------+----------------+---------------------+
|
27
|
+
| 2001 | Florida | Miami-Dade | Miami | 3 | 3.45000004768372 |
|
28
|
+
| 2001 | Florida | Miami-Dade | South Miami | 3 | 3.45000004768372 |
|
29
|
+
| 2002 | Florida | Miami-Dade | Miami | 1 | 1.3400000333786 |
|
30
|
+
| 2002 | Florida | Miami-Dade | South Miami | 1 | 1.3400000333786 |
|
31
|
+
| 2003 | Florida | Miami-Dade | Miami | 2 | 2.6800000667572 |
|
32
|
+
| 2003 | Florida | Miami-Dade | South Miami | 2 | 2.6800000667572 |
|
33
|
+
| 2006 | Florida | Miami-Dade | Miami | 4 | 4.96000009775162 |
|
34
|
+
| 2006 | Florida | Miami-Dade | South Miami | 1 | 1.3400000333786 |
|
35
|
+
+---------------+-------------+--------------+-------------+----------------+---------------------+
|
36
|
+
8 rows in set (0.00 sec)
|
37
|
+
|
38
|
+
mysql> select d1.calendar_year, d1.calendar_month_name, d2.store_state,sum(f.sales_quantity) as sales_quantity,sum(f.sales_dollar_amount) as sales_dollar_amount from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d1.calendar_month_name, d2.store_state;
|
39
|
+
+---------------+---------------------+-------------+----------------+---------------------+
|
40
|
+
| calendar_year | calendar_month_name | store_state | sales_quantity | sales_dollar_amount |
|
41
|
+
+---------------+---------------------+-------------+----------------+---------------------+
|
42
|
+
| 2001 | November | Florida | 6 | 6.90000009536743 |
|
43
|
+
| 2002 | September | Florida | 2 | 2.6800000667572 |
|
44
|
+
| 2003 | June | Florida | 4 | 5.3600001335144 |
|
45
|
+
| 2006 | October | Florida | 5 | 6.30000013113022 |
|
46
|
+
+---------------+---------------------+-------------+----------------+---------------------+
|
47
|
+
4 rows in set (0.01 sec)
|
48
|
+
|
49
|
+
mysql> select d1.calendar_year, d1.calendar_month_name, d2.store_state, d2.store_county,sum(f.sales_quantity) as sales_quantity,sum(f.sales_dollar_amount) as sales_dollar_amount from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d1.calendar_month_name, d2.store_state, d2.store_county;
|
50
|
+
+---------------+---------------------+-------------+--------------+----------------+---------------------+
|
51
|
+
| calendar_year | calendar_month_name | store_state | store_county | sales_quantity | sales_dollar_amount |
|
52
|
+
+---------------+---------------------+-------------+--------------+----------------+---------------------+
|
53
|
+
| 2001 | November | Florida | Miami-Dade | 6 | 6.90000009536743 |
|
54
|
+
| 2002 | September | Florida | Miami-Dade | 2 | 2.6800000667572 |
|
55
|
+
| 2003 | June | Florida | Miami-Dade | 4 | 5.3600001335144 |
|
56
|
+
| 2006 | October | Florida | Miami-Dade | 5 | 6.30000013113022 |
|
57
|
+
+---------------+---------------------+-------------+--------------+----------------+---------------------+
|
58
|
+
4 rows in set (0.04 sec)
|
59
|
+
|
60
|
+
mysql> select d1.calendar_year, d1.calendar_month_name, d2.store_state, d2.store_county, d2.store_city,sum(f.sales_quantity) as sales_quantity,sum(f.sales_dollar_amount) as sales_dollar_amount from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d1.calendar_month_name, d2.store_state, d2.store_county, d2.store_city;
|
61
|
+
+---------------+---------------------+-------------+--------------+-------------+----------------+---------------------+
|
62
|
+
| calendar_year | calendar_month_name | store_state | store_county | store_city | sales_quantity | sales_dollar_amount |
|
63
|
+
+---------------+---------------------+-------------+--------------+-------------+----------------+---------------------+
|
64
|
+
| 2001 | November | Florida | Miami-Dade | Miami | 3 | 3.45000004768372 |
|
65
|
+
| 2001 | November | Florida | Miami-Dade | South Miami | 3 | 3.45000004768372 |
|
66
|
+
| 2002 | September | Florida | Miami-Dade | Miami | 1 | 1.3400000333786 |
|
67
|
+
| 2002 | September | Florida | Miami-Dade | South Miami | 1 | 1.3400000333786 |
|
68
|
+
| 2003 | June | Florida | Miami-Dade | Miami | 2 | 2.6800000667572 |
|
69
|
+
| 2003 | June | Florida | Miami-Dade | South Miami | 2 | 2.6800000667572 |
|
70
|
+
| 2006 | October | Florida | Miami-Dade | Miami | 4 | 4.96000009775162 |
|
71
|
+
| 2006 | October | Florida | Miami-Dade | South Miami | 1 | 1.3400000333786 |
|
72
|
+
+---------------+---------------------+-------------+--------------+-------------+----------------+---------------------+
|
73
|
+
8 rows in set (0.00 sec)
|
74
|
+
|
75
|
+
mysql> select d1.calendar_year, d1.calendar_month_name, d1.calendar_week, d2.store_state,sum(f.sales_quantity) as sales_quantity,sum(f.sales_dollar_amount) as sales_dollar_amount from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d1.calendar_month_name, d1.calendar_week, d2.store_state;
|
76
|
+
+---------------+---------------------+---------------+-------------+----------------+---------------------+
|
77
|
+
| calendar_year | calendar_month_name | calendar_week | store_state | sales_quantity | sales_dollar_amount |
|
78
|
+
+---------------+---------------------+---------------+-------------+----------------+---------------------+
|
79
|
+
| 2001 | November | Week 45 | Florida | 6 | 6.90000009536743 |
|
80
|
+
| 2002 | September | Week 36 | Florida | 2 | 2.6800000667572 |
|
81
|
+
| 2003 | June | Week 26 | Florida | 4 | 5.3600001335144 |
|
82
|
+
| 2006 | October | Week 41 | Florida | 5 | 6.30000013113022 |
|
83
|
+
+---------------+---------------------+---------------+-------------+----------------+---------------------+
|
84
|
+
4 rows in set (0.00 sec)
|
85
|
+
|
86
|
+
mysql> select d1.calendar_year, d1.calendar_month_name, d1.calendar_week, d2.store_state, d2.store_county,sum(f.sales_quantity) as sales_quantity,sum(f.sales_dollar_amount) as sales_dollar_amount from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d1.calendar_month_name, d1.calendar_week, d2.store_state, d2.store_county;
|
87
|
+
+---------------+---------------------+---------------+-------------+--------------+----------------+---------------------+
|
88
|
+
| calendar_year | calendar_month_name | calendar_week | store_state | store_county | sales_quantity | sales_dollar_amount |
|
89
|
+
+---------------+---------------------+---------------+-------------+--------------+----------------+---------------------+
|
90
|
+
| 2001 | November | Week 45 | Florida | Miami-Dade | 6 | 6.90000009536743 |
|
91
|
+
| 2002 | September | Week 36 | Florida | Miami-Dade | 2 | 2.6800000667572 |
|
92
|
+
| 2003 | June | Week 26 | Florida | Miami-Dade | 4 | 5.3600001335144 |
|
93
|
+
| 2006 | October | Week 41 | Florida | Miami-Dade | 5 | 6.30000013113022 |
|
94
|
+
+---------------+---------------------+---------------+-------------+--------------+----------------+---------------------+
|
95
|
+
4 rows in set (0.01 sec)
|
96
|
+
|
97
|
+
mysql> select d1.calendar_year, d1.calendar_month_name, d1.calendar_week, d2.store_state, d2.store_county, d2.store_city,sum(f.sales_quantity) as sales_quantity,sum(f.sales_dollar_amount) as sales_dollar_amount from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d1.calendar_month_name, d1.calendar_week, d2.store_state, d2.store_county, d2.store_city;
|
98
|
+
+---------------+---------------------+---------------+-------------+--------------+-------------+----------------+---------------------+
|
99
|
+
| calendar_year | calendar_month_name | calendar_week | store_state | store_county | store_city | sales_quantity | sales_dollar_amount |
|
100
|
+
+---------------+---------------------+---------------+-------------+--------------+-------------+----------------+---------------------+
|
101
|
+
| 2001 | November | Week 45 | Florida | Miami-Dade | Miami | 3 | 3.45000004768372 |
|
102
|
+
| 2001 | November | Week 45 | Florida | Miami-Dade | South Miami | 3 | 3.45000004768372 |
|
103
|
+
| 2002 | September | Week 36 | Florida | Miami-Dade | Miami | 1 | 1.3400000333786 |
|
104
|
+
| 2002 | September | Week 36 | Florida | Miami-Dade | South Miami | 1 | 1.3400000333786 |
|
105
|
+
| 2003 | June | Week 26 | Florida | Miami-Dade | Miami | 2 | 2.6800000667572 |
|
106
|
+
| 2003 | June | Week 26 | Florida | Miami-Dade | South Miami | 2 | 2.6800000667572 |
|
107
|
+
| 2006 | October | Week 41 | Florida | Miami-Dade | Miami | 4 | 4.96000009775162 |
|
108
|
+
| 2006 | October | Week 41 | Florida | Miami-Dade | South Miami | 1 | 1.3400000333786 |
|
109
|
+
+---------------+---------------------+---------------+-------------+--------------+-------------+----------------+---------------------+
|
110
|
+
8 rows in set (0.04 sec)
|
111
|
+
|
112
|
+
mysql> select d1.calendar_year, d1.calendar_month_name, d1.calendar_week, d1.day_number_in_calendar_month, d2.store_state,sum(f.sales_quantity) as sales_quantity,sum(f.sales_dollar_amount) as sales_dollar_amount from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d1.calendar_month_name, d1.calendar_week, d1.day_number_in_calendar_month, d2.store_state;
|
113
|
+
+---------------+---------------------+---------------+------------------------------+-------------+----------------+---------------------+
|
114
|
+
| calendar_year | calendar_month_name | calendar_week | day_number_in_calendar_month | store_state | sales_quantity | sales_dollar_amount |
|
115
|
+
+---------------+---------------------+---------------+------------------------------+-------------+----------------+---------------------+
|
116
|
+
| 2001 | November | Week 45 | 8 | Florida | 6 | 6.90000009536743 |
|
117
|
+
| 2002 | September | Week 36 | 3 | Florida | 2 | 2.6800000667572 |
|
118
|
+
| 2003 | June | Week 26 | 30 | Florida | 4 | 5.3600001335144 |
|
119
|
+
| 2006 | October | Week 41 | 12 | Florida | 3 | 3.62000006437302 |
|
120
|
+
| 2006 | October | Week 41 | 13 | Florida | 2 | 2.6800000667572 |
|
121
|
+
+---------------+---------------------+---------------+------------------------------+-------------+----------------+---------------------+
|
122
|
+
5 rows in set (0.01 sec)
|
123
|
+
|
124
|
+
mysql> select d1.calendar_year, d1.calendar_month_name, d1.calendar_week, d1.day_number_in_calendar_month, d2.store_state, d2.store_county,sum(f.sales_quantity) as sales_quantity,sum(f.sales_dollar_amount) as sales_dollar_amount from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d1.calendar_month_name, d1.calendar_week, d1.day_number_in_calendar_month, d2.store_state, d2.store_county;
|
125
|
+
+---------------+---------------------+---------------+------------------------------+-------------+--------------+----------------+---------------------+
|
126
|
+
| calendar_year | calendar_month_name | calendar_week | day_number_in_calendar_month | store_state | store_county | sales_quantity | sales_dollar_amount |
|
127
|
+
+---------------+---------------------+---------------+------------------------------+-------------+--------------+----------------+---------------------+
|
128
|
+
| 2001 | November | Week 45 | 8 | Florida | Miami-Dade | 6 | 6.90000009536743 |
|
129
|
+
| 2002 | September | Week 36 | 3 | Florida | Miami-Dade | 2 | 2.6800000667572 |
|
130
|
+
| 2003 | June | Week 26 | 30 | Florida | Miami-Dade | 4 | 5.3600001335144 |
|
131
|
+
| 2006 | October | Week 41 | 12 | Florida | Miami-Dade | 3 | 3.62000006437302 |
|
132
|
+
| 2006 | October | Week 41 | 13 | Florida | Miami-Dade | 2 | 2.6800000667572 |
|
133
|
+
+---------------+---------------------+---------------+------------------------------+-------------+--------------+----------------+---------------------+
|
134
|
+
5 rows in set (0.01 sec)
|
135
|
+
|
136
|
+
mysql> select d1.calendar_year, d1.calendar_month_name, d1.calendar_week, d1.day_number_in_calendar_month, d2.store_state, d2.store_county, d2.store_city,sum(f.sales_quantity) as sales_quantity,sum(f.sales_dollar_amount) as sales_dollar_amount from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d1.calendar_month_name, d1.calendar_week, d1.day_number_in_calendar_month, d2.store_state, d2.store_county, d2.store_city;
|
137
|
+
+---------------+---------------------+---------------+------------------------------+-------------+--------------+-------------+----------------+---------------------+
|
138
|
+
| calendar_year | calendar_month_name | calendar_week | day_number_in_calendar_month | store_state | store_county | store_city | sales_quantity | sales_dollar_amount |
|
139
|
+
+---------------+---------------------+---------------+------------------------------+-------------+--------------+-------------+----------------+---------------------+
|
140
|
+
| 2001 | November | Week 45 | 8 | Florida | Miami-Dade | Miami | 3 | 3.45000004768372 |
|
141
|
+
| 2001 | November | Week 45 | 8 | Florida | Miami-Dade | South Miami | 3 | 3.45000004768372 |
|
142
|
+
| 2002 | September | Week 36 | 3 | Florida | Miami-Dade | Miami | 1 | 1.3400000333786 |
|
143
|
+
| 2002 | September | Week 36 | 3 | Florida | Miami-Dade | South Miami | 1 | 1.3400000333786 |
|
144
|
+
| 2003 | June | Week 26 | 30 | Florida | Miami-Dade | Miami | 2 | 2.6800000667572 |
|
145
|
+
| 2003 | June | Week 26 | 30 | Florida | Miami-Dade | South Miami | 2 | 2.6800000667572 |
|
146
|
+
| 2006 | October | Week 41 | 12 | Florida | Miami-Dade | Miami | 2 | 2.28000003099442 |
|
147
|
+
| 2006 | October | Week 41 | 12 | Florida | Miami-Dade | South Miami | 1 | 1.3400000333786 |
|
148
|
+
| 2006 | October | Week 41 | 13 | Florida | Miami-Dade | Miami | 2 | 2.6800000667572 |
|
149
|
+
+---------------+---------------------+---------------+------------------------------+-------------+--------------+-------------+----------------+---------------------+
|
150
|
+
9 rows in set (0.00 sec)
|
data/doc/queries.txt
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# This will sum sales quantity and group by calendar year
|
2
|
+
select d1.calendar_year, sum(f.sales_quantity) from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id group by d1.calendar_year;
|
3
|
+
|
4
|
+
# This will sum sales quantity and group by store name
|
5
|
+
select d2.store_name, sum(f.sales_quantity) from pos_retail_sales_transaction_facts f join store_dimension d2 on f.store_id = d2.id group by d2.store_name;
|
6
|
+
|
7
|
+
# This will sum sales quantity and group by calendar year and store name
|
8
|
+
select d1.calendar_year, d2.store_name, sum(f.sales_quantity) from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d2.store_name;
|
9
|
+
|
10
|
+
# This will sum sales quantity and group by calendar year and store region
|
11
|
+
select d1.calendar_year, d2.store_region, sum(f.sales_quantity) as sales_quantity from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d2.store_region;
|
12
|
+
|
13
|
+
|
14
|
+
select d1.calendar_year, d1.calendar_quarter, d2.store_region, sum(f.sales_quantity) as sales_quantity from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d1.calendar_quarter, d2.store_region;
|
15
|
+
|
16
|
+
select d1.calendar_year, d1.calendar_quarter, d1.calendar_month_name, d1.calendar_week, d1.day_number_in_calendar_month, d2.store_region, d2.store_district, sum(f.sales_quantity) as sales_quantity, sum(f.sales_dollar_amount) as sales_dollar_amount from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id group by d1.calendar_year, d1.calendar_quarter, d1.calendar_month_name, d1.calendar_week, d1.day_number_in_calendar_month, d2.store_region, d2.store_district;
|
17
|
+
|
18
|
+
|
19
|
+
select * from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id;
|
20
|
+
|
21
|
+
|
22
|
+
select f.pos_transaction_number, d1.calendar_year, d1.calendar_month_name, d1.calendar_week, d1.day_number_in_calendar_month as day, d2.store_region, d2.store_district, f.sales_quantity, f.sales_dollar_amount from pos_retail_sales_transaction_facts f join date_dimension d1 on f.date_id = d1.id join store_dimension d2 on f.store_id = d2.id;
|
23
|
+
|
24
|
+
|
25
|
+
# This will calculate the number of days per year
|
26
|
+
select calendar_year, count(id) from date_dimension group by calendar_year;
|
27
|
+
|
28
|
+
# This will calculate the number of days per month for a particular calendar year
|
29
|
+
select calendar_year, calendar_month_name, count(id) from date_dimension where calendar_year = 2002 group by calendar_month_name;
|
30
|
+
|
31
|
+
# This will calculate the number of fiscal year months in each calendar year. * This is what to use for denomniators *
|
32
|
+
select calendar_year, count(distinct(fiscal_year_month)) from date_dimension group by calendar_year;
|
33
|
+
|
34
|
+
# The example below shows the number of days in each week for each fiscal month
|
35
|
+
select calendar_year_month, count(distinct(day_of_week)) from date_dimension where calendar_year = 2002 group by calendar_year_month;
|
@@ -0,0 +1 @@
|
|
1
|
+
./script/generate cube NAME
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class CubeGenerator < Rails::Generator::NamedBase
|
2
|
+
attr_accessor :file_name
|
3
|
+
|
4
|
+
def initialize(runtime_args, runtime_options = {})
|
5
|
+
super
|
6
|
+
|
7
|
+
@name = @name.underscore
|
8
|
+
@table_name = "#{@name}_cube"
|
9
|
+
@class_name = "#{@name.camelize}Cube"
|
10
|
+
@file_name = "#{@class_name.tableize.singularize}"
|
11
|
+
end
|
12
|
+
|
13
|
+
def manifest
|
14
|
+
record do |m|
|
15
|
+
# Check for class naming collisions.
|
16
|
+
m.class_collisions class_path, "#{class_name}", "#{class_name}Test"
|
17
|
+
|
18
|
+
# Create required directories if necessary
|
19
|
+
m.directory File.join('app/models', class_path)
|
20
|
+
m.directory File.join('test/unit', class_path)
|
21
|
+
|
22
|
+
# Generate the files
|
23
|
+
m.template 'model.rb', File.join('app/models', class_path, "#{file_name}.rb")
|
24
|
+
m.template 'unit_test.rb', File.join('test/unit', class_path, "#{file_name}_test.rb")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|