multi_column_search 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +1 -0
- data/Manifest +9 -0
- data/README.rdoc +36 -0
- data/Rakefile +18 -0
- data/init.rb +3 -0
- data/lib/multi_column_search.rb +53 -0
- data/multi_column_search.gemspec +30 -0
- data/spec/models.rb +4 -0
- data/spec/multi_column_search_spec.rb +30 -0
- data/spec/spec_helper.rb +41 -0
- metadata +81 -0
data/CHANGELOG
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
v0.0.1. Initial release.
|
data/Manifest
ADDED
data/README.rdoc
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
= Multi Column Search
|
2
|
+
|
3
|
+
Quick and dirty multi column LIKE searches. Need to search accross multiple columns, like company(name, address, city, state, zip)
|
4
|
+
|
5
|
+
Running lots of queries or have a large data set? You should probably upgrade to a real search back-end already!
|
6
|
+
|
7
|
+
== Examples
|
8
|
+
|
9
|
+
Add a search method to your model by calling multi_column_search with the fields you want to search.
|
10
|
+
|
11
|
+
class Company
|
12
|
+
multi_column_search :name, :address, :city, :state, :zip
|
13
|
+
end
|
14
|
+
|
15
|
+
Search for a single or multi value across all searched columns.
|
16
|
+
|
17
|
+
Company.search('Sam Comp') # => any company with name, address, city, state, zip containing with Sam Comp
|
18
|
+
|
19
|
+
== Install
|
20
|
+
|
21
|
+
Rails 3 Gem
|
22
|
+
|
23
|
+
# add to your gemfile in bundler
|
24
|
+
bundle install
|
25
|
+
|
26
|
+
|
27
|
+
== Docs
|
28
|
+
|
29
|
+
http://rdoc.info/projects/jackhq/multi_column_search
|
30
|
+
|
31
|
+
Homepage:: http://github.com/jackhq/multi_column_search
|
32
|
+
License:: Copyright (c) 2010 Jack Russell Software Company <mailto:team@jackrussellsoftware.com>, released under the MIT license.
|
33
|
+
|
34
|
+
== Credits
|
35
|
+
|
36
|
+
Completely inspired from "simple_column_search" by Elijah Miller : http://github.com/jqr/simple_column_search
|
data/Rakefile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#require 'spec/rake/spectask'
|
2
|
+
|
3
|
+
require 'echoe'
|
4
|
+
Echoe.new 'multi_column_search' do |p|
|
5
|
+
p.description = "Quick and dirty multi column LIKE searches."
|
6
|
+
p.url = "http://github.com/jackhq/multi_column_search"
|
7
|
+
p.author = "Jack Russell Software"
|
8
|
+
p.email = "team@jackrussellsoftware.com"
|
9
|
+
p.retain_gemspec = true
|
10
|
+
p.need_tar_gz = false
|
11
|
+
p.extra_deps = [
|
12
|
+
]
|
13
|
+
p.ignore_pattern = ['spec/test.sqlite3']
|
14
|
+
end
|
15
|
+
|
16
|
+
desc 'Default: run specs'
|
17
|
+
task :default => :spec
|
18
|
+
task :test => :spec
|
data/init.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
|
3
|
+
module MultiColumnSearch
|
4
|
+
# Adds a Model.search('term1 term2') method that searches across SEARCH_COLUMNS
|
5
|
+
# for ORed across columns.
|
6
|
+
#
|
7
|
+
# class Company
|
8
|
+
# multi_column_search :name, :address, :city, :state, :zip, :phone
|
9
|
+
# end
|
10
|
+
#
|
11
|
+
# Company.search('Jack Russ') # => any company, street, city that match Jack Russ
|
12
|
+
# Company.search('29464') # => any company with zip code 29464
|
13
|
+
# Company.search('Mount P')
|
14
|
+
# # => any company with 'Mount P' in the city
|
15
|
+
def multi_column_search(*args)
|
16
|
+
options = args.extract_options!
|
17
|
+
columns = args
|
18
|
+
|
19
|
+
options[:match] ||= :start
|
20
|
+
options[:name] ||= 'search'
|
21
|
+
|
22
|
+
# PostgreSQL LIKE is case-sensitive, use ILIKE for case-insensitive
|
23
|
+
like = connection.adapter_name == "PostgreSQL" ? "ILIKE" : "LIKE"
|
24
|
+
scope options[:name], lambda { |terms|
|
25
|
+
terms = terms.split.join('%')
|
26
|
+
conditions = terms.split.inject([]) do |acc, term|
|
27
|
+
pattern = get_multi_column_pattern options[:match], term
|
28
|
+
acc << columns.collect { |column| "#{table_name}.#{column} #{like} '#{pattern}'" }
|
29
|
+
|
30
|
+
end
|
31
|
+
conditions = conditions.map { |c| "(" + c.join(' OR ') + ")" }.join(' OR ')
|
32
|
+
puts conditions
|
33
|
+
where conditions
|
34
|
+
}
|
35
|
+
end
|
36
|
+
|
37
|
+
def get_multi_column_pattern(match, term)
|
38
|
+
case(match)
|
39
|
+
when :exact
|
40
|
+
term
|
41
|
+
when :start
|
42
|
+
term + '%'
|
43
|
+
when :middle
|
44
|
+
'%' + term + '%'
|
45
|
+
when :end
|
46
|
+
'%' + term
|
47
|
+
else
|
48
|
+
raise "Unexpected match type: #{options[:match]}"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{multi_column_search}
|
5
|
+
s.version = "0.0.1"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Jack Russell Software"]
|
9
|
+
s.date = %q{2010-08-18}
|
10
|
+
s.description = %q{Quick and dirty multi column LIKE searches.}
|
11
|
+
s.email = %q{team@jackrussellsoftware.com}
|
12
|
+
s.extra_rdoc_files = ["CHANGELOG", "README.rdoc", "lib/multi_column_search.rb"]
|
13
|
+
s.files = ["CHANGELOG", "Manifest", "README.rdoc", "Rakefile", "init.rb", "lib/multi_column_search.rb", "spec/models.rb", "spec/multi_column_search_spec.rb", "spec/spec_helper.rb", "multi_column_search.gemspec"]
|
14
|
+
s.homepage = %q{http://github.com/jackhq/multi_column_search}
|
15
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Multi_column_search", "--main", "README.rdoc"]
|
16
|
+
s.require_paths = ["lib"]
|
17
|
+
s.rubyforge_project = %q{multi_column_search}
|
18
|
+
s.rubygems_version = %q{1.3.7}
|
19
|
+
s.summary = %q{Quick and dirty multi column LIKE searches.}
|
20
|
+
|
21
|
+
if s.respond_to? :specification_version then
|
22
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
23
|
+
s.specification_version = 3
|
24
|
+
|
25
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
26
|
+
else
|
27
|
+
end
|
28
|
+
else
|
29
|
+
end
|
30
|
+
end
|
data/spec/models.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'spec_helper')
|
2
|
+
|
3
|
+
describe MultiColumnSearch do
|
4
|
+
before(:each) do
|
5
|
+
Sponsor.delete_all
|
6
|
+
|
7
|
+
@jrs = Sponsor.create(:name => 'Jack Russell Software', :address => '1067 Cliffwood Drive', :city => 'Mount Pleasant', :state => 'SC', :zip => '29464', :phone => '843.628.0463', :fax => '843.388.9952')
|
8
|
+
@wal = Sponsor.create(:name => 'Walmart Company', :address => '333 Sam Sneed Drive', :city => 'Mount Pleasant', :state => 'SC', :zip => '29464', :phone => '843-628-4321', :fax => '843.388.9952')
|
9
|
+
@musc = Sponsor.create(:name => 'MUSC Health', :address => '1 Downtown Street', :city => 'Charleston', :state => 'SC', :zip => '29401', :phone => '843-555-0463', :fax => '843.388.9952')
|
10
|
+
|
11
|
+
@sponsors = [@jrs, @wal, @musc]
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "multi column search default match" do
|
15
|
+
it "should find sponsors by zip" do
|
16
|
+
Sponsor.search('2946').count.should == 2
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should find sponsors by address" do
|
20
|
+
Sponsor.search('333 Sam').count.should == 1
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should find sponsors by city" do
|
24
|
+
Sponsor.search('Mount P').count.should == 2
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
|
5
|
+
$: << File.join(File.dirname(__FILE__), '..', 'lib')
|
6
|
+
|
7
|
+
require File.join(File.dirname(__FILE__), '..', 'init')
|
8
|
+
|
9
|
+
TEST_DATABASE_FILE = File.join(File.dirname(__FILE__), 'test.sqlite3')
|
10
|
+
|
11
|
+
# Spec::Runner.configure do |config|
|
12
|
+
#
|
13
|
+
# end
|
14
|
+
|
15
|
+
def setup_database
|
16
|
+
File.unlink(TEST_DATABASE_FILE) if File.exist?(TEST_DATABASE_FILE)
|
17
|
+
ActiveRecord::Base.establish_connection(
|
18
|
+
"adapter" => "sqlite3", "timeout" => 5000, "database" => TEST_DATABASE_FILE
|
19
|
+
)
|
20
|
+
create_tables
|
21
|
+
end
|
22
|
+
|
23
|
+
def create_tables
|
24
|
+
c = ActiveRecord::Base.connection
|
25
|
+
|
26
|
+
c.create_table :sponsors, :force => true do |t|
|
27
|
+
t.string :name
|
28
|
+
t.string :address
|
29
|
+
t.string :city
|
30
|
+
t.string :state
|
31
|
+
t.string :zip
|
32
|
+
t.string :phone
|
33
|
+
t.string :fax
|
34
|
+
|
35
|
+
t.timestamps
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
setup_database
|
40
|
+
|
41
|
+
require File.join(File.dirname(__FILE__), 'models')
|
metadata
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: multi_column_search
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
version: 0.0.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Jack Russell Software
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-08-18 00:00:00 -04:00
|
18
|
+
default_executable:
|
19
|
+
dependencies: []
|
20
|
+
|
21
|
+
description: Quick and dirty multi column LIKE searches.
|
22
|
+
email: team@jackrussellsoftware.com
|
23
|
+
executables: []
|
24
|
+
|
25
|
+
extensions: []
|
26
|
+
|
27
|
+
extra_rdoc_files:
|
28
|
+
- CHANGELOG
|
29
|
+
- README.rdoc
|
30
|
+
- lib/multi_column_search.rb
|
31
|
+
files:
|
32
|
+
- CHANGELOG
|
33
|
+
- Manifest
|
34
|
+
- README.rdoc
|
35
|
+
- Rakefile
|
36
|
+
- init.rb
|
37
|
+
- lib/multi_column_search.rb
|
38
|
+
- spec/models.rb
|
39
|
+
- spec/multi_column_search_spec.rb
|
40
|
+
- spec/spec_helper.rb
|
41
|
+
- multi_column_search.gemspec
|
42
|
+
has_rdoc: true
|
43
|
+
homepage: http://github.com/jackhq/multi_column_search
|
44
|
+
licenses: []
|
45
|
+
|
46
|
+
post_install_message:
|
47
|
+
rdoc_options:
|
48
|
+
- --line-numbers
|
49
|
+
- --inline-source
|
50
|
+
- --title
|
51
|
+
- Multi_column_search
|
52
|
+
- --main
|
53
|
+
- README.rdoc
|
54
|
+
require_paths:
|
55
|
+
- lib
|
56
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
segments:
|
62
|
+
- 0
|
63
|
+
version: "0"
|
64
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
segments:
|
70
|
+
- 1
|
71
|
+
- 2
|
72
|
+
version: "1.2"
|
73
|
+
requirements: []
|
74
|
+
|
75
|
+
rubyforge_project: multi_column_search
|
76
|
+
rubygems_version: 1.3.7
|
77
|
+
signing_key:
|
78
|
+
specification_version: 3
|
79
|
+
summary: Quick and dirty multi column LIKE searches.
|
80
|
+
test_files: []
|
81
|
+
|