dusen 0.5.3 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -81,6 +81,9 @@ that looks roughly like the following:
81
81
  contacts.email LIKE "%market ave%" OR
82
82
  contacts.email LIKE "%market ave%" )
83
83
 
84
+ You can also use `where_like` to find all the records *not* matching some phrases, using the `:negate` option:
85
+
86
+ Contact.where_like({ :name => 'foo' }, { :negate => true })
84
87
 
85
88
  Processing queries for qualified fields
86
89
  ---------------------------------------
@@ -88,14 +88,24 @@ module Dusen
88
88
 
89
89
  end
90
90
 
91
- def where_like(conditions)
91
+ def where_like(conditions, options = {})
92
92
  scope = self
93
+ if options[:negate]
94
+ match_operator = 'NOT LIKE'
95
+ join_operator = 'AND'
96
+ else
97
+ match_operator = 'LIKE'
98
+ join_operator = 'OR'
99
+ end
100
+
93
101
  conditions.each do |field_or_fields, query|
94
102
  fields = Array(field_or_fields).collect do |field|
95
103
  Util.qualify_column_name(scope, field)
96
104
  end
97
105
  Array.wrap(query).each do |phrase|
98
- phrase_with_placeholders = fields.collect { |field| "#{field} LIKE ?" }.join(' OR ')
106
+ phrase_with_placeholders = fields.collect { |field|
107
+ "#{field} #{match_operator} ?"
108
+ }.join(" #{join_operator} ")
99
109
  like_expression = Dusen::Util.like_expression(phrase)
100
110
  bindings = [like_expression] * fields.size
101
111
  conditions = [ phrase_with_placeholders, *bindings ]
data/lib/dusen/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module Dusen
4
- VERSION = '0.5.3'
4
+ VERSION = '0.6.0'
5
5
  end
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ../..
3
3
  specs:
4
- dusen (0.5.2)
4
+ dusen (0.6.0)
5
5
  activerecord (>= 3.0)
6
6
  edge_rider (>= 0.2.5)
7
7
 
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ../..
3
3
  specs:
4
- dusen (0.5.2)
4
+ dusen (0.6.0)
5
5
  activerecord (>= 3.0)
6
6
  edge_rider (>= 0.2.5)
7
7
 
@@ -181,6 +181,42 @@ shared_examples_for 'model with search syntax' do
181
181
  end
182
182
 
183
183
  end
184
+
185
+ describe '.where_like' do
186
+
187
+ it 'matches a record if a word appears in any of the given columns' do
188
+ match1 = subject.create!(:name => 'word', :city => 'XXXX')
189
+ match2 = subject.create!(:name => 'XXXX', :city => 'word')
190
+ no_match = subject.create!(:name => 'XXXX', :city => 'XXXX')
191
+ subject.where_like([:name, :city] => 'word').to_a.should =~ [match1, match2]
192
+ end
193
+
194
+ it 'matches a record if it contains all the given words' do
195
+ match1 = subject.create!(:city => 'word1 word2')
196
+ match2 = subject.create!(:city => 'word2 word1')
197
+ no_match = subject.create!(:city => 'word1')
198
+ subject.where_like(:city => ['word1', 'word2']).to_a.should =~ [match1, match2]
199
+ end
200
+
201
+ describe 'with :negate option' do
202
+
203
+ it 'rejects a record if a word appears in any of the given columns' do
204
+ no_match1 = subject.create!(:name => 'word', :city => 'XXXX')
205
+ no_match2 = subject.create!(:name => 'XXXX', :city => 'word')
206
+ match = subject.create!(:name => 'XXXX', :city => 'XXXX')
207
+ subject.where_like({ [:name, :city] => 'word' }, :negate => true).to_a.should =~ [match]
208
+ end
209
+
210
+ it 'rejects a record if it matches at least one of the given words' do
211
+ no_match1 = subject.create!(:city => 'word1')
212
+ no_match2 = subject.create!(:city => 'word2')
213
+ match = subject.create!(:city => 'word3')
214
+ subject.where_like({ :city => ['word1', 'word2'] }, :negate => true).to_a.should =~ [match]
215
+ end
216
+
217
+ end
218
+
219
+ end
184
220
 
185
221
  end
186
222
 
metadata CHANGED
@@ -1,49 +1,62 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: dusen
3
- version: !ruby/object:Gem::Version
4
- version: 0.5.3
3
+ version: !ruby/object:Gem::Version
4
+ hash: 7
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 6
9
+ - 0
10
+ version: 0.6.0
5
11
  platform: ruby
6
- authors:
12
+ authors:
7
13
  - Henning Koch
8
14
  autorequire:
9
15
  bindir: bin
10
16
  cert_chain: []
11
- date: 2015-04-27 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
17
+
18
+ date: 2015-06-14 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
14
21
  name: activerecord
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ! '>='
18
- - !ruby/object:Gem::Version
19
- version: '3.0'
20
- type: :runtime
21
22
  prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ! '>='
25
- - !ruby/object:Gem::Version
26
- version: '3.0'
27
- - !ruby/object:Gem::Dependency
28
- name: edge_rider
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ! '>='
32
- - !ruby/object:Gem::Version
33
- version: 0.2.5
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 7
29
+ segments:
30
+ - 3
31
+ - 0
32
+ version: "3.0"
34
33
  type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: edge_rider
35
37
  prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ! '>='
39
- - !ruby/object:Gem::Version
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ hash: 29
44
+ segments:
45
+ - 0
46
+ - 2
47
+ - 5
40
48
  version: 0.2.5
49
+ type: :runtime
50
+ version_requirements: *id002
41
51
  description: Comprehensive full text search for ActiveRecord and MySQL
42
52
  email: henning.koch@makandra.de
43
53
  executables: []
54
+
44
55
  extensions: []
56
+
45
57
  extra_rdoc_files: []
46
- files:
58
+
59
+ files:
47
60
  - .gitignore
48
61
  - .ruby-version
49
62
  - .travis.yml
@@ -125,27 +138,38 @@ files:
125
138
  - spec/shared/spec/dusen/query_spec.rb
126
139
  - spec/shared/spec/dusen/util_spec.rb
127
140
  homepage: https://github.com/makandra/dusen
128
- licenses:
141
+ licenses:
129
142
  - MIT
130
- metadata: {}
131
143
  post_install_message:
132
144
  rdoc_options: []
133
- require_paths:
145
+
146
+ require_paths:
134
147
  - lib
135
- required_ruby_version: !ruby/object:Gem::Requirement
136
- requirements:
137
- - - ! '>='
138
- - !ruby/object:Gem::Version
139
- version: '0'
140
- required_rubygems_version: !ruby/object:Gem::Requirement
141
- requirements:
142
- - - ! '>='
143
- - !ruby/object:Gem::Version
144
- version: '0'
148
+ required_ruby_version: !ruby/object:Gem::Requirement
149
+ none: false
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ hash: 3
154
+ segments:
155
+ - 0
156
+ version: "0"
157
+ required_rubygems_version: !ruby/object:Gem::Requirement
158
+ none: false
159
+ requirements:
160
+ - - ">="
161
+ - !ruby/object:Gem::Version
162
+ hash: 3
163
+ segments:
164
+ - 0
165
+ version: "0"
145
166
  requirements: []
167
+
146
168
  rubyforge_project:
147
- rubygems_version: 2.2.2
169
+ rubygems_version: 1.8.25
148
170
  signing_key:
149
- specification_version: 4
171
+ specification_version: 3
150
172
  summary: Comprehensive full text search for ActiveRecord and MySQL
151
173
  test_files: []
174
+
175
+ has_rdoc:
checksums.yaml DELETED
@@ -1,15 +0,0 @@
1
- ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- OWVjNGViYjQ5OGJlOWNjNzM5ZmMzMzBjZTYxODEyN2VjMWRiZTZlYQ==
5
- data.tar.gz: !binary |-
6
- OTQ2ODMzOTg0ZmZhYjg4NjYyMjMyOWNlZDVmZmYxOWU5ZThjYTE5Ng==
7
- SHA512:
8
- metadata.gz: !binary |-
9
- NmJjMzI3NDUzMjY1MzgwNDZjMzMxZDcwZmNkNWY5NWUyOWQyMWRkOTg1NTEy
10
- ZTljNjlhYmZlZWI2MDQyMGM1MmEzZTBlZTcyNzRmOTVlZDQxMDA0MDI1ZWEz
11
- ODAzMTAyYzgwMjI1Nzc0YThkMTVmMzE5YmI5NTRjYjg2NjYxMDI=
12
- data.tar.gz: !binary |-
13
- YTZjYTYzMDYxNDEzMDM4M2RlM2MyY2NmYTcxOWMzYjczYjY5ZjY3YmFkOTBj
14
- ZjYxMWJiOTY4OTE0OWI4ZjMxMzMzMjc0MTY4NWM5NzMwZDk0NzBkMmEwM2Vl
15
- NzA3ZmQyMTIxODVhNmJlMDk0ZWQ3ZTY3NDVjMDRiNDNkMTEzNjc=