cube 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
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: