mondrian-olap 0.4.0-java

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.
Files changed (46) hide show
  1. data/.rspec +2 -0
  2. data/Changelog.md +60 -0
  3. data/Gemfile +21 -0
  4. data/LICENSE-Mondrian.html +259 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +302 -0
  7. data/RUNNING_TESTS.rdoc +66 -0
  8. data/Rakefile +48 -0
  9. data/VERSION +1 -0
  10. data/lib/mondrian-olap.rb +1 -0
  11. data/lib/mondrian/jars/commons-collections-3.1.jar +0 -0
  12. data/lib/mondrian/jars/commons-dbcp-1.2.1.jar +0 -0
  13. data/lib/mondrian/jars/commons-logging-1.0.4.jar +0 -0
  14. data/lib/mondrian/jars/commons-math-1.0.jar +0 -0
  15. data/lib/mondrian/jars/commons-pool-1.2.jar +0 -0
  16. data/lib/mondrian/jars/commons-vfs-1.0.jar +0 -0
  17. data/lib/mondrian/jars/eigenbase-properties.jar +0 -0
  18. data/lib/mondrian/jars/eigenbase-resgen.jar +0 -0
  19. data/lib/mondrian/jars/eigenbase-xom.jar +0 -0
  20. data/lib/mondrian/jars/javacup.jar +0 -0
  21. data/lib/mondrian/jars/log4j-1.2.8.jar +0 -0
  22. data/lib/mondrian/jars/log4j.properties +5 -0
  23. data/lib/mondrian/jars/mondrian.jar +0 -0
  24. data/lib/mondrian/jars/olap4j.jar +0 -0
  25. data/lib/mondrian/olap.rb +17 -0
  26. data/lib/mondrian/olap/connection.rb +201 -0
  27. data/lib/mondrian/olap/cube.rb +297 -0
  28. data/lib/mondrian/olap/error.rb +57 -0
  29. data/lib/mondrian/olap/query.rb +342 -0
  30. data/lib/mondrian/olap/result.rb +264 -0
  31. data/lib/mondrian/olap/schema.rb +378 -0
  32. data/lib/mondrian/olap/schema_element.rb +153 -0
  33. data/lib/mondrian/olap/schema_udf.rb +282 -0
  34. data/mondrian-olap.gemspec +128 -0
  35. data/spec/connection_role_spec.rb +130 -0
  36. data/spec/connection_spec.rb +72 -0
  37. data/spec/cube_spec.rb +318 -0
  38. data/spec/fixtures/MondrianTest.xml +134 -0
  39. data/spec/fixtures/MondrianTestOracle.xml +134 -0
  40. data/spec/mondrian_spec.rb +53 -0
  41. data/spec/query_spec.rb +807 -0
  42. data/spec/rake_tasks.rb +260 -0
  43. data/spec/schema_definition_spec.rb +1249 -0
  44. data/spec/spec_helper.rb +134 -0
  45. data/spec/support/matchers/be_like.rb +24 -0
  46. metadata +278 -0
@@ -0,0 +1,282 @@
1
+ require 'jruby/core_ext'
2
+
3
+ module Mondrian
4
+ module OLAP
5
+ class Schema < SchemaElement
6
+
7
+ module ScriptElements
8
+ def javascript(text)
9
+ script text, :language => 'JavaScript'
10
+ end
11
+
12
+ private
13
+
14
+ def coffeescript_function(arguments_string, text)
15
+ # construct function to ensure that last expression is returned
16
+ coffee_text = "#{arguments_string} ->\n" << text.gsub(/^/,' ')
17
+ javascript_text = CoffeeScript.compile(coffee_text, :bare => true)
18
+ # remove function definition first and last lines
19
+ javascript_text = javascript_text.strip.lines.to_a[1..-2].join
20
+ javascript javascript_text
21
+ end
22
+
23
+ def ruby_formatter(interface_class, method, signature, &block)
24
+ formatter_class = Class.new
25
+ formatter_class.class_eval do
26
+ include interface_class
27
+ define_method method, &block
28
+ add_method_signature(method, signature)
29
+ end
30
+ formatter_java_class = formatter_class.become_java!(false)
31
+ class_name formatter_java_class.getName
32
+ end
33
+ end
34
+
35
+ class UserDefinedFunction < SchemaElement
36
+ include ScriptElements
37
+ attributes :name, # Name with which the user-defined function will be referenced in MDX expressions.
38
+ # Name of the class which implemenets this user-defined function.
39
+ # Must implement the mondrian.spi.UserDefinedFunction interface.
40
+ :class_name
41
+ elements :script
42
+
43
+ def coffeescript(text)
44
+ coffee_text = "__udf__ = {\n" << text << "}\n"
45
+ javascript_text = CoffeeScript.compile(coffee_text, :bare => true)
46
+ javascript_text << <<-JS
47
+
48
+ __udf__.parameters || (__udf__.parameters = []);
49
+ __udf__.returns || (__udf__.returns = "Scalar");
50
+ var __scalarTypes__ = {"Numeric":true,"String":true,"Boolean":true,"DateTime":true,"Decimal":true,"Scalar":true};
51
+ function __getType__(type) {
52
+ if (__scalarTypes__[type]) {
53
+ return new mondrian.olap.type[type+"Type"];
54
+ } else if (type === "Member") {
55
+ return mondrian.olap.type.MemberType.Unknown;
56
+ } else {
57
+ return null;
58
+ }
59
+ }
60
+ function getParameterTypes() {
61
+ var parameters = __udf__.parameters || [],
62
+ types = [];
63
+ for (var i = 0, len = parameters.length; i < len; i++) {
64
+ types.push(__getType__(parameters[i]))
65
+ }
66
+ return types;
67
+ }
68
+ function getReturnType(parameterTypes) {
69
+ var returns = __udf__.returns || "Scalar";
70
+ return __getType__(returns);
71
+ }
72
+ if (__udf__.syntax) {
73
+ function getSyntax() {
74
+ return mondrian.olap.Syntax[__udf__.syntax];
75
+ }
76
+ }
77
+ function execute(evaluator, args) {
78
+ var parameters = __udf__.parameters || [],
79
+ values = [],
80
+ value;
81
+ for (var i = 0, len = parameters.length; i < len; i++) {
82
+ if (__scalarTypes__[parameters[i]]) {
83
+ value = args[i].evaluateScalar(evaluator);
84
+ } else {
85
+ value = args[i].evaluate(evaluator);
86
+ }
87
+ values.push(value);
88
+ }
89
+ return __udf__.execute.apply(__udf__, values);
90
+ }
91
+ JS
92
+ javascript javascript_text
93
+ end
94
+
95
+ class RubyUdfBase
96
+ include Java::mondrian.spi.UserDefinedFunction
97
+ def self.function_name=(name); @function_name = name; end
98
+ def self.function_name; @function_name; end
99
+
100
+ def getName
101
+ self.class.function_name
102
+ end
103
+ add_method_signature("getName", [java.lang.String])
104
+
105
+ def getDescription
106
+ getName
107
+ end
108
+ add_method_signature("getDescription", [java.lang.String])
109
+
110
+ def self.parameters(*types)
111
+ if types.empty?
112
+ @parameters || []
113
+ else
114
+ @parameters = types.map{|type| stringified_type(type)}
115
+ end
116
+ end
117
+
118
+ def self.returns(type = nil)
119
+ if type
120
+ @returns = stringified_type(type)
121
+ else
122
+ @returns || 'Scalar'
123
+ end
124
+ end
125
+
126
+ VALID_SYNTAX_TYPES = %w(Function Property Method)
127
+ def self.syntax(type = nil)
128
+ if type
129
+ type = stringify(type)
130
+ raise ArgumentError, "invalid user defined function type #{type.inspect}" unless VALID_SYNTAX_TYPES.include? type
131
+ @syntax = type
132
+ else
133
+ @syntax || 'Function'
134
+ end
135
+ end
136
+
137
+ def getSyntax
138
+ Java::mondrian.olap.Syntax.const_get self.class.syntax
139
+ end
140
+ add_method_signature("getSyntax", [Java::mondrian.olap.Syntax])
141
+
142
+ UDF_SCALAR_TYPES = {
143
+ "Numeric" => Java::mondrian.olap.type.NumericType,
144
+ "String" => Java::mondrian.olap.type.StringType,
145
+ "Boolean" => Java::mondrian.olap.type.BooleanType,
146
+ "DateTime" => Java::mondrian.olap.type.DateTimeType,
147
+ "Decimal" => Java::mondrian.olap.type.DecimalType,
148
+ "Scalar" => Java::mondrian.olap.type.ScalarType
149
+ }
150
+ UDF_OTHER_TYPES = {
151
+ "Member" => Java::mondrian.olap.type.MemberType::Unknown,
152
+ "Set" => Java::mondrian.olap.type.SetType.new(Java::mondrian.olap.type.MemberType::Unknown),
153
+ "Hierarchy" => Java::mondrian.olap.type.HierarchyType.new(nil, nil),
154
+ "Level" => Java::mondrian.olap.type.LevelType::Unknown
155
+ }
156
+
157
+ def getParameterTypes
158
+ @parameterTypes ||= self.class.parameters.map{|p| get_java_type(p)}
159
+ end
160
+ class_loader = JRuby.runtime.jruby_class_loader
161
+ type_array_class = java.lang.Class.forName "[Lmondrian.olap.type.Type;", true, class_loader
162
+ add_method_signature("getParameterTypes", [type_array_class])
163
+
164
+ def getReturnType(parameterTypes)
165
+ @returnType ||= get_java_type self.class.returns
166
+ end
167
+ add_method_signature("getReturnType", [Java::mondrian.olap.type.Type, type_array_class])
168
+
169
+ def getReservedWords
170
+ nil
171
+ end
172
+ string_array_class = java.lang.Class.forName "[Ljava.lang.String;", true, class_loader
173
+ add_method_signature("getReservedWords", [string_array_class])
174
+
175
+ def execute(evaluator, arguments)
176
+ values = []
177
+ self.class.parameters.each_with_index do |p,i|
178
+ value = UDF_SCALAR_TYPES[p] ? arguments[i].evaluateScalar(evaluator) : arguments[i].evaluate(evaluator)
179
+ values << value
180
+ end
181
+ call_with_evaluator(evaluator, *values)
182
+ end
183
+ arguments_array_class = java.lang.Class.forName "[Lmondrian.spi.UserDefinedFunction$Argument;", true, class_loader
184
+ add_method_signature("execute", [java.lang.Object, Java::mondrian.olap.Evaluator, arguments_array_class])
185
+
186
+ # Override this metho if evaluator is needed
187
+ def call_with_evaluator(evaluator, *values)
188
+ call(*values)
189
+ end
190
+
191
+ private
192
+
193
+ def get_java_type(type)
194
+ if type_class = UDF_SCALAR_TYPES[type]
195
+ type_class.new
196
+ else
197
+ UDF_OTHER_TYPES[type]
198
+ end
199
+ end
200
+
201
+ def self.stringified_type(type)
202
+ type = stringify(type)
203
+ raise ArgumentError, "invalid user defined function type #{type.inspect}" unless UDF_SCALAR_TYPES[type] || UDF_OTHER_TYPES[type]
204
+ type
205
+ end
206
+
207
+ def self.stringify(arg)
208
+ arg = arg.to_s.split('_').map{|s| s.capitalize}.join if arg.is_a? Symbol
209
+ arg
210
+ end
211
+ end
212
+
213
+ def ruby(*options, &block)
214
+ udf_class_name = if options.include?(:shared)
215
+ "#{name.capitalize}Udf"
216
+ end
217
+ if udf_class_name && self.class.const_defined?(udf_class_name)
218
+ udf_class = self.class.const_get(udf_class_name)
219
+ else
220
+ udf_class = Class.new(RubyUdfBase)
221
+ self.class.const_set(udf_class_name, udf_class) if udf_class_name
222
+ end
223
+ udf_class.function_name = name
224
+ udf_class.class_eval(&block)
225
+ udf_java_class = udf_class.become_java!(false)
226
+
227
+ class_name udf_java_class.getName
228
+ end
229
+ end
230
+
231
+ class Script < SchemaElement
232
+ attributes :language
233
+ content :text
234
+ end
235
+
236
+ class CellFormatter < SchemaElement
237
+ include ScriptElements
238
+ # Name of a formatter class for the appropriate cell being displayed.
239
+ # The class must implement the mondrian.olap.CellFormatter interface.
240
+ attributes :class_name
241
+ elements :script
242
+
243
+ def coffeescript(text)
244
+ coffeescript_function('(value)', text)
245
+ end
246
+
247
+ def ruby(&block)
248
+ ruby_formatter(Java::mondrian.spi.CellFormatter, 'formatCell', [java.lang.String, java.lang.Object], &block)
249
+ end
250
+ end
251
+
252
+ class MemberFormatter < SchemaElement
253
+ include ScriptElements
254
+ attributes :class_name
255
+ elements :script
256
+
257
+ def coffeescript(text)
258
+ coffeescript_function('(member)', text)
259
+ end
260
+
261
+ def ruby(&block)
262
+ ruby_formatter(Java::mondrian.spi.MemberFormatter, 'formatMember', [java.lang.String, Java::mondrian.olap.Member], &block)
263
+ end
264
+ end
265
+
266
+ class PropertyFormatter < SchemaElement
267
+ include ScriptElements
268
+ attributes :class_name
269
+ elements :script
270
+
271
+ def coffeescript(text)
272
+ coffeescript_function('(member,propertyName,propertyValue)', text)
273
+ end
274
+
275
+ def ruby(&block)
276
+ ruby_formatter(Java::mondrian.spi.PropertyFormatter, 'formatProperty', [java.lang.String, Java::mondrian.olap.Member, java.lang.String, java.lang.Object], &block)
277
+ end
278
+ end
279
+
280
+ end
281
+ end
282
+ end
@@ -0,0 +1,128 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "mondrian-olap"
8
+ s.version = "0.4.0"
9
+ s.platform = "java"
10
+
11
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
+ s.authors = ["Raimonds Simanovskis"]
13
+ s.date = "2012-12-03"
14
+ s.description = "JRuby gem for performing multidimensional queries of relational database data using Mondrian OLAP Java library\n"
15
+ s.email = "raimonds.simanovskis@gmail.com"
16
+ s.extra_rdoc_files = [
17
+ "README.md"
18
+ ]
19
+ s.files = [
20
+ ".rspec",
21
+ "Changelog.md",
22
+ "Gemfile",
23
+ "LICENSE-Mondrian.html",
24
+ "LICENSE.txt",
25
+ "README.md",
26
+ "RUNNING_TESTS.rdoc",
27
+ "Rakefile",
28
+ "VERSION",
29
+ "lib/mondrian-olap.rb",
30
+ "lib/mondrian/jars/commons-collections-3.1.jar",
31
+ "lib/mondrian/jars/commons-dbcp-1.2.1.jar",
32
+ "lib/mondrian/jars/commons-logging-1.0.4.jar",
33
+ "lib/mondrian/jars/commons-math-1.0.jar",
34
+ "lib/mondrian/jars/commons-pool-1.2.jar",
35
+ "lib/mondrian/jars/commons-vfs-1.0.jar",
36
+ "lib/mondrian/jars/eigenbase-properties.jar",
37
+ "lib/mondrian/jars/eigenbase-resgen.jar",
38
+ "lib/mondrian/jars/eigenbase-xom.jar",
39
+ "lib/mondrian/jars/javacup.jar",
40
+ "lib/mondrian/jars/log4j-1.2.8.jar",
41
+ "lib/mondrian/jars/log4j.properties",
42
+ "lib/mondrian/jars/mondrian.jar",
43
+ "lib/mondrian/jars/olap4j.jar",
44
+ "lib/mondrian/olap.rb",
45
+ "lib/mondrian/olap/connection.rb",
46
+ "lib/mondrian/olap/cube.rb",
47
+ "lib/mondrian/olap/error.rb",
48
+ "lib/mondrian/olap/query.rb",
49
+ "lib/mondrian/olap/result.rb",
50
+ "lib/mondrian/olap/schema.rb",
51
+ "lib/mondrian/olap/schema_element.rb",
52
+ "lib/mondrian/olap/schema_udf.rb",
53
+ "mondrian-olap.gemspec",
54
+ "spec/connection_role_spec.rb",
55
+ "spec/connection_spec.rb",
56
+ "spec/cube_spec.rb",
57
+ "spec/fixtures/MondrianTest.xml",
58
+ "spec/fixtures/MondrianTestOracle.xml",
59
+ "spec/mondrian_spec.rb",
60
+ "spec/query_spec.rb",
61
+ "spec/rake_tasks.rb",
62
+ "spec/schema_definition_spec.rb",
63
+ "spec/spec_helper.rb",
64
+ "spec/support/matchers/be_like.rb"
65
+ ]
66
+ s.homepage = "http://github.com/rsim/mondrian-olap"
67
+ s.require_paths = ["lib"]
68
+ s.rubygems_version = "1.8.24"
69
+ s.summary = "JRuby API for Mondrian OLAP Java library"
70
+
71
+ if s.respond_to? :specification_version then
72
+ s.specification_version = 3
73
+
74
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
75
+ s.add_runtime_dependency(%q<nokogiri>, ["~> 1.5.0"])
76
+ s.add_development_dependency(%q<jruby-openssl>, [">= 0"])
77
+ s.add_development_dependency(%q<jeweler>, ["~> 1.8.3"])
78
+ s.add_development_dependency(%q<rdoc>, [">= 0"])
79
+ s.add_development_dependency(%q<rspec>, ["~> 2.10"])
80
+ s.add_development_dependency(%q<autotest>, [">= 0"])
81
+ s.add_development_dependency(%q<jdbc-mysql>, [">= 0"])
82
+ s.add_development_dependency(%q<jdbc-postgres>, [">= 0"])
83
+ s.add_development_dependency(%q<jdbc-luciddb>, [">= 0"])
84
+ s.add_development_dependency(%q<jdbc-jtds>, [">= 0"])
85
+ s.add_development_dependency(%q<activerecord>, ["= 3.2.8"])
86
+ s.add_development_dependency(%q<activerecord-jdbc-adapter>, ["= 1.2.2"])
87
+ s.add_development_dependency(%q<activerecord-oracle_enhanced-adapter>, [">= 0"])
88
+ s.add_development_dependency(%q<coffee-script>, ["~> 2.2.0"])
89
+ s.add_development_dependency(%q<therubyrhino>, ["~> 1.73.1"])
90
+ s.add_development_dependency(%q<pry>, [">= 0"])
91
+ else
92
+ s.add_dependency(%q<nokogiri>, ["~> 1.5.0"])
93
+ s.add_dependency(%q<jruby-openssl>, [">= 0"])
94
+ s.add_dependency(%q<jeweler>, ["~> 1.8.3"])
95
+ s.add_dependency(%q<rdoc>, [">= 0"])
96
+ s.add_dependency(%q<rspec>, ["~> 2.10"])
97
+ s.add_dependency(%q<autotest>, [">= 0"])
98
+ s.add_dependency(%q<jdbc-mysql>, [">= 0"])
99
+ s.add_dependency(%q<jdbc-postgres>, [">= 0"])
100
+ s.add_dependency(%q<jdbc-luciddb>, [">= 0"])
101
+ s.add_dependency(%q<jdbc-jtds>, [">= 0"])
102
+ s.add_dependency(%q<activerecord>, ["= 3.2.8"])
103
+ s.add_dependency(%q<activerecord-jdbc-adapter>, ["= 1.2.2"])
104
+ s.add_dependency(%q<activerecord-oracle_enhanced-adapter>, [">= 0"])
105
+ s.add_dependency(%q<coffee-script>, ["~> 2.2.0"])
106
+ s.add_dependency(%q<therubyrhino>, ["~> 1.73.1"])
107
+ s.add_dependency(%q<pry>, [">= 0"])
108
+ end
109
+ else
110
+ s.add_dependency(%q<nokogiri>, ["~> 1.5.0"])
111
+ s.add_dependency(%q<jruby-openssl>, [">= 0"])
112
+ s.add_dependency(%q<jeweler>, ["~> 1.8.3"])
113
+ s.add_dependency(%q<rdoc>, [">= 0"])
114
+ s.add_dependency(%q<rspec>, ["~> 2.10"])
115
+ s.add_dependency(%q<autotest>, [">= 0"])
116
+ s.add_dependency(%q<jdbc-mysql>, [">= 0"])
117
+ s.add_dependency(%q<jdbc-postgres>, [">= 0"])
118
+ s.add_dependency(%q<jdbc-luciddb>, [">= 0"])
119
+ s.add_dependency(%q<jdbc-jtds>, [">= 0"])
120
+ s.add_dependency(%q<activerecord>, ["= 3.2.8"])
121
+ s.add_dependency(%q<activerecord-jdbc-adapter>, ["= 1.2.2"])
122
+ s.add_dependency(%q<activerecord-oracle_enhanced-adapter>, [">= 0"])
123
+ s.add_dependency(%q<coffee-script>, ["~> 2.2.0"])
124
+ s.add_dependency(%q<therubyrhino>, ["~> 1.73.1"])
125
+ s.add_dependency(%q<pry>, [">= 0"])
126
+ end
127
+ end
128
+
@@ -0,0 +1,130 @@
1
+ require "spec_helper"
2
+
3
+ describe "Connection role" do
4
+
5
+ describe "create connection" do
6
+ before(:each) do
7
+ @role_name = role_name = 'California manager'
8
+ @role_name2 = role_name2 = 'Dummy, with comma'
9
+ @schema = Mondrian::OLAP::Schema.define do
10
+ cube 'Sales' do
11
+ table 'sales'
12
+ dimension 'Gender', :foreign_key => 'customer_id' do
13
+ hierarchy :has_all => true, :primary_key => 'id' do
14
+ table 'customers'
15
+ level 'Gender', :column => 'gender', :unique_members => true
16
+ end
17
+ end
18
+ dimension 'Customers', :foreign_key => 'customer_id' do
19
+ hierarchy :has_all => true, :all_member_name => 'All Customers', :primary_key => 'id' do
20
+ table 'customers'
21
+ level 'Country', :column => 'country', :unique_members => true
22
+ level 'State Province', :column => 'state_province', :unique_members => true
23
+ level 'City', :column => 'city', :unique_members => false
24
+ level 'Name', :column => 'fullname', :unique_members => true
25
+ end
26
+ end
27
+ dimension 'Time', :foreign_key => 'time_id' do
28
+ hierarchy :has_all => false, :primary_key => 'id' do
29
+ table 'time'
30
+ level 'Year', :column => 'the_year', :type => 'Numeric', :unique_members => true
31
+ level 'Quarter', :column => 'quarter', :unique_members => false
32
+ level 'Month', :column => 'month_of_year', :type => 'Numeric', :unique_members => false
33
+ end
34
+ end
35
+ measure 'Unit Sales', :column => 'unit_sales', :aggregator => 'sum'
36
+ measure 'Store Sales', :column => 'store_sales', :aggregator => 'sum'
37
+ end
38
+ role role_name do
39
+ schema_grant :access => 'none' do
40
+ cube_grant :cube => 'Sales', :access => 'all' do
41
+ dimension_grant :dimension => '[Measures]', :access => 'all'
42
+ hierarchy_grant :hierarchy => '[Customers]', :access => 'custom',
43
+ :top_level => '[Customers].[State Province]', :bottom_level => '[Customers].[City]' do
44
+ member_grant :member => '[Customers].[USA].[CA]', :access => 'all'
45
+ member_grant :member => '[Customers].[USA].[CA].[Los Angeles]', :access => 'none'
46
+ end
47
+ end
48
+ end
49
+ end
50
+ role role_name2
51
+
52
+ # to test that Role elements are generated before UserDefinedFunction
53
+ user_defined_function 'Factorial' do
54
+ ruby do
55
+ parameters :numeric
56
+ returns :numeric
57
+ def call(n)
58
+ n <= 1 ? 1 : n * call(n - 1)
59
+ end
60
+ end
61
+ end
62
+ end
63
+ @olap = Mondrian::OLAP::Connection.create(CONNECTION_PARAMS.merge :schema => @schema)
64
+ end
65
+
66
+ it "should connect" do
67
+ @olap.should be_connected
68
+ end
69
+
70
+ it "should get available role names" do
71
+ @olap.available_role_names.should == [@role_name, @role_name2]
72
+ end
73
+
74
+ it "should not get role name if not set" do
75
+ @olap.role_name.should be_nil
76
+ @olap.role_names.should be_empty
77
+ end
78
+
79
+ it "should set and get role name" do
80
+ @olap.role_name = @role_name
81
+ @olap.role_name.should == @role_name
82
+ @olap.role_names.should == [@role_name]
83
+ end
84
+
85
+ it "should raise error when invalid role name is set" do
86
+ expect {
87
+ @olap.role_name = 'invalid'
88
+ }.to raise_error {|e|
89
+ e.should be_kind_of(Mondrian::OLAP::Error)
90
+ e.message.should == "org.olap4j.OlapException: Unknown role 'invalid'"
91
+ e.root_cause_message.should == "Unknown role 'invalid'"
92
+ }
93
+ end
94
+
95
+ it "should set and get several role names" do
96
+ @olap.role_names = [@role_name, @role_name2]
97
+ @olap.role_name.should == "[#{@role_name}, #{@role_name2}]"
98
+ @olap.role_names.should == [@role_name, @role_name2]
99
+ end
100
+
101
+ it "should not get non-visible member" do
102
+ @cube = @olap.cube('Sales')
103
+ @cube.member('[Customers].[USA].[CA].[Los Angeles]').should_not be_nil
104
+ @olap.role_name = @role_name
105
+ @cube.member('[Customers].[USA].[CA].[Los Angeles]').should be_nil
106
+ end
107
+
108
+ # TODO: investigate why role name is not returned when set in connection string
109
+ # it "should set role name from connection parameters" do
110
+ # @olap = Mondrian::OLAP::Connection.create(CONNECTION_PARAMS.merge :schema => @schema,
111
+ # :role => @role_name)
112
+ # @olap.role_name.should == @role_name
113
+ # end
114
+
115
+ it "should not get non-visible member when role name set in connection parameters" do
116
+ @olap = Mondrian::OLAP::Connection.create(CONNECTION_PARAMS.merge :schema => @schema,
117
+ :role => @role_name)
118
+ @cube = @olap.cube('Sales')
119
+ @cube.member('[Customers].[USA].[CA].[Los Angeles]').should be_nil
120
+ end
121
+
122
+ it "should not get non-visible member when several role names set in connection parameters" do
123
+ @olap = Mondrian::OLAP::Connection.create(CONNECTION_PARAMS.merge :schema => @schema,
124
+ :roles => [@role_name, @role_name2])
125
+ @cube = @olap.cube('Sales')
126
+ @cube.member('[Customers].[USA].[CA].[Los Angeles]').should be_nil
127
+ end
128
+
129
+ end
130
+ end