Class: Mondrian::OLAP::Connection
- Inherits:
-
Object
- Object
- Mondrian::OLAP::Connection
show all
- Defined in:
- lib/mondrian/olap/connection.rb
Defined Under Namespace
Classes: ProfilingHandler
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
Constructor Details
#initialize(params = {}) ⇒ Connection
Returns a new instance of Connection.
13
14
15
16
17
18
|
# File 'lib/mondrian/olap/connection.rb', line 13
def initialize(params = {})
@params = params
@driver = params[:driver]
@connected = false
@raw_connection = nil
end
|
Instance Attribute Details
#raw_cache_control ⇒ Object
Returns the value of attribute raw_cache_control.
10
11
12
|
# File 'lib/mondrian/olap/connection.rb', line 10
def raw_cache_control
@raw_cache_control
end
|
#raw_catalog ⇒ Object
Returns the value of attribute raw_catalog.
10
11
12
|
# File 'lib/mondrian/olap/connection.rb', line 10
def raw_catalog
@raw_catalog
end
|
#raw_connection ⇒ Object
Returns the value of attribute raw_connection.
10
11
12
|
# File 'lib/mondrian/olap/connection.rb', line 10
def raw_connection
@raw_connection
end
|
#raw_mondrian_connection ⇒ Object
Returns the value of attribute raw_mondrian_connection.
10
11
12
|
# File 'lib/mondrian/olap/connection.rb', line 10
def raw_mondrian_connection
@raw_mondrian_connection
end
|
#raw_schema ⇒ Object
Returns the value of attribute raw_schema.
10
11
12
|
# File 'lib/mondrian/olap/connection.rb', line 10
def raw_schema
@raw_schema
end
|
#raw_schema_reader ⇒ Object
Returns the value of attribute raw_schema_reader.
10
11
12
|
# File 'lib/mondrian/olap/connection.rb', line 10
def raw_schema_reader
@raw_schema_reader
end
|
Class Method Details
.create(params) ⇒ Object
4
5
6
7
8
|
# File 'lib/mondrian/olap/connection.rb', line 4
def self.create(params)
connection = new(params)
connection.connect
connection
end
|
.flush_schema(schema_key) ⇒ Object
174
175
176
177
178
179
|
# File 'lib/mondrian/olap/connection.rb', line 174
def self.flush_schema(schema_key)
method = Java::mondrian.rolap.RolapSchemaPool.java_class.declared_method('remove',
Java::mondrian.rolap.SchemaKey.java_class)
method.accessible = true
method.invoke(raw_schema_pool, raw_schema_key(schema_key))
end
|
.flush_schema_cache ⇒ Object
161
162
163
164
165
|
# File 'lib/mondrian/olap/connection.rb', line 161
def self.flush_schema_cache
method = Java::mondrian.rolap.RolapSchemaPool.java_class.declared_method('clear')
method.accessible = true
method.invoke(raw_schema_pool)
end
|
.raw_schema_key(schema_key) ⇒ Object
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
# File 'lib/mondrian/olap/connection.rb', line 118
def self.raw_schema_key(schema_key)
if schema_key =~ /\A<(.*), (.*)>\z/
schema_content_key = $1
connection_key = $2
cons = Java::mondrian.rolap.SchemaContentKey.java_class.declared_constructor(java.lang.String)
cons.accessible = true
raw_schema_content_key = cons.new_instance(schema_content_key)
cons = Java::mondrian.rolap.ConnectionKey.java_class.declared_constructor(java.lang.String)
cons.accessible = true
raw_connection_key = cons.new_instance(connection_key)
cons = Java::mondrian.rolap.SchemaKey.java_class.declared_constructor(
Java::mondrian.rolap.SchemaContentKey, Java::mondrian.rolap.ConnectionKey)
cons.accessible = true
cons.new_instance(raw_schema_content_key, raw_connection_key)
else
raise ArgumentError, "invalid schema key #{schema_key}"
end
end
|
.raw_schema_pool ⇒ Object
155
156
157
158
159
|
# File 'lib/mondrian/olap/connection.rb', line 155
def self.raw_schema_pool
method = Java::mondrian.rolap.RolapSchemaPool.java_class.declared_method('instance')
method.accessible = true
method.invoke_static
end
|
.shutdown_static_mondrian_server! ⇒ Object
Force shutdown of static MondrianServer, should not normally be used. Can be used in at_exit block if JRuby based plugin is unloaded from other Java application. WARNING: Mondrian will be unusable after calling this method!
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
|
# File 'lib/mondrian/olap/connection.rb', line 232
def self.shutdown_static_mondrian_server!
static_mondrian_server = Java::MondrianOlap::MondrianServer.forId(nil)
mondrian_server_registry = Java::MondrianServer::MondrianServerRegistry::INSTANCE
f = mondrian_server_registry.java_class.declared_field("staticServer")
f.accessible = true
f.set_value(mondrian_server_registry, nil)
static_mondrian_server.shutdown
f = Java::MondrianUtil::ExpiringReference.java_class.declared_field("timer")
f.accessible = true
expiring_reference_timer = f.static_value.to_java
expiring_reference_timer.cancel
cons = Java::MondrianServer.__send__(:"MonitorImpl$ShutdownCommand").java_class.declared_constructor
cons.accessible = true
shutdown_command = cons.new_instance.to_java
cons = Java::MondrianServer.__send__(:"MonitorImpl$Handler").java_class.declared_constructor
cons.accessible = true
handler = cons.new_instance.to_java
pair = Java::mondrian.util.Pair.new handler, shutdown_command
f = Java::MondrianServer::MonitorImpl.java_class.declared_field("ACTOR")
f.accessible = true
monitor_actor = f.static_value.to_java
f = monitor_actor.java_class.declared_field("eventQueue")
f.accessible = true
event_queue = f.value(monitor_actor)
event_queue.put pair
f = Java::mondrian.rolap.RolapConnectionPool.java_class.declared_field("instance")
f.accessible = true
rolap_connection_pool = f.static_value.to_java
f = rolap_connection_pool.java_class.declared_field("mapConnectKeyToPool")
f.accessible = true
map_connect_key_to_pool = f.value(rolap_connection_pool)
map_connect_key_to_pool.values.each do |pool|
pool.close if pool && !pool.isClosed
end
mbs = Java::JavaLangManagement::ManagementFactory.getPlatformMBeanServer
mbean_name = Java::JavaxManagement::ObjectName.new("mondrian.server:type=Server-#{static_mondrian_server.getId}")
begin
mbs.unregisterMBean(mbean_name)
rescue Java::JavaxManagement::InstanceNotFoundException
end
true
end
|
Instance Method Details
#available_role_names ⇒ Object
181
182
183
|
# File 'lib/mondrian/olap/connection.rb', line 181
def available_role_names
@raw_connection.getAvailableRoleNames.to_a
end
|
#close ⇒ Object
70
71
72
73
74
75
76
77
|
# File 'lib/mondrian/olap/connection.rb', line 70
def close
@raw_jdbc_connection = @raw_catalog = @raw_schema = @raw_mondrian_connection = nil
@raw_schema_reader = @raw_cache_control = nil
@raw_connection.close
@raw_connection = nil
@connected = false
true
end
|
#connect ⇒ Object
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
# File 'lib/mondrian/olap/connection.rb', line 20
def connect
Error.wrap_native_exception do
cons = Java::MondrianOlap4j::MondrianOlap4jDriver.java_class.declared_constructor
cons.accessible = true
driver = cons.new_instance.to_java
props = java.util.Properties.new
props.setProperty('JdbcUser', @params[:username]) if @params[:username]
props.setProperty('JdbcPassword', @params[:password]) if @params[:password]
if @driver == 'oracle'
prefetch_rows = @params[:prefetch_rows] || 100
props.setProperty("jdbc.defaultRowPrefetch", prefetch_rows.to_s)
end
conn_string = connection_string
current_thread = Java::JavaLang::Thread.currentThread
class_loader = current_thread.getContextClassLoader
begin
current_thread.setContextClassLoader JRuby.runtime.jruby_class_loader
@raw_jdbc_connection = driver.connect(conn_string, props)
ensure
current_thread.setContextClassLoader(class_loader)
end
@raw_connection = @raw_jdbc_connection.unwrap(Java::OrgOlap4j::OlapConnection.java_class)
@raw_catalog = @raw_connection.getOlapCatalog
@raw_schema = @raw_catalog.getSchemas.first
@raw_mondrian_connection = @raw_connection.getMondrianConnection
@raw_schema_reader = @raw_mondrian_connection.getSchemaReader
@raw_cache_control = @raw_mondrian_connection.getCacheControl(nil)
@connected = true
true
end
end
|
#connected? ⇒ Boolean
66
67
68
|
# File 'lib/mondrian/olap/connection.rb', line 66
def connected?
@connected
end
|
#cube(name) ⇒ Object
144
145
146
|
# File 'lib/mondrian/olap/connection.rb', line 144
def cube(name)
Cube.get(self, name)
end
|
#cube_names ⇒ Object
140
141
142
|
# File 'lib/mondrian/olap/connection.rb', line 140
def cube_names
@raw_schema.getCubes.map{|c| c.getName}
end
|
#execute(query_string, parameters = {}) ⇒ Object
79
80
81
82
83
84
85
86
87
88
89
90
|
# File 'lib/mondrian/olap/connection.rb', line 79
def execute(query_string, parameters = {})
options = {}
Error.wrap_native_exception(options) do
start_time = Time.now
statement = @raw_connection.prepareOlapStatement(query_string)
options[:profiling_statement] = statement if parameters[:profiling]
set_statement_parameters(statement, parameters)
raw_cell_set = statement.executeQuery()
total_duration = ((Time.now - start_time) * 1000).to_i
Result.new(self, raw_cell_set, profiling_handler: statement.getProfileHandler, total_duration: total_duration)
end
end
|
#execute_drill_through(query_string) ⇒ Object
99
100
101
102
103
104
|
# File 'lib/mondrian/olap/connection.rb', line 99
def execute_drill_through(query_string)
Error.wrap_native_exception do
statement = @raw_connection.createStatement
Result::DrillThrough.new(statement.executeQuery(query_string))
end
end
|
#flush_schema ⇒ Object
This method flushes the schema only for this connection (removes from the schema pool).
168
169
170
171
172
|
# File 'lib/mondrian/olap/connection.rb', line 168
def flush_schema
if raw_mondrian_connection && (rolap_schema = raw_mondrian_connection.getSchema)
raw_cache_control.flushSchema(rolap_schema)
end
end
|
#flush_schema_cache ⇒ Object
Will affect only the next created connection. If it is necessary to clear all schema cache then flush_schema_cache should be called, then close and then new connection should be created. This method flushes schemas for all connections (clears the schema pool).
151
152
153
|
# File 'lib/mondrian/olap/connection.rb', line 151
def flush_schema_cache
raw_cache_control.flushSchemaCache
end
|
#from(cube_name) ⇒ Object
106
107
108
|
# File 'lib/mondrian/olap/connection.rb', line 106
def from(cube_name)
Query.from(self, cube_name)
end
|
#jdbc_uri ⇒ Object
292
293
294
295
296
297
298
|
# File 'lib/mondrian/olap/connection.rb', line 292
def jdbc_uri
if respond_to?(method_name = "jdbc_uri_#{@driver}", true)
send method_name
else
raise ArgumentError, 'unknown JDBC driver'
end
end
|
#locale ⇒ Object
211
212
213
|
# File 'lib/mondrian/olap/connection.rb', line 211
def locale
@raw_connection.getLocale.toString
end
|
#locale=(locale) ⇒ Object
215
216
217
218
219
220
|
# File 'lib/mondrian/olap/connection.rb', line 215
def locale=(locale)
locale_elements = locale.to_s.split('_')
raise ArgumentError, "invalid locale string #{locale.inspect}" unless [1, 2, 3].include?(locale_elements.length)
java_locale = Java::JavaUtil::Locale.new(*locale_elements)
@raw_connection.setLocale(java_locale)
end
|
#mondrian_parameter(parameter_name) ⇒ Object
access mondrian.olap.Parameter object
93
94
95
96
97
|
# File 'lib/mondrian/olap/connection.rb', line 93
def mondrian_parameter(parameter_name)
Error.wrap_native_exception do
@raw_schema_reader.getParameter(parameter_name)
end
end
|
#mondrian_server ⇒ Object
access MondrianServer instance
223
224
225
226
227
|
# File 'lib/mondrian/olap/connection.rb', line 223
def mondrian_server
Error.wrap_native_exception do
@raw_connection.getMondrianConnection.getServer
end
end
|
#raw_schema_key ⇒ Object
110
111
112
|
# File 'lib/mondrian/olap/connection.rb', line 110
def raw_schema_key
@raw_mondrian_connection.getSchema.getKey
end
|
#role_name ⇒ Object
185
186
187
|
# File 'lib/mondrian/olap/connection.rb', line 185
def role_name
@raw_connection.getRoleName
end
|
#role_name=(name) ⇒ Object
195
196
197
198
199
|
# File 'lib/mondrian/olap/connection.rb', line 195
def role_name=(name)
Error.wrap_native_exception do
@raw_connection.setRoleName(name)
end
end
|
#role_names ⇒ Object
189
190
191
192
193
|
# File 'lib/mondrian/olap/connection.rb', line 189
def role_names
@raw_connection.java_method(:getRoleNames).call.to_a
end
|
#role_names=(names) ⇒ Object
201
202
203
204
205
206
207
208
209
|
# File 'lib/mondrian/olap/connection.rb', line 201
def role_names=(names)
Error.wrap_native_exception do
names = Array(names)
@raw_connection.java_method(:setRoleNames, [Java::JavaUtil::List.java_class]).call(names)
names
end
end
|
#schema_key ⇒ Object
114
115
116
|
# File 'lib/mondrian/olap/connection.rb', line 114
def schema_key
raw_schema_key.toString
end
|