Skip to content

Commit a8d8213

Browse files
alnokares
authored andcommitted
Support options for Postgresql indexes
1 parent 14c5cd4 commit a8d8213

File tree

2 files changed

+84
-3
lines changed

2 files changed

+84
-3
lines changed

lib/arjdbc/postgresql/adapter.rb

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -596,7 +596,11 @@ def supports_transaction_isolation? # :nodoc:
596596
def supports_index_sort_order? # :nodoc:
597597
true
598598
end
599-
599+
600+
def supports_partial_index?
601+
true
602+
end if AR4_COMPAT
603+
600604
# Range datatypes weren't introduced until PostgreSQL 9.2
601605
def supports_ranges? # :nodoc:
602606
postgresql_version >= 90200
@@ -609,7 +613,11 @@ def supports_savepoints? # :nodoc:
609613
def supports_transaction_isolation?(level = nil)
610614
true
611615
end
612-
616+
617+
def index_algorithms
618+
{ :concurrently => 'CONCURRENTLY' }
619+
end
620+
613621
def create_savepoint
614622
execute("SAVEPOINT #{current_savepoint_name}")
615623
end
@@ -1214,7 +1222,12 @@ def rename_column(table_name, column_name, new_column_name) # :nodoc:
12141222
rename_column_indexes(table_name, column_name, new_column_name) if respond_to?(:rename_column_indexes) # AR-4.0 SchemaStatements
12151223
end
12161224

1217-
def remove_index!(table_name, index_name) #:nodoc:
1225+
def add_index(table_name, column_name, options = {}) # :nodoc:
1226+
index_name, index_type, index_columns, index_options, index_algorithm, index_using = add_index_options(table_name, column_name, options)
1227+
execute "CREATE #{index_type} INDEX #{index_algorithm} #{quote_column_name(index_name)} ON #{quote_table_name(table_name)} #{index_using} (#{index_columns})#{index_options}"
1228+
end if AR4_COMPAT
1229+
1230+
def remove_index!(table_name, index_name) # :nodoc:
12181231
execute "DROP INDEX #{quote_table_name(index_name)}"
12191232
end
12201233

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
require 'test_helper'
2+
require 'db/postgres'
3+
4+
class PostgreActiveSchemaUnitTest < Test::Unit::TestCase
5+
6+
setup do
7+
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
8+
def execute(sql, name = nil) sql end
9+
end
10+
end
11+
12+
teardown do
13+
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
14+
remove_method :execute
15+
end
16+
end
17+
18+
def test_create_database_with_encoding
19+
assert_equal %(CREATE DATABASE "matt" ENCODING = 'utf8'), create_database(:matt)
20+
assert_equal %(CREATE DATABASE "aimonetti" ENCODING = 'latin1'), create_database(:aimonetti, :encoding => :latin1)
21+
assert_equal %(CREATE DATABASE "aimonetti" ENCODING = 'latin1'), create_database(:aimonetti, 'encoding' => :latin1)
22+
end
23+
24+
def test_create_database_with_collation_and_ctype
25+
assert_equal %(CREATE DATABASE "aimonetti" ENCODING = 'UTF8' LC_COLLATE = 'ja_JP.UTF8' LC_CTYPE = 'ja_JP.UTF8'), create_database(:aimonetti, :encoding => :"UTF8", :collation => :"ja_JP.UTF8", :ctype => :"ja_JP.UTF8")
26+
end
27+
28+
def test_add_index
29+
# add_index calls index_name_exists? which can't work since execute is stubbed
30+
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.send(:define_method, :index_name_exists?) do |*|
31+
false
32+
end
33+
redefined = true
34+
35+
expected = %(CREATE UNIQUE INDEX "index_people_on_last_name" ON "people" ("last_name") WHERE state = 'active')
36+
assert_equal expected, add_index(:people, :last_name, :unique => true, :where => "state = 'active'")
37+
38+
expected = %(CREATE INDEX CONCURRENTLY "index_people_on_last_name" ON "people" ("last_name"))
39+
assert_equal expected, add_index(:people, :last_name, :algorithm => :concurrently)
40+
41+
%w(gin gist hash btree).each do |type|
42+
expected = %(CREATE INDEX "index_people_on_last_name" ON "people" USING #{type} ("last_name"))
43+
assert_equal expected, add_index(:people, :last_name, :using => type)
44+
45+
expected = %(CREATE INDEX CONCURRENTLY "index_people_on_last_name" ON "people" USING #{type} ("last_name"))
46+
assert_equal expected, add_index(:people, :last_name, :using => type, :algorithm => :concurrently)
47+
end
48+
49+
assert_raise ArgumentError do
50+
add_index(:people, :last_name, :algorithm => :copy)
51+
end
52+
expected = %(CREATE UNIQUE INDEX "index_people_on_last_name" ON "people" USING gist ("last_name"))
53+
assert_equal expected, add_index(:people, :last_name, :unique => true, :using => :gist)
54+
55+
expected = %(CREATE UNIQUE INDEX "index_people_on_last_name" ON "people" USING gist ("last_name") WHERE state = 'active')
56+
assert_equal expected, add_index(:people, :last_name, :unique => true, :where => "state = 'active'", :using => :gist)
57+
58+
ensure
59+
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.send(:remove_method, :index_name_exists?) if redefined
60+
end if ar_version('4.0')
61+
62+
private
63+
64+
def method_missing(method_symbol, *arguments)
65+
ActiveRecord::Base.connection.send(method_symbol, *arguments)
66+
end
67+
68+
end

0 commit comments

Comments
 (0)