dusen 0.5.3 → 0.6.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
@@ -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=