class ActiveRecord::Migration
Public Instance Methods
add_pg_searchable_dictionary(dictionary, options = {})
click to toggle source
# File lib/pg_searchable/active_record/migration.rb, line 33 def add_pg_searchable_dictionary(dictionary, options = {}) remove_pg_searchable_dictionary(dictionary) options = { catalog: 'english', template: 'ispell', dict_file: 'english', aff_file: 'english', stop_words: 'english', mappings: 'asciiword, asciihword, hword_asciipart, word, hword, hword_part' }.merge(options) execute <<-EOS CREATE TEXT SEARCH CONFIGURATION #{dictionary} ( COPY = pg_catalog.#{options[:catalog]} ); CREATE TEXT SEARCH DICTIONARY #{dictionary}_dict ( TEMPLATE = #{options[:template]}, DictFile = #{options[:dict_file]}, AffFile = #{options[:aff_file]}, StopWords = #{options[:stop_words]} ); ALTER TEXT SEARCH CONFIGURATION #{dictionary} ALTER MAPPING FOR #{options[:mappings]} WITH unaccent, #{dictionary}_dict, english_stem; EOS end
add_pg_searchable_dmetaphone_trigger(table_name, column_name, options = {})
click to toggle source
# File lib/pg_searchable/active_record/migration.rb, line 19 def add_pg_searchable_dmetaphone_trigger(table_name, column_name, options = {}) options.reverse_merge({ dictionary: 'simple', columns: nil }) column_data = case options[:columns] when Array then "to_tsvector('#{options['dictionary']}', #{options[:columns].map {|column_name| "pg_searchable_dmetaphone(coalesce(new.#{column_name}, ''))" }.join(" || ' ' || ") });" when Hash then "#{options[:columns].map {|column_name, weight| "setweight(to_tsvector('#{options[:dictionary]}', pg_searchable_dmetaphone(coalesce(new.#{column_name}, ''))), '#{weight}')" }.join(" || ")};" end _add_pg_searchable_trigger(table_name, column_name, :dmetaphone, column_data) end
add_pg_searchable_point_index(table_name, longitude_column, latitude_column)
click to toggle source
# File lib/pg_searchable/active_record/migration.rb, line 67 def add_pg_searchable_point_index(table_name, longitude_column, latitude_column) execute %{CREATE INDEX index_#{table_name}_on_#{longitude_column}_#{latitude_column}_point ON #{table_name} using gist ( ST_GeographyFromText( 'SRID=4326;POINT(' || #{table_name}.#{longitude_column} || ' ' || #{table_name}.#{latitude_column} || ')' ) ) } end
add_pg_searchable_tsearch_trigger(table_name, column_name, options = {})
click to toggle source
# File lib/pg_searchable/active_record/migration.rb, line 5 def add_pg_searchable_tsearch_trigger(table_name, column_name, options = {}) options.reverse_merge({ dictionary: 'simple', columns: nil }) column_data = case options[:columns] when Array then "to_tsvector('#{options['dictionary']}', #{options[:columns].map {|column_name| "coalesce(new.#{column_name}, '')" }.join(" || ' ' || ") });" when Hash then "#{options[:columns].map {|column_name, weight| "setweight(to_tsvector('#{options[:dictionary]}', coalesce(new.#{column_name}, '')), '#{weight}')" }.join(" || ")};" end _add_pg_searchable_trigger(table_name, column_name, :tsearch, column_data) end
remove_pg_searchable_dictionary(dictionary)
click to toggle source
# File lib/pg_searchable/active_record/migration.rb, line 60 def remove_pg_searchable_dictionary(dictionary) execute <<-SQL DROP TEXT SEARCH CONFIGURATION IF EXISTS #{dictionary}; DROP TEXT SEARCH DICTIONARY IF EXISTS #{dictionary}_dict; SQL end
remove_pg_searchable_dmetaphone_trigger(table_name, column_name)
click to toggle source
# File lib/pg_searchable/active_record/migration.rb, line 29 def remove_pg_searchable_dmetaphone_trigger(table_name, column_name) _remove_pg_searchable_trigger(table_name, column_name, :dmetaphone) end
remove_pg_searchable_point_index(table_name, longitude_column, latitude_column)
click to toggle source
# File lib/pg_searchable/active_record/migration.rb, line 76 def remove_pg_searchable_point_index(table_name, longitude_column, latitude_column) execute %{ DROP INDEX index_#{table_name}_on_#{longitude_column}_#{latitude_column}_point } end
remove_pg_searchable_tsearch_trigger(table_name, column_name)
click to toggle source
# File lib/pg_searchable/active_record/migration.rb, line 15 def remove_pg_searchable_tsearch_trigger(table_name, column_name) _remove_pg_searchable_trigger(table_name, column_name, :tsearch) end
Private Instance Methods
_add_pg_searchable_trigger(table_name, column_name, trigger_type = 'tsearch', column_data = '')
click to toggle source
# File lib/pg_searchable/active_record/migration.rb, line 84 def _add_pg_searchable_trigger(table_name, column_name, trigger_type = 'tsearch', column_data = '') trigger_name = "#{table_name}_#{column_name}_#{trigger_type}" # be sure to remove trigger / function before recreating it _remove_pg_searchable_trigger(table_name, column_name, trigger_type) execute <<-SQL CREATE OR REPLACE FUNCTION #{trigger_name}_update() RETURNS trigger AS $$ begin new.#{column_name} := #{column_data} return new; end $$ LANGUAGE plpgsql; CREATE TRIGGER #{trigger_name} BEFORE INSERT OR UPDATE ON #{table_name} FOR EACH ROW EXECUTE PROCEDURE #{trigger_name}_update(); SQL end
_remove_pg_searchable_trigger(table_name, column_name, trigger_type = 'tsearch')
click to toggle source
# File lib/pg_searchable/active_record/migration.rb, line 104 def _remove_pg_searchable_trigger(table_name, column_name, trigger_type = 'tsearch') trigger_name = "#{table_name}_#{column_name}_#{trigger_type}" execute <<-SQL DROP TRIGGER IF EXISTS #{trigger_name} ON #{table_name}; DROP FUNCTION IF EXISTS #{trigger_name}_update(); SQL end