chicagowarehouse 0.6.6 → 0.6.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +1 -1
- data/chicagowarehouse.gemspec +3 -2
- data/lib/chicago/schema/column_parser.rb +4 -3
- data/lib/chicago/schema/dimension_reference.rb +8 -0
- data/lib/chicago/schema/query_column.rb +21 -9
- data/spec/schema/column_parser_spec.rb +39 -0
- data/spec/schema/dimension_reference_spec.rb +5 -0
- data/spec/schema/query_column_spec.rb +4 -4
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0d1ffe55091b2b8fac1433fc50fef9671530f206
|
4
|
+
data.tar.gz: 480006599cc1e0cf41dc81c939f708c23df47697
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7683d3c320d51fd44bc56e4071327a459b1484677c0c28221b156209a57a515d2a41198fc6f0e549aa4cda672e966c785f6de96df11cb2b5e2d8a081561bd25c
|
7
|
+
data.tar.gz: 805ac03ef39232f596cc8ce254d7d0cc7daace567f7bbb8ea7a1477077875f86f1705986381b05ae590d47eae3288055b45212ba471d27e719472895e2212cc4
|
data/Rakefile
CHANGED
@@ -14,7 +14,7 @@ require 'rake'
|
|
14
14
|
require 'jeweler'
|
15
15
|
Jeweler::Tasks.new do |gem|
|
16
16
|
gem.name = "chicagowarehouse"
|
17
|
-
gem.version = "0.6.
|
17
|
+
gem.version = "0.6.7"
|
18
18
|
gem.summary = "Ruby Data Warehousing"
|
19
19
|
gem.description = "Simple Data Warehouse toolkit for ruby"
|
20
20
|
gem.author = "Roland Swingler"
|
data/chicagowarehouse.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: chicagowarehouse 0.6.
|
5
|
+
# stub: chicagowarehouse 0.6.7 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "chicagowarehouse"
|
9
|
-
s.version = "0.6.
|
9
|
+
s.version = "0.6.7"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib"]
|
@@ -63,6 +63,7 @@ Gem::Specification.new do |s|
|
|
63
63
|
"spec/database/schema_generator_spec.rb",
|
64
64
|
"spec/db_connections.yml.dist",
|
65
65
|
"spec/query_spec.rb",
|
66
|
+
"spec/schema/column_parser_spec.rb",
|
66
67
|
"spec/schema/column_spec.rb",
|
67
68
|
"spec/schema/dimension_builder_spec.rb",
|
68
69
|
"spec/schema/dimension_reference_spec.rb",
|
@@ -93,8 +93,8 @@ module Chicago
|
|
93
93
|
end
|
94
94
|
|
95
95
|
def simple_column(elem)
|
96
|
-
table, col = parse_parts(elem)
|
97
|
-
QueryColumn.column(table, col, elem.to_sym)
|
96
|
+
table, col, table_qualifier = parse_parts(elem)
|
97
|
+
QueryColumn.column(table, col, elem.to_sym, table_qualifier)
|
98
98
|
end
|
99
99
|
|
100
100
|
def calculated_column(elem)
|
@@ -111,9 +111,10 @@ module Chicago
|
|
111
111
|
if col.kind_of?(Chicago::Schema::Dimension)
|
112
112
|
table = col
|
113
113
|
col = parts.empty? ? table : table[parts.first]
|
114
|
+
table_qualifier = table.label if table.roleplayed?
|
114
115
|
end
|
115
116
|
|
116
|
-
[table, col]
|
117
|
+
[table, col, table_qualifier]
|
117
118
|
end
|
118
119
|
|
119
120
|
def parse_table(str)
|
@@ -40,6 +40,14 @@ module Chicago
|
|
40
40
|
database_name.qualify(table)
|
41
41
|
end
|
42
42
|
|
43
|
+
# Returns true if this dimension reference is roleplayed -
|
44
|
+
# i.e. it has a different name from the underlying dimension so
|
45
|
+
# that, for example, multiple date dimensions can be assigned to
|
46
|
+
# the same fact table.
|
47
|
+
def roleplayed?
|
48
|
+
name != @dimension.name
|
49
|
+
end
|
50
|
+
|
43
51
|
# Returns the first null record id for this dimension, or 0 if
|
44
52
|
# the dimension has no null records defined.
|
45
53
|
def default_value
|
@@ -14,8 +14,9 @@ module Chicago
|
|
14
14
|
end
|
15
15
|
|
16
16
|
# @private
|
17
|
-
def initialize(column)
|
17
|
+
def initialize(column, table_label=nil)
|
18
18
|
@column = column
|
19
|
+
@table_label = table_label
|
19
20
|
end
|
20
21
|
|
21
22
|
# @private
|
@@ -23,21 +24,32 @@ module Chicago
|
|
23
24
|
@column.send(*args, &block)
|
24
25
|
end
|
25
26
|
|
27
|
+
# Returns the label for this column.
|
28
|
+
#
|
29
|
+
# The label is qualified by the table name if neccessary
|
30
|
+
# (i.e. if the column comes from a dimension which features
|
31
|
+
# multiple times in the same fact table).
|
32
|
+
def qualified_label
|
33
|
+
@table_label ? "#{label} (#{@table_label})" : label
|
34
|
+
end
|
35
|
+
|
26
36
|
# Factory method that returns a query column.
|
27
37
|
#
|
28
38
|
# @param owner the column owner, normally a fact or dimension
|
29
39
|
# @param column the wrapped column
|
30
40
|
# @param column_alias the reference to this column as used by
|
31
41
|
# the column parser.
|
32
|
-
|
42
|
+
# @param table_label a table name to distinguish this column
|
43
|
+
# from and identically named one. May be nil.
|
44
|
+
def self.column(owner, column, column_alias, table_label)
|
33
45
|
if column.kind_of?(Chicago::Schema::Dimension)
|
34
46
|
DimensionAsColumn.new(owner, column, column_alias)
|
35
47
|
elsif owner.kind_of?(Chicago::Schema::Dimension) && owner.identifiable? && owner.identifiers.include?(column.name)
|
36
48
|
DimensionIdentifierColumn.new(owner, column, column_alias)
|
37
49
|
elsif column.calculated?
|
38
|
-
VirtualColumn.new(owner, column, column_alias)
|
50
|
+
VirtualColumn.new(owner, column, column_alias, table_label)
|
39
51
|
else
|
40
|
-
QualifiedColumn.new(owner, column, column_alias)
|
52
|
+
QualifiedColumn.new(owner, column, column_alias, table_label)
|
41
53
|
end
|
42
54
|
end
|
43
55
|
|
@@ -48,8 +60,8 @@ module Chicago
|
|
48
60
|
|
49
61
|
# @abstract
|
50
62
|
class AbstractQualifiedColumn < QueryColumn
|
51
|
-
def initialize(owner, column, column_alias)
|
52
|
-
super column
|
63
|
+
def initialize(owner, column, column_alias, table_label=nil)
|
64
|
+
super column, table_label
|
53
65
|
@owner = owner
|
54
66
|
@column_alias = column_alias
|
55
67
|
end
|
@@ -85,7 +97,7 @@ module Chicago
|
|
85
97
|
end
|
86
98
|
|
87
99
|
class QualifiedColumn < AbstractQualifiedColumn
|
88
|
-
def initialize(owner, column, column_alias)
|
100
|
+
def initialize(owner, column, column_alias, table_label)
|
89
101
|
super
|
90
102
|
@select_name = @column.name.qualify(@owner.name)
|
91
103
|
@count_name = @select_name
|
@@ -100,8 +112,8 @@ module Chicago
|
|
100
112
|
# - filters will appear in the HAVING clause, not the WHERE clause
|
101
113
|
# of the SQL statement.
|
102
114
|
class VirtualColumn < QualifiedColumn
|
103
|
-
def initialize(owner, column, column_alias)
|
104
|
-
super
|
115
|
+
def initialize(owner, column, column_alias, table_label)
|
116
|
+
super
|
105
117
|
@select_name = @column.calculation
|
106
118
|
end
|
107
119
|
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Chicago::Schema::ColumnParser do
|
4
|
+
let(:schema) do
|
5
|
+
schema = Chicago::StarSchema.new
|
6
|
+
|
7
|
+
schema.define_dimension(:date) do
|
8
|
+
columns do
|
9
|
+
string :day
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
schema.define_dimension(:product) do
|
14
|
+
columns do
|
15
|
+
string :name
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
schema.define_fact(:sales) do
|
20
|
+
dimensions :product, :date.as(:order_date), :date.as(:refund_date)
|
21
|
+
end
|
22
|
+
|
23
|
+
schema
|
24
|
+
end
|
25
|
+
|
26
|
+
subject { described_class.new(schema) }
|
27
|
+
|
28
|
+
it "has a qualified label for roleplayed dimensions" do
|
29
|
+
column = subject.parse("sales.order_date.day").first
|
30
|
+
expect(column.label).to eql("Day")
|
31
|
+
expect(column.qualified_label).to eql("Day (Order Date)")
|
32
|
+
end
|
33
|
+
|
34
|
+
it "has a non-qualified label for non-roleplayed dimensions" do
|
35
|
+
column = subject.parse("sales.product.name").first
|
36
|
+
|
37
|
+
expect(column.qualified_label).to eql("Name")
|
38
|
+
end
|
39
|
+
end
|
@@ -98,6 +98,11 @@ describe Chicago::Schema::DimensionReference do
|
|
98
98
|
described_class.new(:foo, @dimension).default_value.should == 1
|
99
99
|
end
|
100
100
|
|
101
|
+
it "knows whether it is a roleplayed dimension or not" do
|
102
|
+
expect(described_class.new(:bar, @dimension)).to_not be_roleplayed
|
103
|
+
expect(described_class.new(:foo, @dimension)).to be_roleplayed
|
104
|
+
end
|
105
|
+
|
101
106
|
it "is visitable" do
|
102
107
|
visitor = double(:visitor)
|
103
108
|
column = described_class.new(:foo, @dimension)
|
@@ -5,7 +5,7 @@ describe Chicago::Schema::QueryColumn do
|
|
5
5
|
describe "a standard column" do
|
6
6
|
let(:owner) { double(:owner).as_null_object }
|
7
7
|
let(:column) { double(:column, :calculated? => false).as_null_object }
|
8
|
-
subject { described_class.column(owner, column, "foo.bar") }
|
8
|
+
subject { described_class.column(owner, column, "foo.bar", nil) }
|
9
9
|
|
10
10
|
it "should have a column alias" do
|
11
11
|
subject.column_alias.should == "foo.bar"
|
@@ -41,7 +41,7 @@ describe Chicago::Schema::QueryColumn do
|
|
41
41
|
let(:calculation) { double(:calculation).as_null_object }
|
42
42
|
let(:owner) { double(:owner).as_null_object }
|
43
43
|
let(:column) { double(:column, :calculated? => true, :calculation => calculation).as_null_object }
|
44
|
-
subject { described_class.column(owner, column, "foo.bar") }
|
44
|
+
subject { described_class.column(owner, column, "foo.bar", nil) }
|
45
45
|
|
46
46
|
it "should have a column alias" do
|
47
47
|
subject.column_alias.should == "foo.bar"
|
@@ -70,7 +70,7 @@ describe Chicago::Schema::QueryColumn do
|
|
70
70
|
describe "a dimension column" do
|
71
71
|
let(:owner) { double(:owner).as_null_object }
|
72
72
|
let(:column) { double(:column).as_null_object }
|
73
|
-
subject { described_class.column(owner, column, "foo.bar") }
|
73
|
+
subject { described_class.column(owner, column, "foo.bar", nil) }
|
74
74
|
|
75
75
|
before :each do
|
76
76
|
column.stub(:main_identifier).and_return(:name)
|
@@ -110,7 +110,7 @@ describe Chicago::Schema::QueryColumn do
|
|
110
110
|
describe "a dimension identifier column" do
|
111
111
|
let(:owner) { double(:owner).as_null_object }
|
112
112
|
let(:column) { double(:column).as_null_object }
|
113
|
-
subject { described_class.column(owner, column, "foo.bar") }
|
113
|
+
subject { described_class.column(owner, column, "foo.bar", nil) }
|
114
114
|
|
115
115
|
before :each do
|
116
116
|
column.stub(:name).and_return(:bar)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chicagowarehouse
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Roland Swingler
|
@@ -216,6 +216,7 @@ files:
|
|
216
216
|
- spec/database/schema_generator_spec.rb
|
217
217
|
- spec/db_connections.yml.dist
|
218
218
|
- spec/query_spec.rb
|
219
|
+
- spec/schema/column_parser_spec.rb
|
219
220
|
- spec/schema/column_spec.rb
|
220
221
|
- spec/schema/dimension_builder_spec.rb
|
221
222
|
- spec/schema/dimension_reference_spec.rb
|