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.
- 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
|