mondrian-olap 0.4.0-java

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