barely_searchable 0.0.1 → 1.0.0

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/README.md CHANGED
@@ -10,7 +10,7 @@ It is a terrible and slow search engine....but it'll probably work for a handful
10
10
 
11
11
  Add this line to your application's Gemfile: `gem 'barely_searchable'`
12
12
 
13
- ## Usage
13
+ ## Quickstart
14
14
 
15
15
  In your model:
16
16
 
@@ -29,6 +29,25 @@ Now elsewhere in your application:
29
29
  end
30
30
  ```
31
31
 
32
+ ## More details:
33
+
34
+ In your models, you can specify conditions on the search parameters to exclude them from searches. This is useful for search query optimization or selective searches.
35
+
36
+ ```
37
+ class Order < ActiveRecord::Base
38
+ #search these columns always
39
+ searches_on :user_id, :shipping_city
40
+
41
+ # Will only search these columns when the type-casted value isn't zero
42
+ searches_on :subtotal, :tax, :total, unless: Proc.new{|value| value == 0}
43
+
44
+ # Only search this column if the query is longer thahn 3 characters
45
+ searches_on :email, if: Proc.new{|value| value.length > 3}
46
+ end
47
+ ```
48
+
49
+ Search content is cast to the column data type before calling if/unless blocks.
50
+
32
51
  ## Contributing
33
52
 
34
53
  1. Fork it
@@ -1,35 +1,56 @@
1
- require 'ruby-debug'
2
-
3
1
  module BarelySearchable
4
2
  module ModelInjections
5
3
 
6
4
  module ClassMethods
7
- def searches_on *fields
5
+ def searches_on *fields, conditions
6
+ if conditions.kind_of? Symbol
7
+ fields.push conditions
8
+ conditions = {}
9
+ end
10
+
11
+ conditions = {} if conditions.nil?
12
+
8
13
  if @searches.nil?
9
14
  init_searches_on
10
15
  end
11
16
 
12
- @searches << fields
13
- @searches.flatten!
17
+ fields.map! {|field| [field, conditions]}
18
+ @searches.push *fields
14
19
  end
15
20
 
16
21
  def init_searches_on
17
22
  @searches = []
18
23
  end
19
24
 
25
+ def searches
26
+ @searches
27
+ end
28
+
20
29
  def search query, limit = nil
21
30
  where = '0'
22
- like = '%' + query.to_s.gsub(' ','%') + '%'
23
31
 
24
- @searches.each do |field|
25
- field = field.to_s
32
+ @searches.each do |search_field|
33
+ field = search_field[0].to_s
34
+ hash = search_field[1]
35
+
36
+ #check to make sure the field actually exists on the table
26
37
  unless self.columns_hash.include? field
27
38
  raise NameError, "#{field} is not a valid column on #{self}"
28
39
  end
29
40
 
30
- if [:integer, :decimal, :float].include? self.columns_hash[ field.to_s ].type
31
- where += ' or ' + self.arel_table[field].eq( query ).to_sql
41
+ #cast the query to the right data type for this column
42
+ col_query = cast_to_column(query, field)
43
+
44
+ #check for an if-condition
45
+ next if ! hash[:if].nil? && ! hash[:if].call(col_query)
46
+
47
+ #check for an unless condition
48
+ next if ! hash[:unless].nil? && hash[:unless].call(col_query)
49
+
50
+ if equality_columns.include? column_to_type(field)
51
+ where += ' or ' + self.arel_table[field].eq( col_query ).to_sql
32
52
  else
53
+ like = '%' + col_query.to_s.gsub(' ','%') + '%'
33
54
  where += ' or ' + self.arel_table[field].matches( like ).to_sql
34
55
  end
35
56
  end
@@ -41,6 +62,32 @@ module BarelySearchable
41
62
  end
42
63
 
43
64
  end
65
+
66
+ private
67
+
68
+ def cast_to_column data, column
69
+ case column_to_type(column)
70
+ when :decimal, :float
71
+ data.to_f
72
+ when :integer
73
+ data.to_i
74
+ when :string, :text, :binary, :date, :datetime, :time, :timestamp
75
+ data.to_s
76
+ when :boolean
77
+ !!data
78
+ else
79
+ data
80
+ end
81
+ end
82
+
83
+ def column_to_type column
84
+ self.columns_hash[ column ].type
85
+ end
86
+
87
+ def equality_columns
88
+ [:integer, :decimal, :float, :boolean]
89
+ end
90
+
44
91
  end
45
92
 
46
93
  def self.included to
@@ -1,5 +1,3 @@
1
- require 'ruby-debug'
2
-
3
1
  module BarelySearchable
4
2
  class Railtie < Rails::Railtie
5
3
  config.to_prepare do
@@ -1,3 +1,3 @@
1
1
  module BarelySearchable
2
- VERSION = "0.0.1"
2
+ VERSION = "1.0.0"
3
3
  end
metadata CHANGED
@@ -1,33 +1,23 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: barely_searchable
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 0
8
- - 1
9
- version: 0.0.1
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
10
6
  platform: ruby
11
- authors:
7
+ authors:
12
8
  - Robert L. Carpenter
13
9
  autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
-
17
- date: 2012-02-10 00:00:00 -07:00
18
- default_executable:
12
+ date: 2012-09-25 00:00:00.000000000 Z
19
13
  dependencies: []
20
-
21
14
  description: Adds a very rudimentary .search() function to your activerecord models
22
- email:
15
+ email:
23
16
  - codemonkey@robacarp.com
24
17
  executables: []
25
-
26
18
  extensions: []
27
-
28
19
  extra_rdoc_files: []
29
-
30
- files:
20
+ files:
31
21
  - .gitignore
32
22
  - Gemfile
33
23
  - LICENSE
@@ -38,35 +28,29 @@ files:
38
28
  - lib/barely_searchable/model_injections.rb
39
29
  - lib/barely_searchable/railtie.rb
40
30
  - lib/barely_searchable/version.rb
41
- has_rdoc: true
42
31
  homepage: https://github.com/robacarp/barely_searchable
43
32
  licenses: []
44
-
45
33
  post_install_message:
46
34
  rdoc_options: []
47
-
48
- require_paths:
35
+ require_paths:
49
36
  - lib
50
- required_ruby_version: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- segments:
55
- - 0
56
- version: "0"
57
- required_rubygems_version: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- segments:
62
- - 0
63
- version: "0"
37
+ required_ruby_version: !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ! '>='
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ required_rubygems_version: !ruby/object:Gem::Requirement
44
+ none: false
45
+ requirements:
46
+ - - ! '>='
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
64
49
  requirements: []
65
-
66
50
  rubyforge_project:
67
- rubygems_version: 1.3.6
51
+ rubygems_version: 1.8.22
68
52
  signing_key:
69
53
  specification_version: 3
70
- summary: Add quick and dirty search functionality to your model layer without any indexing service
54
+ summary: Add quick and dirty search functionality to your model layer without any
55
+ indexing service
71
56
  test_files: []
72
-