activerecord-oracle_enhanced-adapter 1.6.9 → 1.7.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +10 -11
- data/History.md +126 -14
- data/README.md +9 -6
- data/RUNNING_TESTS.md +1 -1
- data/Rakefile +1 -16
- data/VERSION +1 -1
- data/activerecord-oracle_enhanced-adapter.gemspec +15 -52
- data/lib/active_record/connection_adapters/oracle_enhanced/column.rb +8 -22
- data/lib/active_record/connection_adapters/oracle_enhanced/column_dumper.rb +53 -45
- data/lib/active_record/connection_adapters/oracle_enhanced/connection.rb +6 -1
- data/lib/active_record/connection_adapters/oracle_enhanced/database_statements.rb +23 -62
- data/lib/active_record/connection_adapters/oracle_enhanced/jdbc_connection.rb +46 -56
- data/lib/active_record/connection_adapters/oracle_enhanced/jdbc_quoting.rb +35 -0
- data/lib/active_record/connection_adapters/oracle_enhanced/oci_connection.rb +34 -21
- data/lib/active_record/connection_adapters/oracle_enhanced/oci_quoting.rb +36 -0
- data/lib/active_record/connection_adapters/oracle_enhanced/procedures.rb +1 -1
- data/lib/active_record/connection_adapters/oracle_enhanced/quoting.rb +174 -0
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_creation.rb +17 -8
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_definitions.rb +17 -11
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_dumper.rb +160 -178
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_statements.rb +42 -94
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_statements_ext.rb +50 -54
- data/lib/active_record/connection_adapters/oracle_enhanced/structure_dump.rb +15 -11
- data/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb +197 -301
- data/lib/active_record/oracle_enhanced/type/integer.rb +3 -2
- data/lib/active_record/oracle_enhanced/type/national_character_string.rb +25 -0
- data/lib/active_record/oracle_enhanced/type/raw.rb +14 -2
- data/lib/active_record/oracle_enhanced/type/string.rb +28 -0
- data/lib/active_record/oracle_enhanced/type/text.rb +32 -0
- data/lib/activerecord-oracle_enhanced-adapter.rb +12 -17
- data/spec/active_record/connection_adapters/oracle_enhanced_adapter_spec.rb +113 -135
- data/spec/active_record/connection_adapters/oracle_enhanced_connection_spec.rb +51 -59
- data/spec/active_record/connection_adapters/oracle_enhanced_context_index_spec.rb +40 -41
- data/spec/active_record/connection_adapters/oracle_enhanced_cpk_spec.rb +6 -6
- data/spec/active_record/connection_adapters/oracle_enhanced_data_types_spec.rb +281 -233
- data/spec/active_record/connection_adapters/oracle_enhanced_database_tasks_spec.rb +7 -7
- data/spec/active_record/connection_adapters/oracle_enhanced_dbms_output_spec.rb +10 -10
- data/spec/active_record/connection_adapters/oracle_enhanced_dirty_spec.rb +22 -22
- data/spec/active_record/connection_adapters/oracle_enhanced_emulate_oracle_adapter_spec.rb +2 -2
- data/spec/active_record/connection_adapters/oracle_enhanced_procedures_spec.rb +36 -37
- data/spec/active_record/connection_adapters/oracle_enhanced_schema_dump_spec.rb +86 -46
- data/spec/active_record/connection_adapters/oracle_enhanced_schema_statements_spec.rb +194 -294
- data/spec/active_record/connection_adapters/oracle_enhanced_structure_dump_spec.rb +53 -39
- data/spec/spec_helper.rb +0 -6
- metadata +42 -143
- data/.travis.yml +0 -39
- data/.travis/oracle/download.sh +0 -14
- data/.travis/oracle/install.sh +0 -31
- data/.travis/setup_accounts.sh +0 -9
- data/lib/active_record/connection_adapters/oracle_enhanced/dirty.rb +0 -40
- data/lib/active_record/oracle_enhanced/type/timestamp.rb +0 -11
- data/spec/spec_config.yaml.template +0 -11
- data/spec/support/alter_system_user_password.sql +0 -2
- data/spec/support/create_oracle_enhanced_users.sql +0 -31
@@ -12,25 +12,25 @@ describe "OracleEnhancedConnection" do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
it "should create new connection" do
|
15
|
-
@conn.
|
15
|
+
expect(@conn).to be_active
|
16
16
|
end
|
17
17
|
|
18
18
|
it "should ping active connection" do
|
19
|
-
@conn.ping.
|
19
|
+
expect(@conn.ping).to be_truthy
|
20
20
|
end
|
21
21
|
|
22
22
|
it "should not ping inactive connection" do
|
23
23
|
@conn.logoff
|
24
|
-
|
24
|
+
expect { @conn.ping }.to raise_error(ActiveRecord::ConnectionAdapters::OracleEnhancedConnectionException)
|
25
25
|
end
|
26
26
|
|
27
27
|
it "should reset active connection" do
|
28
28
|
@conn.reset!
|
29
|
-
@conn.
|
29
|
+
expect(@conn).to be_active
|
30
30
|
end
|
31
31
|
|
32
32
|
it "should be in autocommit mode after connection" do
|
33
|
-
@conn.
|
33
|
+
expect(@conn).to be_autocommit
|
34
34
|
end
|
35
35
|
|
36
36
|
end
|
@@ -45,16 +45,16 @@ describe "OracleEnhancedConnection" do
|
|
45
45
|
end
|
46
46
|
|
47
47
|
it "should create new connection" do
|
48
|
-
@conn.
|
48
|
+
expect(@conn).to be_active
|
49
49
|
end
|
50
50
|
|
51
51
|
it "should swith to specified schema" do
|
52
|
-
@conn.select_value("select SYS_CONTEXT('userenv', 'current_schema') from dual").
|
52
|
+
expect(@conn.select_value("select SYS_CONTEXT('userenv', 'current_schema') from dual")).to eq(CONNECTION_WITH_SCHEMA_PARAMS[:schema].upcase)
|
53
53
|
end
|
54
54
|
|
55
55
|
it "should swith to specified schema after reset" do
|
56
56
|
@conn.reset!
|
57
|
-
@conn.select_value("select SYS_CONTEXT('userenv', 'current_schema') from dual").
|
57
|
+
expect(@conn.select_value("select SYS_CONTEXT('userenv', 'current_schema') from dual")).to eq(CONNECTION_WITH_SCHEMA_PARAMS[:schema].upcase)
|
58
58
|
end
|
59
59
|
|
60
60
|
end
|
@@ -67,20 +67,20 @@ describe "OracleEnhancedConnection" do
|
|
67
67
|
it "should use NLS_DATE_FORMAT environment variable" do
|
68
68
|
ENV['NLS_DATE_FORMAT'] = 'YYYY-MM-DD'
|
69
69
|
@conn = ActiveRecord::ConnectionAdapters::OracleEnhancedConnection.create(CONNECTION_PARAMS)
|
70
|
-
@conn.select("SELECT value FROM v$nls_parameters WHERE parameter = 'NLS_DATE_FORMAT'").
|
70
|
+
expect(@conn.select("SELECT value FROM v$nls_parameters WHERE parameter = 'NLS_DATE_FORMAT'")).to eq([{'value' => 'YYYY-MM-DD'}])
|
71
71
|
end
|
72
72
|
|
73
73
|
it "should use configuration value and ignore NLS_DATE_FORMAT environment variable" do
|
74
74
|
ENV['NLS_DATE_FORMAT'] = 'YYYY-MM-DD'
|
75
75
|
@conn = ActiveRecord::ConnectionAdapters::OracleEnhancedConnection.create(CONNECTION_PARAMS.merge(:nls_date_format => 'YYYY-MM-DD HH24:MI'))
|
76
|
-
@conn.select("SELECT value FROM v$nls_parameters WHERE parameter = 'NLS_DATE_FORMAT'").
|
76
|
+
expect(@conn.select("SELECT value FROM v$nls_parameters WHERE parameter = 'NLS_DATE_FORMAT'")).to eq([{'value' => 'YYYY-MM-DD HH24:MI'}])
|
77
77
|
end
|
78
78
|
|
79
79
|
it "should use default value when NLS_DATE_FORMAT environment variable is not set" do
|
80
80
|
ENV['NLS_DATE_FORMAT'] = nil
|
81
81
|
@conn = ActiveRecord::ConnectionAdapters::OracleEnhancedConnection.create(CONNECTION_PARAMS)
|
82
82
|
default = ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter::DEFAULT_NLS_PARAMETERS[:nls_date_format]
|
83
|
-
@conn.select("SELECT value FROM v$nls_parameters WHERE parameter = 'NLS_DATE_FORMAT'").
|
83
|
+
expect(@conn.select("SELECT value FROM v$nls_parameters WHERE parameter = 'NLS_DATE_FORMAT'")).to eq([{'value' => default}])
|
84
84
|
end
|
85
85
|
end
|
86
86
|
|
@@ -94,7 +94,7 @@ describe "OracleEnhancedConnection" do
|
|
94
94
|
end
|
95
95
|
|
96
96
|
it "should create new connection" do
|
97
|
-
@conn.
|
97
|
+
expect(@conn).to be_active
|
98
98
|
end
|
99
99
|
end
|
100
100
|
|
@@ -106,24 +106,7 @@ describe "OracleEnhancedConnection" do
|
|
106
106
|
end
|
107
107
|
|
108
108
|
it "should create new connection" do
|
109
|
-
@conn.
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
describe 'with host="connection-string"' do
|
114
|
-
let(:username) { CONNECTION_PARAMS[:username] }
|
115
|
-
let(:password) { CONNECTION_PARAMS[:password] }
|
116
|
-
let(:connection_string) { "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=tcp)(HOST=#{DATABASE_HOST})(PORT=#{DATABASE_PORT})))(CONNECT_DATA=(SERVICE_NAME=#{DATABASE_NAME})))" }
|
117
|
-
let(:params) { { username: username, password: password, host: 'connection-string', database: connection_string } }
|
118
|
-
|
119
|
-
it 'uses the database param as the connection string' do
|
120
|
-
if ORACLE_ENHANCED_CONNECTION == :jdbc
|
121
|
-
expect(java.sql.DriverManager).to receive(:getConnection).with("jdbc:oracle:thin:@#{connection_string}", anything).and_call_original
|
122
|
-
else
|
123
|
-
expect(OCI8).to receive(:new).with(username, password, connection_string, nil).and_call_original
|
124
|
-
end
|
125
|
-
conn = ActiveRecord::ConnectionAdapters::OracleEnhancedConnection.create(params)
|
126
|
-
expect(conn).to be_active
|
109
|
+
expect(@conn).to be_active
|
127
110
|
end
|
128
111
|
end
|
129
112
|
|
@@ -138,7 +121,7 @@ describe "OracleEnhancedConnection" do
|
|
138
121
|
params[:host] = nil
|
139
122
|
params[:database] = nil
|
140
123
|
@conn = ActiveRecord::ConnectionAdapters::OracleEnhancedConnection.create(params)
|
141
|
-
@conn.
|
124
|
+
expect(@conn).to be_active
|
142
125
|
end
|
143
126
|
|
144
127
|
it "should create new connection using :url and tnsnames alias" do
|
@@ -147,14 +130,14 @@ describe "OracleEnhancedConnection" do
|
|
147
130
|
params[:host] = nil
|
148
131
|
params[:database] = nil
|
149
132
|
@conn = ActiveRecord::ConnectionAdapters::OracleEnhancedConnection.create(params)
|
150
|
-
@conn.
|
133
|
+
expect(@conn).to be_active
|
151
134
|
end
|
152
135
|
|
153
136
|
it "should create new connection using just tnsnames alias" do
|
154
137
|
params = CONNECTION_PARAMS.dup
|
155
138
|
params[:host] = nil
|
156
139
|
@conn = ActiveRecord::ConnectionAdapters::OracleEnhancedConnection.create(params)
|
157
|
-
@conn.
|
140
|
+
expect(@conn).to be_active
|
158
141
|
end
|
159
142
|
|
160
143
|
it "should create a new connection using JNDI" do
|
@@ -187,12 +170,12 @@ describe "OracleEnhancedConnection" do
|
|
187
170
|
end
|
188
171
|
end
|
189
172
|
|
190
|
-
javax.naming.InitialContext.
|
173
|
+
allow(javax.naming.InitialContext).to receive(:new).and_return(InitialContextMock.new)
|
191
174
|
|
192
175
|
params = {}
|
193
176
|
params[:jndi] = 'java:comp/env/jdbc/test'
|
194
177
|
@conn = ActiveRecord::ConnectionAdapters::OracleEnhancedConnection.create(params)
|
195
|
-
@conn.
|
178
|
+
expect(@conn).to be_active
|
196
179
|
end
|
197
180
|
|
198
181
|
end
|
@@ -202,9 +185,9 @@ describe "OracleEnhancedConnection" do
|
|
202
185
|
params[:url] = "jdbc:oracle:thin:@#{DATABASE_HOST && "//#{DATABASE_HOST}#{DATABASE_PORT && ":#{DATABASE_PORT}"}/"}#{DATABASE_NAME}"
|
203
186
|
params[:host] = nil
|
204
187
|
params[:database] = nil
|
205
|
-
java.sql.DriverManager.
|
188
|
+
allow(java.sql.DriverManager).to receive(:getConnection).and_raise('no suitable driver found')
|
206
189
|
@conn = ActiveRecord::ConnectionAdapters::OracleEnhancedConnection.create(params)
|
207
|
-
@conn.
|
190
|
+
expect(@conn).to be_active
|
208
191
|
end
|
209
192
|
|
210
193
|
end
|
@@ -215,15 +198,15 @@ describe "OracleEnhancedConnection" do
|
|
215
198
|
end
|
216
199
|
|
217
200
|
it "should execute SQL statement" do
|
218
|
-
@conn.exec("SELECT * FROM dual").
|
201
|
+
expect(@conn.exec("SELECT * FROM dual")).not_to be_nil
|
219
202
|
end
|
220
203
|
|
221
204
|
it "should execute SQL select" do
|
222
|
-
@conn.select("SELECT * FROM dual").
|
205
|
+
expect(@conn.select("SELECT * FROM dual")).to eq([{'dummy' => 'X'}])
|
223
206
|
end
|
224
207
|
|
225
208
|
it "should execute SQL select and return also columns" do
|
226
|
-
@conn.select("SELECT * FROM dual", nil, true).
|
209
|
+
expect(@conn.select("SELECT * FROM dual", nil, true)).to eq([ [{'dummy' => 'X'}], ['dummy'] ])
|
227
210
|
end
|
228
211
|
|
229
212
|
end
|
@@ -237,8 +220,8 @@ describe "OracleEnhancedConnection" do
|
|
237
220
|
cursor = @conn.prepare("SELECT * FROM dual WHERE :1 = 1")
|
238
221
|
cursor.bind_param(1, 1)
|
239
222
|
cursor.exec
|
240
|
-
cursor.get_col_names.
|
241
|
-
cursor.fetch.
|
223
|
+
expect(cursor.get_col_names).to eq(['DUMMY'])
|
224
|
+
expect(cursor.fetch).to eq(["X"])
|
242
225
|
cursor.close
|
243
226
|
end
|
244
227
|
|
@@ -246,10 +229,10 @@ describe "OracleEnhancedConnection" do
|
|
246
229
|
cursor = @conn.prepare("SELECT * FROM dual WHERE :1 = 1")
|
247
230
|
cursor.bind_param(1, 1)
|
248
231
|
cursor.exec
|
249
|
-
cursor.fetch.
|
232
|
+
expect(cursor.fetch).to eq(["X"])
|
250
233
|
cursor.bind_param(1, 0)
|
251
234
|
cursor.exec
|
252
|
-
cursor.fetch.
|
235
|
+
expect(cursor.fetch).to be_nil
|
253
236
|
cursor.close
|
254
237
|
end
|
255
238
|
end
|
@@ -268,14 +251,15 @@ describe "OracleEnhancedConnection" do
|
|
268
251
|
|
269
252
|
it "should execute prepared statement with decimal bind parameter " do
|
270
253
|
cursor = @conn.prepare("INSERT INTO test_employees VALUES(:1)")
|
271
|
-
|
272
|
-
column.
|
254
|
+
type_metadata = ActiveRecord::ConnectionAdapters::SqlTypeMetadata.new(sql_type: "NUMBER", type: :decimal, limit: 10, precision: nil, scale: 2)
|
255
|
+
column = ActiveRecord::ConnectionAdapters::OracleEnhancedColumn.new('age', nil, type_metadata, false, "test_employees", false, false, nil)
|
256
|
+
expect(column.type).to eq(:decimal)
|
273
257
|
cursor.bind_param(1, "1.5", column)
|
274
258
|
cursor.exec
|
275
259
|
cursor.close
|
276
260
|
cursor = @conn.prepare("SELECT age FROM test_employees")
|
277
261
|
cursor.exec
|
278
|
-
cursor.fetch.
|
262
|
+
expect(cursor.fetch).to eq([1.5])
|
279
263
|
cursor.close
|
280
264
|
end
|
281
265
|
end
|
@@ -303,28 +287,36 @@ describe "OracleEnhancedConnection" do
|
|
303
287
|
# @conn.auto_retry = true
|
304
288
|
ActiveRecord::Base.connection.auto_retry = true
|
305
289
|
kill_current_session
|
306
|
-
@conn.exec("SELECT * FROM dual").
|
290
|
+
expect(@conn.exec("SELECT * FROM dual")).not_to be_nil
|
307
291
|
end
|
308
292
|
|
309
293
|
it "should not reconnect and execute SQL statement if connection is lost and auto retry is disabled" do
|
310
294
|
# @conn.auto_retry = false
|
311
295
|
ActiveRecord::Base.connection.auto_retry = false
|
312
296
|
kill_current_session
|
313
|
-
|
297
|
+
if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
|
298
|
+
expect { @conn.exec("SELECT * FROM dual") }.to raise_error(NativeException)
|
299
|
+
else
|
300
|
+
expect { @conn.exec("SELECT * FROM dual") }.to raise_error(OCIError)
|
301
|
+
end
|
314
302
|
end
|
315
303
|
|
316
304
|
it "should reconnect and execute SQL select if connection is lost and auto retry is enabled" do
|
317
305
|
# @conn.auto_retry = true
|
318
306
|
ActiveRecord::Base.connection.auto_retry = true
|
319
307
|
kill_current_session
|
320
|
-
@conn.select("SELECT * FROM dual").
|
308
|
+
expect(@conn.select("SELECT * FROM dual")).to eq([{'dummy' => 'X'}])
|
321
309
|
end
|
322
310
|
|
323
311
|
it "should not reconnect and execute SQL select if connection is lost and auto retry is disabled" do
|
324
312
|
# @conn.auto_retry = false
|
325
313
|
ActiveRecord::Base.connection.auto_retry = false
|
326
314
|
kill_current_session
|
327
|
-
|
315
|
+
if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
|
316
|
+
expect { @conn.select("SELECT * FROM dual") }.to raise_error(NativeException)
|
317
|
+
else
|
318
|
+
expect { @conn.select("SELECT * FROM dual") }.to raise_error(OCIError)
|
319
|
+
end
|
328
320
|
end
|
329
321
|
|
330
322
|
end
|
@@ -337,45 +329,45 @@ describe "OracleEnhancedConnection" do
|
|
337
329
|
|
338
330
|
it "should describe existing table" do
|
339
331
|
@conn.exec "CREATE TABLE test_employees (first_name VARCHAR2(20))" rescue nil
|
340
|
-
@conn.describe("test_employees").
|
332
|
+
expect(@conn.describe("test_employees")).to eq([@owner, "TEST_EMPLOYEES"])
|
341
333
|
@conn.exec "DROP TABLE test_employees" rescue nil
|
342
334
|
end
|
343
335
|
|
344
336
|
it "should not describe non-existing table" do
|
345
|
-
|
337
|
+
expect { @conn.describe("test_xxx") }.to raise_error(ActiveRecord::ConnectionAdapters::OracleEnhancedConnectionException)
|
346
338
|
end
|
347
339
|
|
348
340
|
it "should describe table in other schema" do
|
349
|
-
@conn.describe("sys.dual").
|
341
|
+
expect(@conn.describe("sys.dual")).to eq(["SYS", "DUAL"])
|
350
342
|
end
|
351
343
|
|
352
344
|
it "should describe existing view" do
|
353
345
|
@conn.exec "CREATE TABLE test_employees (first_name VARCHAR2(20))" rescue nil
|
354
346
|
@conn.exec "CREATE VIEW test_employees_v AS SELECT * FROM test_employees" rescue nil
|
355
|
-
@conn.describe("test_employees_v").
|
347
|
+
expect(@conn.describe("test_employees_v")).to eq([@owner, "TEST_EMPLOYEES_V"])
|
356
348
|
@conn.exec "DROP VIEW test_employees_v" rescue nil
|
357
349
|
@conn.exec "DROP TABLE test_employees" rescue nil
|
358
350
|
end
|
359
351
|
|
360
352
|
it "should describe view in other schema" do
|
361
|
-
@conn.describe("sys.v_$version").
|
353
|
+
expect(@conn.describe("sys.v_$version")).to eq(["SYS", "V_$VERSION"])
|
362
354
|
end
|
363
355
|
|
364
356
|
it "should describe existing private synonym" do
|
365
357
|
@conn.exec "CREATE SYNONYM test_dual FOR sys.dual" rescue nil
|
366
|
-
@conn.describe("test_dual").
|
358
|
+
expect(@conn.describe("test_dual")).to eq(["SYS", "DUAL"])
|
367
359
|
@conn.exec "DROP SYNONYM test_dual" rescue nil
|
368
360
|
end
|
369
361
|
|
370
362
|
it "should describe existing public synonym" do
|
371
|
-
@conn.describe("all_tables").
|
363
|
+
expect(@conn.describe("all_tables")).to eq(["SYS", "ALL_TABLES"])
|
372
364
|
end
|
373
365
|
|
374
366
|
if defined?(OCI8)
|
375
367
|
context "OCI8 adapter" do
|
376
368
|
|
377
369
|
it "should not fallback to SELECT-based logic when querying non-existant table information" do
|
378
|
-
@conn.
|
370
|
+
expect(@conn).not_to receive(:select_one)
|
379
371
|
@conn.describe("non_existant") rescue ActiveRecord::ConnectionAdapters::OracleEnhancedConnectionException
|
380
372
|
end
|
381
373
|
|
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
require 'spec_helper'
|
3
2
|
|
4
3
|
describe "OracleEnhancedAdapter context index" do
|
@@ -88,7 +87,7 @@ describe "OracleEnhancedAdapter context index" do
|
|
88
87
|
it "should create single VARCHAR2 column index" do
|
89
88
|
@conn.add_context_index :posts, :title
|
90
89
|
@title_words.each do |word|
|
91
|
-
Post.contains(:title, word).to_a.
|
90
|
+
expect(Post.contains(:title, word).to_a).to eq([@post2, @post1])
|
92
91
|
end
|
93
92
|
@conn.remove_context_index :posts, :title
|
94
93
|
end
|
@@ -96,28 +95,28 @@ describe "OracleEnhancedAdapter context index" do
|
|
96
95
|
it "should create single CLOB column index" do
|
97
96
|
@conn.add_context_index :posts, :body
|
98
97
|
@body_words.each do |word|
|
99
|
-
Post.contains(:body, word).to_a.
|
98
|
+
expect(Post.contains(:body, word).to_a).to eq([@post2, @post1])
|
100
99
|
end
|
101
100
|
@conn.remove_context_index :posts, :body
|
102
101
|
end
|
103
102
|
|
104
103
|
it "should not include text index secondary tables in user tables list" do
|
105
104
|
@conn.add_context_index :posts, :title
|
106
|
-
@conn.tables.any?{|t| t =~ /^dr\$/i}.
|
105
|
+
expect(@conn.tables.any?{|t| t =~ /^dr\$/i}).to be_falsey
|
107
106
|
@conn.remove_context_index :posts, :title
|
108
107
|
end
|
109
108
|
|
110
109
|
it "should create multiple column index" do
|
111
110
|
@conn.add_context_index :posts, [:title, :body]
|
112
111
|
(@title_words+@body_words).each do |word|
|
113
|
-
Post.contains(:title, word).to_a.
|
112
|
+
expect(Post.contains(:title, word).to_a).to eq([@post2, @post1])
|
114
113
|
end
|
115
114
|
@conn.remove_context_index :posts, [:title, :body]
|
116
115
|
end
|
117
116
|
|
118
117
|
it "should index records with null values" do
|
119
118
|
@conn.add_context_index :posts, [:title, :body]
|
120
|
-
Post.contains(:title, "withnull").to_a.
|
119
|
+
expect(Post.contains(:title, "withnull").to_a).to eq([@post_with_null_body, @post_with_null_title])
|
121
120
|
@conn.remove_context_index :posts, [:title, :body]
|
122
121
|
end
|
123
122
|
|
@@ -125,14 +124,14 @@ describe "OracleEnhancedAdapter context index" do
|
|
125
124
|
@conn.add_context_index :posts, [:title, :body],
|
126
125
|
index_column: :all_text, sync: 'ON COMMIT'
|
127
126
|
@post = Post.create(title: "abc", body: "def")
|
128
|
-
Post.contains(:all_text, "abc").to_a.
|
129
|
-
Post.contains(:all_text, "def").to_a.
|
127
|
+
expect(Post.contains(:all_text, "abc").to_a).to eq([@post])
|
128
|
+
expect(Post.contains(:all_text, "def").to_a).to eq([@post])
|
130
129
|
@post.update_attributes!(title: "ghi")
|
131
130
|
# index will not be updated as all_text column is not changed
|
132
|
-
Post.contains(:all_text, "ghi").to_a.
|
131
|
+
expect(Post.contains(:all_text, "ghi").to_a).to be_empty
|
133
132
|
@post.update_attributes!(all_text: "1")
|
134
133
|
# index will be updated when all_text column is changed
|
135
|
-
Post.contains(:all_text, "ghi").to_a.
|
134
|
+
expect(Post.contains(:all_text, "ghi").to_a).to eq([@post])
|
136
135
|
@conn.remove_context_index :posts, index_column: :all_text
|
137
136
|
end
|
138
137
|
|
@@ -141,11 +140,11 @@ describe "OracleEnhancedAdapter context index" do
|
|
141
140
|
index_column: :all_text, index_column_trigger_on: [:created_at, :updated_at],
|
142
141
|
sync: 'ON COMMIT'
|
143
142
|
@post = Post.create(title: "abc", body: "def")
|
144
|
-
Post.contains(:all_text, "abc").to_a.
|
145
|
-
Post.contains(:all_text, "def").to_a.
|
143
|
+
expect(Post.contains(:all_text, "abc").to_a).to eq([@post])
|
144
|
+
expect(Post.contains(:all_text, "def").to_a).to eq([@post])
|
146
145
|
@post.update_attributes!(title: "ghi")
|
147
146
|
# index should be updated as created_at column is changed
|
148
|
-
Post.contains(:all_text, "ghi").to_a.
|
147
|
+
expect(Post.contains(:all_text, "ghi").to_a).to eq([@post])
|
149
148
|
@conn.remove_context_index :posts, index_column: :all_text
|
150
149
|
end
|
151
150
|
|
@@ -153,9 +152,9 @@ describe "OracleEnhancedAdapter context index" do
|
|
153
152
|
@post = Post.create!(title: "āčē", body: "dummy")
|
154
153
|
@conn.add_context_index :posts, :title,
|
155
154
|
lexer: { type: "BASIC_LEXER", base_letter_type: 'GENERIC', base_letter: true }
|
156
|
-
Post.contains(:title, "āčē").to_a.
|
157
|
-
Post.contains(:title, "ace").to_a.
|
158
|
-
Post.contains(:title, "ACE").to_a.
|
155
|
+
expect(Post.contains(:title, "āčē").to_a).to eq([@post])
|
156
|
+
expect(Post.contains(:title, "ace").to_a).to eq([@post])
|
157
|
+
expect(Post.contains(:title, "ACE").to_a).to eq([@post])
|
159
158
|
@conn.remove_context_index :posts, :title
|
160
159
|
end
|
161
160
|
|
@@ -163,9 +162,9 @@ describe "OracleEnhancedAdapter context index" do
|
|
163
162
|
@conn.add_context_index :posts, :title, transactional: true
|
164
163
|
Post.transaction do
|
165
164
|
@post = Post.create(title: "abc")
|
166
|
-
Post.contains(:title, "abc").to_a.
|
165
|
+
expect(Post.contains(:title, "abc").to_a).to eq([@post])
|
167
166
|
@post.update_attributes!(title: "ghi")
|
168
|
-
Post.contains(:title, "ghi").to_a.
|
167
|
+
expect(Post.contains(:title, "ghi").to_a).to eq([@post])
|
169
168
|
end
|
170
169
|
@conn.remove_context_index :posts, :title
|
171
170
|
end
|
@@ -218,7 +217,7 @@ describe "OracleEnhancedAdapter context index" do
|
|
218
217
|
@post.comments.create!(author: "ccc", body: "ddd")
|
219
218
|
@post.comments.create!(author: "eee", body: "fff")
|
220
219
|
["aaa", "bbb", "ccc", "ddd", "eee", "fff"].each do |word|
|
221
|
-
Post.contains(:all_text, word).to_a.
|
220
|
+
expect(Post.contains(:all_text, word).to_a).to eq([@post])
|
222
221
|
end
|
223
222
|
end
|
224
223
|
|
@@ -239,7 +238,7 @@ describe "OracleEnhancedAdapter context index" do
|
|
239
238
|
@post.comments.create!(author: "ccc", body: "ddd")
|
240
239
|
@post.comments.create!(author: "eee", body: "fff")
|
241
240
|
["aaa", "bbb", "ccc", "ddd", "eee", "fff"].each do |word|
|
242
|
-
Post.contains(:all_text, word).to_a.
|
241
|
+
expect(Post.contains(:all_text, word).to_a).to eq([@post])
|
243
242
|
end
|
244
243
|
end
|
245
244
|
|
@@ -252,14 +251,14 @@ describe "OracleEnhancedAdapter context index" do
|
|
252
251
|
"SELECT comments.author AS comment_author, comments.body AS comment_body FROM comments WHERE comments.post_id = :id"
|
253
252
|
],
|
254
253
|
index_column: :all_text
|
255
|
-
Post.contains(:all_text, "aaa within title").to_a.
|
256
|
-
Post.contains(:all_text, "aaa within body").to_a.
|
257
|
-
Post.contains(:all_text, "bbb within body").to_a.
|
258
|
-
Post.contains(:all_text, "bbb within title").to_a.
|
259
|
-
Post.contains(:all_text, "ccc within comment_author").to_a.
|
260
|
-
Post.contains(:all_text, "ccc within comment_body").to_a.
|
261
|
-
Post.contains(:all_text, "ddd within comment_body").to_a.
|
262
|
-
Post.contains(:all_text, "ddd within comment_author").to_a.
|
254
|
+
expect(Post.contains(:all_text, "aaa within title").to_a).to eq([@post])
|
255
|
+
expect(Post.contains(:all_text, "aaa within body").to_a).to be_empty
|
256
|
+
expect(Post.contains(:all_text, "bbb within body").to_a).to eq([@post])
|
257
|
+
expect(Post.contains(:all_text, "bbb within title").to_a).to be_empty
|
258
|
+
expect(Post.contains(:all_text, "ccc within comment_author").to_a).to eq([@post])
|
259
|
+
expect(Post.contains(:all_text, "ccc within comment_body").to_a).to be_empty
|
260
|
+
expect(Post.contains(:all_text, "ddd within comment_body").to_a).to eq([@post])
|
261
|
+
expect(Post.contains(:all_text, "ddd within comment_author").to_a).to be_empty
|
263
262
|
end
|
264
263
|
|
265
264
|
end
|
@@ -289,22 +288,22 @@ describe "OracleEnhancedAdapter context index" do
|
|
289
288
|
|
290
289
|
def verify_logged_statements
|
291
290
|
['K_TABLE_CLAUSE', 'R_TABLE_CLAUSE', 'N_TABLE_CLAUSE', 'I_INDEX_CLAUSE', 'P_TABLE_CLAUSE'].each do |clause|
|
292
|
-
@logger.output(:debug).
|
291
|
+
expect(@logger.output(:debug)).to match(/CTX_DDL\.SET_ATTRIBUTE\('index_posts_on_title_sto', '#{clause}', '.*TABLESPACE #{@tablespace}'\)/)
|
293
292
|
end
|
294
|
-
@logger.output(:debug).
|
293
|
+
expect(@logger.output(:debug)).to match(/CREATE INDEX .* PARAMETERS \('STORAGE index_posts_on_title_sto'\)/)
|
295
294
|
end
|
296
295
|
|
297
296
|
it "should create index on single column" do
|
298
297
|
@conn.add_context_index :posts, :title, tablespace: @tablespace
|
299
298
|
verify_logged_statements
|
300
|
-
Post.contains(:title, 'aaa').to_a.
|
299
|
+
expect(Post.contains(:title, 'aaa').to_a).to eq([@post])
|
301
300
|
@conn.remove_context_index :posts, :title
|
302
301
|
end
|
303
302
|
|
304
303
|
it "should create index on multiple columns" do
|
305
304
|
@conn.add_context_index :posts, [:title, :body], name: 'index_posts_text', tablespace: @conn.default_tablespace
|
306
305
|
verify_logged_statements
|
307
|
-
Post.contains(:title, 'aaa AND bbb').to_a.
|
306
|
+
expect(Post.contains(:title, 'aaa AND bbb').to_a).to eq([@post])
|
308
307
|
@conn.remove_context_index :posts, name: 'index_posts_text'
|
309
308
|
end
|
310
309
|
|
@@ -332,13 +331,13 @@ describe "OracleEnhancedAdapter context index" do
|
|
332
331
|
|
333
332
|
it "should dump definition of single column index" do
|
334
333
|
@conn.add_context_index :posts, :title
|
335
|
-
standard_dump.
|
334
|
+
expect(standard_dump).to match(/add_context_index "posts", \["title"\], name: \"index_posts_on_title\"$/)
|
336
335
|
@conn.remove_context_index :posts, :title
|
337
336
|
end
|
338
337
|
|
339
338
|
it "should dump definition of multiple column index" do
|
340
339
|
@conn.add_context_index :posts, [:title, :body]
|
341
|
-
standard_dump.
|
340
|
+
expect(standard_dump).to match(/add_context_index "posts", \[:title, :body\]$/)
|
342
341
|
@conn.remove_context_index :posts, [:title, :body]
|
343
342
|
end
|
344
343
|
|
@@ -351,7 +350,7 @@ describe "OracleEnhancedAdapter context index" do
|
|
351
350
|
}
|
352
351
|
sub_query = "SELECT comments.author AS comment_author, comments.body AS comment_body FROM comments WHERE comments.post_id = :id"
|
353
352
|
@conn.add_context_index :posts, [:title, :body, sub_query], options
|
354
|
-
standard_dump.
|
353
|
+
expect(standard_dump).to match(/add_context_index "posts", \[:title, :body, "#{sub_query}"\], #{options.inspect[1..-2]}$/)
|
355
354
|
@conn.remove_context_index :posts, name: 'post_and_comments_index'
|
356
355
|
end
|
357
356
|
|
@@ -364,7 +363,7 @@ describe "OracleEnhancedAdapter context index" do
|
|
364
363
|
}
|
365
364
|
sub_query = "SELECT comments.author AS comment_author, comments.body AS comment_body FROM comments WHERE comments.post_id = :id#{' AND 1=1' * 500}"
|
366
365
|
@conn.add_context_index :posts, [:title, :body, sub_query], options
|
367
|
-
standard_dump.
|
366
|
+
expect(standard_dump).to match(/add_context_index "posts", \[:title, :body, "#{sub_query}"\], #{options.inspect[1..-2]}$/)
|
368
367
|
@conn.remove_context_index :posts, name: 'post_and_comments_index'
|
369
368
|
end
|
370
369
|
|
@@ -377,7 +376,7 @@ describe "OracleEnhancedAdapter context index" do
|
|
377
376
|
}
|
378
377
|
sub_query = "SELECT comments.author AS comment_author, comments.body AS comment_body\nFROM comments\nWHERE comments.post_id = :id"
|
379
378
|
@conn.add_context_index :posts, [:title, :body, sub_query], options
|
380
|
-
standard_dump.
|
379
|
+
expect(standard_dump).to match(/add_context_index "posts", \[:title, :body, "#{sub_query.gsub(/\n/, ' ')}"\], #{options.inspect[1..-2]}$/)
|
381
380
|
@conn.remove_context_index :posts, name: 'post_and_comments_index'
|
382
381
|
end
|
383
382
|
|
@@ -398,13 +397,13 @@ describe "OracleEnhancedAdapter context index" do
|
|
398
397
|
|
399
398
|
it "should dump definition of single column index" do
|
400
399
|
schema_define { add_context_index :posts, :title }
|
401
|
-
standard_dump.
|
400
|
+
expect(standard_dump).to match(/add_context_index "posts", \["title"\], name: "i_xxx_posts_xxx_title"$/)
|
402
401
|
schema_define { remove_context_index :posts, :title }
|
403
402
|
end
|
404
403
|
|
405
404
|
it "should dump definition of multiple column index" do
|
406
405
|
schema_define { add_context_index :posts, [:title, :body] }
|
407
|
-
standard_dump.
|
406
|
+
expect(standard_dump).to match(/add_context_index "posts", \[:title, :body\]$/)
|
408
407
|
schema_define { remove_context_index :posts, [:title, :body] }
|
409
408
|
end
|
410
409
|
|
@@ -422,8 +421,8 @@ describe "OracleEnhancedAdapter context index" do
|
|
422
421
|
"SELECT comments.author AS comment_author, comments.body AS comment_body FROM comments WHERE comments.post_id = :id"
|
423
422
|
], options
|
424
423
|
end
|
425
|
-
standard_dump.
|
426
|
-
options.inspect[1..-2].gsub(/[{}]/){|s| '\\'<<s }}$/
|
424
|
+
expect(standard_dump).to match(/add_context_index "posts", \[:title, :body, "SELECT comments.author AS comment_author, comments.body AS comment_body FROM comments WHERE comments.post_id = :id"\], #{
|
425
|
+
options.inspect[1..-2].gsub(/[{}]/){|s| '\\'<<s }}$/)
|
427
426
|
schema_define { remove_context_index :posts, name: 'xxx_post_and_comments_i' }
|
428
427
|
end
|
429
428
|
|