mondrian-olap 1.1.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.
- checksums.yaml +4 -4
- data/Changelog.md +33 -0
- data/LICENSE-Mondrian.txt +87 -0
- data/LICENSE.txt +1 -1
- data/README.md +4 -4
- data/VERSION +1 -1
- data/lib/mondrian/jars/guava-17.0.jar +0 -0
- data/lib/mondrian/jars/log4j-api-2.17.1.jar +0 -0
- data/lib/mondrian/jars/log4j-core-2.17.1.jar +0 -0
- data/lib/mondrian/jars/log4j2-config.jar +0 -0
- data/lib/mondrian/jars/mondrian-9.3.0.0.jar +0 -0
- data/lib/mondrian/olap/connection.rb +126 -73
- data/lib/mondrian/olap/cube.rb +46 -4
- data/lib/mondrian/olap/error.rb +10 -2
- data/lib/mondrian/olap/query.rb +1 -0
- data/lib/mondrian/olap/result.rb +132 -56
- data/lib/mondrian/olap/schema.rb +9 -3
- data/lib/mondrian/olap/schema_element.rb +6 -3
- data/lib/mondrian/olap/schema_udf.rb +8 -82
- data/lib/mondrian/olap.rb +11 -7
- data/spec/connection_role_spec.rb +4 -1
- data/spec/connection_spec.rb +38 -5
- data/spec/cube_cache_control_spec.rb +7 -17
- data/spec/cube_spec.rb +36 -2
- data/spec/fixtures/MondrianTest.xml +40 -6
- data/spec/fixtures/MondrianTestOracle.xml +40 -6
- data/spec/mondrian_spec.rb +203 -1
- data/spec/query_spec.rb +94 -25
- data/spec/rake_tasks.rb +319 -165
- data/spec/schema_definition_spec.rb +8 -241
- data/spec/spec_helper.rb +330 -112
- data/spec/support/data/customers.csv +10902 -0
- data/spec/support/data/product_classes.csv +101 -0
- data/spec/support/data/products.csv +101 -0
- data/spec/support/data/promotions.csv +11 -0
- data/spec/support/data/sales.csv +101 -0
- data/spec/support/data/time.csv +731 -0
- data/spec/support/data/warehouse.csv +101 -0
- data/spec/support/matchers/be_like.rb +1 -0
- metadata +42 -83
- data/LICENSE-Mondrian.html +0 -259
- data/lib/mondrian/jars/log4j-1.2.17.jar +0 -0
- data/lib/mondrian/jars/log4j.properties +0 -3
- data/lib/mondrian/jars/mondrian-8.3.0.5.jar +0 -0
data/spec/spec_helper.rb
CHANGED
@@ -2,55 +2,148 @@ require 'rdoc'
|
|
2
2
|
require 'rspec'
|
3
3
|
require 'active_record'
|
4
4
|
require 'activerecord-jdbc-adapter'
|
5
|
-
require 'coffee-script'
|
6
|
-
require 'rhino'
|
7
5
|
require 'pry'
|
8
6
|
|
9
|
-
#
|
7
|
+
# Autoload corresponding JDBC driver during require 'jdbc/...'
|
10
8
|
Java::JavaLang::System.setProperty("jdbc.driver.autoload", "true")
|
11
9
|
|
12
10
|
MONDRIAN_DRIVER = ENV['MONDRIAN_DRIVER'] || 'mysql'
|
13
11
|
env_prefix = MONDRIAN_DRIVER.upcase
|
14
12
|
|
15
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']
|
16
16
|
DATABASE_USER = ENV["#{env_prefix}_DATABASE_USER"] || ENV['DATABASE_USER'] || 'mondrian_test'
|
17
|
-
DATABASE_PASSWORD = ENV["#{env_prefix}
|
17
|
+
DATABASE_PASSWORD = ENV["#{env_prefix}_DATABASE_PASSWORD"] || ENV['DATABASE_PASSWORD'] || 'mondrian_test'
|
18
18
|
DATABASE_NAME = ENV["#{env_prefix}_DATABASE_NAME"] || ENV['DATABASE_NAME'] || 'mondrian_test'
|
19
19
|
DATABASE_INSTANCE = ENV["#{env_prefix}_DATABASE_INSTANCE"] || ENV['DATABASE_INSTANCE']
|
20
20
|
|
21
21
|
case MONDRIAN_DRIVER
|
22
22
|
when 'mysql', 'jdbc_mysql'
|
23
|
-
|
24
|
-
|
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
|
28
|
+
JDBC_DRIVER = (Java::com.mysql.cj.jdbc.Driver rescue nil) ? 'com.mysql.cj.jdbc.Driver' : 'com.mysql.jdbc.Driver'
|
29
|
+
|
25
30
|
when 'postgresql'
|
26
31
|
require 'jdbc/postgres'
|
27
32
|
JDBC_DRIVER = 'org.postgresql.Driver'
|
33
|
+
require 'arjdbc/postgresql'
|
34
|
+
|
28
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
|
29
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
|
30
65
|
CATALOG_FILE = File.expand_path('../fixtures/MondrianTestOracle.xml', __FILE__)
|
31
|
-
|
32
|
-
require 'jdbc/jtds'
|
33
|
-
JDBC_DRIVER = 'net.sourceforge.jtds.jdbc.Driver'
|
66
|
+
|
34
67
|
when 'sqlserver'
|
35
|
-
Dir[File.expand_path("
|
68
|
+
Dir[File.expand_path("mssql-jdbc*.jar", 'spec/support/jars')].each do |jdbc_driver_file|
|
36
69
|
require jdbc_driver_file
|
37
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
|
38
121
|
JDBC_DRIVER = 'com.microsoft.sqlserver.jdbc.SQLServerDriver'
|
122
|
+
|
39
123
|
when 'vertica'
|
40
124
|
Dir[File.expand_path("vertica*.jar", 'spec/support/jars')].each do |jdbc_driver_file|
|
41
125
|
require jdbc_driver_file
|
42
126
|
end
|
43
127
|
JDBC_DRIVER = 'com.vertica.jdbc.Driver'
|
44
128
|
DATABASE_SCHEMA = ENV["#{env_prefix}_DATABASE_SCHEMA"] || ENV['DATABASE_SCHEMA'] || 'mondrian_test'
|
45
|
-
# patches for Vertica minimal AR support
|
46
129
|
require 'arjdbc/jdbc/adapter'
|
47
130
|
ActiveRecord::ConnectionAdapters::JdbcAdapter.class_eval do
|
48
|
-
def
|
49
|
-
|
50
|
-
|
51
|
-
|
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"
|
137
|
+
end
|
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
|
52
145
|
end
|
53
|
-
#
|
146
|
+
# By default Vertica stores table and column names in uppercase
|
54
147
|
def quote_table_name(name)
|
55
148
|
"\"#{name.to_s}\""
|
56
149
|
end
|
@@ -62,6 +155,7 @@ when 'vertica'
|
|
62
155
|
exec_update(sql, name, binds)
|
63
156
|
end
|
64
157
|
end
|
158
|
+
|
65
159
|
when 'snowflake'
|
66
160
|
Dir[File.expand_path("snowflake*.jar", 'spec/support/jars')].each do |jdbc_driver_file|
|
67
161
|
require jdbc_driver_file
|
@@ -72,166 +166,290 @@ when 'snowflake'
|
|
72
166
|
CATALOG_FILE = File.expand_path('../fixtures/MondrianTestOracle.xml', __FILE__)
|
73
167
|
require 'arjdbc/jdbc/adapter'
|
74
168
|
ActiveRecord::ConnectionAdapters::JdbcAdapter.class_eval do
|
75
|
-
def
|
76
|
-
|
77
|
-
|
78
|
-
|
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'
|
175
|
+
end
|
176
|
+
# exec_insert tries to use Statement.RETURN_GENERATED_KEYS which is not supported by Snowflake
|
177
|
+
def exec_insert(sql, name, binds, pk = nil, sequence_name = nil)
|
178
|
+
exec_update(sql, name, binds)
|
79
179
|
end
|
80
180
|
end
|
81
181
|
require 'arjdbc/jdbc/type_converter'
|
82
182
|
# Hack to disable :text and :binary types for Snowflake
|
83
183
|
ActiveRecord::ConnectionAdapters::JdbcTypeConverter::AR_TO_JDBC_TYPES.delete(:text)
|
84
184
|
ActiveRecord::ConnectionAdapters::JdbcTypeConverter::AR_TO_JDBC_TYPES.delete(:binary)
|
85
|
-
when 'luciddb'
|
86
|
-
require 'jdbc/luciddb'
|
87
|
-
CATALOG_FILE = File.expand_path('../fixtures/MondrianTestOracle.xml', __FILE__)
|
88
185
|
|
89
|
-
|
90
|
-
|
91
|
-
|
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
|
92
260
|
|
93
|
-
|
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'
|
94
266
|
require 'arjdbc/jdbc/adapter'
|
95
267
|
ActiveRecord::ConnectionAdapters::JdbcAdapter.class_eval do
|
96
|
-
def
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
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
|
101
299
|
end
|
102
|
-
# by default LucidDB stores table and column names in uppercase
|
103
300
|
def quote_table_name(name)
|
104
|
-
"
|
301
|
+
"`#{name.to_s}`"
|
105
302
|
end
|
106
303
|
def quote_column_name(name)
|
107
|
-
"
|
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))
|
108
311
|
end
|
109
312
|
end
|
110
|
-
JDBC_DRIVER = 'org.luciddb.jdbc.LucidDbClientDriver'
|
111
|
-
DATABASE_USER.upcase! if DATABASE_USER == 'mondrian_test'
|
112
|
-
DATABASE_NAME = nil
|
113
|
-
DATABASE_SCHEMA = ENV['DATABASE_SCHEMA'] || 'mondrian_test'
|
114
313
|
end
|
115
314
|
|
116
315
|
puts "==> Using #{MONDRIAN_DRIVER} driver"
|
117
316
|
|
317
|
+
# Necessary for Aggregate optimizations test
|
318
|
+
Java::JavaLang::System.setProperty("mondrian.rolap.EnableInMemoryRollup", "false")
|
319
|
+
|
118
320
|
require 'mondrian/olap'
|
119
321
|
require_relative 'support/matchers/be_like'
|
120
322
|
|
121
323
|
RSpec.configure do |config|
|
122
324
|
config.include Matchers
|
325
|
+
config.expect_with(:rspec) { |c| c.syntax = [:should, :expect] }
|
123
326
|
end
|
124
327
|
|
125
328
|
CATALOG_FILE = File.expand_path('../fixtures/MondrianTest.xml', __FILE__) unless defined?(CATALOG_FILE)
|
126
329
|
|
127
330
|
CONNECTION_PARAMS = if MONDRIAN_DRIVER =~ /^jdbc/
|
128
331
|
{
|
129
|
-
:
|
130
|
-
:
|
131
|
-
:
|
132
|
-
:
|
133
|
-
:
|
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
|
134
337
|
}
|
135
338
|
else
|
136
339
|
{
|
137
|
-
#
|
138
|
-
# :
|
139
|
-
:
|
140
|
-
:
|
141
|
-
:
|
142
|
-
:
|
143
|
-
:
|
144
|
-
|
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
|
350
|
+
end
|
351
|
+
case MONDRIAN_DRIVER
|
352
|
+
when 'mysql'
|
353
|
+
CONNECTION_PARAMS[:properties] = {useSSL: false, serverTimezone: 'UTC'}
|
354
|
+
when 'jdbc_mysql'
|
355
|
+
CONNECTION_PARAMS[:jdbc_url] << '?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC'
|
145
356
|
end
|
146
357
|
|
147
358
|
case MONDRIAN_DRIVER
|
359
|
+
when 'mysql', 'postgresql'
|
360
|
+
AR_CONNECTION_PARAMS = CONNECTION_PARAMS.slice(:host, :database, :username, :password).merge(
|
361
|
+
adapter: MONDRIAN_DRIVER,
|
362
|
+
driver: JDBC_DRIVER,
|
363
|
+
properties: CONNECTION_PARAMS[:properties].dup || {}
|
364
|
+
)
|
148
365
|
when 'oracle'
|
149
366
|
AR_CONNECTION_PARAMS = {
|
150
|
-
:
|
151
|
-
:
|
152
|
-
:
|
153
|
-
:
|
154
|
-
:
|
155
|
-
|
156
|
-
when 'luciddb'
|
157
|
-
CONNECTION_PARAMS[:database] = nil
|
158
|
-
CONNECTION_PARAMS[:database_schema] = DATABASE_SCHEMA
|
159
|
-
AR_CONNECTION_PARAMS = {
|
160
|
-
:adapter => 'jdbc',
|
161
|
-
:driver => JDBC_DRIVER,
|
162
|
-
:url => "jdbc:#{MONDRIAN_DRIVER}:http://#{CONNECTION_PARAMS[:host]};schema=#{CONNECTION_PARAMS[:database_schema]}",
|
163
|
-
:username => CONNECTION_PARAMS[:username],
|
164
|
-
:password => CONNECTION_PARAMS[:password]
|
165
|
-
}
|
166
|
-
when 'mssql'
|
167
|
-
url = "jdbc:jtds:sqlserver://#{CONNECTION_PARAMS[:host]}/#{CONNECTION_PARAMS[:database]}"
|
168
|
-
url << ";instance=#{DATABASE_INSTANCE}" if DATABASE_INSTANCE
|
169
|
-
AR_CONNECTION_PARAMS = {
|
170
|
-
:adapter => 'jdbc',
|
171
|
-
:dialect => 'Microsoft SQL Server',
|
172
|
-
:driver => JDBC_DRIVER,
|
173
|
-
:url => url,
|
174
|
-
:username => CONNECTION_PARAMS[:username],
|
175
|
-
:password => CONNECTION_PARAMS[:password],
|
176
|
-
: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: '.,'
|
177
373
|
}
|
178
374
|
when 'sqlserver'
|
179
375
|
url = "jdbc:sqlserver://#{CONNECTION_PARAMS[:host]};databaseName=#{CONNECTION_PARAMS[:database]};"
|
180
376
|
url << ";instanceName=#{DATABASE_INSTANCE}" if DATABASE_INSTANCE
|
181
377
|
AR_CONNECTION_PARAMS = {
|
182
|
-
:
|
183
|
-
:
|
184
|
-
:
|
185
|
-
:
|
186
|
-
:
|
187
|
-
:
|
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'
|
188
386
|
}
|
189
387
|
when 'vertica'
|
388
|
+
CONNECTION_PARAMS[:properties] = {
|
389
|
+
'SearchPath' => DATABASE_SCHEMA
|
390
|
+
}
|
190
391
|
AR_CONNECTION_PARAMS = {
|
191
392
|
adapter: 'jdbc',
|
192
|
-
driver:
|
193
|
-
url:
|
393
|
+
driver: JDBC_DRIVER,
|
394
|
+
url: "jdbc:#{MONDRIAN_DRIVER}://#{CONNECTION_PARAMS[:host]}/#{CONNECTION_PARAMS[:database]}" \
|
395
|
+
"?SearchPath=#{DATABASE_SCHEMA}", # &LogLevel=DEBUG
|
194
396
|
username: CONNECTION_PARAMS[:username],
|
195
|
-
password: CONNECTION_PARAMS[:password]
|
397
|
+
password: CONNECTION_PARAMS[:password],
|
398
|
+
dialect: 'jdbc'
|
196
399
|
}
|
197
400
|
when 'snowflake'
|
198
401
|
CONNECTION_PARAMS[:database_schema] = DATABASE_SCHEMA
|
199
402
|
CONNECTION_PARAMS[:warehouse] = WAREHOUSE_NAME
|
403
|
+
CONNECTION_PARAMS[:properties] = {
|
404
|
+
# 'tracing' => 'ALL'
|
405
|
+
}
|
406
|
+
AR_CONNECTION_PARAMS = {
|
407
|
+
adapter: 'jdbc',
|
408
|
+
driver: JDBC_DRIVER,
|
409
|
+
url: "jdbc:#{MONDRIAN_DRIVER}://#{CONNECTION_PARAMS[:host]}/?db=#{CONNECTION_PARAMS[:database]}" \
|
410
|
+
"&schema=#{DATABASE_SCHEMA}&warehouse=#{WAREHOUSE_NAME}", # &tracing=ALL
|
411
|
+
username: CONNECTION_PARAMS[:username],
|
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
|
+
|
200
424
|
AR_CONNECTION_PARAMS = {
|
201
425
|
adapter: 'jdbc',
|
202
|
-
driver:
|
203
|
-
url:
|
426
|
+
driver: JDBC_DRIVER,
|
427
|
+
url: "jdbc:ch:#{CONNECTION_PARAMS[:protocol]&.+(':')}//#{CONNECTION_PARAMS[:host]}/#{CONNECTION_PARAMS[:database]}",
|
204
428
|
username: CONNECTION_PARAMS[:username],
|
205
|
-
password: CONNECTION_PARAMS[:password]
|
429
|
+
password: CONNECTION_PARAMS[:password],
|
430
|
+
dialect: 'jdbc'
|
206
431
|
}
|
207
432
|
when /jdbc/
|
208
433
|
AR_CONNECTION_PARAMS = {
|
209
|
-
:
|
210
|
-
:
|
211
|
-
:
|
212
|
-
:
|
213
|
-
:
|
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'
|
214
440
|
}
|
215
441
|
else
|
216
442
|
AR_CONNECTION_PARAMS = {
|
217
|
-
|
218
|
-
|
219
|
-
:
|
220
|
-
|
221
|
-
:
|
222
|
-
:
|
223
|
-
:
|
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'
|
224
450
|
}
|
225
451
|
end
|
226
452
|
|
227
|
-
|
228
|
-
case MONDRIAN_DRIVER
|
229
|
-
when 'mysql'
|
230
|
-
AR_CONNECTION_PARAMS[:properties] = CONNECTION_PARAMS[:properties] = {useSSL: false}
|
231
|
-
when 'jdbc_mysql'
|
232
|
-
AR_CONNECTION_PARAMS[:url] = CONNECTION_PARAMS[:jdbc_url] << '?useSSL=false'
|
233
|
-
end
|
234
|
-
|
235
|
-
CONNECTION_PARAMS_WITH_CATALOG = CONNECTION_PARAMS.merge(:catalog => CATALOG_FILE)
|
453
|
+
CONNECTION_PARAMS_WITH_CATALOG = CONNECTION_PARAMS.merge(catalog: CATALOG_FILE)
|
236
454
|
|
237
455
|
ActiveRecord::Base.establish_connection(AR_CONNECTION_PARAMS)
|