cube 1.3.0 → 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  Cube
2
2
  ================
3
3
 
4
- Use this gem talk to the OLAP based backend via XMLA SOAP messages from Ruby.
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 = "GOSJAR"
22
- c.endpoint = "http://localhost:8282/icCube/xmla"
21
+ c.catalog = "OUTAGE"
22
+ c.endpoint = "http://localhost:8383/mondrian/xmla"
23
23
  end
24
24
  ```
25
25
 
26
- Queriying the OLAP
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 [GOSJAR]"
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
- result = XMLA::Cube.execute_scalar <<-MDX
40
+ average_mtbf = XMLA::Cube.execute_scalar <<-MDX
40
41
  SELECT {Hierarchize({[Measures].[MTBF]})} ON COLUMNS
41
- FROM [Outage]
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.0
1
+ 1.3.1
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "cube"
8
- s.version = "1.3.0"
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-02-18"
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",
@@ -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) { |result, j| result << ( y_axe[j] + (0...x_size).map { |i| "#{cell_data[i + j]}" }) }
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 = @response.to_hash[:execute_response][:return][:root][:axes][:axis].select { |axe| axe[:@name] != "SlicerAxis" }
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
- y << ( data.class == Hash || data.size == 1 ?
56
- [data[:caption].strip].flatten :
57
- data.select { |item_data| item_data.class == Hash }.reduce([]) { |z,item_data| z << item_data[:caption].strip } )
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 { |item,i| (i == number_of_colums) ? item : ((item == above_row[i]) ? '' : item ) }
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
- def tuple(axe)
102
- axe[:tuples].nil? ? [] : axe[:tuples][:tuple]
103
- end
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
- "<Command> <Statement> <![CDATA[ #{query} ]]> </Statement> </Command> <Properties> <PropertyList> <Catalog>#{catalog}</Catalog>
107
- <Format>Multidimensional</Format> <AxisFormat>TupleFormat</AxisFormat> </PropertyList> </Properties>"
108
- end
109
-
110
- end
111
-
112
- class OlapResult
113
- attr_reader :header, :rows
114
- def initialize(table)
115
- @header = table[0]
116
- table.delete_at(0)
117
- @rows = table
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
 
@@ -0,0 +1,8 @@
1
+ class OlapResult
2
+ attr_reader :header, :rows
3
+ def initialize(table)
4
+ @header = table[0]
5
+ table.delete_at(0)
6
+ @rows = table
7
+ end
8
+ end
@@ -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> <Statement> <![CDATA[ SELECT ]]> </Statement> </Command> <Properties> <PropertyList> <Catalog>GOSJAR</Catalog>
51
- <Format>Multidimensional</Format> <AxisFormat>TupleFormat</AxisFormat> </PropertyList> </Properties>"
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.0
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-02-18 00:00:00.000000000Z
12
+ date: 2012-04-20 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: savon
16
- requirement: &70281986966140 !ruby/object:Gem::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: *70281986966140
24
+ version_requirements: *70250315041580
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: webmock
27
- requirement: &70281987002860 !ruby/object:Gem::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: *70281987002860
35
+ version_requirements: *70250315040320
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: guerrilla_patch
38
- requirement: &70281987005480 !ruby/object:Gem::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: *70281987005480
46
+ version_requirements: *70250315038780
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: vcr
49
- requirement: &70281987007640 !ruby/object:Gem::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: *70281987007640
57
+ version_requirements: *70250315037120
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rspec
60
- requirement: &70281987010760 !ruby/object:Gem::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: *70281987010760
68
+ version_requirements: *70250315035820
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: bundler
71
- requirement: &70281987013780 !ruby/object:Gem::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: *70281987013780
79
+ version_requirements: *70250315033480
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: jeweler
82
- requirement: &70281987015800 !ruby/object:Gem::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: *70281987015800
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: 3603504358049639102
140
+ hash: -3248801804127972152
140
141
  required_rubygems_version: !ruby/object:Gem::Requirement
141
142
  none: false
142
143
  requirements: