cube 1.1.0 → 1.2.0

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
@@ -18,17 +18,19 @@ Set up your catalog and endpoint
18
18
 
19
19
  ```
20
20
  XMLA.configure do |c|
21
- c.endpoint = "http://localhost:8282/icCube/xmla"
22
21
  c.catalog = "GOSJAR"
22
+ c.endpoint = "http://localhost:8282/icCube/xmla"
23
23
  end
24
24
  ```
25
25
 
26
26
  Usage
27
27
  -------
28
28
  ```
29
- table = XMLA::Cube.execute "select [Location].[City].children on COLUMNS,
30
- [Measures].[Count] on ROWS
31
- from [GOSJAR]"
29
+ table = XMLA::Cube.execute <<-MDX
30
+ SELECT [Location].[City].children on COLUMNS,
31
+ [Measures].[Count] on ROWS
32
+ FROM [GOSJAR]"
33
+ MDX
32
34
  ```
33
35
 
34
36
  Limitations
data/Rakefile CHANGED
@@ -18,7 +18,7 @@ Jeweler::Tasks.new do |gem|
18
18
  gem.homepage = "http://github.com/drkreso/cube"
19
19
  gem.license = "MIT"
20
20
  gem.summary = %Q{Get's the data from OLAP cube via XMLA}
21
- gem.description = %Q{Eases the pain I had to go through to get to the data of Xmla based OLAP provider}
21
+ gem.description = %Q{Eases the pain I had to go through to get to the data out of XMLA based OLAP provider}
22
22
  gem.email = "kresimir.bojcic@gmail.com"
23
23
  gem.authors = ["drKreso"]
24
24
  # dependencies defined in Gemfile
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.1.0
1
+ 1.2.0
data/cube.gemspec CHANGED
@@ -5,12 +5,12 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "cube"
8
- s.version = "1.1.0"
8
+ s.version = "1.2.0"
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-12"
13
- s.description = "Eases the pain I had to go through to get to the data of Xmla based OLAP provider"
12
+ s.date = "2012-02-15"
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 = [
16
16
  "LICENSE.txt",
@@ -34,6 +34,8 @@ Gem::Specification.new do |s|
34
34
  "spec/cassettes/kvartovi_u_recima.yml",
35
35
  "spec/cassettes/kvatovi_u_koloni.yml",
36
36
  "spec/cassettes/mondrian_broj_intervencija.yml",
37
+ "spec/cassettes/mondrian_jedan_red_odgovor.yml",
38
+ "spec/cassettes/mondrian_nula_redaka.yml",
37
39
  "spec/cassettes/razlog_prijave_i_kvart.yml",
38
40
  "spec/cube_spec.rb",
39
41
  "spec/spec_helper.rb"
data/lib/cube/cube.rb CHANGED
@@ -23,7 +23,7 @@ module XMLA
23
23
 
24
24
  let(:x_axe) { @x_axe ||= axes[0] }
25
25
  let(:y_axe) { @y_axe ||= axes[1] }
26
- let(:y_size) { y_axe[0].size }
26
+ let(:y_size) { y_axe[0].nil? ? 0 : y_axe[0].size }
27
27
  let(:x_size) { x_axe.size }
28
28
 
29
29
  private
@@ -80,10 +80,16 @@ module XMLA
80
80
 
81
81
  def cell_data
82
82
  cell_data = @response.to_hash[:execute_response][:return][:root][:cell_data]
83
- @data ||= cell_data.reduce([]) { |data, cell| cell[1].reduce(data) { |data, value| data << value[:value] } }
83
+ @data ||= cell_data.reduce([]) do |data, cell|
84
+ cell[1].reduce(data) do |data, value|
85
+ data << (value.class == Hash ? value[:value] : value[1] )
86
+ end
87
+ end
84
88
  end
85
89
 
86
- let(:tuple) { |axe| axe[:tuples][:tuple] }
90
+ def tuple(axe)
91
+ axe[:tuples].nil? ? [] : axe[:tuples][:tuple]
92
+ end
87
93
 
88
94
  def Cube.request_body(query, catalog)
89
95
  "<Command> <Statement> <![CDATA[ #{query} ]]> </Statement> </Command> <Properties> <PropertyList> <Catalog>#{catalog}</Catalog>
@@ -0,0 +1,171 @@
1
+ ---
2
+ - !ruby/struct:VCR::HTTPInteraction
3
+ request: !ruby/struct:VCR::Request
4
+ method: :post
5
+ uri: http://localhost:8383/mondrian/xmla
6
+ body: ! "<?xml version=\"1.0\" encoding=\"UTF-8\"?><env:Envelope xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"
7
+ xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:wsdl=\"http://tempuri.org/wsdl/\"
8
+ xmlns:env=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ins0=\"http://tempuri.org/type\"><env:Body><Execute
9
+ xmlns=\"urn:schemas-microsoft-com:xml-analysis\"><Command> <Statement> <![CDATA[
10
+ \ SELECT NON EMPTY {Hierarchize({[Measures].[Broj intervencija]})} ON
11
+ COLUMNS,\n non empty ( { Filter (Hierarchize({[Razlog prijave].children}),
12
+ [Measures].[Broj intervencija] >= 7000 )}) ON ROWS\n FROM [Kvarovi]\n
13
+ ]]> </Statement> </Command> <Properties> <PropertyList> <Catalog>GOSJAR</Catalog>\n
14
+ \ <Format>Multidimensional</Format> <AxisFormat>TupleFormat</AxisFormat>
15
+ </PropertyList> </Properties></Execute></env:Body></env:Envelope>"
16
+ headers:
17
+ soapaction:
18
+ - ! '"urn:schemas-microsoft-com:xml-analysis:Execute"'
19
+ content-type:
20
+ - text/xml;charset=UTF-8
21
+ content-length:
22
+ - '839'
23
+ response: !ruby/struct:VCR::Response
24
+ status: !ruby/struct:VCR::ResponseStatus
25
+ code: 200
26
+ message: OK
27
+ headers:
28
+ server:
29
+ - Apache-Coyote/1.1
30
+ content-type:
31
+ - text/xml;charset=UTF-8
32
+ transfer-encoding:
33
+ - chunked
34
+ date:
35
+ - Wed, 15 Feb 2012 20:37:46 GMT
36
+ body: ! "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\"
37
+ SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" >\n<SOAP-ENV:Header>\n</SOAP-ENV:Header>\n<SOAP-ENV:Body>\n<cxmla:ExecuteResponse
38
+ xmlns:cxmla=\"urn:schemas-microsoft-com:xml-analysis\">\n <cxmla:return>\n
39
+ \ <root xmlns=\"urn:schemas-microsoft-com:xml-analysis:mddataset\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
40
+ xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:EX=\"urn:schemas-microsoft-com:xml-analysis:exception\">\n
41
+ \ <xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" targetNamespace=\"urn:schemas-microsoft-com:xml-analysis:mddataset\"
42
+ xmlns=\"urn:schemas-microsoft-com:xml-analysis:mddataset\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
43
+ xmlns:sql=\"urn:schemas-microsoft-com:xml-sql\" elementFormDefault=\"qualified\">\n
44
+ \ <xsd:complexType name=\"MemberType\">\n <xsd:sequence>\n <xsd:element
45
+ name=\"UName\" type=\"xsd:string\"/>\n <xsd:element name=\"Caption\"
46
+ type=\"xsd:string\"/>\n <xsd:element name=\"LName\" type=\"xsd:string\"/>\n
47
+ \ <xsd:element name=\"LNum\" type=\"xsd:unsignedInt\"/>\n <xsd:element
48
+ name=\"DisplayInfo\" type=\"xsd:unsignedInt\"/>\n <xsd:sequence maxOccurs=\"unbounded\"
49
+ minOccurs=\"0\">\n <xsd:any processContents=\"lax\" maxOccurs=\"unbounded\"/>\n
50
+ \ </xsd:sequence>\n </xsd:sequence>\n <xsd:attribute
51
+ name=\"Hierarchy\" type=\"xsd:string\"/>\n </xsd:complexType>\n <xsd:complexType
52
+ name=\"PropType\">\n <xsd:attribute name=\"name\" type=\"xsd:string\"/>\n
53
+ \ </xsd:complexType>\n <xsd:complexType name=\"TupleType\">\n <xsd:sequence
54
+ maxOccurs=\"unbounded\">\n <xsd:element name=\"Member\" type=\"MemberType\"/>\n
55
+ \ </xsd:sequence>\n </xsd:complexType>\n <xsd:complexType
56
+ name=\"MembersType\">\n <xsd:sequence maxOccurs=\"unbounded\">\n <xsd:element
57
+ name=\"Member\" type=\"MemberType\"/>\n </xsd:sequence>\n <xsd:attribute
58
+ name=\"Hierarchy\" type=\"xsd:string\"/>\n </xsd:complexType>\n <xsd:complexType
59
+ name=\"TuplesType\">\n <xsd:sequence maxOccurs=\"unbounded\">\n <xsd:element
60
+ name=\"Tuple\" type=\"TupleType\"/>\n </xsd:sequence>\n </xsd:complexType>\n
61
+ \ <xsd:complexType name=\"CrossProductType\">\n <xsd:sequence>\n
62
+ \ <xsd:choice minOccurs=\"0\" maxOccurs=\"unbounded\">\n <xsd:element
63
+ name=\"Members\" type=\"MembersType\"/>\n <xsd:element name=\"Tuples\"
64
+ type=\"TuplesType\"/>\n </xsd:choice>\n </xsd:sequence>\n
65
+ \ <xsd:attribute name=\"Size\" type=\"xsd:unsignedInt\"/>\n </xsd:complexType>\n
66
+ \ <xsd:complexType name=\"OlapInfo\">\n <xsd:sequence>\n <xsd:element
67
+ name=\"CubeInfo\">\n <xsd:complexType>\n <xsd:sequence>\n
68
+ \ <xsd:element name=\"Cube\" maxOccurs=\"unbounded\">\n <xsd:complexType>\n
69
+ \ <xsd:sequence>\n <xsd:element name=\"CubeName\"
70
+ type=\"xsd:string\"/>\n </xsd:sequence>\n </xsd:complexType>\n
71
+ \ </xsd:element>\n </xsd:sequence>\n </xsd:complexType>\n
72
+ \ </xsd:element>\n <xsd:element name=\"AxesInfo\">\n <xsd:complexType>\n
73
+ \ <xsd:sequence>\n <xsd:element name=\"AxisInfo\"
74
+ maxOccurs=\"unbounded\">\n <xsd:complexType>\n <xsd:sequence>\n
75
+ \ <xsd:element name=\"HierarchyInfo\" minOccurs=\"0\"
76
+ maxOccurs=\"unbounded\">\n <xsd:complexType>\n <xsd:sequence>\n
77
+ \ <xsd:sequence maxOccurs=\"unbounded\">\n <xsd:element
78
+ name=\"UName\" type=\"PropType\"/>\n <xsd:element
79
+ name=\"Caption\" type=\"PropType\"/>\n <xsd:element
80
+ name=\"LName\" type=\"PropType\"/>\n <xsd:element
81
+ name=\"LNum\" type=\"PropType\"/>\n <xsd:element
82
+ name=\"DisplayInfo\" type=\"PropType\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\n
83
+ \ </xsd:sequence>\n <xsd:sequence>\n
84
+ \ <xsd:any processContents=\"lax\" minOccurs=\"0\"
85
+ maxOccurs=\"unbounded\"/>\n </xsd:sequence>\n </xsd:sequence>\n
86
+ \ <xsd:attribute name=\"name\" type=\"xsd:string\"
87
+ use=\"required\"/>\n </xsd:complexType>\n </xsd:element>\n
88
+ \ </xsd:sequence>\n <xsd:attribute
89
+ name=\"name\" type=\"xsd:string\"/>\n </xsd:complexType>\n
90
+ \ </xsd:element>\n </xsd:sequence>\n </xsd:complexType>\n
91
+ \ </xsd:element>\n <xsd:element name=\"CellInfo\">\n <xsd:complexType>\n
92
+ \ <xsd:sequence>\n <xsd:sequence minOccurs=\"0\"
93
+ maxOccurs=\"unbounded\">\n <xsd:choice>\n <xsd:element
94
+ name=\"Value\" type=\"PropType\"/>\n <xsd:element name=\"FmtValue\"
95
+ type=\"PropType\"/>\n <xsd:element name=\"BackColor\" type=\"PropType\"/>\n
96
+ \ <xsd:element name=\"ForeColor\" type=\"PropType\"/>\n
97
+ \ <xsd:element name=\"FontName\" type=\"PropType\"/>\n <xsd:element
98
+ name=\"FontSize\" type=\"PropType\"/>\n <xsd:element name=\"FontFlags\"
99
+ type=\"PropType\"/>\n <xsd:element name=\"FormatString\"
100
+ type=\"PropType\"/>\n <xsd:element name=\"NonEmptyBehavior\"
101
+ type=\"PropType\"/>\n <xsd:element name=\"SolveOrder\"
102
+ type=\"PropType\"/>\n <xsd:element name=\"Updateable\"
103
+ type=\"PropType\"/>\n <xsd:element name=\"Visible\" type=\"PropType\"/>\n
104
+ \ <xsd:element name=\"Expression\" type=\"PropType\"/>\n
105
+ \ </xsd:choice>\n </xsd:sequence>\n <xsd:sequence
106
+ maxOccurs=\"unbounded\" minOccurs=\"0\">\n <xsd:any processContents=\"lax\"
107
+ maxOccurs=\"unbounded\"/>\n </xsd:sequence>\n </xsd:sequence>\n
108
+ \ </xsd:complexType>\n </xsd:element>\n </xsd:sequence>\n
109
+ \ </xsd:complexType>\n <xsd:complexType name=\"Axes\">\n <xsd:sequence
110
+ maxOccurs=\"unbounded\">\n <xsd:element name=\"Axis\">\n <xsd:complexType>\n
111
+ \ <xsd:choice minOccurs=\"0\" maxOccurs=\"unbounded\">\n <xsd:element
112
+ name=\"CrossProduct\" type=\"CrossProductType\"/>\n <xsd:element
113
+ name=\"Tuples\" type=\"TuplesType\"/>\n <xsd:element name=\"Members\"
114
+ type=\"MembersType\"/>\n </xsd:choice>\n <xsd:attribute
115
+ name=\"name\" type=\"xsd:string\"/>\n </xsd:complexType>\n </xsd:element>\n
116
+ \ </xsd:sequence>\n </xsd:complexType>\n <xsd:complexType
117
+ name=\"CellData\">\n <xsd:sequence>\n <xsd:element name=\"Cell\"
118
+ minOccurs=\"0\" maxOccurs=\"unbounded\">\n <xsd:complexType>\n
119
+ \ <xsd:sequence maxOccurs=\"unbounded\">\n <xsd:choice>\n
120
+ \ <xsd:element name=\"Value\"/>\n <xsd:element
121
+ name=\"FmtValue\" type=\"xsd:string\"/>\n <xsd:element name=\"BackColor\"
122
+ type=\"xsd:unsignedInt\"/>\n <xsd:element name=\"ForeColor\"
123
+ type=\"xsd:unsignedInt\"/>\n <xsd:element name=\"FontName\"
124
+ type=\"xsd:string\"/>\n <xsd:element name=\"FontSize\" type=\"xsd:unsignedShort\"/>\n
125
+ \ <xsd:element name=\"FontFlags\" type=\"xsd:unsignedInt\"/>\n
126
+ \ <xsd:element name=\"FormatString\" type=\"xsd:string\"/>\n
127
+ \ <xsd:element name=\"NonEmptyBehavior\" type=\"xsd:unsignedShort\"/>\n
128
+ \ <xsd:element name=\"SolveOrder\" type=\"xsd:unsignedInt\"/>\n
129
+ \ <xsd:element name=\"Updateable\" type=\"xsd:unsignedInt\"/>\n
130
+ \ <xsd:element name=\"Visible\" type=\"xsd:unsignedInt\"/>\n
131
+ \ <xsd:element name=\"Expression\" type=\"xsd:string\"/>\n
132
+ \ </xsd:choice>\n </xsd:sequence>\n <xsd:attribute
133
+ name=\"CellOrdinal\" type=\"xsd:unsignedInt\" use=\"required\"/>\n </xsd:complexType>\n
134
+ \ </xsd:element>\n </xsd:sequence>\n </xsd:complexType>\n
135
+ \ <xsd:element name=\"root\">\n <xsd:complexType>\n <xsd:sequence
136
+ maxOccurs=\"unbounded\">\n <xsd:element name=\"OlapInfo\" type=\"OlapInfo\"/>\n
137
+ \ <xsd:element name=\"Axes\" type=\"Axes\"/>\n <xsd:element
138
+ name=\"CellData\" type=\"CellData\"/>\n </xsd:sequence>\n </xsd:complexType>\n
139
+ \ </xsd:element>\n </xsd:schema>\n <OlapInfo>\n <CubeInfo>\n
140
+ \ <Cube>\n <CubeName>Kvarovi</CubeName>\n </Cube>\n
141
+ \ </CubeInfo>\n <AxesInfo>\n <AxisInfo name=\"Axis0\">\n
142
+ \ <HierarchyInfo name=\"Measures\">\n <UName name=\"[Measures].[MEMBER_UNIQUE_NAME]\"/>\n
143
+ \ <Caption name=\"[Measures].[MEMBER_CAPTION]\"/>\n <LName
144
+ name=\"[Measures].[LEVEL_UNIQUE_NAME]\"/>\n <LNum name=\"[Measures].[LEVEL_NUMBER]\"/>\n
145
+ \ <DisplayInfo name=\"[Measures].[DISPLAY_INFO]\"/>\n </HierarchyInfo>\n
146
+ \ </AxisInfo>\n <AxisInfo name=\"Axis1\">\n <HierarchyInfo
147
+ name=\"Razlog prijave.Razlog prijave\">\n <UName name=\"[Razlog
148
+ prijave].[MEMBER_UNIQUE_NAME]\"/>\n <Caption name=\"[Razlog prijave].[MEMBER_CAPTION]\"/>\n
149
+ \ <LName name=\"[Razlog prijave].[LEVEL_UNIQUE_NAME]\"/>\n <LNum
150
+ name=\"[Razlog prijave].[LEVEL_NUMBER]\"/>\n <DisplayInfo name=\"[Razlog
151
+ prijave].[DISPLAY_INFO]\"/>\n </HierarchyInfo>\n </AxisInfo>\n
152
+ \ <AxisInfo name=\"SlicerAxis\"/>\n </AxesInfo>\n <CellInfo>\n
153
+ \ <Value name=\"VALUE\"/>\n <FmtValue name=\"FORMATTED_VALUE\"/>\n
154
+ \ <FormatString name=\"FORMAT_STRING\"/>\n </CellInfo>\n </OlapInfo>\n
155
+ \ <Axes>\n <Axis name=\"Axis0\">\n <Tuples>\n <Tuple>\n
156
+ \ <Member Hierarchy=\"Measures\">\n <UName>[Measures].[Broj
157
+ intervencija]</UName>\n <Caption>Broj intervencija</Caption>\n
158
+ \ <LName>[Measures].[MeasuresLevel]</LName>\n <LNum>0</LNum>\n
159
+ \ <DisplayInfo>0</DisplayInfo>\n </Member>\n </Tuple>\n
160
+ \ </Tuples>\n </Axis>\n <Axis name=\"Axis1\">\n <Tuples>\n
161
+ \ <Tuple>\n <Member Hierarchy=\"Razlog prijave.Razlog
162
+ prijave\">\n <UName>[Razlog prijave].[Ne radi svjetiljka]</UName>\n
163
+ \ <Caption>Ne radi svjetiljka</Caption>\n <LName>[Razlog
164
+ prijave].[Razlog prijave]</LName>\n <LNum>1</LNum>\n <DisplayInfo>0</DisplayInfo>\n
165
+ \ </Member>\n </Tuple>\n </Tuples>\n </Axis>\n
166
+ \ <Axis name=\"SlicerAxis\">\n <Tuples>\n <Tuple/>\n
167
+ \ </Tuples>\n </Axis>\n </Axes>\n <CellData>\n <Cell
168
+ CellOrdinal=\"0\">\n <Value xsi:type=\"xsd:int\">14442</Value>\n <FmtValue>14,442</FmtValue>\n
169
+ \ <FormatString/>\n </Cell>\n </CellData>\n </root>\n
170
+ \ </cxmla:return>\n</cxmla:ExecuteResponse>\n</SOAP-ENV:Body>\n</SOAP-ENV:Envelope>\n"
171
+ http_version: '1.1'
@@ -0,0 +1,159 @@
1
+ ---
2
+ - !ruby/struct:VCR::HTTPInteraction
3
+ request: !ruby/struct:VCR::Request
4
+ method: :post
5
+ uri: http://localhost:8383/mondrian/xmla
6
+ body: ! "<?xml version=\"1.0\" encoding=\"UTF-8\"?><env:Envelope xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"
7
+ xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:wsdl=\"http://tempuri.org/wsdl/\"
8
+ xmlns:env=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ins0=\"http://tempuri.org/type\"><env:Body><Execute
9
+ xmlns=\"urn:schemas-microsoft-com:xml-analysis\"><Command> <Statement> <![CDATA[
10
+ \ SELECT NON EMPTY {Hierarchize({[Measures].[Broj intervencija]})} ON
11
+ COLUMNS,\n non empty ( { Filter (Hierarchize({[Razlog prijave].children}),
12
+ [Measures].[Broj intervencija] >= 15000 )}) ON ROWS\n FROM [Kvarovi]\n
13
+ ]]> </Statement> </Command> <Properties> <PropertyList> <Catalog>GOSJAR</Catalog>\n
14
+ \ <Format>Multidimensional</Format> <AxisFormat>TupleFormat</AxisFormat>
15
+ </PropertyList> </Properties></Execute></env:Body></env:Envelope>"
16
+ headers:
17
+ soapaction:
18
+ - ! '"urn:schemas-microsoft-com:xml-analysis:Execute"'
19
+ content-type:
20
+ - text/xml;charset=UTF-8
21
+ content-length:
22
+ - '840'
23
+ response: !ruby/struct:VCR::Response
24
+ status: !ruby/struct:VCR::ResponseStatus
25
+ code: 200
26
+ message: OK
27
+ headers:
28
+ server:
29
+ - Apache-Coyote/1.1
30
+ content-type:
31
+ - text/xml;charset=UTF-8
32
+ transfer-encoding:
33
+ - chunked
34
+ date:
35
+ - Wed, 15 Feb 2012 20:48:55 GMT
36
+ body: ! "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\"
37
+ SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" >\n<SOAP-ENV:Header>\n</SOAP-ENV:Header>\n<SOAP-ENV:Body>\n<cxmla:ExecuteResponse
38
+ xmlns:cxmla=\"urn:schemas-microsoft-com:xml-analysis\">\n <cxmla:return>\n
39
+ \ <root xmlns=\"urn:schemas-microsoft-com:xml-analysis:mddataset\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
40
+ xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:EX=\"urn:schemas-microsoft-com:xml-analysis:exception\">\n
41
+ \ <xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" targetNamespace=\"urn:schemas-microsoft-com:xml-analysis:mddataset\"
42
+ xmlns=\"urn:schemas-microsoft-com:xml-analysis:mddataset\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
43
+ xmlns:sql=\"urn:schemas-microsoft-com:xml-sql\" elementFormDefault=\"qualified\">\n
44
+ \ <xsd:complexType name=\"MemberType\">\n <xsd:sequence>\n <xsd:element
45
+ name=\"UName\" type=\"xsd:string\"/>\n <xsd:element name=\"Caption\"
46
+ type=\"xsd:string\"/>\n <xsd:element name=\"LName\" type=\"xsd:string\"/>\n
47
+ \ <xsd:element name=\"LNum\" type=\"xsd:unsignedInt\"/>\n <xsd:element
48
+ name=\"DisplayInfo\" type=\"xsd:unsignedInt\"/>\n <xsd:sequence maxOccurs=\"unbounded\"
49
+ minOccurs=\"0\">\n <xsd:any processContents=\"lax\" maxOccurs=\"unbounded\"/>\n
50
+ \ </xsd:sequence>\n </xsd:sequence>\n <xsd:attribute
51
+ name=\"Hierarchy\" type=\"xsd:string\"/>\n </xsd:complexType>\n <xsd:complexType
52
+ name=\"PropType\">\n <xsd:attribute name=\"name\" type=\"xsd:string\"/>\n
53
+ \ </xsd:complexType>\n <xsd:complexType name=\"TupleType\">\n <xsd:sequence
54
+ maxOccurs=\"unbounded\">\n <xsd:element name=\"Member\" type=\"MemberType\"/>\n
55
+ \ </xsd:sequence>\n </xsd:complexType>\n <xsd:complexType
56
+ name=\"MembersType\">\n <xsd:sequence maxOccurs=\"unbounded\">\n <xsd:element
57
+ name=\"Member\" type=\"MemberType\"/>\n </xsd:sequence>\n <xsd:attribute
58
+ name=\"Hierarchy\" type=\"xsd:string\"/>\n </xsd:complexType>\n <xsd:complexType
59
+ name=\"TuplesType\">\n <xsd:sequence maxOccurs=\"unbounded\">\n <xsd:element
60
+ name=\"Tuple\" type=\"TupleType\"/>\n </xsd:sequence>\n </xsd:complexType>\n
61
+ \ <xsd:complexType name=\"CrossProductType\">\n <xsd:sequence>\n
62
+ \ <xsd:choice minOccurs=\"0\" maxOccurs=\"unbounded\">\n <xsd:element
63
+ name=\"Members\" type=\"MembersType\"/>\n <xsd:element name=\"Tuples\"
64
+ type=\"TuplesType\"/>\n </xsd:choice>\n </xsd:sequence>\n
65
+ \ <xsd:attribute name=\"Size\" type=\"xsd:unsignedInt\"/>\n </xsd:complexType>\n
66
+ \ <xsd:complexType name=\"OlapInfo\">\n <xsd:sequence>\n <xsd:element
67
+ name=\"CubeInfo\">\n <xsd:complexType>\n <xsd:sequence>\n
68
+ \ <xsd:element name=\"Cube\" maxOccurs=\"unbounded\">\n <xsd:complexType>\n
69
+ \ <xsd:sequence>\n <xsd:element name=\"CubeName\"
70
+ type=\"xsd:string\"/>\n </xsd:sequence>\n </xsd:complexType>\n
71
+ \ </xsd:element>\n </xsd:sequence>\n </xsd:complexType>\n
72
+ \ </xsd:element>\n <xsd:element name=\"AxesInfo\">\n <xsd:complexType>\n
73
+ \ <xsd:sequence>\n <xsd:element name=\"AxisInfo\"
74
+ maxOccurs=\"unbounded\">\n <xsd:complexType>\n <xsd:sequence>\n
75
+ \ <xsd:element name=\"HierarchyInfo\" minOccurs=\"0\"
76
+ maxOccurs=\"unbounded\">\n <xsd:complexType>\n <xsd:sequence>\n
77
+ \ <xsd:sequence maxOccurs=\"unbounded\">\n <xsd:element
78
+ name=\"UName\" type=\"PropType\"/>\n <xsd:element
79
+ name=\"Caption\" type=\"PropType\"/>\n <xsd:element
80
+ name=\"LName\" type=\"PropType\"/>\n <xsd:element
81
+ name=\"LNum\" type=\"PropType\"/>\n <xsd:element
82
+ name=\"DisplayInfo\" type=\"PropType\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\n
83
+ \ </xsd:sequence>\n <xsd:sequence>\n
84
+ \ <xsd:any processContents=\"lax\" minOccurs=\"0\"
85
+ maxOccurs=\"unbounded\"/>\n </xsd:sequence>\n </xsd:sequence>\n
86
+ \ <xsd:attribute name=\"name\" type=\"xsd:string\"
87
+ use=\"required\"/>\n </xsd:complexType>\n </xsd:element>\n
88
+ \ </xsd:sequence>\n <xsd:attribute
89
+ name=\"name\" type=\"xsd:string\"/>\n </xsd:complexType>\n
90
+ \ </xsd:element>\n </xsd:sequence>\n </xsd:complexType>\n
91
+ \ </xsd:element>\n <xsd:element name=\"CellInfo\">\n <xsd:complexType>\n
92
+ \ <xsd:sequence>\n <xsd:sequence minOccurs=\"0\"
93
+ maxOccurs=\"unbounded\">\n <xsd:choice>\n <xsd:element
94
+ name=\"Value\" type=\"PropType\"/>\n <xsd:element name=\"FmtValue\"
95
+ type=\"PropType\"/>\n <xsd:element name=\"BackColor\" type=\"PropType\"/>\n
96
+ \ <xsd:element name=\"ForeColor\" type=\"PropType\"/>\n
97
+ \ <xsd:element name=\"FontName\" type=\"PropType\"/>\n <xsd:element
98
+ name=\"FontSize\" type=\"PropType\"/>\n <xsd:element name=\"FontFlags\"
99
+ type=\"PropType\"/>\n <xsd:element name=\"FormatString\"
100
+ type=\"PropType\"/>\n <xsd:element name=\"NonEmptyBehavior\"
101
+ type=\"PropType\"/>\n <xsd:element name=\"SolveOrder\"
102
+ type=\"PropType\"/>\n <xsd:element name=\"Updateable\"
103
+ type=\"PropType\"/>\n <xsd:element name=\"Visible\" type=\"PropType\"/>\n
104
+ \ <xsd:element name=\"Expression\" type=\"PropType\"/>\n
105
+ \ </xsd:choice>\n </xsd:sequence>\n <xsd:sequence
106
+ maxOccurs=\"unbounded\" minOccurs=\"0\">\n <xsd:any processContents=\"lax\"
107
+ maxOccurs=\"unbounded\"/>\n </xsd:sequence>\n </xsd:sequence>\n
108
+ \ </xsd:complexType>\n </xsd:element>\n </xsd:sequence>\n
109
+ \ </xsd:complexType>\n <xsd:complexType name=\"Axes\">\n <xsd:sequence
110
+ maxOccurs=\"unbounded\">\n <xsd:element name=\"Axis\">\n <xsd:complexType>\n
111
+ \ <xsd:choice minOccurs=\"0\" maxOccurs=\"unbounded\">\n <xsd:element
112
+ name=\"CrossProduct\" type=\"CrossProductType\"/>\n <xsd:element
113
+ name=\"Tuples\" type=\"TuplesType\"/>\n <xsd:element name=\"Members\"
114
+ type=\"MembersType\"/>\n </xsd:choice>\n <xsd:attribute
115
+ name=\"name\" type=\"xsd:string\"/>\n </xsd:complexType>\n </xsd:element>\n
116
+ \ </xsd:sequence>\n </xsd:complexType>\n <xsd:complexType
117
+ name=\"CellData\">\n <xsd:sequence>\n <xsd:element name=\"Cell\"
118
+ minOccurs=\"0\" maxOccurs=\"unbounded\">\n <xsd:complexType>\n
119
+ \ <xsd:sequence maxOccurs=\"unbounded\">\n <xsd:choice>\n
120
+ \ <xsd:element name=\"Value\"/>\n <xsd:element
121
+ name=\"FmtValue\" type=\"xsd:string\"/>\n <xsd:element name=\"BackColor\"
122
+ type=\"xsd:unsignedInt\"/>\n <xsd:element name=\"ForeColor\"
123
+ type=\"xsd:unsignedInt\"/>\n <xsd:element name=\"FontName\"
124
+ type=\"xsd:string\"/>\n <xsd:element name=\"FontSize\" type=\"xsd:unsignedShort\"/>\n
125
+ \ <xsd:element name=\"FontFlags\" type=\"xsd:unsignedInt\"/>\n
126
+ \ <xsd:element name=\"FormatString\" type=\"xsd:string\"/>\n
127
+ \ <xsd:element name=\"NonEmptyBehavior\" type=\"xsd:unsignedShort\"/>\n
128
+ \ <xsd:element name=\"SolveOrder\" type=\"xsd:unsignedInt\"/>\n
129
+ \ <xsd:element name=\"Updateable\" type=\"xsd:unsignedInt\"/>\n
130
+ \ <xsd:element name=\"Visible\" type=\"xsd:unsignedInt\"/>\n
131
+ \ <xsd:element name=\"Expression\" type=\"xsd:string\"/>\n
132
+ \ </xsd:choice>\n </xsd:sequence>\n <xsd:attribute
133
+ name=\"CellOrdinal\" type=\"xsd:unsignedInt\" use=\"required\"/>\n </xsd:complexType>\n
134
+ \ </xsd:element>\n </xsd:sequence>\n </xsd:complexType>\n
135
+ \ <xsd:element name=\"root\">\n <xsd:complexType>\n <xsd:sequence
136
+ maxOccurs=\"unbounded\">\n <xsd:element name=\"OlapInfo\" type=\"OlapInfo\"/>\n
137
+ \ <xsd:element name=\"Axes\" type=\"Axes\"/>\n <xsd:element
138
+ name=\"CellData\" type=\"CellData\"/>\n </xsd:sequence>\n </xsd:complexType>\n
139
+ \ </xsd:element>\n </xsd:schema>\n <OlapInfo>\n <CubeInfo>\n
140
+ \ <Cube>\n <CubeName>Kvarovi</CubeName>\n </Cube>\n
141
+ \ </CubeInfo>\n <AxesInfo>\n <AxisInfo name=\"Axis0\">\n
142
+ \ <HierarchyInfo name=\"Measures\">\n <UName name=\"[Measures].[MEMBER_UNIQUE_NAME]\"/>\n
143
+ \ <Caption name=\"[Measures].[MEMBER_CAPTION]\"/>\n <LName
144
+ name=\"[Measures].[LEVEL_UNIQUE_NAME]\"/>\n <LNum name=\"[Measures].[LEVEL_NUMBER]\"/>\n
145
+ \ <DisplayInfo name=\"[Measures].[DISPLAY_INFO]\"/>\n </HierarchyInfo>\n
146
+ \ </AxisInfo>\n <AxisInfo name=\"Axis1\">\n <HierarchyInfo
147
+ name=\"Razlog prijave.Razlog prijave\">\n <UName name=\"[Razlog
148
+ prijave].[MEMBER_UNIQUE_NAME]\"/>\n <Caption name=\"[Razlog prijave].[MEMBER_CAPTION]\"/>\n
149
+ \ <LName name=\"[Razlog prijave].[LEVEL_UNIQUE_NAME]\"/>\n <LNum
150
+ name=\"[Razlog prijave].[LEVEL_NUMBER]\"/>\n <DisplayInfo name=\"[Razlog
151
+ prijave].[DISPLAY_INFO]\"/>\n </HierarchyInfo>\n </AxisInfo>\n
152
+ \ <AxisInfo name=\"SlicerAxis\"/>\n </AxesInfo>\n <CellInfo>\n
153
+ \ <Value name=\"VALUE\"/>\n <FmtValue name=\"FORMATTED_VALUE\"/>\n
154
+ \ <FormatString name=\"FORMAT_STRING\"/>\n </CellInfo>\n </OlapInfo>\n
155
+ \ <Axes>\n <Axis name=\"Axis0\">\n <Tuples/>\n </Axis>\n
156
+ \ <Axis name=\"Axis1\">\n <Tuples/>\n </Axis>\n <Axis
157
+ name=\"SlicerAxis\">\n <Tuples>\n <Tuple/>\n </Tuples>\n
158
+ \ </Axis>\n </Axes>\n <CellData/>\n </root>\n </cxmla:return>\n</cxmla:ExecuteResponse>\n</SOAP-ENV:Body>\n</SOAP-ENV:Envelope>\n"
159
+ http_version: '1.1'
data/spec/cube_spec.rb CHANGED
@@ -51,11 +51,15 @@ describe XMLA::Cube do
51
51
  <Format>Multidimensional</Format> <AxisFormat>TupleFormat</AxisFormat> </PropertyList> </Properties>"
52
52
  end
53
53
 
54
- it 'should connect to mondrian' do
55
- XMLA.configure do |c|
56
- c.endpoint = "http://localhost:8383/mondrian/xmla"
57
- c.catalog = "GOSJAR"
58
- end
54
+ def configure_mondrian
55
+ XMLA.configure do |c|
56
+ c.endpoint = "http://localhost:8383/mondrian/xmla"
57
+ c.catalog = "GOSJAR"
58
+ end
59
+ end
60
+
61
+ it'should connect to mondrian' do
62
+ configure_mondrian
59
63
 
60
64
  VCR.use_cassette('mondrian_broj_intervencija') do
61
65
  result = XMLA::Cube.execute("SELECT NON EMPTY {Hierarchize({[Measures].[Broj intervencija]})} ON COLUMNS, NON EMPTY {Hierarchize({[Gradska cetvrt].[Gradska cetvrt].Members})} ON ROWS FROM [Kvarovi]")
@@ -65,4 +69,35 @@ describe XMLA::Cube do
65
69
  end
66
70
  end
67
71
 
72
+ it'should handle the case with only one row in result' do
73
+ configure_mondrian
74
+
75
+ VCR.use_cassette('mondrian_jedan_red_odgovor') do
76
+ result = XMLA::Cube.execute <<-MDX
77
+ SELECT NON EMPTY {Hierarchize({[Measures].[Broj intervencija]})} ON COLUMNS,
78
+ non empty ( { Filter (Hierarchize({[Razlog prijave].children}), [Measures].[Broj intervencija] >= 7000 )}) ON ROWS
79
+ FROM [Kvarovi]
80
+ MDX
81
+ result.size.should == 2
82
+ result[0].should == "|Broj intervencija"
83
+ result[1].should == "Ne radi svjetiljka|14442"
84
+ end
85
+ end
86
+
87
+
88
+ it'should handle the case with zero rows in result' do
89
+ configure_mondrian
90
+
91
+ VCR.use_cassette('mondrian_nula_redaka') do
92
+ result = XMLA::Cube.execute <<-MDX
93
+ SELECT NON EMPTY {Hierarchize({[Measures].[Broj intervencija]})} ON COLUMNS,
94
+ non empty ( { Filter (Hierarchize({[Razlog prijave].children}), [Measures].[Broj intervencija] >= 15000 )}) ON ROWS
95
+ FROM [Kvarovi]
96
+ MDX
97
+ result.size.should == 1
98
+ result[0].should == ""
99
+ end
100
+ end
101
+
102
+
68
103
  end
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.1.0
4
+ version: 1.2.0
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-12 00:00:00.000000000Z
12
+ date: 2012-02-15 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: savon
16
- requirement: &70118415011960 !ruby/object:Gem::Requirement
16
+ requirement: &70098177763320 !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: *70118415011960
24
+ version_requirements: *70098177763320
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: webmock
27
- requirement: &70118415011460 !ruby/object:Gem::Requirement
27
+ requirement: &70098177762780 !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: *70118415011460
35
+ version_requirements: *70098177762780
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: guerrilla_patch
38
- requirement: &70118415010940 !ruby/object:Gem::Requirement
38
+ requirement: &70098177762260 !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: *70118415010940
46
+ version_requirements: *70098177762260
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: vcr
49
- requirement: &70118415010460 !ruby/object:Gem::Requirement
49
+ requirement: &70098177761620 !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: *70118415010460
57
+ version_requirements: *70098177761620
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rspec
60
- requirement: &70118415009940 !ruby/object:Gem::Requirement
60
+ requirement: &70098177761100 !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: *70118415009940
68
+ version_requirements: *70098177761100
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: bundler
71
- requirement: &70118415009440 !ruby/object:Gem::Requirement
71
+ requirement: &70098177760540 !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: *70118415009440
79
+ version_requirements: *70098177760540
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: jeweler
82
- requirement: &70118415008940 !ruby/object:Gem::Requirement
82
+ requirement: &70098177759980 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ~>
@@ -87,9 +87,9 @@ dependencies:
87
87
  version: 1.6.4
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *70118415008940
91
- description: Eases the pain I had to go through to get to the data of Xmla based OLAP
92
- provider
90
+ version_requirements: *70098177759980
91
+ description: Eases the pain I had to go through to get to the data out of XMLA based
92
+ OLAP provider
93
93
  email: kresimir.bojcic@gmail.com
94
94
  executables: []
95
95
  extensions: []
@@ -114,6 +114,8 @@ files:
114
114
  - spec/cassettes/kvartovi_u_recima.yml
115
115
  - spec/cassettes/kvatovi_u_koloni.yml
116
116
  - spec/cassettes/mondrian_broj_intervencija.yml
117
+ - spec/cassettes/mondrian_jedan_red_odgovor.yml
118
+ - spec/cassettes/mondrian_nula_redaka.yml
117
119
  - spec/cassettes/razlog_prijave_i_kvart.yml
118
120
  - spec/cube_spec.rb
119
121
  - spec/spec_helper.rb
@@ -132,7 +134,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
132
134
  version: '0'
133
135
  segments:
134
136
  - 0
135
- hash: -309596402643366136
137
+ hash: 1940280110315131232
136
138
  required_rubygems_version: !ruby/object:Gem::Requirement
137
139
  none: false
138
140
  requirements: