mondrian-olap 1.2.0 → 1.3.0

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/spec/spec_helper.rb CHANGED
@@ -1,20 +1,18 @@
1
1
  require 'rdoc'
2
2
  require 'rspec'
3
3
  require 'active_record'
4
- # Patched adapter_java.jar with MySQL 8 JDBC driver support
5
- require_relative 'support/jars/adapter_java.jar'
6
4
  require 'activerecord-jdbc-adapter'
7
- require 'coffee-script'
8
- require 'rhino'
9
5
  require 'pry'
10
6
 
11
- # autoload corresponding JDBC driver during require 'jdbc/...'
7
+ # Autoload corresponding JDBC driver during require 'jdbc/...'
12
8
  Java::JavaLang::System.setProperty("jdbc.driver.autoload", "true")
13
9
 
14
10
  MONDRIAN_DRIVER = ENV['MONDRIAN_DRIVER'] || 'mysql'
15
11
  env_prefix = MONDRIAN_DRIVER.upcase
16
12
 
17
13
  DATABASE_HOST = ENV["#{env_prefix}_DATABASE_HOST"] || ENV['DATABASE_HOST'] || 'localhost'
14
+ DATABASE_PORT = ENV["#{env_prefix}_DATABASE_PORT"] || ENV['DATABASE_PORT']
15
+ DATABASE_PROTOCOL = ENV["#{env_prefix}_DATABASE_PROTOCOL"] || ENV['DATABASE_PROTOCOL']
18
16
  DATABASE_USER = ENV["#{env_prefix}_DATABASE_USER"] || ENV['DATABASE_USER'] || 'mondrian_test'
19
17
  DATABASE_PASSWORD = ENV["#{env_prefix}_DATABASE_PASSWORD"] || ENV['DATABASE_PASSWORD'] || 'mondrian_test'
20
18
  DATABASE_NAME = ENV["#{env_prefix}_DATABASE_NAME"] || ENV['DATABASE_NAME'] || 'mondrian_test'
@@ -22,37 +20,130 @@ DATABASE_INSTANCE = ENV["#{env_prefix}_DATABASE_INSTANCE"] || ENV['DATABASE_INST
22
20
 
23
21
  case MONDRIAN_DRIVER
24
22
  when 'mysql', 'jdbc_mysql'
25
- require 'jdbc/mysql'
23
+ if jdbc_driver_file = Dir[File.expand_path("mysql*.jar", 'spec/support/jars')].first
24
+ require jdbc_driver_file
25
+ else
26
+ require 'jdbc/mysql'
27
+ end
26
28
  JDBC_DRIVER = (Java::com.mysql.cj.jdbc.Driver rescue nil) ? 'com.mysql.cj.jdbc.Driver' : 'com.mysql.jdbc.Driver'
29
+
27
30
  when 'postgresql'
28
31
  require 'jdbc/postgres'
29
32
  JDBC_DRIVER = 'org.postgresql.Driver'
33
+ require 'arjdbc/postgresql'
34
+
30
35
  when 'oracle'
36
+ Dir[File.expand_path("ojdbc*.jar", 'spec/support/jars')].each do |jdbc_driver_file|
37
+ require jdbc_driver_file
38
+ end
31
39
  require 'active_record/connection_adapters/oracle_enhanced_adapter'
40
+ ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.class_eval do
41
+ # Start primary key sequences from 1 (and not 10000) and take just one next value in each session
42
+ self.default_sequence_start_value = "1 NOCACHE INCREMENT BY 1"
43
+ # PATCH: Restore previous mapping of ActiveRecord datetime to DATE type.
44
+ def supports_datetime_with_precision?; false; end
45
+ # PATCH: Do not send fractional seconds to DATE type.
46
+ def quoted_date(value)
47
+ if value.acts_like?(:time)
48
+ zone_conversion_method = ActiveRecord::Base.default_timezone == :utc ? :getutc : :getlocal
49
+ if value.respond_to?(zone_conversion_method)
50
+ value = value.send(zone_conversion_method)
51
+ end
52
+ end
53
+ value.to_s(:db)
54
+ end
55
+ private
56
+ # PATCH: Restore previous mapping of ActiveRecord datetime to DATE type.
57
+ const_get(:NATIVE_DATABASE_TYPES)[:datetime] = {name: "DATE"}
58
+ alias_method :original_initialize_type_map, :initialize_type_map
59
+ def initialize_type_map(m = type_map)
60
+ original_initialize_type_map(m)
61
+ # PATCH: Map Oracle DATE to DateTime for backwards compatibility
62
+ register_class_with_precision m, %r(date)i, ActiveRecord::Type::DateTime
63
+ end
64
+ end
32
65
  CATALOG_FILE = File.expand_path('../fixtures/MondrianTestOracle.xml', __FILE__)
33
- when 'mssql'
34
- require 'jdbc/jtds'
35
- JDBC_DRIVER = 'net.sourceforge.jtds.jdbc.Driver'
66
+
36
67
  when 'sqlserver'
37
- Dir[File.expand_path("{mssql-jdbc,sqljdbc}*.jar", 'spec/support/jars')].each do |jdbc_driver_file|
68
+ Dir[File.expand_path("mssql-jdbc*.jar", 'spec/support/jars')].each do |jdbc_driver_file|
38
69
  require jdbc_driver_file
39
70
  end
71
+ require 'arjdbc/jdbc/adapter'
72
+ ActiveRecord::ConnectionAdapters::JdbcAdapter.class_eval do
73
+ def initialize(connection, logger = nil, connection_parameters = nil, config = {})
74
+ super(connection, logger, config.dup)
75
+ end
76
+ def modify_types(types)
77
+ types.merge!(
78
+ primary_key: 'bigint NOT NULL IDENTITY(1,1) PRIMARY KEY',
79
+ integer: {name: 'int'},
80
+ bigint: {name: 'bigint'},
81
+ boolean: {name: 'bit'},
82
+ decimal: {name: 'decimal'},
83
+ date: {name: 'date'},
84
+ datetime: {name: 'datetime'},
85
+ timestamp: {name: 'datetime'},
86
+ string: {name: 'nvarchar', limit: 4000},
87
+ text: {name: 'nvarchar(max)'}
88
+ )
89
+ end
90
+ def quote_table_name(name)
91
+ name.to_s.split('.').map { |n| quote_column_name(n) }.join('.')
92
+ end
93
+ def quote_column_name(name)
94
+ "[#{name.to_s}]"
95
+ end
96
+ def columns(table_name, name = nil)
97
+ select_all(
98
+ "SELECT * FROM information_schema.columns WHERE table_name = #{quote table_name}"
99
+ ).map do |column|
100
+ ActiveRecord::ConnectionAdapters::Column.new(
101
+ column['COLUMN_NAME'],
102
+ column['COLUMN_DEFAULT'],
103
+ fetch_type_metadata(column['DATA_TYPE']),
104
+ column['IS_NULLABLE']
105
+ )
106
+ end
107
+ end
108
+ def write_query?(sql)
109
+ sql =~ /\A(INSERT|UPDATE|DELETE) /
110
+ end
111
+ end
112
+ ::Arel::Visitors::ToSql.class_eval do
113
+ private
114
+ def visit_Arel_Nodes_Limit(o, collector)
115
+ # Do not add LIMIT as it is not supported by MS SQL Server
116
+ collector
117
+ end
118
+ end
119
+ require "active_model/type/integer"
120
+ ActiveModel::Type::Integer::DEFAULT_LIMIT = 8
40
121
  JDBC_DRIVER = 'com.microsoft.sqlserver.jdbc.SQLServerDriver'
122
+
41
123
  when 'vertica'
42
124
  Dir[File.expand_path("vertica*.jar", 'spec/support/jars')].each do |jdbc_driver_file|
43
125
  require jdbc_driver_file
44
126
  end
45
127
  JDBC_DRIVER = 'com.vertica.jdbc.Driver'
46
128
  DATABASE_SCHEMA = ENV["#{env_prefix}_DATABASE_SCHEMA"] || ENV['DATABASE_SCHEMA'] || 'mondrian_test'
47
- # patches for Vertica minimal AR support
48
129
  require 'arjdbc/jdbc/adapter'
49
130
  ActiveRecord::ConnectionAdapters::JdbcAdapter.class_eval do
50
- def modify_types(tp)
51
- # mapping of ActiveRecord data types to Vertica data types
52
- tp[:primary_key] = "int" # Use int instead of identity as data cannot be loaded into identity columns
53
- tp[:integer] = "int"
131
+ def initialize(connection, logger = nil, connection_parameters = nil, config = {})
132
+ super(connection, logger, config.dup)
133
+ end
134
+ def modify_types(types)
135
+ types[:primary_key] = "int" # Use int instead of identity as data cannot be loaded into identity columns
136
+ types[:integer] = "int"
54
137
  end
55
- # by default Vertica stores table and column names in uppercase
138
+ def type_to_sql(type, limit: nil, precision: nil, scale: nil, **)
139
+ case type.to_sym
140
+ when :integer, :primary_key
141
+ 'int' # All integers are 64-bit in Vertica and limit should be ignored
142
+ else
143
+ super
144
+ end
145
+ end
146
+ # By default Vertica stores table and column names in uppercase
56
147
  def quote_table_name(name)
57
148
  "\"#{name.to_s}\""
58
149
  end
@@ -64,6 +155,7 @@ when 'vertica'
64
155
  exec_update(sql, name, binds)
65
156
  end
66
157
  end
158
+
67
159
  when 'snowflake'
68
160
  Dir[File.expand_path("snowflake*.jar", 'spec/support/jars')].each do |jdbc_driver_file|
69
161
  require jdbc_driver_file
@@ -74,10 +166,12 @@ when 'snowflake'
74
166
  CATALOG_FILE = File.expand_path('../fixtures/MondrianTestOracle.xml', __FILE__)
75
167
  require 'arjdbc/jdbc/adapter'
76
168
  ActiveRecord::ConnectionAdapters::JdbcAdapter.class_eval do
77
- def modify_types(tp)
78
- # mapping of ActiveRecord data types to Snowflake data types
79
- tp[:primary_key] = "integer"
80
- tp[:integer] = "integer"
169
+ def initialize(connection, logger = nil, connection_parameters = nil, config = {})
170
+ super(connection, logger, config.dup)
171
+ end
172
+ def modify_types(types)
173
+ types[:primary_key] = 'integer'
174
+ types[:integer] = 'integer'
81
175
  end
82
176
  # exec_insert tries to use Statement.RETURN_GENERATED_KEYS which is not supported by Snowflake
83
177
  def exec_insert(sql, name, binds, pk = nil, sequence_name = nil)
@@ -88,37 +182,171 @@ when 'snowflake'
88
182
  # Hack to disable :text and :binary types for Snowflake
89
183
  ActiveRecord::ConnectionAdapters::JdbcTypeConverter::AR_TO_JDBC_TYPES.delete(:text)
90
184
  ActiveRecord::ConnectionAdapters::JdbcTypeConverter::AR_TO_JDBC_TYPES.delete(:binary)
185
+
186
+ when 'clickhouse'
187
+ Dir[File.expand_path("clickhouse*.jar", 'spec/support/jars')].each do |jdbc_driver_file|
188
+ require jdbc_driver_file
189
+ end
190
+ JDBC_DRIVER = 'com.clickhouse.jdbc.ClickHouseDriver'
191
+ DATABASE_SCHEMA = ENV["#{env_prefix}_DATABASE_SCHEMA"] || ENV['DATABASE_SCHEMA'] || 'mondrian_test'
192
+ require 'arjdbc/jdbc/adapter'
193
+ ActiveRecord::ConnectionAdapters::JdbcAdapter.class_eval do
194
+ def initialize(connection, logger = nil, connection_parameters = nil, config = {})
195
+ super(connection, logger, config.dup)
196
+ end
197
+ NATIVE_DATABASE_TYPES = {
198
+ primary_key: "Int32", # We do not need automatic primary key generation and need to allow inserting PK values
199
+ string: {name: "String"},
200
+ text: {name: "String"},
201
+ integer: {name: "Int32"},
202
+ float: {name: "Float64"},
203
+ numeric: {name: "Decimal"},
204
+ decimal: {name: "Decimal"},
205
+ datetime: {name: "DateTime"},
206
+ timestamp: {name: "DateTime"},
207
+ time: {name: "DateTime"},
208
+ date: {name: "Date"},
209
+ binary: {name: "String"},
210
+ boolean: {name: "Boolean"},
211
+ }
212
+ def native_database_types
213
+ NATIVE_DATABASE_TYPES
214
+ end
215
+ def modify_types(types)
216
+ types[:primary_key] = 'Int32'
217
+ types[:integer] = 'Int32'
218
+ end
219
+ def type_to_sql(type, limit: nil, precision: nil, scale: nil, **)
220
+ case type.to_sym
221
+ when :integer, :primary_key
222
+ return 'Int32' unless limit
223
+ case limit.to_i
224
+ when 1 then 'Int8'
225
+ when 2 then 'Int16'
226
+ when 3, 4 then 'Int32'
227
+ when 5..8 then 'Int64'
228
+ else raise ActiveRecord::ActiveRecordError,
229
+ "No integer type has byte size #{limit}. Use a numeric with precision 0 instead."
230
+ end
231
+ # Ignore limit for string and text
232
+ when :string, :text
233
+ super(type)
234
+ else
235
+ super
236
+ end
237
+ end
238
+ def quote_table_name(name)
239
+ "`#{name.to_s}`"
240
+ end
241
+ def quote_column_name(name)
242
+ "`#{name.to_s}`"
243
+ end
244
+ def create_table(name, options = {})
245
+ super(name, {options: "ENGINE=MergeTree ORDER BY tuple()"}.merge(options))
246
+ end
247
+ alias_method :exec_update_original, :exec_update
248
+ # exec_insert tries to use Statement.RETURN_GENERATED_KEYS which is not supported by ClickHouse
249
+ def exec_insert(sql, name, binds, pk = nil, sequence_name = nil)
250
+ exec_update_original(sql, name, binds)
251
+ end
252
+ # Modify UPDATE statements for ClickHouse specific syntax
253
+ def exec_update(sql, name, binds)
254
+ if sql =~ /\AUPDATE (.*) SET (.*)\z/
255
+ sql = "ALTER TABLE #{$1} UPDATE #{$2}"
256
+ end
257
+ exec_update_original(sql, name, binds)
258
+ end
259
+ end
260
+
261
+ when 'mariadb'
262
+ Dir[File.expand_path("mariadb*.jar", 'spec/support/jars')].each do |jdbc_driver_file|
263
+ require jdbc_driver_file
264
+ end
265
+ JDBC_DRIVER = 'org.mariadb.jdbc.Driver'
266
+ require 'arjdbc/jdbc/adapter'
267
+ ActiveRecord::ConnectionAdapters::JdbcAdapter.class_eval do
268
+ def initialize(connection, logger = nil, connection_parameters = nil, config = {})
269
+ super(connection, logger, config.dup)
270
+ end
271
+ def modify_types(types)
272
+ types[:primary_key] = "integer"
273
+ types[:integer] = "integer"
274
+ end
275
+ def type_to_sql(type, limit: nil, precision: nil, scale: nil, **)
276
+ case type.to_sym
277
+ when :integer, :primary_key
278
+ return 'integer' unless limit
279
+ case limit.to_i
280
+ when 1 then 'tinyint'
281
+ when 2 then 'smallint'
282
+ when 3 then 'mediumint'
283
+ when 4 then 'integer'
284
+ when 5..8 then 'bigint'
285
+ else raise ActiveRecord::ActiveRecordError,
286
+ "No integer type has byte size #{limit}. Use a numeric with precision 0 instead."
287
+ end
288
+ when :text
289
+ case limit
290
+ when 0..0xff then 'tinytext'
291
+ when nil, 0x100..0xffff then 'text'
292
+ when 0x10000..0xffffff then'mediumtext'
293
+ when 0x1000000..0xffffffff then 'longtext'
294
+ else raise ActiveRecordError, "No text type has character length #{limit}"
295
+ end
296
+ else
297
+ super
298
+ end
299
+ end
300
+ def quote_table_name(name)
301
+ "`#{name.to_s}`"
302
+ end
303
+ def quote_column_name(name)
304
+ "`#{name.to_s}`"
305
+ end
306
+ def execute(sql, name = nil, binds = nil)
307
+ exec_update(sql, name, binds)
308
+ end
309
+ def create_table(name, options = {})
310
+ super(name, {options: "ENGINE=Columnstore DEFAULT CHARSET=utf8"}.merge(options))
311
+ end
312
+ end
91
313
  end
92
314
 
93
315
  puts "==> Using #{MONDRIAN_DRIVER} driver"
94
316
 
317
+ # Necessary for Aggregate optimizations test
318
+ Java::JavaLang::System.setProperty("mondrian.rolap.EnableInMemoryRollup", "false")
319
+
95
320
  require 'mondrian/olap'
96
321
  require_relative 'support/matchers/be_like'
97
322
 
98
323
  RSpec.configure do |config|
99
324
  config.include Matchers
325
+ config.expect_with(:rspec) { |c| c.syntax = [:should, :expect] }
100
326
  end
101
327
 
102
328
  CATALOG_FILE = File.expand_path('../fixtures/MondrianTest.xml', __FILE__) unless defined?(CATALOG_FILE)
103
329
 
104
330
  CONNECTION_PARAMS = if MONDRIAN_DRIVER =~ /^jdbc/
105
331
  {
106
- :driver => 'jdbc',
107
- :jdbc_url => "jdbc:#{MONDRIAN_DRIVER.split('_').last}://#{DATABASE_HOST}/#{DATABASE_NAME}",
108
- :jdbc_driver => JDBC_DRIVER,
109
- :username => DATABASE_USER,
110
- :password => DATABASE_PASSWORD
332
+ driver: 'jdbc',
333
+ jdbc_url: "jdbc:#{MONDRIAN_DRIVER.split('_').last}://#{DATABASE_HOST}/#{DATABASE_NAME}",
334
+ jdbc_driver: JDBC_DRIVER,
335
+ username: DATABASE_USER,
336
+ password: DATABASE_PASSWORD
111
337
  }
112
338
  else
113
339
  {
114
- # uncomment to test PostgreSQL SSL connection
115
- # :properties => {'ssl'=>'true','sslfactory'=>'org.postgresql.ssl.NonValidatingFactory'},
116
- :driver => MONDRIAN_DRIVER,
117
- :host => DATABASE_HOST,
118
- :database => DATABASE_NAME,
119
- :username => DATABASE_USER,
120
- :password => DATABASE_PASSWORD
121
- }
340
+ # Uncomment to test PostgreSQL SSL connection
341
+ # properties: {'ssl'=>'true','sslfactory'=>'org.postgresql.ssl.NonValidatingFactory'},
342
+ driver: MONDRIAN_DRIVER,
343
+ host: DATABASE_HOST,
344
+ port: DATABASE_PORT,
345
+ protocol: DATABASE_PROTOCOL.presence,
346
+ database: DATABASE_NAME,
347
+ username: DATABASE_USER,
348
+ password: DATABASE_PASSWORD
349
+ }.compact
122
350
  end
123
351
  case MONDRIAN_DRIVER
124
352
  when 'mysql'
@@ -130,39 +358,31 @@ end
130
358
  case MONDRIAN_DRIVER
131
359
  when 'mysql', 'postgresql'
132
360
  AR_CONNECTION_PARAMS = CONNECTION_PARAMS.slice(:host, :database, :username, :password).merge(
133
- :adapter => MONDRIAN_DRIVER,
134
- :properties => CONNECTION_PARAMS[:properties].dup || {}
361
+ adapter: MONDRIAN_DRIVER,
362
+ driver: JDBC_DRIVER,
363
+ properties: CONNECTION_PARAMS[:properties].dup || {}
135
364
  )
136
365
  when 'oracle'
137
366
  AR_CONNECTION_PARAMS = {
138
- :adapter => 'oracle_enhanced',
139
- :host => CONNECTION_PARAMS[:host],
140
- :database => CONNECTION_PARAMS[:database],
141
- :username => CONNECTION_PARAMS[:username],
142
- :password => CONNECTION_PARAMS[:password]
143
- }
144
- when 'mssql'
145
- url = "jdbc:jtds:sqlserver://#{CONNECTION_PARAMS[:host]}/#{CONNECTION_PARAMS[:database]}"
146
- url << ";instance=#{DATABASE_INSTANCE}" if DATABASE_INSTANCE
147
- AR_CONNECTION_PARAMS = {
148
- :adapter => 'jdbc',
149
- :dialect => 'Microsoft SQL Server',
150
- :driver => JDBC_DRIVER,
151
- :url => url,
152
- :username => CONNECTION_PARAMS[:username],
153
- :password => CONNECTION_PARAMS[:password],
154
- :connection_alive_sql => 'SELECT 1'
367
+ adapter: 'oracle_enhanced',
368
+ host: CONNECTION_PARAMS[:host],
369
+ database: CONNECTION_PARAMS[:database],
370
+ username: CONNECTION_PARAMS[:username],
371
+ password: CONNECTION_PARAMS[:password],
372
+ nls_numeric_characters: '.,'
155
373
  }
156
374
  when 'sqlserver'
157
375
  url = "jdbc:sqlserver://#{CONNECTION_PARAMS[:host]};databaseName=#{CONNECTION_PARAMS[:database]};"
158
376
  url << ";instanceName=#{DATABASE_INSTANCE}" if DATABASE_INSTANCE
159
377
  AR_CONNECTION_PARAMS = {
160
- :adapter => 'jdbc',
161
- :driver => JDBC_DRIVER,
162
- :url => url,
163
- :username => CONNECTION_PARAMS[:username],
164
- :password => CONNECTION_PARAMS[:password],
165
- :connection_alive_sql => 'SELECT 1'
378
+ adapter: 'jdbc',
379
+ driver: JDBC_DRIVER,
380
+ url: url,
381
+ username: CONNECTION_PARAMS[:username],
382
+ password: CONNECTION_PARAMS[:password],
383
+ connection_alive_sql: 'SELECT 1',
384
+ sqlserver_version: ENV['SQLSERVER_VERSION'],
385
+ dialect: 'jdbc'
166
386
  }
167
387
  when 'vertica'
168
388
  CONNECTION_PARAMS[:properties] = {
@@ -170,11 +390,12 @@ when 'vertica'
170
390
  }
171
391
  AR_CONNECTION_PARAMS = {
172
392
  adapter: 'jdbc',
173
- driver: JDBC_DRIVER,
174
- url: "jdbc:#{MONDRIAN_DRIVER}://#{CONNECTION_PARAMS[:host]}/#{CONNECTION_PARAMS[:database]}" \
393
+ driver: JDBC_DRIVER,
394
+ url: "jdbc:#{MONDRIAN_DRIVER}://#{CONNECTION_PARAMS[:host]}/#{CONNECTION_PARAMS[:database]}" \
175
395
  "?SearchPath=#{DATABASE_SCHEMA}", # &LogLevel=DEBUG
176
396
  username: CONNECTION_PARAMS[:username],
177
- password: CONNECTION_PARAMS[:password]
397
+ password: CONNECTION_PARAMS[:password],
398
+ dialect: 'jdbc'
178
399
  }
179
400
  when 'snowflake'
180
401
  CONNECTION_PARAMS[:database_schema] = DATABASE_SCHEMA
@@ -184,30 +405,51 @@ when 'snowflake'
184
405
  }
185
406
  AR_CONNECTION_PARAMS = {
186
407
  adapter: 'jdbc',
187
- driver: JDBC_DRIVER,
188
- url: "jdbc:#{MONDRIAN_DRIVER}://#{CONNECTION_PARAMS[:host]}/?db=#{CONNECTION_PARAMS[:database]}" \
408
+ driver: JDBC_DRIVER,
409
+ url: "jdbc:#{MONDRIAN_DRIVER}://#{CONNECTION_PARAMS[:host]}/?db=#{CONNECTION_PARAMS[:database]}" \
189
410
  "&schema=#{DATABASE_SCHEMA}&warehouse=#{WAREHOUSE_NAME}", # &tracing=ALL
190
411
  username: CONNECTION_PARAMS[:username],
191
- password: CONNECTION_PARAMS[:password]
412
+ password: CONNECTION_PARAMS[:password],
413
+ dialect: 'jdbc'
414
+ }
415
+ when 'clickhouse'
416
+ # CREATE USER mondrian_test IDENTIFIED WITH plaintext_password BY 'mondrian_test';
417
+ # CREATE DATABASE mondrian_test;
418
+ # GRANT ALL ON mondrian_test.* TO mondrian_test;
419
+
420
+ # For testing different protocols
421
+ # CONNECTION_PARAMS[:protocol] = 'http'
422
+ # CONNECTION_PARAMS[:properties] ={'http_connection_provider' => 'APACHE_HTTP_CLIENT'}
423
+
424
+ AR_CONNECTION_PARAMS = {
425
+ adapter: 'jdbc',
426
+ driver: JDBC_DRIVER,
427
+ url: "jdbc:ch:#{CONNECTION_PARAMS[:protocol]&.+(':')}//#{CONNECTION_PARAMS[:host]}/#{CONNECTION_PARAMS[:database]}",
428
+ username: CONNECTION_PARAMS[:username],
429
+ password: CONNECTION_PARAMS[:password],
430
+ dialect: 'jdbc'
192
431
  }
193
432
  when /jdbc/
194
433
  AR_CONNECTION_PARAMS = {
195
- :adapter => 'jdbc',
196
- :driver => JDBC_DRIVER,
197
- :url => CONNECTION_PARAMS[:jdbc_url],
198
- :username => CONNECTION_PARAMS[:username],
199
- :password => CONNECTION_PARAMS[:password]
434
+ adapter: MONDRIAN_DRIVER =~ /mysql/ ? 'mysql' : 'jdbc',
435
+ driver: JDBC_DRIVER,
436
+ url: CONNECTION_PARAMS[:jdbc_url],
437
+ username: CONNECTION_PARAMS[:username],
438
+ password: CONNECTION_PARAMS[:password],
439
+ dialect: MONDRIAN_DRIVER =~ /mysql/ ? 'mysql' : 'jdbc'
200
440
  }
201
441
  else
202
442
  AR_CONNECTION_PARAMS = {
203
- :adapter => 'jdbc',
204
- :driver => JDBC_DRIVER,
205
- :url => "jdbc:#{MONDRIAN_DRIVER}://#{CONNECTION_PARAMS[:host]}/#{CONNECTION_PARAMS[:database]}",
206
- :username => CONNECTION_PARAMS[:username],
207
- :password => CONNECTION_PARAMS[:password]
443
+ adapter: 'jdbc',
444
+ driver: JDBC_DRIVER,
445
+ url: "jdbc:#{MONDRIAN_DRIVER}://#{CONNECTION_PARAMS[:host]}" +
446
+ (CONNECTION_PARAMS[:port] ? ":#{CONNECTION_PARAMS[:port]}" : "") + "/#{CONNECTION_PARAMS[:database]}",
447
+ username: CONNECTION_PARAMS[:username],
448
+ password: CONNECTION_PARAMS[:password],
449
+ dialect: 'jdbc'
208
450
  }
209
451
  end
210
452
 
211
- CONNECTION_PARAMS_WITH_CATALOG = CONNECTION_PARAMS.merge(:catalog => CATALOG_FILE)
453
+ CONNECTION_PARAMS_WITH_CATALOG = CONNECTION_PARAMS.merge(catalog: CATALOG_FILE)
212
454
 
213
455
  ActiveRecord::Base.establish_connection(AR_CONNECTION_PARAMS)