scoped_search 2.3.4 → 2.3.5

Sign up to get free protection for your applications and to get access to all the features.
data/lib/scoped_search.rb CHANGED
@@ -14,7 +14,7 @@ module ScopedSearch
14
14
 
15
15
  # The current scoped_search version. Do not change thisvalue by hand,
16
16
  # because it will be updated automatically by the gem release script.
17
- VERSION = "2.3.4"
17
+ VERSION = "2.3.5"
18
18
 
19
19
  # The ClassMethods module will be included into the ActiveRecord::Base class
20
20
  # to add the <tt>ActiveRecord::Base.scoped_search</tt> method and the
@@ -89,7 +89,7 @@ module ScopedSearch
89
89
  end
90
90
 
91
91
  def is_left_hand(node)
92
- field = definition.field_by_name(node.value)
92
+ field = definition.field_by_name(node.value) if node.respond_to?(:value)
93
93
  lh = field.nil? || field.key_field && !(query.end_with?(' '))
94
94
  lh = lh || last_token_is(NULL_PREFIX_OPERATORS, 2)
95
95
  lh = lh && !is_right_hand
@@ -132,8 +132,8 @@ module ScopedSearch
132
132
  q=query
133
133
  unless q =~ /(\s|\)|,)$/
134
134
  val = Regexp.escape(tokens.last.to_s).gsub('\*', '.*')
135
- suggestions = suggestions.map {|s| s if s.to_s =~ /^#{val}/i}.compact
136
- q.chomp!(tokens.last.to_s)
135
+ suggestions = suggestions.map {|s| s if s.to_s =~ /^"?#{val}"?/i}.compact
136
+ q.chomp!(/("?#{Regexp.escape(tokens.last.to_s)}"?)$/.match(q)[1])
137
137
  end
138
138
 
139
139
  # for doted field names compact the suggestions list to be one suggestion
@@ -167,10 +167,11 @@ module ScopedSearch
167
167
  return ["#{name}."] if !val || !val.is_a?(String) || !(val.include?('.'))
168
168
  val = val.sub(/.*\./,'')
169
169
 
170
- field_name = field.key_field
171
- opts = value_conditions(field.key_field, val).merge(:limit => 20, :select => field_name, :group => field_name )
170
+ table = field.key_klass.connection.quote_table_name(field.key_klass.table_name)
171
+ field_name = "#{table}.#{field.key_field}"
172
+ opts = value_conditions(field_name, val).merge(:limit => 20, :select => field_name, :group => field_name )
172
173
 
173
- field.key_klass.all(opts).map(&field_name).compact.map{ |f| "#{name}.#{f} "}
174
+ field.key_klass.all(opts).map(&field.key_field).compact.map{ |f| "#{name}.#{f} "}
174
175
  end
175
176
 
176
177
  # this method auto-completes values of fields that have a :complete_value marker
@@ -190,8 +191,8 @@ module ScopedSearch
190
191
  return complete_date_value if field.temporal?
191
192
  return complete_key_value(field, token, val) if field.key_field
192
193
 
193
- opts = value_conditions(field.field, val)
194
194
  table = field.klass.connection.quote_table_name(field.klass.table_name)
195
+ opts = value_conditions("#{table}.#{field.field}", val)
195
196
  opts.merge!(:limit => 20, :select => "DISTINCT #{table}.#{field.field}")
196
197
 
197
198
  return completer_scope(field.klass).all(opts).map(&field.field).compact.map{|v| v.to_s =~ /\s+/ ? "\"#{v}\"" : v}
@@ -243,7 +244,7 @@ module ScopedSearch
243
244
 
244
245
  #this method returns conditions for selecting completion from partial value
245
246
  def value_conditions(field_name, val)
246
- return val.blank? ? {} : {:conditions => "#{field_name} LIKE '#{val}%'".tr_s('%*', '%')}
247
+ return val.blank? ? {} : {:conditions => "#{field_name} LIKE '#{val.gsub("'","''")}%'".tr_s('%*', '%')}
247
248
  end
248
249
 
249
250
  # This method complete infix operators by field type
@@ -164,7 +164,7 @@ module ScopedSearch
164
164
 
165
165
  # this method return definitions::field object from string
166
166
  def field_by_name(name)
167
- field = fields[name.to_sym]
167
+ field = fields[name.to_sym] unless name.blank?
168
168
  if field.nil?
169
169
  dotted = name.to_s.split('.')[0]
170
170
  field = fields[dotted.to_sym] unless dotted.nil?
@@ -3,8 +3,8 @@ Gem::Specification.new do |s|
3
3
 
4
4
  # Do not change the version and date fields by hand. This will be done
5
5
  # automatically by the gem release script.
6
- s.version = "2.3.4"
7
- s.date = "2011-10-03"
6
+ s.version = "2.3.5"
7
+ s.date = "2011-10-18"
8
8
 
9
9
  s.summary = "Easily search you ActiveRecord models with a simple query language using a named scope."
10
10
  s.description = <<-EOS
@@ -135,5 +135,24 @@ ScopedSearch::RSpec::Database.test_databases.each do |db|
135
135
  Foo.complete_for('has string ').should_not contain('has string = ')
136
136
  end
137
137
  end
138
+
139
+ context 'exceptional search strings' do
140
+
141
+ it "query that starts with 'or'" do
142
+ Foo.complete_for('or ').should have(9).items
143
+ end
144
+
145
+ it "value completion with quotes" do
146
+ Foo.complete_for('string = "').should eql([])
147
+ end
148
+
149
+ it "value completion with single quote" do
150
+ Foo.complete_for("string = this is a 'valid' query").should eql([])
151
+ end
152
+
153
+ it "value auto completer for related tables" do
154
+ Foo.complete_for('bars.related = ').should eql([])
155
+ end
156
+ end
138
157
  end
139
158
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scoped_search
3
3
  version: !ruby/object:Gem::Version
4
- hash: 11
4
+ hash: 9
5
5
  prerelease: false
6
6
  segments:
7
7
  - 2
8
8
  - 3
9
- - 4
10
- version: 2.3.4
9
+ - 5
10
+ version: 2.3.5
11
11
  platform: ruby
12
12
  authors:
13
13
  - Willem van Bergen
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2011-10-03 00:00:00 +02:00
19
+ date: 2011-10-18 00:00:00 +02:00
20
20
  default_executable:
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency