fulltext_search_redux 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 378c35d9c374acd91c037a041c7ecfad0b90f370
4
+ data.tar.gz: 1371d80b2b1de3744c6b811814bc577ccee072a0
5
+ SHA512:
6
+ metadata.gz: eb9c1b3c26c2faf4d411ea283158704d099513e290c2c0bff47dc0c6f83a61e5916c91b9e7a40d7613c4a2755f647697f0b08fbeedf8e0dea5c2a5c239f16f5b
7
+ data.tar.gz: 52054577dae037df7447a6633489aeecea98fa7b09cc764b3d7e58b43c8ebfaa19ab587160b606da5419c760a18d04e6da028c4cbd48ef165323e6e2030ed187
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ *.gem
2
+ *.swp
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/README.md ADDED
@@ -0,0 +1,27 @@
1
+ # Full text search redux
2
+
3
+ The current version is just a code extraction of a simple text search using especially Postgres functionality.
4
+
5
+ For now the usage is limited, it expects a title and a content column.
6
+
7
+ # Installation
8
+
9
+ Include the gem in your Gemfile:
10
+
11
+ ```ruby
12
+ gem 'fulltext_search_redux'
13
+ ```
14
+
15
+ # Quick start
16
+
17
+ ```ruby
18
+ class MyModel
19
+ act_as_searchable
20
+ end
21
+
22
+ class MyController
23
+ def index
24
+ an_article = MyModel.text_search 'query phrase'
25
+ end
26
+ end
27
+ ```
@@ -0,0 +1,22 @@
1
+ $LOAD_PATH.push File.expand_path("../lib", __FILE__)
2
+ require 'fulltext_search_redux/version'
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = 'fulltext_search_redux'
6
+ s.version = FulltextSearchRedux::VERSION
7
+ s.platform = Gem::Platform::RUBY
8
+ s.summary = 'Add a text_search method to your models.'
9
+ s.description = 'Simple ActiveRecord full text search.'
10
+ s.author = 'Marian Posaceanu'
11
+ s.email = 'contact@marianposaceanu.com'
12
+ s.files = `git ls-files`.split("\n")
13
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
14
+ s.require_paths = ['lib']
15
+ s.homepage = 'https://github.com/dakull/fulltext_search_redux'
16
+
17
+ s.required_ruby_version = '>= 1.9.2'
18
+
19
+ s.add_dependency('activerecord', '>= 3.0.0')
20
+ s.add_dependency('activemodel', '>= 3.0.0')
21
+ s.add_dependency('activesupport', '>= 3.0.0')
22
+ end
@@ -0,0 +1,25 @@
1
+ require 'fulltext_search_redux/version'
2
+ require 'fulltext_search_redux/errors'
3
+ require 'fulltext_search_redux/helpers'
4
+ require 'fulltext_search_redux/glue'
5
+ require 'fulltext_search_redux/rdbms/mysql.rb'
6
+ require 'fulltext_search_redux/rdbms/postgres.rb'
7
+
8
+ require 'fulltext_search_redux/railtie'
9
+
10
+ module FulltextSearchRedux
11
+ extend Helpers
12
+
13
+ module ClassMethods
14
+ def text_search(query)
15
+ if query.present?
16
+ adapter = FulltextSearchRedux.db_adapter
17
+ strategy = FulltextSearchRedux.select_best_query_strategy(adapter, query)
18
+
19
+ strategy.call(self)
20
+ else
21
+ scoped
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,2 @@
1
+ module FulltextSearchRedux
2
+ end
@@ -0,0 +1,7 @@
1
+ module FulltextSearchRedux
2
+ module Glue
3
+ def self.included(base)
4
+ base.extend ClassMethods
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,16 @@
1
+ module FulltextSearchRedux
2
+ module Helpers
3
+ def select_best_query_strategy(adapter, query)
4
+ case adapter
5
+ when /mysql.*/i
6
+ FulltextSearchRedux::Mysql.compatible_search(query)
7
+ when /postgres.*/i
8
+ FulltextSearchRedux::Postgres.compatible_search(query)
9
+ end
10
+ end
11
+
12
+ def db_adapter
13
+ ActiveRecord::Base::connection.adapter_name
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,20 @@
1
+ module FulltextSearchRedux
2
+ require 'rails'
3
+
4
+ class Railtie < Rails::Railtie
5
+ initializer 'fulltext_search_redux.insert_into_active_record' do |app|
6
+ FulltextSearchRedux::Railtie.insert
7
+ end
8
+
9
+ # rake_tasks { load 'tasks/fulltext_search_redux.rake' }
10
+ end
11
+
12
+ class Railtie
13
+ def self.insert
14
+ if defined? ActiveRecord
15
+ # do the dew
16
+ ActiveRecord::Base.send(:include, FulltextSearchRedux::Glue)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,7 @@
1
+ module FulltextSearchRedux
2
+ class Mysql
3
+ def self.compatible_search(query)
4
+ ->(obj) { obj.where("title like :q or content like :q", q: "%#{query}%") }
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,18 @@
1
+ module FulltextSearchRedux
2
+ class Postgres
3
+ def self.compatible_search(query)
4
+ sanitized_query = ActionController::Base.helpers.sanitize(query)
5
+
6
+ rank = <<-RANK
7
+ ts_rank(to_tsvector(title), plainto_tsquery('#{sanitized_query}'))
8
+ RANK
9
+
10
+ sql = <<-SQL
11
+ to_tsvector('english', title) @@ plainto_tsquery(:q)
12
+ OR to_tsvector('english', content) @@ plainto_tsquery(:q)
13
+ SQL
14
+
15
+ ->(obj) { obj.where(sql, q: query).order("#{rank} desc") }
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,3 @@
1
+ module FulltextSearchRedux
2
+ VERSION = '0.0.3' unless defined? FulltextSearchRedux::VERSION
3
+ end
metadata ADDED
@@ -0,0 +1,96 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fulltext_search_redux
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
5
+ platform: ruby
6
+ authors:
7
+ - Marian Posaceanu
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-05-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activerecord
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: 3.0.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: 3.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: activemodel
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: 3.0.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: 3.0.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: activesupport
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: 3.0.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: 3.0.0
55
+ description: Simple ActiveRecord full text search.
56
+ email: contact@marianposaceanu.com
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files: []
60
+ files:
61
+ - .gitignore
62
+ - Gemfile
63
+ - README.md
64
+ - fulltext_search_redux.gemspec
65
+ - lib/fulltext_search_redux.rb
66
+ - lib/fulltext_search_redux/errors.rb
67
+ - lib/fulltext_search_redux/glue.rb
68
+ - lib/fulltext_search_redux/helpers.rb
69
+ - lib/fulltext_search_redux/railtie.rb
70
+ - lib/fulltext_search_redux/rdbms/mysql.rb
71
+ - lib/fulltext_search_redux/rdbms/postgres.rb
72
+ - lib/fulltext_search_redux/version.rb
73
+ homepage: https://github.com/dakull/fulltext_search_redux
74
+ licenses: []
75
+ metadata: {}
76
+ post_install_message:
77
+ rdoc_options: []
78
+ require_paths:
79
+ - lib
80
+ required_ruby_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - '>='
83
+ - !ruby/object:Gem::Version
84
+ version: 1.9.2
85
+ required_rubygems_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ requirements: []
91
+ rubyforge_project:
92
+ rubygems_version: 2.0.0
93
+ signing_key:
94
+ specification_version: 4
95
+ summary: Add a text_search method to your models.
96
+ test_files: []