searchgasm 1.3.3 → 1.3.4
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/CHANGELOG.rdoc +7 -0
- data/lib/searchgasm/conditions/base.rb +46 -21
- data/lib/searchgasm/helpers/utilities.rb +1 -0
- data/lib/searchgasm/search/base.rb +20 -1
- data/lib/searchgasm/search/conditions.rb +0 -11
- data/lib/searchgasm/version.rb +1 -1
- data/searchgasm.gemspec +3 -3
- data/test/fixtures/users.yml +9 -0
- data/test/test_conditions_base.rb +5 -0
- data/test/test_search_base.rb +7 -6
- data/test/test_search_conditions.rb +0 -10
- data/test/test_search_ordering.rb +6 -0
- metadata +2 -2
data/CHANGELOG.rdoc
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
== 1.3.4 released 2008-10-03
|
2
|
+
|
3
|
+
* Fixed method names creation for conditions with modifiers
|
4
|
+
* Create local column conditions, incase there are method conflicts. Such as "id".
|
5
|
+
* All joins are switched to left outer joins. When search with *any* conditions, inner joins return incorrect results. Also when ordering by an association that allows for blanks, inner joins exclude the records with blank values. Only option is left outer joins.
|
6
|
+
* If joins is manually set with a string, treat it as SQL, just like ActiveRecord
|
7
|
+
|
1
8
|
== 1.3.3 released 2008-10-03
|
2
9
|
|
3
10
|
* Fixed modifiers being double escaped on equals condition
|
@@ -11,7 +11,7 @@ module Searchgasm
|
|
11
11
|
attr_accessor :any, :relationship_name
|
12
12
|
|
13
13
|
class << self
|
14
|
-
attr_accessor :added_klass_conditions, :
|
14
|
+
attr_accessor :added_klass_conditions, :added_column_equals_conditions, :added_associations
|
15
15
|
|
16
16
|
def column_details # :nodoc:
|
17
17
|
return @column_details if @column_details
|
@@ -149,6 +149,7 @@ module Searchgasm
|
|
149
149
|
|
150
150
|
def initialize(init_conditions = {})
|
151
151
|
add_associations!
|
152
|
+
add_column_equals_conditions!
|
152
153
|
self.conditions = init_conditions
|
153
154
|
end
|
154
155
|
|
@@ -266,6 +267,12 @@ module Searchgasm
|
|
266
267
|
self.class.added_associations = true
|
267
268
|
end
|
268
269
|
|
270
|
+
def add_column_equals_conditions!
|
271
|
+
return true if self.class.added_column_equals_conditions
|
272
|
+
klass.column_names.each { |name| setup_condition(name) }
|
273
|
+
self.class.added_column_equals_conditions = true
|
274
|
+
end
|
275
|
+
|
269
276
|
def extract_column_and_condition_from_method_name(name)
|
270
277
|
name_parts = name.gsub("=", "").split("_")
|
271
278
|
|
@@ -334,42 +341,56 @@ module Searchgasm
|
|
334
341
|
modifier_name_parts = []
|
335
342
|
modifier_klasses.each { |modifier_klass| modifier_name_parts << modifier_klass.modifier_names.first }
|
336
343
|
method_name_parts = []
|
337
|
-
method_name_parts << modifier_name_parts.join("_of_") unless modifier_name_parts.blank?
|
344
|
+
method_name_parts << modifier_name_parts.join("_of_") + "_of" unless modifier_name_parts.blank?
|
338
345
|
method_name_parts << column_name
|
339
|
-
method_name_parts << condition_name
|
346
|
+
method_name_parts << condition_name unless condition_name.blank?
|
340
347
|
method_name_parts.join("_")
|
341
348
|
end
|
342
349
|
|
343
350
|
def method_missing(name, *args, &block)
|
351
|
+
if setup_condition(name)
|
352
|
+
send(name, *args, &block)
|
353
|
+
else
|
354
|
+
super
|
355
|
+
end
|
356
|
+
end
|
357
|
+
|
358
|
+
def setup_condition(name)
|
344
359
|
modifier_klasses, column_detail, condition_klass = breakdown_method_name(name.to_s)
|
345
360
|
if !column_detail.nil? && !condition_klass.nil?
|
346
361
|
method_name = build_method_name(modifier_klasses, column_detail[:column].name, condition_klass.condition_names_for_column.first)
|
347
|
-
|
348
|
-
if !
|
349
|
-
|
350
|
-
|
362
|
+
|
363
|
+
if !added_condition?(method_name)
|
364
|
+
column_type = column_sql = nil
|
365
|
+
if !modifier_klasses.blank?
|
366
|
+
# Find the column type
|
367
|
+
column_type = modifier_klasses.first.return_type
|
351
368
|
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
369
|
+
# Build the column sql
|
370
|
+
column_sql = "#{klass.connection.quote_table_name(klass.table_name)}.#{klass.connection.quote_column_name(column_detail[:column].name)}"
|
371
|
+
modifier_klasses.each do |modifier_klass|
|
372
|
+
next unless klass.connection.respond_to?(modifier_klass.adapter_method_name)
|
373
|
+
column_sql = klass.connection.send(modifier_klass.adapter_method_name, column_sql)
|
374
|
+
end
|
357
375
|
end
|
358
|
-
end
|
359
376
|
|
360
|
-
|
377
|
+
add_condition!(condition_klass, method_name, column_detail[:column], column_type, column_sql)
|
361
378
|
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
379
|
+
([column_detail[:column].name] + column_detail[:aliases]).each do |column_name|
|
380
|
+
condition_klass.condition_names_for_column.each do |condition_name|
|
381
|
+
alias_method_name = build_method_name(modifier_klasses, column_name, condition_name)
|
382
|
+
add_condition_alias!(alias_method_name, method_name) unless added_condition?(alias_method_name)
|
383
|
+
end
|
366
384
|
end
|
367
385
|
end
|
368
386
|
|
369
|
-
|
370
|
-
|
371
|
-
|
387
|
+
alias_method_name = name.to_s.gsub("=", "")
|
388
|
+
add_condition_alias!(alias_method_name, method_name) unless added_condition?(alias_method_name)
|
389
|
+
|
390
|
+
return true
|
372
391
|
end
|
392
|
+
|
393
|
+
false
|
373
394
|
end
|
374
395
|
|
375
396
|
def add_condition!(condition, name, column = nil, column_type = nil, column_sql = nil)
|
@@ -397,6 +418,10 @@ module Searchgasm
|
|
397
418
|
end_eval
|
398
419
|
end
|
399
420
|
|
421
|
+
def added_condition?(name)
|
422
|
+
respond_to?("#{name}_object") && respond_to?(name) && respond_to?("#{name}=") && respond_to?("reset_#{name}!")
|
423
|
+
end
|
424
|
+
|
400
425
|
def add_condition_alias!(alias_name, name)
|
401
426
|
self.class.condition_names << alias_name
|
402
427
|
|
@@ -84,6 +84,7 @@ module Searchgasm
|
|
84
84
|
# * <tt>:params</tt> -- default: nil, Additional params to add to the url, must be a hash
|
85
85
|
# * <tt>:exclude_params</tt> -- default: nil, params you want to exclude. This is nifty because it does a "deep delete". So you can pass {:param1 => {:param2 => :param3}} and it will make sure param3 does not get include. param1 and param2 will not be touched. This also accepts an array or just a symbol or string.
|
86
86
|
# * <tt>:search_params</tt> -- default: nil, Additional search params to add to the url, must be a hash. Adds the options into the :params_scope.
|
87
|
+
# * <tt>:literal_search_params</tt> -- default: nil, Additional search params to add to the url, but are not escaped. So you can add javascript into the URL: :literal_search_params => {:per_page => "' + escape(this.value) + '"}
|
87
88
|
# * <tt>:exclude_search_params</tt> -- default: nil, Same as :exclude_params but for the :search_params.
|
88
89
|
def searchgasm_url(options = {})
|
89
90
|
search_params = searchgasm_params(options)
|
@@ -79,8 +79,27 @@ module Searchgasm #:nodoc:
|
|
79
79
|
"#<#{klass}Search #{current_find_options.inspect}>"
|
80
80
|
end
|
81
81
|
|
82
|
+
# Searchgasm requires that all joins be left outer joins for conditions and ordering to work properly
|
82
83
|
def joins
|
83
|
-
|
84
|
+
joins_sql = ""
|
85
|
+
all_joins = auto_joins
|
86
|
+
|
87
|
+
case @joins
|
88
|
+
when String
|
89
|
+
joins_sql += @joins
|
90
|
+
else
|
91
|
+
all_joins = merge_joins(@joins, all_joins)
|
92
|
+
end
|
93
|
+
|
94
|
+
return if joins_sql.blank? && all_joins.blank?
|
95
|
+
|
96
|
+
unless all_joins.blank?
|
97
|
+
join_dependency = ::ActiveRecord::Associations::ClassMethods::JoinDependency.new(klass, all_joins, nil)
|
98
|
+
joins_sql += " " unless joins_sql.blank?
|
99
|
+
joins_sql += join_dependency.join_associations.collect { |assoc| assoc.association_join }.join
|
100
|
+
end
|
101
|
+
|
102
|
+
joins_sql
|
84
103
|
end
|
85
104
|
|
86
105
|
def limit=(value)
|
@@ -11,7 +11,6 @@ module Searchgasm
|
|
11
11
|
alias_method_chain :conditions=, :conditions
|
12
12
|
alias_method_chain :conditions, :conditions
|
13
13
|
alias_method_chain :auto_joins, :conditions
|
14
|
-
alias_method_chain :joins, :conditions
|
15
14
|
alias_method_chain :sanitize, :conditions
|
16
15
|
end
|
17
16
|
end
|
@@ -57,16 +56,6 @@ module Searchgasm
|
|
57
56
|
@memoized_auto_joins ||= merge_joins(auto_joins_without_conditions, conditions.auto_joins)
|
58
57
|
end
|
59
58
|
|
60
|
-
# Changes joins to use left outer joins if conditions.any == true.
|
61
|
-
def joins_with_conditions
|
62
|
-
if conditions.any?
|
63
|
-
join_dependency = ::ActiveRecord::Associations::ClassMethods::JoinDependency.new(klass, joins_without_conditions, nil)
|
64
|
-
join_dependency.join_associations.collect { |assoc| assoc.association_join }.join
|
65
|
-
else
|
66
|
-
joins_without_conditions
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
59
|
def sanitize_with_conditions(searching = true) # :nodoc:
|
71
60
|
find_options = sanitize_without_conditions(searching)
|
72
61
|
if conditions_obj = find_options.delete(:conditions)
|
data/lib/searchgasm/version.rb
CHANGED
data/searchgasm.gemspec
CHANGED
@@ -1,18 +1,18 @@
|
|
1
1
|
|
2
|
-
# Gem::Specification for Searchgasm-1.3.
|
2
|
+
# Gem::Specification for Searchgasm-1.3.4
|
3
3
|
# Originally generated by Echoe
|
4
4
|
|
5
5
|
--- !ruby/object:Gem::Specification
|
6
6
|
name: searchgasm
|
7
7
|
version: !ruby/object:Gem::Version
|
8
|
-
version: 1.3.
|
8
|
+
version: 1.3.4
|
9
9
|
platform: ruby
|
10
10
|
authors:
|
11
11
|
- Ben Johnson of Binary Logic
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
|
15
|
-
date: 2008-10-
|
15
|
+
date: 2008-10-07 00:00:00 -04:00
|
16
16
|
default_executable:
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
data/test/fixtures/users.yml
CHANGED
@@ -213,4 +213,9 @@ class TestConditionsBase < Test::Unit::TestCase
|
|
213
213
|
conditions.reset_users!
|
214
214
|
assert_equal({}, conditions.send(:objects))
|
215
215
|
end
|
216
|
+
|
217
|
+
def test_method_conflicts
|
218
|
+
conditions = Searchgasm::Cache::AccountConditions.new
|
219
|
+
assert_equal nil, conditions.id
|
220
|
+
end
|
216
221
|
end
|
data/test/test_search_base.rb
CHANGED
@@ -28,9 +28,9 @@ class TestSearchBase < Test::Unit::TestCase
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def test_setting_first_level_options
|
31
|
-
search = Account.new_search!(:include => :users, :joins => :
|
31
|
+
search = Account.new_search!(:include => :users, :joins => :users, :offset => 5, :limit => 20, :order => "name ASC", :select => "name", :readonly => true, :group => "name", :from => "accounts", :lock => true)
|
32
32
|
assert_equal :users, search.include
|
33
|
-
assert_equal
|
33
|
+
assert_equal " LEFT OUTER JOIN \"users\" ON users.account_id = accounts.id ", search.joins
|
34
34
|
assert_equal 5, search.offset
|
35
35
|
assert_equal 20, search.limit
|
36
36
|
assert_equal "name ASC", search.order
|
@@ -44,9 +44,10 @@ class TestSearchBase < Test::Unit::TestCase
|
|
44
44
|
|
45
45
|
search.include = :users
|
46
46
|
assert_equal :users, search.include
|
47
|
-
|
48
|
-
|
49
|
-
|
47
|
+
|
48
|
+
# treat it like SQL, just like AR
|
49
|
+
search.joins = "users"
|
50
|
+
assert_equal "users", search.joins
|
50
51
|
|
51
52
|
search.page = 5
|
52
53
|
assert_equal 1, search.page
|
@@ -140,7 +141,7 @@ class TestSearchBase < Test::Unit::TestCase
|
|
140
141
|
search.conditions.users.id_greater_than = 2
|
141
142
|
search.page = 3
|
142
143
|
search.readonly = true
|
143
|
-
assert_equal({:joins =>
|
144
|
+
assert_equal({:joins => " LEFT OUTER JOIN \"users\" ON users.account_id = accounts.id ", :offset => 4, :readonly => true, :conditions => ["(\"accounts\".\"name\" LIKE ?) AND (\"users\".\"id\" > ?)", "%Binary%", 2], :limit => 2 }, search.sanitize)
|
144
145
|
end
|
145
146
|
|
146
147
|
def test_scope
|
@@ -23,16 +23,6 @@ class TestSearchConditions < Test::Unit::TestCase
|
|
23
23
|
assert_equal nil, search.auto_joins
|
24
24
|
end
|
25
25
|
|
26
|
-
def test_joins
|
27
|
-
search = Account.new_search
|
28
|
-
search.conditions = {:id_lte => 2, :users => {:first_name_like => "Ben"}}
|
29
|
-
assert_equal :users, search.joins
|
30
|
-
assert_equal [Account.find(1)], search.all
|
31
|
-
search.conditions.any = true
|
32
|
-
assert_equal " LEFT OUTER JOIN \"users\" ON users.account_id = accounts.id ", search.joins
|
33
|
-
assert_equal Account.find(1, 2), search.all
|
34
|
-
end
|
35
|
-
|
36
26
|
def test_sanitize
|
37
27
|
# This is tested in test_search_base
|
38
28
|
end
|
@@ -157,4 +157,10 @@ class TestSearchOrdering < Test::Unit::TestCase
|
|
157
157
|
def test_sanitize
|
158
158
|
# tested in test_priority_order_by
|
159
159
|
end
|
160
|
+
|
161
|
+
def test_ordering_includes_blank
|
162
|
+
search = User.new_search
|
163
|
+
search.order_by = {:account => :name}
|
164
|
+
assert_equal 4, search.count
|
165
|
+
end
|
160
166
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: searchgasm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Johnson of Binary Logic
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-10-
|
12
|
+
date: 2008-10-07 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|