cube 1.3.0 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +8 -8
- data/VERSION +1 -1
- data/cube.gemspec +3 -2
- data/lib/cube/cube.rb +37 -27
- data/lib/cube/olap_result.rb +8 -0
- data/spec/cube_spec.rb +3 -3
- metadata +18 -17
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Cube
|
2
2
|
================
|
3
3
|
|
4
|
-
|
4
|
+
Talk to the OLAP based backend via XMLA SOAP messages from Ruby.
|
5
5
|
You can send (simple) MDX queries and get the result back in a human friendly from.
|
6
6
|
|
7
7
|
Installation
|
@@ -18,31 +18,31 @@ Set up your catalog and endpoint
|
|
18
18
|
|
19
19
|
```
|
20
20
|
XMLA.configure do |c|
|
21
|
-
c.catalog = "
|
22
|
-
c.endpoint = "http://localhost:
|
21
|
+
c.catalog = "OUTAGE"
|
22
|
+
c.endpoint = "http://localhost:8383/mondrian/xmla"
|
23
23
|
end
|
24
24
|
```
|
25
25
|
|
26
|
-
|
26
|
+
Querying the OLAP
|
27
27
|
-------
|
28
28
|
```
|
29
29
|
table = XMLA::Cube.execute <<-MDX
|
30
30
|
SELECT [Location].[City].children on COLUMNS,
|
31
31
|
[Measures].[Count] on ROWS
|
32
|
-
FROM [
|
32
|
+
FROM [OUTAGE]"
|
33
33
|
MDX
|
34
34
|
```
|
35
|
+
Table has two attributes: header and rows.
|
35
36
|
|
36
37
|
Scalar results
|
37
38
|
-----------
|
38
39
|
```
|
39
|
-
|
40
|
+
average_mtbf = XMLA::Cube.execute_scalar <<-MDX
|
40
41
|
SELECT {Hierarchize({[Measures].[MTBF]})} ON COLUMNS
|
41
|
-
FROM [
|
42
|
+
FROM [OUTAGE]
|
42
43
|
WHERE [Country].[Croatia]
|
43
44
|
MDX
|
44
45
|
```
|
45
|
-
This returns decimal value.
|
46
46
|
|
47
47
|
Limitations
|
48
48
|
------------
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.3.
|
1
|
+
1.3.1
|
data/cube.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "cube"
|
8
|
-
s.version = "1.3.
|
8
|
+
s.version = "1.3.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["drKreso"]
|
12
|
-
s.date = "2012-
|
12
|
+
s.date = "2012-04-20"
|
13
13
|
s.description = "Eases the pain I had to go through to get to the data out of XMLA based OLAP provider"
|
14
14
|
s.email = "kresimir.bojcic@gmail.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -28,6 +28,7 @@ Gem::Specification.new do |s|
|
|
28
28
|
"cube.gemspec",
|
29
29
|
"lib/cube.rb",
|
30
30
|
"lib/cube/cube.rb",
|
31
|
+
"lib/cube/olap_result.rb",
|
31
32
|
"lib/cube/xmla.rb",
|
32
33
|
"lib/wsdl/xmla.xml",
|
33
34
|
"spec/cassettes/.yml",
|
data/lib/cube/cube.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'savon'
|
2
2
|
require 'guerrilla_patch'
|
3
3
|
require 'bigdecimal'
|
4
|
+
require_relative 'olap_result'
|
4
5
|
|
5
6
|
Savon.configure do |config|
|
6
7
|
config.soap_version = 1
|
@@ -29,17 +30,14 @@ module XMLA
|
|
29
30
|
|
30
31
|
private
|
31
32
|
|
32
|
-
let(:x_axe) { @x_axe ||= axes[0] }
|
33
|
-
let(:y_axe) { @y_axe ||= axes[1] }
|
34
|
-
let(:y_size) { (y_axe.nil? || y_axe[0].nil?) ? 0 : y_axe[0].size }
|
35
|
-
let(:x_size) { x_axe.size }
|
36
|
-
|
37
33
|
#header and rows
|
38
34
|
def table
|
39
35
|
if (header.size == 1 && y_size == 0)
|
40
36
|
cell_data[0]
|
41
37
|
else
|
42
|
-
(0...y_axe.size).reduce(header)
|
38
|
+
(0...y_axe.size).reduce(header) do |result, j|
|
39
|
+
result << ( y_axe[j] + (0...x_size).map { |i| "#{cell_data[i + j]}" })
|
40
|
+
end
|
43
41
|
end
|
44
42
|
end
|
45
43
|
|
@@ -48,13 +46,17 @@ module XMLA
|
|
48
46
|
end
|
49
47
|
|
50
48
|
def axes
|
51
|
-
axes =
|
49
|
+
axes = all_axes.select { |axe| axe[:@name] != "SlicerAxis" }
|
52
50
|
@axes ||= axes.reduce([]) do |result, axe|
|
53
51
|
result << tuple(axe).reduce([]) { |y, member|
|
54
52
|
data = (member[0] == :member) ? member[1] : member[:member]
|
55
|
-
|
56
|
-
|
57
|
-
|
53
|
+
if ( data.class == Hash || data.size == 1 )
|
54
|
+
y << [data[:caption].strip].flatten
|
55
|
+
else
|
56
|
+
y << data.select { |item_data| item_data.class == Hash }.reduce([]) do |z,item_data|
|
57
|
+
z << item_data[:caption].strip
|
58
|
+
end
|
59
|
+
end
|
58
60
|
}
|
59
61
|
end
|
60
62
|
end
|
@@ -82,7 +84,13 @@ module XMLA
|
|
82
84
|
above_row = []
|
83
85
|
#filter if they are not last column, and they are same as the item on the row above
|
84
86
|
table.reduce([]) { |result, row|
|
85
|
-
result << row.each_with_index.map
|
87
|
+
result << row.each_with_index.map do |item,i|
|
88
|
+
if i == number_of_colums
|
89
|
+
item
|
90
|
+
else
|
91
|
+
item == above_row[i] ? '' : item
|
92
|
+
end
|
93
|
+
end
|
86
94
|
above_row = row
|
87
95
|
result
|
88
96
|
}
|
@@ -98,26 +106,28 @@ module XMLA
|
|
98
106
|
end
|
99
107
|
end
|
100
108
|
|
101
|
-
|
102
|
-
|
103
|
-
|
109
|
+
let(:tuple) { |axe| axe[:tuples].nil? ? [] : axe[:tuples][:tuple] }
|
110
|
+
let(:all_axes) { @response.to_hash[:execute_response][:return][:root][:axes][:axis] }
|
111
|
+
let(:x_axe) { @x_axe ||= axes[0] }
|
112
|
+
let(:y_axe) { @y_axe ||= axes[1] }
|
113
|
+
let(:y_size) { (y_axe.nil? || y_axe[0].nil?) ? 0 : y_axe[0].size }
|
114
|
+
let(:x_size) { x_axe.size }
|
104
115
|
|
105
116
|
def Cube.request_body(query, catalog)
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
117
|
+
<<-REQUEST
|
118
|
+
<Command>
|
119
|
+
<Statement> <![CDATA[ #{query} ]]> </Statement>
|
120
|
+
</Command>
|
121
|
+
<Properties>
|
122
|
+
<PropertyList>
|
123
|
+
<Catalog>#{catalog}</Catalog>
|
124
|
+
<Format>Multidimensional</Format>
|
125
|
+
<AxisFormat>TupleFormat</AxisFormat>
|
126
|
+
</PropertyList>
|
127
|
+
</Properties>
|
128
|
+
REQUEST
|
118
129
|
end
|
119
130
|
end
|
120
|
-
|
121
131
|
end
|
122
132
|
|
123
133
|
|
data/spec/cube_spec.rb
CHANGED
@@ -46,9 +46,9 @@ describe XMLA::Cube do
|
|
46
46
|
end
|
47
47
|
|
48
48
|
it 'check if request is correct - to fix that bug with class varables not beign visible inside the block' do
|
49
|
-
XMLA::Cube.send(:request_body, "SELECT", "GOSJAR").should ==
|
50
|
-
"<Command
|
51
|
-
|
49
|
+
XMLA::Cube.send(:request_body, "SELECT", "GOSJAR").gsub("\n","").gsub(" ", "").should ==
|
50
|
+
"<Command><Statement><![CDATA[SELECT]]></Statement></Command><Properties><PropertyList><Catalog>GOSJAR</Catalog>
|
51
|
+
<Format>Multidimensional</Format><AxisFormat>TupleFormat</AxisFormat></PropertyList></Properties>".gsub("\n","").gsub(" ","")
|
52
52
|
end
|
53
53
|
|
54
54
|
def configure_mondrian
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cube
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-04-20 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: savon
|
16
|
-
requirement: &
|
16
|
+
requirement: &70250315041580 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70250315041580
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: webmock
|
27
|
-
requirement: &
|
27
|
+
requirement: &70250315040320 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70250315040320
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: guerrilla_patch
|
38
|
-
requirement: &
|
38
|
+
requirement: &70250315038780 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70250315038780
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: vcr
|
49
|
-
requirement: &
|
49
|
+
requirement: &70250315037120 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70250315037120
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: rspec
|
60
|
-
requirement: &
|
60
|
+
requirement: &70250315035820 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ~>
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: 2.3.0
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70250315035820
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: bundler
|
71
|
-
requirement: &
|
71
|
+
requirement: &70250315033480 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ~>
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: 1.0.0
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70250315033480
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: jeweler
|
82
|
-
requirement: &
|
82
|
+
requirement: &70250315032380 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ~>
|
@@ -87,7 +87,7 @@ dependencies:
|
|
87
87
|
version: 1.6.4
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *70250315032380
|
91
91
|
description: Eases the pain I had to go through to get to the data out of XMLA based
|
92
92
|
OLAP provider
|
93
93
|
email: kresimir.bojcic@gmail.com
|
@@ -108,6 +108,7 @@ files:
|
|
108
108
|
- cube.gemspec
|
109
109
|
- lib/cube.rb
|
110
110
|
- lib/cube/cube.rb
|
111
|
+
- lib/cube/olap_result.rb
|
111
112
|
- lib/cube/xmla.rb
|
112
113
|
- lib/wsdl/xmla.xml
|
113
114
|
- spec/cassettes/.yml
|
@@ -136,7 +137,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
136
137
|
version: '0'
|
137
138
|
segments:
|
138
139
|
- 0
|
139
|
-
hash:
|
140
|
+
hash: -3248801804127972152
|
140
141
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
141
142
|
none: false
|
142
143
|
requirements:
|