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 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: