mondrian-olap 0.4.0-java
Sign up to get free protection for your applications and to get access to all the features.
- data/.rspec +2 -0
- data/Changelog.md +60 -0
- data/Gemfile +21 -0
- data/LICENSE-Mondrian.html +259 -0
- data/LICENSE.txt +22 -0
- data/README.md +302 -0
- data/RUNNING_TESTS.rdoc +66 -0
- data/Rakefile +48 -0
- data/VERSION +1 -0
- data/lib/mondrian-olap.rb +1 -0
- data/lib/mondrian/jars/commons-collections-3.1.jar +0 -0
- data/lib/mondrian/jars/commons-dbcp-1.2.1.jar +0 -0
- data/lib/mondrian/jars/commons-logging-1.0.4.jar +0 -0
- data/lib/mondrian/jars/commons-math-1.0.jar +0 -0
- data/lib/mondrian/jars/commons-pool-1.2.jar +0 -0
- data/lib/mondrian/jars/commons-vfs-1.0.jar +0 -0
- data/lib/mondrian/jars/eigenbase-properties.jar +0 -0
- data/lib/mondrian/jars/eigenbase-resgen.jar +0 -0
- data/lib/mondrian/jars/eigenbase-xom.jar +0 -0
- data/lib/mondrian/jars/javacup.jar +0 -0
- data/lib/mondrian/jars/log4j-1.2.8.jar +0 -0
- data/lib/mondrian/jars/log4j.properties +5 -0
- data/lib/mondrian/jars/mondrian.jar +0 -0
- data/lib/mondrian/jars/olap4j.jar +0 -0
- data/lib/mondrian/olap.rb +17 -0
- data/lib/mondrian/olap/connection.rb +201 -0
- data/lib/mondrian/olap/cube.rb +297 -0
- data/lib/mondrian/olap/error.rb +57 -0
- data/lib/mondrian/olap/query.rb +342 -0
- data/lib/mondrian/olap/result.rb +264 -0
- data/lib/mondrian/olap/schema.rb +378 -0
- data/lib/mondrian/olap/schema_element.rb +153 -0
- data/lib/mondrian/olap/schema_udf.rb +282 -0
- data/mondrian-olap.gemspec +128 -0
- data/spec/connection_role_spec.rb +130 -0
- data/spec/connection_spec.rb +72 -0
- data/spec/cube_spec.rb +318 -0
- data/spec/fixtures/MondrianTest.xml +134 -0
- data/spec/fixtures/MondrianTestOracle.xml +134 -0
- data/spec/mondrian_spec.rb +53 -0
- data/spec/query_spec.rb +807 -0
- data/spec/rake_tasks.rb +260 -0
- data/spec/schema_definition_spec.rb +1249 -0
- data/spec/spec_helper.rb +134 -0
- data/spec/support/matchers/be_like.rb +24 -0
- 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
|