searchgasm 1.0.3 → 1.0.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 +5 -0
- data/Manifest +0 -1
- data/README.rdoc +1 -1
- data/lib/searchgasm/active_record/base.rb +25 -23
- data/lib/searchgasm/conditions/base.rb +2 -13
- data/lib/searchgasm/search/base.rb +3 -3
- data/lib/searchgasm/search/conditions.rb +2 -2
- data/lib/searchgasm/shared/searching.rb +18 -2
- data/lib/searchgasm/version.rb +1 -1
- data/searchgasm.gemspec +2 -4
- data/test/test_active_record_associations.rb +10 -4
- data/test/test_active_record_base.rb +5 -0
- data/test/test_search_base.rb +9 -2
- metadata +1 -3
- data/lib/searchgasm/search/scoping.rb +0 -0
data/CHANGELOG.rdoc
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
== 1.0.4 released 2008-09-18
|
|
2
|
+
|
|
3
|
+
* Fixed bugs when performing calculations and searches on has_many through relationships.
|
|
4
|
+
* Instead of merging the find_options myself, I delegated that to AR's with_scope function, which already does this. Much more solid, less intrusive.
|
|
5
|
+
|
|
1
6
|
== 1.0.3 released 2008-09-18
|
|
2
7
|
|
|
3
8
|
* Updated inspect to show the current options for your search. Plays nicer in the console.
|
data/Manifest
CHANGED
|
@@ -39,7 +39,6 @@ lib/searchgasm/search/conditions.rb
|
|
|
39
39
|
lib/searchgasm/search/ordering.rb
|
|
40
40
|
lib/searchgasm/search/pagination.rb
|
|
41
41
|
lib/searchgasm/search/protection.rb
|
|
42
|
-
lib/searchgasm/search/scoping.rb
|
|
43
42
|
lib/searchgasm/search.rb
|
|
44
43
|
lib/searchgasm/shared/searching.rb
|
|
45
44
|
lib/searchgasm/shared/utilities.rb
|
data/README.rdoc
CHANGED
|
@@ -147,7 +147,7 @@ Take the @search object and pass it right into form\_for or fields\_for (see abo
|
|
|
147
147
|
Using the object from above:
|
|
148
148
|
|
|
149
149
|
@search.average('id')
|
|
150
|
-
@search.count
|
|
150
|
+
@search.count # ignores limit and offset
|
|
151
151
|
@search.maximum('id')
|
|
152
152
|
@search.minimum('id')
|
|
153
153
|
@search.sum('id')
|
|
@@ -11,6 +11,12 @@ module Searchgasm
|
|
|
11
11
|
calculate_without_searchgasm(*args)
|
|
12
12
|
end
|
|
13
13
|
|
|
14
|
+
def total(*args)
|
|
15
|
+
options = args.extract_options!
|
|
16
|
+
searcher = searchgasm_searcher(options)
|
|
17
|
+
searcher.total
|
|
18
|
+
end
|
|
19
|
+
|
|
14
20
|
# This is an alias method chain. It hooks into ActiveRecord's "find" method and checks to see if Searchgasm should get involved.
|
|
15
21
|
def find_with_searchgasm(*args)
|
|
16
22
|
options = args.extract_options!
|
|
@@ -126,40 +132,36 @@ module Searchgasm
|
|
|
126
132
|
private
|
|
127
133
|
def sanitize_options_with_searchgasm(options = {})
|
|
128
134
|
return options unless Searchgasm::Search::Base.needed?(self, options)
|
|
129
|
-
search = Searchgasm::Search::Base.create_virtual_class(self).new
|
|
135
|
+
search = Searchgasm::Search::Base.create_virtual_class(self).new # call explicitly to avoid merging the scopes into the searcher
|
|
130
136
|
search.acting_as_filter = true
|
|
137
|
+
search.options = options
|
|
131
138
|
search.sanitize
|
|
132
139
|
end
|
|
133
140
|
|
|
134
141
|
def searchgasm_conditions(options = {})
|
|
135
|
-
|
|
136
|
-
conditions
|
|
137
|
-
conditions
|
|
142
|
+
searcher = nil
|
|
143
|
+
conditions = nil
|
|
144
|
+
conditions = options.delete(:conditions) if options[:conditions].is_a?(Hash)
|
|
145
|
+
|
|
146
|
+
with_scope(:find => {:conditions => options[:conditions]}) do
|
|
147
|
+
searcher = Searchgasm::Conditions::Base.create_virtual_class(self).new(scope(:find)[:conditions])
|
|
148
|
+
searcher.conditions = conditions unless conditions.nil?
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
searcher
|
|
138
152
|
end
|
|
139
153
|
|
|
140
154
|
def searchgasm_searcher(options = {})
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
def options_from_scope_for_searchgasm(options)
|
|
147
|
-
# The goal here is to mimic how scope work. Merge what scopes would and don't what they wouldn't.
|
|
148
|
-
scope = scope(:find) || {}
|
|
149
|
-
scope_options = {}
|
|
150
|
-
[:group, :include, :select, :readonly].each { |option| scope_options[option] = scope[option] if !options.has_key?(option) && scope.has_key?(option) }
|
|
155
|
+
searcher = nil
|
|
156
|
+
conditions = nil
|
|
157
|
+
conditions = options.delete(:conditions) if options[:conditions].is_a?(Hash)
|
|
151
158
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
scope_options[:joins] += options[:joins].is_a?(Array) ? options[:joins] : [options[:joins]] unless options[:joins].blank?
|
|
159
|
+
with_scope(:find => options) do
|
|
160
|
+
searcher = Searchgasm::Search::Base.create_virtual_class(self).new(scope(:find))
|
|
161
|
+
searcher.conditions = conditions unless conditions.nil?
|
|
156
162
|
end
|
|
157
163
|
|
|
158
|
-
|
|
159
|
-
scope_options[:offset] = scope[:offset] if !options.has_key?(:page) && !options.has_key?(:offset) && scope.has_key?(:offset)
|
|
160
|
-
scope_options[:order] = scope[:order] if !options.has_key?(:order_by) && !options.has_key?(:order) && scope.has_key?(:order)
|
|
161
|
-
scope_options[:conditions] = scope[:conditions] if scope.has_key?(:conditions)
|
|
162
|
-
scope_options
|
|
164
|
+
searcher
|
|
163
165
|
end
|
|
164
166
|
end
|
|
165
167
|
end
|
|
@@ -83,17 +83,6 @@ module Searchgasm
|
|
|
83
83
|
self.conditions = init_conditions
|
|
84
84
|
end
|
|
85
85
|
|
|
86
|
-
# Setup methods for searching
|
|
87
|
-
[:all, :average, :calculate, :count, :find, :first, :maximum, :minimum, :sum].each do |method|
|
|
88
|
-
class_eval <<-"end_eval", __FILE__, __LINE__
|
|
89
|
-
def #{method}(*args)
|
|
90
|
-
self.conditions = args.extract_options!
|
|
91
|
-
args << {:conditions => sanitize}
|
|
92
|
-
klass.#{method}(*args)
|
|
93
|
-
end
|
|
94
|
-
end_eval
|
|
95
|
-
end
|
|
96
|
-
|
|
97
86
|
# A list of includes to use when searching, includes relationships
|
|
98
87
|
def includes
|
|
99
88
|
i = []
|
|
@@ -112,11 +101,11 @@ module Searchgasm
|
|
|
112
101
|
end
|
|
113
102
|
|
|
114
103
|
# Sanitizes the conditions down into conditions that ActiveRecord::Base.find can understand.
|
|
115
|
-
def sanitize(
|
|
104
|
+
def sanitize(any = false)
|
|
116
105
|
conditions = merge_conditions(*objects.collect { |object| object.sanitize })
|
|
117
106
|
return sql if conditions.blank?
|
|
118
107
|
merged_conditions = merge_conditions(conditions, sql)
|
|
119
|
-
|
|
108
|
+
merged_conditions
|
|
120
109
|
end
|
|
121
110
|
|
|
122
111
|
# Allows you to set the conditions via a hash.
|
|
@@ -36,7 +36,7 @@ module Searchgasm #:nodoc:
|
|
|
36
36
|
# Flag to determine if searchgasm is acting as a filter for the ActiveRecord search methods.
|
|
37
37
|
# The purpose of this is to determine if Config.per_page should be implemented.
|
|
38
38
|
def acting_as_filter=(value)
|
|
39
|
-
@acting_as_filter
|
|
39
|
+
@acting_as_filter = value
|
|
40
40
|
end
|
|
41
41
|
|
|
42
42
|
# See acting_as_filter=
|
|
@@ -84,11 +84,11 @@ module Searchgasm #:nodoc:
|
|
|
84
84
|
end
|
|
85
85
|
|
|
86
86
|
# Sanitizes everything down into options ActiveRecord::Base.find can understand
|
|
87
|
-
def sanitize
|
|
87
|
+
def sanitize
|
|
88
88
|
find_options = {}
|
|
89
89
|
::ActiveRecord::Base.valid_find_options.each do |find_option|
|
|
90
90
|
value = send(find_option)
|
|
91
|
-
next if value.blank?
|
|
91
|
+
next if value.blank?
|
|
92
92
|
find_options[find_option] = value
|
|
93
93
|
end
|
|
94
94
|
find_options
|
|
@@ -51,8 +51,8 @@ module Searchgasm
|
|
|
51
51
|
includes.blank? ? nil : (includes.size == 1 ? includes.first : includes)
|
|
52
52
|
end
|
|
53
53
|
|
|
54
|
-
def sanitize_with_conditions
|
|
55
|
-
find_options = sanitize_without_conditions
|
|
54
|
+
def sanitize_with_conditions # :nodoc:
|
|
55
|
+
find_options = sanitize_without_conditions
|
|
56
56
|
if conditions_obj = find_options.delete(:conditions)
|
|
57
57
|
new_conditions = conditions_obj.sanitize
|
|
58
58
|
find_options[:conditions] = new_conditions unless new_conditions.blank?
|
|
@@ -6,7 +6,8 @@ module Searchgasm
|
|
|
6
6
|
# this module.
|
|
7
7
|
module Searching
|
|
8
8
|
# Use these methods just like you would in ActiveRecord
|
|
9
|
-
SEARCH_METHODS = [:all, :
|
|
9
|
+
SEARCH_METHODS = [:all, :find, :first]
|
|
10
|
+
CALCULATION_METHODS = [:average, :calculate, :count, :maximum, :minimum, :sum]
|
|
10
11
|
|
|
11
12
|
# Setup methods for searching
|
|
12
13
|
SEARCH_METHODS.each do |method|
|
|
@@ -14,7 +15,22 @@ module Searchgasm
|
|
|
14
15
|
def #{method}(*args)
|
|
15
16
|
options = args.extract_options!
|
|
16
17
|
klass.send(:with_scope, :find => options) do
|
|
17
|
-
args <<
|
|
18
|
+
args << (self.class < Searchgasm::Conditions::Base ? {:conditions => sanitize} : sanitize)
|
|
19
|
+
klass.#{method}(*args)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end_eval
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Setup methods for calculating
|
|
26
|
+
CALCULATION_METHODS.each do |method|
|
|
27
|
+
class_eval <<-"end_eval", __FILE__, __LINE__
|
|
28
|
+
def #{method}(*args)
|
|
29
|
+
options = args.extract_options!
|
|
30
|
+
klass.send(:with_scope, :find => options) do
|
|
31
|
+
find_options = (self.class < Searchgasm::Conditions::Base ? {:conditions => sanitize} : sanitize)
|
|
32
|
+
find_options.delete(:select)
|
|
33
|
+
args << find_options
|
|
18
34
|
klass.#{method}(*args)
|
|
19
35
|
end
|
|
20
36
|
end
|
data/lib/searchgasm/version.rb
CHANGED
data/searchgasm.gemspec
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
|
|
2
|
-
# Gem::Specification for Searchgasm-1.0.
|
|
2
|
+
# Gem::Specification for Searchgasm-1.0.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.0.
|
|
8
|
+
version: 1.0.4
|
|
9
9
|
platform: ruby
|
|
10
10
|
authors:
|
|
11
11
|
- Ben Johnson of Binary Logic
|
|
@@ -91,7 +91,6 @@ extra_rdoc_files:
|
|
|
91
91
|
- lib/searchgasm/search/ordering.rb
|
|
92
92
|
- lib/searchgasm/search/pagination.rb
|
|
93
93
|
- lib/searchgasm/search/protection.rb
|
|
94
|
-
- lib/searchgasm/search/scoping.rb
|
|
95
94
|
- lib/searchgasm/search.rb
|
|
96
95
|
- lib/searchgasm/shared/searching.rb
|
|
97
96
|
- lib/searchgasm/shared/utilities.rb
|
|
@@ -141,7 +140,6 @@ files:
|
|
|
141
140
|
- lib/searchgasm/search/ordering.rb
|
|
142
141
|
- lib/searchgasm/search/pagination.rb
|
|
143
142
|
- lib/searchgasm/search/protection.rb
|
|
144
|
-
- lib/searchgasm/search/scoping.rb
|
|
145
143
|
- lib/searchgasm/search.rb
|
|
146
144
|
- lib/searchgasm/shared/searching.rb
|
|
147
145
|
- lib/searchgasm/shared/utilities.rb
|
|
@@ -28,6 +28,10 @@ class TestActiveRecordAssociations < Test::Unit::TestCase
|
|
|
28
28
|
assert_equal User.find(1), Account.find(1).users.first(:conditions => {:first_name_begins_with => "Ben"})
|
|
29
29
|
assert_equal User.find(1), Account.find(1).users.find(:first, :conditions => {:first_name_begins_with => "Ben"})
|
|
30
30
|
assert_equal [], Account.find(1).users.all(:conditions => {:first_name_begins_with => "Ben"}, :per_page => 20, :page => 5)
|
|
31
|
+
|
|
32
|
+
search = Account.find(1).users.new_search
|
|
33
|
+
assert_equal User.find(1, 3), search.all
|
|
34
|
+
assert_equal User.find(1), search.first
|
|
31
35
|
end
|
|
32
36
|
|
|
33
37
|
def test_calculations
|
|
@@ -43,13 +47,15 @@ class TestActiveRecordAssociations < Test::Unit::TestCase
|
|
|
43
47
|
assert_equal 1, Account.find(1).orders.sum("id", :conditions => {:total_gt => 100})
|
|
44
48
|
assert_equal 0, Account.find(1).orders.sum("id", :conditions => {:total_gt => 1000})
|
|
45
49
|
assert_equal 1, Account.find(1).orders.average("id", :conditions => {:total_gt => 100})
|
|
50
|
+
|
|
51
|
+
search = Account.find(1).orders.new_search
|
|
52
|
+
assert_equal [Order.find(1)], search.all
|
|
53
|
+
assert_equal Order.find(1), search.first
|
|
54
|
+
assert_equal 1, search.average("id")
|
|
55
|
+
assert_equal 1, search.count
|
|
46
56
|
end
|
|
47
57
|
|
|
48
58
|
def test_habtm
|
|
49
59
|
|
|
50
60
|
end
|
|
51
|
-
|
|
52
|
-
def test_special_options
|
|
53
|
-
#order, see AR doc, etc
|
|
54
|
-
end
|
|
55
61
|
end
|
data/test/test_search_base.rb
CHANGED
|
@@ -29,6 +29,14 @@ class TestSearchBase < Test::Unit::TestCase
|
|
|
29
29
|
assert_equal 10, search.limit
|
|
30
30
|
assert_equal true, search.readonly
|
|
31
31
|
end
|
|
32
|
+
|
|
33
|
+
def test_acting_as_filter
|
|
34
|
+
search = Account.new_search
|
|
35
|
+
search.acting_as_filter = true
|
|
36
|
+
assert search.acting_as_filter?
|
|
37
|
+
search.acting_as_filter = false
|
|
38
|
+
assert !search.acting_as_filter?
|
|
39
|
+
end
|
|
32
40
|
|
|
33
41
|
def test_setting_first_level_options
|
|
34
42
|
search = Account.new_search
|
|
@@ -131,8 +139,7 @@ class TestSearchBase < Test::Unit::TestCase
|
|
|
131
139
|
search.conditions.users.id_greater_than = 2
|
|
132
140
|
search.page = 3
|
|
133
141
|
search.readonly = true
|
|
134
|
-
assert_equal({:include => :users, :offset => 4, :readonly => true, :conditions => ["(\"accounts\".\"name\" LIKE ?) AND (\"users\".\"id\" > ?)", "%Binary%", 2], :limit => 2 }, search.sanitize
|
|
135
|
-
assert_equal({:include => :users, :readonly => true, :conditions => ["(\"accounts\".\"name\" LIKE ?) AND (\"users\".\"id\" > ?)", "%Binary%", 2] }, search.sanitize(:count))
|
|
142
|
+
assert_equal({:include => :users, :offset => 4, :readonly => true, :conditions => ["(\"accounts\".\"name\" LIKE ?) AND (\"users\".\"id\" > ?)", "%Binary%", 2], :limit => 2 }, search.sanitize)
|
|
136
143
|
end
|
|
137
144
|
|
|
138
145
|
def test_scope
|
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.0.
|
|
4
|
+
version: 1.0.4
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ben Johnson of Binary Logic
|
|
@@ -88,7 +88,6 @@ extra_rdoc_files:
|
|
|
88
88
|
- lib/searchgasm/search/ordering.rb
|
|
89
89
|
- lib/searchgasm/search/pagination.rb
|
|
90
90
|
- lib/searchgasm/search/protection.rb
|
|
91
|
-
- lib/searchgasm/search/scoping.rb
|
|
92
91
|
- lib/searchgasm/search.rb
|
|
93
92
|
- lib/searchgasm/shared/searching.rb
|
|
94
93
|
- lib/searchgasm/shared/utilities.rb
|
|
@@ -138,7 +137,6 @@ files:
|
|
|
138
137
|
- lib/searchgasm/search/ordering.rb
|
|
139
138
|
- lib/searchgasm/search/pagination.rb
|
|
140
139
|
- lib/searchgasm/search/protection.rb
|
|
141
|
-
- lib/searchgasm/search/scoping.rb
|
|
142
140
|
- lib/searchgasm/search.rb
|
|
143
141
|
- lib/searchgasm/shared/searching.rb
|
|
144
142
|
- lib/searchgasm/shared/utilities.rb
|
|
File without changes
|