activerecord-oracle_enhanced-adapter 1.6.9 → 1.7.0.beta1
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/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
|
|