pmacs-activerecord-oracle_enhanced-adapter 1.4.2.rc1 → 1.5.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +11 -40
- data/History.md +170 -0
- data/README.md +61 -5
- data/Rakefile +1 -0
- data/VERSION +1 -1
- data/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb +330 -161
- data/lib/active_record/connection_adapters/oracle_enhanced_column.rb +48 -8
- data/lib/active_record/connection_adapters/oracle_enhanced_column_dumper.rb +77 -0
- data/lib/active_record/connection_adapters/oracle_enhanced_connection.rb +8 -24
- data/lib/active_record/connection_adapters/oracle_enhanced_context_index.rb +4 -13
- data/lib/active_record/connection_adapters/oracle_enhanced_database_tasks.rb +61 -0
- data/lib/active_record/connection_adapters/oracle_enhanced_dirty.rb +13 -12
- data/lib/active_record/connection_adapters/oracle_enhanced_jdbc_connection.rb +42 -19
- data/lib/active_record/connection_adapters/oracle_enhanced_oci_connection.rb +28 -74
- data/lib/active_record/connection_adapters/oracle_enhanced_procedures.rb +165 -231
- data/lib/active_record/connection_adapters/oracle_enhanced_schema_creation.rb +89 -0
- data/lib/active_record/connection_adapters/oracle_enhanced_schema_definitions.rb +16 -24
- data/lib/active_record/connection_adapters/oracle_enhanced_schema_dumper.rb +29 -38
- data/lib/active_record/connection_adapters/oracle_enhanced_schema_statements.rb +93 -42
- data/lib/active_record/connection_adapters/oracle_enhanced_schema_statements_ext.rb +5 -3
- data/lib/active_record/connection_adapters/oracle_enhanced_structure_dump.rb +7 -7
- data/lib/active_record/connection_adapters/oracle_enhanced_version.rb +1 -1
- data/lib/pmacs-activerecord-oracle_enhanced-adapter.rb +2 -2
- data/pmacs-activerecord-oracle_enhanced-adapter.gemspec +19 -17
- data/spec/active_record/connection_adapters/oracle_enhanced_adapter_spec.rb +35 -99
- data/spec/active_record/connection_adapters/oracle_enhanced_connection_spec.rb +17 -3
- data/spec/active_record/connection_adapters/oracle_enhanced_context_index_spec.rb +105 -98
- data/spec/active_record/connection_adapters/oracle_enhanced_data_types_spec.rb +74 -44
- data/spec/active_record/connection_adapters/oracle_enhanced_database_tasks_spec.rb +89 -0
- data/spec/active_record/connection_adapters/oracle_enhanced_dbms_output_spec.rb +3 -3
- data/spec/active_record/connection_adapters/oracle_enhanced_dirty_spec.rb +13 -2
- data/spec/active_record/connection_adapters/oracle_enhanced_procedures_spec.rb +11 -12
- data/spec/active_record/connection_adapters/oracle_enhanced_schema_dump_spec.rb +252 -60
- data/spec/active_record/connection_adapters/oracle_enhanced_schema_statements_spec.rb +170 -40
- data/spec/active_record/connection_adapters/oracle_enhanced_structure_dump_spec.rb +14 -8
- data/spec/spec_helper.rb +25 -54
- metadata +41 -72
- data/lib/active_record/connection_adapters/oracle_enhanced.rake +0 -105
- data/lib/active_record/connection_adapters/oracle_enhanced_activerecord_patches.rb +0 -41
- data/lib/active_record/connection_adapters/oracle_enhanced_base_ext.rb +0 -118
- data/lib/active_record/connection_adapters/oracle_enhanced_core_ext.rb +0 -25
- data/lib/active_record/connection_adapters/oracle_enhanced_tasks.rb +0 -17
- data/spec/active_record/connection_adapters/oracle_enhanced_core_ext_spec.rb +0 -19
@@ -103,9 +103,11 @@ module ActiveRecord
|
|
103
103
|
references = options[:references] ? options[:references].first : nil
|
104
104
|
references_sql = quote_column_name(options[:primary_key] || references || "id")
|
105
105
|
end
|
106
|
-
|
107
|
-
|
108
|
-
|
106
|
+
|
107
|
+
table_name = ActiveRecord::Migrator.proper_table_name(to_table)
|
108
|
+
|
109
|
+
sql = "FOREIGN KEY (#{columns_sql}) REFERENCES #{quote_table_name(table_name)}(#{references_sql})"
|
110
|
+
|
109
111
|
case options[:dependent]
|
110
112
|
when :nullify
|
111
113
|
sql << " ON DELETE SET NULL"
|
@@ -136,7 +136,7 @@ module ActiveRecord #:nodoc:
|
|
136
136
|
|
137
137
|
def dump_schema_information #:nodoc:
|
138
138
|
sm_table = ActiveRecord::Migrator.schema_migrations_table_name
|
139
|
-
migrated = select_values("SELECT version FROM #{sm_table}")
|
139
|
+
migrated = select_values("SELECT version FROM #{sm_table} ORDER BY version")
|
140
140
|
join_with_statement_token(migrated.map{|v| "INSERT INTO #{sm_table} (version) VALUES ('#{v}')" })
|
141
141
|
end
|
142
142
|
|
@@ -149,23 +149,23 @@ module ActiveRecord #:nodoc:
|
|
149
149
|
AND name NOT LIKE 'BIN$%'
|
150
150
|
AND owner = SYS_CONTEXT('userenv', 'current_schema') ORDER BY type").each do |source|
|
151
151
|
ddl = "CREATE OR REPLACE \n"
|
152
|
-
|
152
|
+
select_all(%Q{
|
153
153
|
SELECT text
|
154
154
|
FROM all_source
|
155
155
|
WHERE name = '#{source['name']}'
|
156
156
|
AND type = '#{source['type']}'
|
157
157
|
AND owner = SYS_CONTEXT('userenv', 'current_schema')
|
158
158
|
ORDER BY line
|
159
|
-
}).
|
159
|
+
}).each do |row|
|
160
160
|
ddl << row['text']
|
161
161
|
end
|
162
|
-
ddl << ";" unless ddl.strip[-1,1] ==
|
162
|
+
ddl << ";" unless ddl.strip[-1,1] == ';'
|
163
163
|
structure << ddl
|
164
164
|
end
|
165
165
|
|
166
166
|
# export views
|
167
|
-
select_all("SELECT view_name, text FROM user_views").each do |view|
|
168
|
-
structure << "CREATE OR REPLACE VIEW #{view['view_name']} AS\n #{view['text']}"
|
167
|
+
select_all("SELECT view_name, text FROM user_views ORDER BY view_name ASC").each do |view|
|
168
|
+
structure << "CREATE OR REPLACE FORCE VIEW #{view['view_name']} AS\n #{view['text']}"
|
169
169
|
end
|
170
170
|
|
171
171
|
# export synonyms
|
@@ -240,7 +240,7 @@ module ActiveRecord #:nodoc:
|
|
240
240
|
|
241
241
|
def execute_structure_dump(string)
|
242
242
|
string.split(STATEMENT_TOKEN).each do |ddl|
|
243
|
-
ddl.chop! if ddl
|
243
|
+
ddl.chop! if ddl[-1,1] == ';'
|
244
244
|
execute(ddl) unless ddl.blank?
|
245
245
|
end
|
246
246
|
end
|
@@ -1 +1 @@
|
|
1
|
-
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter::VERSION = File.read(File.
|
1
|
+
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter::VERSION = File.read(File.expand_path('../../../../VERSION', __FILE__)).chomp
|
@@ -5,7 +5,7 @@ if defined?(::Rails::Railtie)
|
|
5
5
|
module ConnectionAdapters
|
6
6
|
class OracleEnhancedRailtie < ::Rails::Railtie
|
7
7
|
rake_tasks do
|
8
|
-
load 'active_record/connection_adapters/
|
8
|
+
load 'active_record/connection_adapters/oracle_enhanced_database_tasks.rb'
|
9
9
|
end
|
10
10
|
|
11
11
|
ActiveSupport.on_load(:active_record) do
|
@@ -22,4 +22,4 @@ if defined?(::Rails::Railtie)
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
-
end
|
25
|
+
end
|
@@ -4,14 +4,18 @@
|
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
|
-
s.name =
|
8
|
-
s.version = "1.
|
7
|
+
s.name = %q{pmacs-activerecord-oracle_enhanced-adapter}
|
8
|
+
s.version = "1.5.1.1"
|
9
9
|
|
10
|
-
s.required_rubygems_version = Gem::Requirement.new("
|
11
|
-
s.authors = [
|
12
|
-
s.date =
|
13
|
-
s.
|
14
|
-
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = [%q{Charles Treatman}, %q{Raimonds Simanovskis}]
|
12
|
+
s.date = %q{2013-03-18}
|
13
|
+
s.version = "1.5.5.1"
|
14
|
+
|
15
|
+
s.description = %q{Oracle "enhanced" ActiveRecord adapter contains useful additional methods for working with new and legacy Oracle databases.
|
16
|
+
This adapter is superset of original ActiveRecord Oracle adapter.
|
17
|
+
}
|
18
|
+
s.email = %q{charles.treatman@gmail.com}
|
15
19
|
s.extra_rdoc_files = [
|
16
20
|
"README.md"
|
17
21
|
]
|
@@ -25,33 +29,31 @@ Gem::Specification.new do |s|
|
|
25
29
|
"Rakefile",
|
26
30
|
"VERSION",
|
27
31
|
"lib/active_record/connection_adapters/emulation/oracle_adapter.rb",
|
28
|
-
"lib/active_record/connection_adapters/oracle_enhanced.rake",
|
29
|
-
"lib/active_record/connection_adapters/oracle_enhanced_activerecord_patches.rb",
|
30
32
|
"lib/active_record/connection_adapters/oracle_enhanced_adapter.rb",
|
31
|
-
"lib/active_record/connection_adapters/oracle_enhanced_base_ext.rb",
|
32
33
|
"lib/active_record/connection_adapters/oracle_enhanced_column.rb",
|
34
|
+
"lib/active_record/connection_adapters/oracle_enhanced_column_dumper.rb",
|
33
35
|
"lib/active_record/connection_adapters/oracle_enhanced_connection.rb",
|
34
36
|
"lib/active_record/connection_adapters/oracle_enhanced_context_index.rb",
|
35
|
-
"lib/active_record/connection_adapters/oracle_enhanced_core_ext.rb",
|
36
37
|
"lib/active_record/connection_adapters/oracle_enhanced_cpk.rb",
|
38
|
+
"lib/active_record/connection_adapters/oracle_enhanced_database_tasks.rb",
|
37
39
|
"lib/active_record/connection_adapters/oracle_enhanced_dirty.rb",
|
38
40
|
"lib/active_record/connection_adapters/oracle_enhanced_jdbc_connection.rb",
|
39
41
|
"lib/active_record/connection_adapters/oracle_enhanced_oci_connection.rb",
|
40
42
|
"lib/active_record/connection_adapters/oracle_enhanced_procedures.rb",
|
43
|
+
"lib/active_record/connection_adapters/oracle_enhanced_schema_creation.rb",
|
41
44
|
"lib/active_record/connection_adapters/oracle_enhanced_schema_definitions.rb",
|
42
45
|
"lib/active_record/connection_adapters/oracle_enhanced_schema_dumper.rb",
|
43
46
|
"lib/active_record/connection_adapters/oracle_enhanced_schema_statements.rb",
|
44
47
|
"lib/active_record/connection_adapters/oracle_enhanced_schema_statements_ext.rb",
|
45
48
|
"lib/active_record/connection_adapters/oracle_enhanced_structure_dump.rb",
|
46
|
-
"lib/active_record/connection_adapters/oracle_enhanced_tasks.rb",
|
47
49
|
"lib/active_record/connection_adapters/oracle_enhanced_version.rb",
|
48
50
|
"lib/pmacs-activerecord-oracle_enhanced-adapter.rb",
|
49
51
|
"pmacs-activerecord-oracle_enhanced-adapter.gemspec",
|
50
52
|
"spec/active_record/connection_adapters/oracle_enhanced_adapter_spec.rb",
|
51
53
|
"spec/active_record/connection_adapters/oracle_enhanced_connection_spec.rb",
|
52
54
|
"spec/active_record/connection_adapters/oracle_enhanced_context_index_spec.rb",
|
53
|
-
"spec/active_record/connection_adapters/oracle_enhanced_core_ext_spec.rb",
|
54
55
|
"spec/active_record/connection_adapters/oracle_enhanced_cpk_spec.rb",
|
56
|
+
"spec/active_record/connection_adapters/oracle_enhanced_database_tasks_spec.rb",
|
55
57
|
"spec/active_record/connection_adapters/oracle_enhanced_data_types_spec.rb",
|
56
58
|
"spec/active_record/connection_adapters/oracle_enhanced_dbms_output_spec.rb",
|
57
59
|
"spec/active_record/connection_adapters/oracle_enhanced_dirty_spec.rb",
|
@@ -70,8 +72,8 @@ Gem::Specification.new do |s|
|
|
70
72
|
"spec/active_record/connection_adapters/oracle_enhanced_adapter_spec.rb",
|
71
73
|
"spec/active_record/connection_adapters/oracle_enhanced_connection_spec.rb",
|
72
74
|
"spec/active_record/connection_adapters/oracle_enhanced_context_index_spec.rb",
|
73
|
-
"spec/active_record/connection_adapters/oracle_enhanced_core_ext_spec.rb",
|
74
75
|
"spec/active_record/connection_adapters/oracle_enhanced_cpk_spec.rb",
|
76
|
+
"spec/active_record/connection_adapters/oracle_enhanced_database_tasks_spec.rb",
|
75
77
|
"spec/active_record/connection_adapters/oracle_enhanced_data_types_spec.rb",
|
76
78
|
"spec/active_record/connection_adapters/oracle_enhanced_dbms_output_spec.rb",
|
77
79
|
"spec/active_record/connection_adapters/oracle_enhanced_dirty_spec.rb",
|
@@ -87,7 +89,7 @@ Gem::Specification.new do |s|
|
|
87
89
|
s.specification_version = 3
|
88
90
|
|
89
91
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
90
|
-
s.add_development_dependency(%q<jeweler>, ["~> 1.
|
92
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.8"])
|
91
93
|
s.add_development_dependency(%q<rspec>, ["~> 2.4"])
|
92
94
|
s.add_development_dependency(%q<rdoc>, [">= 0"])
|
93
95
|
s.add_development_dependency(%q<activerecord>, [">= 0"])
|
@@ -100,7 +102,7 @@ Gem::Specification.new do |s|
|
|
100
102
|
s.add_development_dependency(%q<ruby-plsql>, [">= 0.4.4"])
|
101
103
|
s.add_development_dependency(%q<ruby-oci8>, [">= 2.0.4"])
|
102
104
|
else
|
103
|
-
s.add_dependency(%q<jeweler>, ["~> 1.
|
105
|
+
s.add_dependency(%q<jeweler>, ["~> 1.8"])
|
104
106
|
s.add_dependency(%q<rspec>, ["~> 2.4"])
|
105
107
|
s.add_dependency(%q<rdoc>, [">= 0"])
|
106
108
|
s.add_dependency(%q<activerecord>, [">= 0"])
|
@@ -114,7 +116,7 @@ Gem::Specification.new do |s|
|
|
114
116
|
s.add_dependency(%q<ruby-oci8>, [">= 2.0.4"])
|
115
117
|
end
|
116
118
|
else
|
117
|
-
s.add_dependency(%q<jeweler>, ["~> 1.
|
119
|
+
s.add_dependency(%q<jeweler>, ["~> 1.8"])
|
118
120
|
s.add_dependency(%q<rspec>, ["~> 2.4"])
|
119
121
|
s.add_dependency(%q<rdoc>, [">= 0"])
|
120
122
|
s.add_dependency(%q<activerecord>, [">= 0"])
|
@@ -41,76 +41,6 @@ describe "OracleEnhancedAdapter" do
|
|
41
41
|
ActiveRecord::Base.establish_connection(CONNECTION_PARAMS)
|
42
42
|
end
|
43
43
|
|
44
|
-
describe "database session store" do
|
45
|
-
before(:all) do
|
46
|
-
@conn.execute "DROP TABLE sessions" rescue nil
|
47
|
-
@conn.execute "DROP SEQUENCE sessions_seq" rescue nil
|
48
|
-
@conn = ActiveRecord::Base.connection
|
49
|
-
@conn.execute <<-SQL
|
50
|
-
CREATE TABLE sessions (
|
51
|
-
id NUMBER(38,0) NOT NULL,
|
52
|
-
session_id VARCHAR2(255) DEFAULT NULL,
|
53
|
-
data CLOB DEFAULT NULL,
|
54
|
-
created_at DATE DEFAULT NULL,
|
55
|
-
updated_at DATE DEFAULT NULL,
|
56
|
-
PRIMARY KEY (ID)
|
57
|
-
)
|
58
|
-
SQL
|
59
|
-
@conn.execute <<-SQL
|
60
|
-
CREATE SEQUENCE sessions_seq MINVALUE 1 MAXVALUE 999999999999999999999999999
|
61
|
-
INCREMENT BY 1 START WITH 10040 CACHE 20 NOORDER NOCYCLE
|
62
|
-
SQL
|
63
|
-
if ENV['RAILS_GEM_VERSION'] >= '2.3'
|
64
|
-
@session_class = ActiveRecord::SessionStore::Session
|
65
|
-
else
|
66
|
-
@session_class = CGI::Session::ActiveRecordStore::Session
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
after(:all) do
|
71
|
-
@conn.execute "DROP TABLE sessions"
|
72
|
-
@conn.execute "DROP SEQUENCE sessions_seq"
|
73
|
-
end
|
74
|
-
|
75
|
-
it "should create sessions table" do
|
76
|
-
ActiveRecord::Base.connection.tables.grep("sessions").should_not be_empty
|
77
|
-
end
|
78
|
-
|
79
|
-
it "should save session data" do
|
80
|
-
@session = @session_class.new :session_id => "111111", :data => "something" #, :updated_at => Time.now
|
81
|
-
@session.save!
|
82
|
-
@session = @session_class.find_by_session_id("111111")
|
83
|
-
@session.data.should == "something"
|
84
|
-
end
|
85
|
-
|
86
|
-
it "should change session data when partial updates enabled" do
|
87
|
-
return pending("Not in this ActiveRecord version") unless @session_class.respond_to?(:partial_updates=)
|
88
|
-
@session_class.partial_updates = true
|
89
|
-
@session = @session_class.new :session_id => "222222", :data => "something" #, :updated_at => Time.now
|
90
|
-
@session.save!
|
91
|
-
@session = @session_class.find_by_session_id("222222")
|
92
|
-
@session.data = "other thing"
|
93
|
-
@session.save!
|
94
|
-
# second save should call again blob writing callback
|
95
|
-
@session.save!
|
96
|
-
@session = @session_class.find_by_session_id("222222")
|
97
|
-
@session.data.should == "other thing"
|
98
|
-
end
|
99
|
-
|
100
|
-
it "should have one enhanced_write_lobs callback" do
|
101
|
-
return pending("Not in this ActiveRecord version") unless @session_class.respond_to?(:after_save_callback_chain)
|
102
|
-
@session_class.after_save_callback_chain.select{|cb| cb.method == :enhanced_write_lobs}.should have(1).record
|
103
|
-
end
|
104
|
-
|
105
|
-
it "should not set sessions table session_id column type as integer if emulate_integers_by_column_name is true" do
|
106
|
-
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_integers_by_column_name = true
|
107
|
-
columns = @conn.columns('sessions')
|
108
|
-
column = columns.detect{|c| c.name == "session_id"}
|
109
|
-
column.type.should == :string
|
110
|
-
end
|
111
|
-
|
112
|
-
end
|
113
|
-
|
114
44
|
describe "ignore specified table columns" do
|
115
45
|
before(:all) do
|
116
46
|
@conn = ActiveRecord::Base.connection
|
@@ -186,13 +116,14 @@ describe "OracleEnhancedAdapter" do
|
|
186
116
|
before(:all) do
|
187
117
|
@conn = ActiveRecord::Base.connection
|
188
118
|
@conn.execute "DROP TABLE test_employees" rescue nil
|
189
|
-
@
|
119
|
+
@oracle11g_or_higher = !! @conn.select_value(
|
120
|
+
"select * from product_component_version where product like 'Oracle%' and to_number(substr(version,1,2)) >= 11")
|
190
121
|
@conn.execute <<-SQL
|
191
122
|
CREATE TABLE test_employees (
|
192
123
|
id NUMBER PRIMARY KEY,
|
193
124
|
first_name VARCHAR2(20),
|
194
125
|
last_name VARCHAR2(25),
|
195
|
-
#{ @
|
126
|
+
#{ @oracle11g_or_higher ? "full_name AS (first_name || ' ' || last_name)," : "full_name VARCHAR2(46),"}
|
196
127
|
hire_date DATE
|
197
128
|
)
|
198
129
|
SQL
|
@@ -209,11 +140,7 @@ describe "OracleEnhancedAdapter" do
|
|
209
140
|
end
|
210
141
|
# Another class using the same table
|
211
142
|
class ::TestEmployee2 < ActiveRecord::Base
|
212
|
-
|
213
|
-
self.table_name = "test_employees"
|
214
|
-
else
|
215
|
-
set_table_name "test_employees"
|
216
|
-
end
|
143
|
+
self.table_name = "test_employees"
|
217
144
|
end
|
218
145
|
end
|
219
146
|
|
@@ -244,7 +171,7 @@ describe "OracleEnhancedAdapter" do
|
|
244
171
|
end
|
245
172
|
|
246
173
|
it 'should identify virtual columns as such' do
|
247
|
-
pending "Not supported in this database version" unless @
|
174
|
+
pending "Not supported in this database version" unless @oracle11g_or_higher
|
248
175
|
te = TestEmployee.connection.columns('test_employees').detect(&:virtual?)
|
249
176
|
te.name.should == 'full_name'
|
250
177
|
end
|
@@ -336,11 +263,7 @@ describe "OracleEnhancedAdapter" do
|
|
336
263
|
SQL
|
337
264
|
Object.send(:remove_const, 'CompositePrimaryKeys') if defined?(CompositePrimaryKeys)
|
338
265
|
class ::TestEmployee < ActiveRecord::Base
|
339
|
-
|
340
|
-
self.primary_key = :employee_id
|
341
|
-
else
|
342
|
-
set_primary_key :employee_id
|
343
|
-
end
|
266
|
+
self.primary_key = :employee_id
|
344
267
|
end
|
345
268
|
end
|
346
269
|
|
@@ -517,11 +440,7 @@ describe "OracleEnhancedAdapter" do
|
|
517
440
|
it "should allow creation of a table with non alphanumeric characters" do
|
518
441
|
create_warehouse_things_table
|
519
442
|
class ::WarehouseThing < ActiveRecord::Base
|
520
|
-
|
521
|
-
self.table_name = "warehouse-things"
|
522
|
-
else
|
523
|
-
set_table_name "warehouse-things"
|
524
|
-
end
|
443
|
+
self.table_name = "warehouse-things"
|
525
444
|
end
|
526
445
|
|
527
446
|
wh = WarehouseThing.create!(:name => "Foo", :foo => 2)
|
@@ -533,11 +452,7 @@ describe "OracleEnhancedAdapter" do
|
|
533
452
|
it "should allow creation of a table with CamelCase name" do
|
534
453
|
create_camel_case_table
|
535
454
|
class ::CamelCase < ActiveRecord::Base
|
536
|
-
|
537
|
-
self.table_name = "CamelCase"
|
538
|
-
else
|
539
|
-
set_table_name "CamelCase"
|
540
|
-
end
|
455
|
+
self.table_name = "CamelCase"
|
541
456
|
end
|
542
457
|
|
543
458
|
cc = CamelCase.create!(:name => "Foo", :foo => 2)
|
@@ -569,11 +484,7 @@ describe "OracleEnhancedAdapter" do
|
|
569
484
|
@conn.execute "CREATE OR REPLACE SYNONYM test_posts_seq FOR test_posts_seq@#{@db_link}"
|
570
485
|
class ::TestPost < ActiveRecord::Base
|
571
486
|
end
|
572
|
-
|
573
|
-
TestPost.table_name = "test_posts"
|
574
|
-
else
|
575
|
-
TestPost.set_table_name "test_posts"
|
576
|
-
end
|
487
|
+
TestPost.table_name = "test_posts"
|
577
488
|
end
|
578
489
|
|
579
490
|
after(:all) do
|
@@ -682,7 +593,7 @@ describe "OracleEnhancedAdapter" do
|
|
682
593
|
end
|
683
594
|
|
684
595
|
it "should load included association with more than 1000 records" do
|
685
|
-
posts = TestPost.includes(:test_comments).
|
596
|
+
posts = TestPost.includes(:test_comments).to_a
|
686
597
|
posts.size.should == @ids.size
|
687
598
|
end
|
688
599
|
|
@@ -775,4 +686,29 @@ describe "OracleEnhancedAdapter" do
|
|
775
686
|
explain.should include("INDEX UNIQUE SCAN")
|
776
687
|
end
|
777
688
|
end if ENV['RAILS_GEM_VERSION'] >= '3.2'
|
689
|
+
|
690
|
+
describe ".is_integer_column?" do
|
691
|
+
before(:all) do
|
692
|
+
@adapter = ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter
|
693
|
+
end
|
694
|
+
|
695
|
+
it "should return TrueClass or FalseClass" do
|
696
|
+
@adapter.is_integer_column?("adapter_id").should be_a TrueClass
|
697
|
+
@adapter.is_integer_column?("").should be_a FalseClass
|
698
|
+
end
|
699
|
+
|
700
|
+
it "should return true if name is 'id'" do
|
701
|
+
@adapter.is_integer_column?("id").should be_true
|
702
|
+
end
|
703
|
+
|
704
|
+
it "should return true if name ends with '_id'" do
|
705
|
+
@adapter.is_integer_column?("_id").should be_true
|
706
|
+
@adapter.is_integer_column?("foo_id").should be_true
|
707
|
+
end
|
708
|
+
|
709
|
+
it "should return false if name is 'something_else'" do
|
710
|
+
@adapter.is_integer_column?("something_else").should be_false
|
711
|
+
end
|
712
|
+
end
|
713
|
+
|
778
714
|
end
|
@@ -92,7 +92,8 @@ describe "OracleEnhancedConnection" do
|
|
92
92
|
|
93
93
|
it "should create new connection using :url" do
|
94
94
|
params = CONNECTION_PARAMS.dup
|
95
|
-
params[:url] = "jdbc:oracle:thin:@#{DATABASE_HOST && "
|
95
|
+
params[:url] = "jdbc:oracle:thin:@#{DATABASE_HOST && "//#{DATABASE_HOST}#{DATABASE_PORT && ":#{DATABASE_PORT}"}/"}#{DATABASE_NAME}"
|
96
|
+
|
96
97
|
params[:host] = nil
|
97
98
|
params[:database] = nil
|
98
99
|
@conn = ActiveRecord::ConnectionAdapters::OracleEnhancedConnection.create(params)
|
@@ -157,7 +158,7 @@ describe "OracleEnhancedConnection" do
|
|
157
158
|
|
158
159
|
it "should fall back to directly instantiating OracleDriver" do
|
159
160
|
params = CONNECTION_PARAMS.dup
|
160
|
-
params[:url] = "jdbc:oracle:thin:@#{DATABASE_HOST && "
|
161
|
+
params[:url] = "jdbc:oracle:thin:@#{DATABASE_HOST && "//#{DATABASE_HOST}#{DATABASE_PORT && ":#{DATABASE_PORT}"}/"}#{DATABASE_NAME}"
|
161
162
|
params[:host] = nil
|
162
163
|
params[:database] = nil
|
163
164
|
java.sql.DriverManager.stub!(:getConnection).and_raise('no suitable driver found')
|
@@ -226,7 +227,9 @@ describe "OracleEnhancedConnection" do
|
|
226
227
|
|
227
228
|
it "should execute prepared statement with decimal bind parameter " do
|
228
229
|
cursor = @conn.prepare("INSERT INTO test_employees VALUES(:1)")
|
229
|
-
|
230
|
+
column = ActiveRecord::ConnectionAdapters::OracleEnhancedColumn.new('age', nil, 'NUMBER(10,2)')
|
231
|
+
column.type.should == :decimal
|
232
|
+
cursor.bind_param(1, "1.5", column)
|
230
233
|
cursor.exec
|
231
234
|
cursor.close
|
232
235
|
cursor = @conn.prepare("SELECT age FROM test_employees")
|
@@ -327,6 +330,17 @@ describe "OracleEnhancedConnection" do
|
|
327
330
|
@conn.describe("all_tables").should == ["SYS", "ALL_TABLES"]
|
328
331
|
end
|
329
332
|
|
333
|
+
if defined?(OCI8)
|
334
|
+
context "OCI8 adapter" do
|
335
|
+
|
336
|
+
it "should not fallback to SELECT-based logic when querying non-existant table information" do
|
337
|
+
@conn.should_not_receive(:select_one)
|
338
|
+
@conn.describe("non_existant") rescue ActiveRecord::ConnectionAdapters::OracleEnhancedConnectionException
|
339
|
+
end
|
340
|
+
|
341
|
+
end
|
342
|
+
end
|
343
|
+
|
330
344
|
end
|
331
345
|
|
332
346
|
end
|
@@ -7,19 +7,19 @@ describe "OracleEnhancedAdapter context index" do
|
|
7
7
|
|
8
8
|
def create_table_posts
|
9
9
|
schema_define do
|
10
|
-
create_table :posts, :
|
10
|
+
create_table :posts, force: true do |t|
|
11
11
|
t.string :title
|
12
12
|
t.text :body
|
13
13
|
t.integer :comments_count
|
14
14
|
t.timestamps
|
15
|
-
t.string :all_text, :
|
15
|
+
t.string :all_text, limit: 2 # will be used for multi-column index
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
20
|
def create_table_comments
|
21
21
|
schema_define do
|
22
|
-
create_table :comments, :
|
22
|
+
create_table :comments, force: true do |t|
|
23
23
|
t.integer :post_id
|
24
24
|
t.string :author
|
25
25
|
t.text :body
|
@@ -68,11 +68,11 @@ describe "OracleEnhancedAdapter context index" do
|
|
68
68
|
class ::Post < ActiveRecord::Base
|
69
69
|
has_context_index
|
70
70
|
end
|
71
|
-
@post0 = Post.create(:
|
72
|
-
@post1 = Post.create(:
|
73
|
-
@post2 = Post.create(:
|
74
|
-
@post_with_null_body = Post.create(:
|
75
|
-
@post_with_null_title = Post.create(:
|
71
|
+
@post0 = Post.create(title: "dummy title", body: "dummy body")
|
72
|
+
@post1 = Post.create(title: @title_words.join(' '), body: @body_words.join(' '))
|
73
|
+
@post2 = Post.create(title: (@title_words*2).join(' '), body: (@body_words*2).join(' '))
|
74
|
+
@post_with_null_body = Post.create(title: "withnull", body: nil)
|
75
|
+
@post_with_null_title = Post.create(title: nil, body: "withnull")
|
76
76
|
end
|
77
77
|
|
78
78
|
after(:all) do
|
@@ -88,7 +88,7 @@ describe "OracleEnhancedAdapter context index" do
|
|
88
88
|
it "should create single VARCHAR2 column index" do
|
89
89
|
@conn.add_context_index :posts, :title
|
90
90
|
@title_words.each do |word|
|
91
|
-
Post.contains(:title, word).
|
91
|
+
Post.contains(:title, word).to_a.should == [@post2, @post1]
|
92
92
|
end
|
93
93
|
@conn.remove_context_index :posts, :title
|
94
94
|
end
|
@@ -96,7 +96,7 @@ describe "OracleEnhancedAdapter context index" do
|
|
96
96
|
it "should create single CLOB column index" do
|
97
97
|
@conn.add_context_index :posts, :body
|
98
98
|
@body_words.each do |word|
|
99
|
-
Post.contains(:body, word).
|
99
|
+
Post.contains(:body, word).to_a.should == [@post2, @post1]
|
100
100
|
end
|
101
101
|
@conn.remove_context_index :posts, :body
|
102
102
|
end
|
@@ -110,62 +110,62 @@ describe "OracleEnhancedAdapter context index" do
|
|
110
110
|
it "should create multiple column index" do
|
111
111
|
@conn.add_context_index :posts, [:title, :body]
|
112
112
|
(@title_words+@body_words).each do |word|
|
113
|
-
Post.contains(:title, word).
|
113
|
+
Post.contains(:title, word).to_a.should == [@post2, @post1]
|
114
114
|
end
|
115
115
|
@conn.remove_context_index :posts, [:title, :body]
|
116
116
|
end
|
117
117
|
|
118
118
|
it "should index records with null values" do
|
119
119
|
@conn.add_context_index :posts, [:title, :body]
|
120
|
-
Post.contains(:title, "withnull").
|
120
|
+
Post.contains(:title, "withnull").to_a.should == [@post_with_null_body, @post_with_null_title]
|
121
121
|
@conn.remove_context_index :posts, [:title, :body]
|
122
122
|
end
|
123
123
|
|
124
124
|
it "should create multiple column index with specified main index column" do
|
125
125
|
@conn.add_context_index :posts, [:title, :body],
|
126
|
-
:
|
127
|
-
@post = Post.create(:
|
128
|
-
Post.contains(:all_text, "abc").
|
129
|
-
Post.contains(:all_text, "def").
|
130
|
-
@post.update_attributes!(:
|
126
|
+
index_column: :all_text, sync: 'ON COMMIT'
|
127
|
+
@post = Post.create(title: "abc", body: "def")
|
128
|
+
Post.contains(:all_text, "abc").to_a.should == [@post]
|
129
|
+
Post.contains(:all_text, "def").to_a.should == [@post]
|
130
|
+
@post.update_attributes!(title: "ghi")
|
131
131
|
# index will not be updated as all_text column is not changed
|
132
|
-
Post.contains(:all_text, "ghi").
|
133
|
-
@post.update_attributes!(:
|
132
|
+
Post.contains(:all_text, "ghi").to_a.should be_empty
|
133
|
+
@post.update_attributes!(all_text: "1")
|
134
134
|
# index will be updated when all_text column is changed
|
135
|
-
Post.contains(:all_text, "ghi").
|
136
|
-
@conn.remove_context_index :posts, :
|
135
|
+
Post.contains(:all_text, "ghi").to_a.should == [@post]
|
136
|
+
@conn.remove_context_index :posts, index_column: :all_text
|
137
137
|
end
|
138
138
|
|
139
139
|
it "should create multiple column index with trigger updated main index column" do
|
140
140
|
@conn.add_context_index :posts, [:title, :body],
|
141
|
-
:
|
142
|
-
:
|
143
|
-
@post = Post.create(:
|
144
|
-
Post.contains(:all_text, "abc").
|
145
|
-
Post.contains(:all_text, "def").
|
146
|
-
@post.update_attributes!(:
|
141
|
+
index_column: :all_text, index_column_trigger_on: [:created_at, :updated_at],
|
142
|
+
sync: 'ON COMMIT'
|
143
|
+
@post = Post.create(title: "abc", body: "def")
|
144
|
+
Post.contains(:all_text, "abc").to_a.should == [@post]
|
145
|
+
Post.contains(:all_text, "def").to_a.should == [@post]
|
146
|
+
@post.update_attributes!(title: "ghi")
|
147
147
|
# index should be updated as created_at column is changed
|
148
|
-
Post.contains(:all_text, "ghi").
|
149
|
-
@conn.remove_context_index :posts, :
|
148
|
+
Post.contains(:all_text, "ghi").to_a.should == [@post]
|
149
|
+
@conn.remove_context_index :posts, index_column: :all_text
|
150
150
|
end
|
151
151
|
|
152
152
|
it "should use base letter conversion with BASIC_LEXER" do
|
153
|
-
@post = Post.create!(:
|
153
|
+
@post = Post.create!(title: "āčē", body: "dummy")
|
154
154
|
@conn.add_context_index :posts, :title,
|
155
|
-
:
|
156
|
-
Post.contains(:title, "āčē").
|
157
|
-
Post.contains(:title, "ace").
|
158
|
-
Post.contains(:title, "ACE").
|
155
|
+
lexer: { type: "BASIC_LEXER", base_letter_type: 'GENERIC', base_letter: true }
|
156
|
+
Post.contains(:title, "āčē").to_a.should == [@post]
|
157
|
+
Post.contains(:title, "ace").to_a.should == [@post]
|
158
|
+
Post.contains(:title, "ACE").to_a.should == [@post]
|
159
159
|
@conn.remove_context_index :posts, :title
|
160
160
|
end
|
161
161
|
|
162
162
|
it "should create transactional index and sync index within transaction on inserts and updates" do
|
163
|
-
@conn.add_context_index :posts, :title, :
|
163
|
+
@conn.add_context_index :posts, :title, transactional: true
|
164
164
|
Post.transaction do
|
165
|
-
@post = Post.create(:
|
166
|
-
Post.contains(:title, "abc").
|
167
|
-
@post.update_attributes!(:
|
168
|
-
Post.contains(:title, "ghi").
|
165
|
+
@post = Post.create(title: "abc")
|
166
|
+
Post.contains(:title, "abc").to_a.should == [@post]
|
167
|
+
@post.update_attributes!(title: "ghi")
|
168
|
+
Post.contains(:title, "ghi").to_a.should == [@post]
|
169
169
|
end
|
170
170
|
@conn.remove_context_index :posts, :title
|
171
171
|
end
|
@@ -174,13 +174,15 @@ describe "OracleEnhancedAdapter context index" do
|
|
174
174
|
describe "on multiple tables" do
|
175
175
|
before(:all) do
|
176
176
|
@conn = ActiveRecord::Base.connection
|
177
|
+
@oracle12c = !! @conn.select_value(
|
178
|
+
"select * from product_component_version where product like 'Oracle%' and to_number(substr(version,1,2)) = 12")
|
177
179
|
create_tables
|
178
180
|
class ::Post < ActiveRecord::Base
|
179
|
-
has_many :comments, :
|
181
|
+
has_many :comments, dependent: :destroy
|
180
182
|
has_context_index
|
181
183
|
end
|
182
184
|
class ::Comment < ActiveRecord::Base
|
183
|
-
belongs_to :post, :
|
185
|
+
belongs_to :post, counter_cache: true
|
184
186
|
end
|
185
187
|
end
|
186
188
|
|
@@ -192,28 +194,31 @@ describe "OracleEnhancedAdapter context index" do
|
|
192
194
|
end
|
193
195
|
|
194
196
|
after(:each) do
|
197
|
+
@conn.remove_context_index :posts, name: 'post_and_comments_index' rescue nil
|
198
|
+
@conn.remove_context_index :posts, index_column: :all_text rescue nil
|
195
199
|
Post.destroy_all
|
196
200
|
end
|
197
201
|
|
198
202
|
it "should create multiple table index with specified main index column" do
|
203
|
+
pending "It always fails when Oracle 12c 12.1.0 used." if @oracle12c
|
199
204
|
@conn.add_context_index :posts,
|
200
205
|
[:title, :body,
|
201
206
|
# specify aliases always with AS keyword
|
202
207
|
"SELECT comments.author AS comment_author, comments.body AS comment_body FROM comments WHERE comments.post_id = :id"
|
203
208
|
],
|
204
|
-
:
|
205
|
-
:
|
206
|
-
:
|
207
|
-
@post = Post.create!(:
|
208
|
-
@post.comments.create!(:
|
209
|
-
@post.comments.create!(:
|
209
|
+
name: 'post_and_comments_index',
|
210
|
+
index_column: :all_text, index_column_trigger_on: [:updated_at, :comments_count],
|
211
|
+
sync: 'ON COMMIT'
|
212
|
+
@post = Post.create!(title: "aaa", body: "bbb")
|
213
|
+
@post.comments.create!(author: "ccc", body: "ddd")
|
214
|
+
@post.comments.create!(author: "eee", body: "fff")
|
210
215
|
["aaa", "bbb", "ccc", "ddd", "eee", "fff"].each do |word|
|
211
|
-
Post.contains(:all_text, word).
|
216
|
+
Post.contains(:all_text, word).to_a.should == [@post]
|
212
217
|
end
|
213
|
-
@conn.remove_context_index :posts, :name => 'post_and_comments_index'
|
214
218
|
end
|
215
219
|
|
216
220
|
it "should create multiple table index with specified main index column (when subquery has newlines)" do
|
221
|
+
pending "It always fails when Oracle 12c 12.1.0 used." if @oracle12c
|
217
222
|
@conn.add_context_index :posts,
|
218
223
|
[:title, :body,
|
219
224
|
# specify aliases always with AS keyword
|
@@ -223,36 +228,34 @@ describe "OracleEnhancedAdapter context index" do
|
|
223
228
|
FROM comments
|
224
229
|
WHERE comments.post_id = :id }
|
225
230
|
],
|
226
|
-
:
|
227
|
-
:
|
228
|
-
:
|
229
|
-
@post = Post.create!(:
|
230
|
-
@post.comments.create!(:
|
231
|
-
@post.comments.create!(:
|
231
|
+
name: 'post_and_comments_index',
|
232
|
+
index_column: :all_text, index_column_trigger_on: [:updated_at, :comments_count],
|
233
|
+
sync: 'ON COMMIT'
|
234
|
+
@post = Post.create!(title: "aaa", body: "bbb")
|
235
|
+
@post.comments.create!(author: "ccc", body: "ddd")
|
236
|
+
@post.comments.create!(author: "eee", body: "fff")
|
232
237
|
["aaa", "bbb", "ccc", "ddd", "eee", "fff"].each do |word|
|
233
|
-
Post.contains(:all_text, word).
|
238
|
+
Post.contains(:all_text, word).to_a.should == [@post]
|
234
239
|
end
|
235
|
-
@conn.remove_context_index :posts, :name => 'post_and_comments_index'
|
236
240
|
end
|
237
241
|
|
238
242
|
it "should find by search term within specified field" do
|
239
|
-
@post = Post.create!(:
|
240
|
-
@post.comments.create!(:
|
243
|
+
@post = Post.create!(title: "aaa", body: "bbb")
|
244
|
+
@post.comments.create!(author: "ccc", body: "ddd")
|
241
245
|
@conn.add_context_index :posts,
|
242
246
|
[:title, :body,
|
243
247
|
# specify aliases always with AS keyword
|
244
248
|
"SELECT comments.author AS comment_author, comments.body AS comment_body FROM comments WHERE comments.post_id = :id"
|
245
249
|
],
|
246
|
-
:
|
247
|
-
Post.contains(:all_text, "aaa within title").
|
248
|
-
Post.contains(:all_text, "aaa within body").
|
249
|
-
Post.contains(:all_text, "bbb within body").
|
250
|
-
Post.contains(:all_text, "bbb within title").
|
251
|
-
Post.contains(:all_text, "ccc within comment_author").
|
252
|
-
Post.contains(:all_text, "ccc within comment_body").
|
253
|
-
Post.contains(:all_text, "ddd within comment_body").
|
254
|
-
Post.contains(:all_text, "ddd within comment_author").
|
255
|
-
@conn.remove_context_index :posts, :index_column => :all_text
|
250
|
+
index_column: :all_text
|
251
|
+
Post.contains(:all_text, "aaa within title").to_a.should == [@post]
|
252
|
+
Post.contains(:all_text, "aaa within body").to_a.should be_empty
|
253
|
+
Post.contains(:all_text, "bbb within body").to_a.should == [@post]
|
254
|
+
Post.contains(:all_text, "bbb within title").to_a.should be_empty
|
255
|
+
Post.contains(:all_text, "ccc within comment_author").to_a.should == [@post]
|
256
|
+
Post.contains(:all_text, "ccc within comment_body").to_a.should be_empty
|
257
|
+
Post.contains(:all_text, "ddd within comment_body").to_a.should == [@post]
|
258
|
+
Post.contains(:all_text, "ddd within comment_author").to_a.should be_empty
|
256
259
|
end
|
257
260
|
|
258
261
|
end
|
@@ -264,7 +267,7 @@ describe "OracleEnhancedAdapter context index" do
|
|
264
267
|
class ::Post < ActiveRecord::Base
|
265
268
|
has_context_index
|
266
269
|
end
|
267
|
-
@post = Post.create(:
|
270
|
+
@post = Post.create(title: 'aaa', body: 'bbb')
|
268
271
|
@tablespace = @conn.default_tablespace
|
269
272
|
set_logger
|
270
273
|
@conn = ActiveRecord::Base.connection
|
@@ -288,17 +291,17 @@ describe "OracleEnhancedAdapter context index" do
|
|
288
291
|
end
|
289
292
|
|
290
293
|
it "should create index on single column" do
|
291
|
-
@conn.add_context_index :posts, :title, :
|
294
|
+
@conn.add_context_index :posts, :title, tablespace: @tablespace
|
292
295
|
verify_logged_statements
|
293
|
-
Post.contains(:title, 'aaa').
|
296
|
+
Post.contains(:title, 'aaa').to_a.should == [@post]
|
294
297
|
@conn.remove_context_index :posts, :title
|
295
298
|
end
|
296
299
|
|
297
300
|
it "should create index on multiple columns" do
|
298
|
-
@conn.add_context_index :posts, [:title, :body], :
|
301
|
+
@conn.add_context_index :posts, [:title, :body], name: 'index_posts_text', tablespace: @conn.default_tablespace
|
299
302
|
verify_logged_statements
|
300
|
-
Post.contains(:title, 'aaa AND bbb').
|
301
|
-
@conn.remove_context_index :posts, :
|
303
|
+
Post.contains(:title, 'aaa AND bbb').to_a.should == [@post]
|
304
|
+
@conn.remove_context_index :posts, name: 'index_posts_text'
|
302
305
|
end
|
303
306
|
|
304
307
|
end
|
@@ -325,7 +328,7 @@ describe "OracleEnhancedAdapter context index" do
|
|
325
328
|
|
326
329
|
it "should dump definition of single column index" do
|
327
330
|
@conn.add_context_index :posts, :title
|
328
|
-
standard_dump.should =~ /add_context_index "posts", \["title"\], :
|
331
|
+
standard_dump.should =~ /add_context_index "posts", \["title"\], name: \"index_posts_on_title\"$/
|
329
332
|
@conn.remove_context_index :posts, :title
|
330
333
|
end
|
331
334
|
|
@@ -337,47 +340,50 @@ describe "OracleEnhancedAdapter context index" do
|
|
337
340
|
|
338
341
|
it "should dump definition of multiple table index with options" do
|
339
342
|
options = {
|
340
|
-
:
|
341
|
-
:
|
342
|
-
:
|
343
|
-
:
|
343
|
+
name: 'post_and_comments_index',
|
344
|
+
index_column: :all_text, index_column_trigger_on: :updated_at,
|
345
|
+
transactional: true,
|
346
|
+
sync: 'ON COMMIT'
|
344
347
|
}
|
345
348
|
sub_query = "SELECT comments.author AS comment_author, comments.body AS comment_body FROM comments WHERE comments.post_id = :id"
|
346
349
|
@conn.add_context_index :posts, [:title, :body, sub_query], options
|
347
350
|
standard_dump.should =~ /add_context_index "posts", \[:title, :body, "#{sub_query}"\], #{options.inspect[1..-2]}$/
|
348
|
-
@conn.remove_context_index :posts, :
|
351
|
+
@conn.remove_context_index :posts, name: 'post_and_comments_index'
|
349
352
|
end
|
350
353
|
|
351
354
|
it "should dump definition of multiple table index with options (when definition is larger than 4000 bytes)" do
|
352
355
|
options = {
|
353
|
-
:
|
354
|
-
:
|
355
|
-
:
|
356
|
-
:
|
356
|
+
name: 'post_and_comments_index',
|
357
|
+
index_column: :all_text, index_column_trigger_on: :updated_at,
|
358
|
+
transactional: true,
|
359
|
+
sync: 'ON COMMIT'
|
357
360
|
}
|
358
361
|
sub_query = "SELECT comments.author AS comment_author, comments.body AS comment_body FROM comments WHERE comments.post_id = :id#{' AND 1=1' * 500}"
|
359
362
|
@conn.add_context_index :posts, [:title, :body, sub_query], options
|
360
363
|
standard_dump.should =~ /add_context_index "posts", \[:title, :body, "#{sub_query}"\], #{options.inspect[1..-2]}$/
|
361
|
-
@conn.remove_context_index :posts, :
|
364
|
+
@conn.remove_context_index :posts, name: 'post_and_comments_index'
|
362
365
|
end
|
363
366
|
|
364
367
|
it "should dump definition of multiple table index with options (when subquery has newlines)" do
|
365
368
|
options = {
|
366
|
-
:
|
367
|
-
:
|
368
|
-
:
|
369
|
-
:
|
369
|
+
name: 'post_and_comments_index',
|
370
|
+
index_column: :all_text, index_column_trigger_on: :updated_at,
|
371
|
+
transactional: true,
|
372
|
+
sync: 'ON COMMIT'
|
370
373
|
}
|
371
374
|
sub_query = "SELECT comments.author AS comment_author, comments.body AS comment_body\nFROM comments\nWHERE comments.post_id = :id"
|
372
375
|
@conn.add_context_index :posts, [:title, :body, sub_query], options
|
373
376
|
standard_dump.should =~ /add_context_index "posts", \[:title, :body, "#{sub_query.gsub(/\n/, ' ')}"\], #{options.inspect[1..-2]}$/
|
374
|
-
@conn.remove_context_index :posts, :
|
377
|
+
@conn.remove_context_index :posts, name: 'post_and_comments_index'
|
375
378
|
end
|
376
379
|
|
377
380
|
end
|
378
381
|
|
379
382
|
describe "with table prefix and suffix" do
|
380
383
|
before(:all) do
|
384
|
+
@conn = ActiveRecord::Base.connection
|
385
|
+
@oracle12c = !! @conn.select_value(
|
386
|
+
"select * from product_component_version where product like 'Oracle%' and to_number(substr(version,1,2)) = 12")
|
381
387
|
ActiveRecord::Base.table_name_prefix = 'xxx_'
|
382
388
|
ActiveRecord::Base.table_name_suffix = '_xxx'
|
383
389
|
create_tables
|
@@ -391,7 +397,7 @@ describe "OracleEnhancedAdapter context index" do
|
|
391
397
|
|
392
398
|
it "should dump definition of single column index" do
|
393
399
|
schema_define { add_context_index :posts, :title }
|
394
|
-
standard_dump.should =~ /add_context_index "posts", \["title"\], :
|
400
|
+
standard_dump.should =~ /add_context_index "posts", \["title"\], name: "i_xxx_posts_xxx_title"$/
|
395
401
|
schema_define { remove_context_index :posts, :title }
|
396
402
|
end
|
397
403
|
|
@@ -402,12 +408,13 @@ describe "OracleEnhancedAdapter context index" do
|
|
402
408
|
end
|
403
409
|
|
404
410
|
it "should dump definition of multiple table index with options" do
|
411
|
+
pending "It always fails when Oracle 12c 12.1.0 used." if @oracle12c
|
405
412
|
options = {
|
406
|
-
:
|
407
|
-
:
|
408
|
-
:
|
409
|
-
:
|
410
|
-
:
|
413
|
+
name: 'xxx_post_and_comments_i',
|
414
|
+
index_column: :all_text, index_column_trigger_on: :updated_at,
|
415
|
+
lexer: { type: "BASIC_LEXER", base_letter_type: 'GENERIC', base_letter: true },
|
416
|
+
wordlist: { type: "BASIC_WORDLIST", prefix_index: true },
|
417
|
+
sync: 'ON COMMIT'
|
411
418
|
}
|
412
419
|
schema_define do
|
413
420
|
add_context_index :posts,
|
@@ -417,7 +424,7 @@ describe "OracleEnhancedAdapter context index" do
|
|
417
424
|
end
|
418
425
|
standard_dump.should =~ /add_context_index "posts", \[:title, :body, "SELECT comments.author AS comment_author, comments.body AS comment_body FROM comments WHERE comments.post_id = :id"\], #{
|
419
426
|
options.inspect[1..-2].gsub(/[{}]/){|s| '\\'<<s }}$/
|
420
|
-
schema_define { remove_context_index :posts, :
|
427
|
+
schema_define { remove_context_index :posts, name: 'xxx_post_and_comments_i' }
|
421
428
|
end
|
422
429
|
|
423
430
|
end
|