dusen 0.5 → 0.5.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 28383a66956bb8c3378bb0033387475fca743a53
4
+ data.tar.gz: 4b5dc66350c2c31cd070307a54b60296f8ed8dee
5
+ SHA512:
6
+ metadata.gz: 76ead2fcf071262ae45ea9d710c51150a668d6639752fa6750c4fa7908a11cd562eddb166be657d11d72dfe21009dcb8bcb16740ea29d39c2662cc871efc9936
7
+ data.tar.gz: a93bc1087afd7ddb94fc955dc0f0323d1fb8c581503c7659615b5738158fe70779eead5cf958ef3c5a7bea69b46f7e15a20278a3ff68652333c531d4683c12fd
data/lib/dusen/syntax.rb CHANGED
@@ -21,20 +21,8 @@ module Dusen
21
21
  query = query.condensed
22
22
  matches = find_parsed_query(root_scope, query.include)
23
23
  if query.exclude.any?
24
- exclude_matches = find_parsed_query(root_scope, query.exclude)
25
-
26
- # extract conditions that were added by exclude tokens
27
- sql = exclude_matches.to_sql
28
- root_pattern = /\A#{Regexp.quote root_scope.to_sql}/
29
- sql =~ root_pattern or raise "Could not find ..."
30
- sql = sql.sub(root_pattern, '')
31
-
32
- # negate conditions
33
- sql = sql.sub(/^\s*WHERE\s*/i, '')
34
- sql = sql.sub(/^\s*AND\s*/i, '')
35
- sql = "NOT COALESCE(#{sql}, 0)"
36
-
37
- matches.scoped(:conditions => sql)
24
+ inverted_exclude_scope = build_exclude_scope(root_scope, query.exclude)
25
+ matches.merge(inverted_exclude_scope)
38
26
  else
39
27
  matches
40
28
  end
@@ -73,5 +61,23 @@ module Dusen
73
61
  scope
74
62
  end
75
63
 
64
+ def build_exclude_scope(root_scope, exclude_query)
65
+ root_scope_without_conditions = root_scope.except(:where)
66
+ exclude_scope = find_parsed_query(root_scope_without_conditions, exclude_query)
67
+ exclude_scope_conditions = exclude_scope.where_values.reduce(:and)
68
+ if exclude_scope_conditions.present?
69
+ # where_values.reduce(:and) returns a string if only one where_value given
70
+ # and a Arel::Node for more than one where_value
71
+ unless exclude_scope_conditions.is_a?(String)
72
+ exclude_scope_conditions = exclude_scope_conditions.to_sql
73
+ end
74
+ inverted_sql = "NOT COALESCE (" + exclude_scope_conditions + ",0)"
75
+ exclude_scope.except(:where).where(inverted_sql)
76
+ else
77
+ # we cannot build an inverted scope if no where-conditions are present
78
+ root_scope
79
+ end
80
+ end
81
+
76
82
  end
77
83
  end
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'
4
+ VERSION = '0.5.1'
5
5
  end
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ../..
3
3
  specs:
4
- dusen (0.4.10)
4
+ dusen (0.5)
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.4.10)
4
+ dusen (0.5)
5
5
  activerecord (>= 3.0)
6
6
  edge_rider (>= 0.2.5)
7
7
 
@@ -5,10 +5,16 @@ class Recipe < ActiveRecord::Base
5
5
  has_many :ingredients, :class_name => 'Recipe::Ingredient', :inverse_of => :recipe
6
6
  belongs_to :category, :class_name => 'Recipe::Category', :inverse_of => :recipes
7
7
 
8
- search_syntax
9
-
10
8
  search_text do
11
9
  [name, category.andand.name, ingredients.collect(&:name)]
12
10
  end
13
11
 
12
+ search_syntax do
13
+
14
+ search_by :category do |scope, category_name|
15
+ scope.joins(:category).where('recipe_categories.name = ?', category_name)
16
+ end
17
+
18
+ end
19
+
14
20
  end
@@ -132,6 +132,14 @@ shared_examples_for 'model with search syntax' do
132
132
  subject.search('Sunny -Power').to_a.should == [match]
133
133
  end
134
134
 
135
+ it 'should work if search_by contains a join' do
136
+ category1 = Recipe::Category.create!(:name => 'Rice')
137
+ category2= Recipe::Category.create!(:name => 'Barbecue')
138
+ match = Recipe.create!(:name => 'Martini Chicken', :category => category1)
139
+ no_match = Recipe.create!(:name => 'Barbecue Chicken', :category => category2)
140
+ Recipe.search('category:-Barbecue').to_a.should == [match]
141
+ end
142
+
135
143
  end
136
144
 
137
145
  context 'when the given query is blank' do
metadata CHANGED
@@ -1,65 +1,52 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: dusen
3
- version: !ruby/object:Gem::Version
4
- hash: 1
5
- prerelease:
6
- segments:
7
- - 0
8
- - 5
9
- version: "0.5"
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.1
10
5
  platform: ruby
11
- authors:
6
+ authors:
12
7
  - Henning Koch
13
8
  autorequire:
14
9
  bindir: bin
15
10
  cert_chain: []
16
-
17
- date: 2015-03-30 00:00:00 +02:00
18
- default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
11
+ date: 2015-04-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
21
14
  name: activerecord
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- none: false
25
- requirements:
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
26
17
  - - ">="
27
- - !ruby/object:Gem::Version
28
- hash: 7
29
- segments:
30
- - 3
31
- - 0
32
- version: "3.0"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
33
20
  type: :runtime
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
36
- name: edge_rider
37
21
  prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
39
- none: false
40
- requirements:
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:
41
31
  - - ">="
42
- - !ruby/object:Gem::Version
43
- hash: 29
44
- segments:
45
- - 0
46
- - 2
47
- - 5
32
+ - !ruby/object:Gem::Version
48
33
  version: 0.2.5
49
34
  type: :runtime
50
- version_requirements: *id002
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 0.2.5
51
41
  description: Comprehensive full text search for ActiveRecord and MySQL
52
42
  email: henning.koch@makandra.de
53
43
  executables: []
54
-
55
44
  extensions: []
56
-
57
45
  extra_rdoc_files: []
58
-
59
- files:
60
- - .gitignore
61
- - .ruby-version
62
- - .travis.yml
46
+ files:
47
+ - ".gitignore"
48
+ - ".ruby-version"
49
+ - ".travis.yml"
63
50
  - LICENSE
64
51
  - README.md
65
52
  - Rakefile
@@ -137,39 +124,28 @@ files:
137
124
  - spec/shared/spec/dusen/parser_spec.rb
138
125
  - spec/shared/spec/dusen/query_spec.rb
139
126
  - spec/shared/spec/dusen/util_spec.rb
140
- has_rdoc: true
141
127
  homepage: https://github.com/makandra/dusen
142
- licenses:
128
+ licenses:
143
129
  - MIT
130
+ metadata: {}
144
131
  post_install_message:
145
132
  rdoc_options: []
146
-
147
- require_paths:
133
+ require_paths:
148
134
  - lib
149
- required_ruby_version: !ruby/object:Gem::Requirement
150
- none: false
151
- requirements:
135
+ required_ruby_version: !ruby/object:Gem::Requirement
136
+ requirements:
152
137
  - - ">="
153
- - !ruby/object:Gem::Version
154
- hash: 3
155
- segments:
156
- - 0
157
- version: "0"
158
- required_rubygems_version: !ruby/object:Gem::Requirement
159
- none: false
160
- requirements:
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ required_rubygems_version: !ruby/object:Gem::Requirement
141
+ requirements:
161
142
  - - ">="
162
- - !ruby/object:Gem::Version
163
- hash: 3
164
- segments:
165
- - 0
166
- version: "0"
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
167
145
  requirements: []
168
-
169
146
  rubyforge_project:
170
- rubygems_version: 1.3.9.5
147
+ rubygems_version: 2.2.2
171
148
  signing_key:
172
- specification_version: 3
149
+ specification_version: 4
173
150
  summary: Comprehensive full text search for ActiveRecord and MySQL
174
151
  test_files: []
175
-