From 03b3e7b1cdd1cf51e79b0a2b5e6e4470a7ae87c9 Mon Sep 17 00:00:00 2001 From: Rodrigo Souto Date: Thu, 16 May 2013 12:53:38 -0300 Subject: [PATCH] Refactoring pg_search_plugin --- plugins/pg_search/db/migrate/20130320010053_create_indexes_for_search.rb | 19 ------------------- plugins/pg_search/db/migrate/20130320010062_create_indexes_for_search.rb | 16 ++++++++++++++++ plugins/pg_search/lib/ext/active_record.rb | 7 +++++-- plugins/pg_search/test/unit/pg_search_plugin_test.rb | 22 ++++++++++++++++++++++ 4 files changed, 43 insertions(+), 21 deletions(-) delete mode 100644 plugins/pg_search/db/migrate/20130320010053_create_indexes_for_search.rb create mode 100644 plugins/pg_search/db/migrate/20130320010062_create_indexes_for_search.rb create mode 100644 plugins/pg_search/test/unit/pg_search_plugin_test.rb diff --git a/plugins/pg_search/db/migrate/20130320010053_create_indexes_for_search.rb b/plugins/pg_search/db/migrate/20130320010053_create_indexes_for_search.rb deleted file mode 100644 index ea5e619..0000000 --- a/plugins/pg_search/db/migrate/20130320010053_create_indexes_for_search.rb +++ /dev/null @@ -1,19 +0,0 @@ -class CreateIndexesForSearch < ActiveRecord::Migration - def self.up - searchables = %w[ article comment qualifier national_region certifier profile license scrap category ] - klasses = searchables.map {|searchable| searchable.camelize.constantize } - klasses.each do |klass| - klass::SEARCHABLE_FIELDS.keys.each do |field| - execute "create index pg_search_plugin_#{klass.name.singularize.downcase}_#{field} on #{klass.table_name} using gin(to_tsvector('simple', \"#{klass.table_name}\".#{field}))" - end - end - end - - def self.down - klasses.each do |klass| - klass::SEARCHABLE_FIELDS.keys.each do |field| - execute "drop index pg_search_plugin_#{klass.name.singularize.downcase}_#{field}" - end - end - end -end diff --git a/plugins/pg_search/db/migrate/20130320010062_create_indexes_for_search.rb b/plugins/pg_search/db/migrate/20130320010062_create_indexes_for_search.rb new file mode 100644 index 0000000..633bbce --- /dev/null +++ b/plugins/pg_search/db/migrate/20130320010062_create_indexes_for_search.rb @@ -0,0 +1,16 @@ +class CreateIndexesForSearch < ActiveRecord::Migration + def self.up + searchables = %w[ article comment qualifier national_region certifier profile license scrap category ] + klasses = searchables.map {|searchable| searchable.camelize.constantize } + klasses.each do |klass| + fields = klass.pg_search_plugin_fields + execute "create index pg_search_plugin_#{klass.name.singularize.downcase} on #{klass.table_name} using gin(to_tsvector('simple', #{fields}))" + end + end + + def self.down + klasses.each do |klass| + execute "drop index pg_search_plugin_#{klass.name.singularize.downcase}" + end + end +end diff --git a/plugins/pg_search/lib/ext/active_record.rb b/plugins/pg_search/lib/ext/active_record.rb index 1c7b2ff..3296888 100644 --- a/plugins/pg_search/lib/ext/active_record.rb +++ b/plugins/pg_search/lib/ext/active_record.rb @@ -3,10 +3,13 @@ require_dependency 'active_record' class ActiveRecord::Base def self.pg_search_plugin_search(query) if defined?(self::SEARCHABLE_FIELDS) - conditions = self::SEARCHABLE_FIELDS.map {|field, weight| "to_tsvector('simple', \"#{self.table_name}\".#{field}) @@ '#{query}'"}.join(' OR ') - where(conditions) + where("to_tsvector('simple', #{pg_search_plugin_fields}) @@ to_tsquery('#{query}:*')") else raise "No searchable fields defined for #{self.name}" end end + + def self.pg_search_plugin_fields + self::SEARCHABLE_FIELDS.keys.map(&:to_s).sort.map {|f| "coalesce(\"#{table_name}\".#{f}, '')"}.join(" || ' ' || ") + end end diff --git a/plugins/pg_search/test/unit/pg_search_plugin_test.rb b/plugins/pg_search/test/unit/pg_search_plugin_test.rb new file mode 100644 index 0000000..adbc838 --- /dev/null +++ b/plugins/pg_search/test/unit/pg_search_plugin_test.rb @@ -0,0 +1,22 @@ +require 'test_helper' + +class PgSearchPluginTest < ActiveSupport::TestCase + def setup + @environment = Environment.default + @environment.enable_plugin(PgSearchPlugin) + end + + should 'locate profile' do + profile = fast_create(Profile, :name => 'John', :identifier => 'waterfall') + assert_includes search(Profile, 'John'), profile + assert_includes search(Profile, 'john'), profile + assert_includes search(Profile, 'waterfall'), profile + assert_includes search(Profile, 'water'), profile + end + + private + + def search(scope, query) + scope.pg_search_plugin_search(query) + end +end -- libgit2 0.21.2