searchgasm 1.1.2 → 1.1.3

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 CHANGED
@@ -1,3 +1,10 @@
1
+ == 1.1.3 released 2008-09-22
2
+
3
+ * Setting a condition to nil removes it if the condition is set to ignore blanks
4
+ * Setting search.conditions = "some sql" will reset ALL conditions. Alternatively search.conditions => {:first_name_contains => "Ben"} will overwrite "some sql". The same goes with search.conditions.first_name_contains = "Ben".
5
+ * Fixed bug with inspect
6
+ * Other small performance enhancements with memoized attributes
7
+
1
8
  == 1.1.2 released 2008-09-22
2
9
 
3
10
  * Fixed bug with select control types not using :search_obj to determine its select values.
@@ -8,7 +8,6 @@ module Searchgasm
8
8
  include Shared::Utilities
9
9
 
10
10
  attr_accessor :column, :klass
11
- attr_reader :value
12
11
  class_inheritable_accessor :ignore_blanks, :type_cast_value
13
12
  self.ignore_blanks = true
14
13
  self.type_cast_value = true
@@ -116,20 +115,14 @@ module Searchgasm
116
115
  to_conditions(v)
117
116
  end
118
117
  end
119
-
120
- # Should the value be automatically type casted
121
- def type_cast_value?
122
- true
123
- end
124
118
 
125
119
  # The value for the condition
126
120
  def value
127
121
  self.class.type_cast_value? && @value.is_a?(String) ? column.type_cast(@value) : @value
128
122
  end
129
123
 
130
- # Sets the value for the condition, will ignore place if ignore_blanks?
124
+ # Sets the value for the condition
131
125
  def value=(v)
132
- return if self.class.ignore_blanks? && v.blank?
133
126
  self.explicitly_set_value = true
134
127
  @value = v
135
128
  end
@@ -9,7 +9,7 @@ module Searchgasm
9
9
  include Shared::Searching
10
10
  include Shared::VirtualClasses
11
11
 
12
- attr_accessor :any, :relationship_name, :sql
12
+ attr_accessor :any, :relationship_name
13
13
 
14
14
  class << self
15
15
  attr_accessor :added_klass_conditions, :added_column_conditions, :added_associations
@@ -116,36 +116,35 @@ module Searchgasm
116
116
  end
117
117
 
118
118
  def inspect
119
- conditions_hash = conditions
120
- conditions_hash[:sql] = sql if sql
121
- conditions_hash[:protected] = true if protected?
122
- conditions_hash.inspect
119
+ "#<#{klass}Conditions#{conditions.blank? ? "" : " #{conditions.inspect}"}>"
123
120
  end
124
121
 
125
122
  # Sanitizes the conditions down into conditions that ActiveRecord::Base.find can understand.
126
123
  def sanitize
127
- conditions = merge_conditions(*(objects.collect { |object| object.sanitize } << {:any => any}))
128
- return sql if conditions.blank?
129
- merged_conditions = merge_conditions(conditions, sql, :any => any)
130
- merged_conditions
124
+ return @conditions if @conditions
125
+ merge_conditions(*(objects.collect { |object| object.sanitize } << {:any => any}))
131
126
  end
132
127
 
133
128
  # Allows you to set the conditions via a hash.
134
- def conditions=(conditions)
135
- case conditions
136
- when Hash
137
- assert_valid_conditions(conditions)
138
- remove_conditions_from_protected_assignement(conditions).each do |condition, value|
139
- next if value.blank? # ignore blanks on mass assignments
140
- send("#{condition}=", value)
129
+ def conditions=(value)
130
+ case value
131
+ when Hash
132
+ assert_valid_conditions(value)
133
+ remove_conditions_from_protected_assignement(value).each do |condition, condition_value|
134
+ next if condition_value.blank? # ignore blanks on mass assignments
135
+ send("#{condition}=", condition_value)
141
136
  end
142
137
  else
143
- self.sql = conditions
138
+ reset_objects!
139
+ @conditions = value
144
140
  end
145
141
  end
146
142
 
147
143
  # All of the active conditions (conditions that have been set)
148
144
  def conditions
145
+ return @conditions if @conditions
146
+ return if objects.blank?
147
+
149
148
  conditions_hash = {}
150
149
  objects.each do |object|
151
150
  if object.class < Searchgasm::Conditions::Base
@@ -178,7 +177,7 @@ module Searchgasm
178
177
  @#{association.name}
179
178
  end
180
179
 
181
- def #{association.name}=(conditions); #{association.name}.conditions = conditions; end
180
+ def #{association.name}=(conditions); @conditions = nil; #{association.name}.conditions = conditions; end
182
181
  def reset_#{association.name}!; objects.delete(#{association.name}); @#{association.name} = nil; end
183
182
  end_eval
184
183
  end
@@ -214,7 +213,16 @@ module Searchgasm
214
213
  end
215
214
 
216
215
  def #{name}; #{name}_object.value; end
217
- def #{name}=(value); #{name}_object.value = value; end
216
+
217
+ def #{name}=(value)
218
+ if value.blank? && #{name}_object.class.ignore_blanks?
219
+ reset_#{name}!
220
+ else
221
+ @conditions = nil
222
+ #{name}_object.value = value
223
+ end
224
+ end
225
+
218
226
  def reset_#{name}!; objects.delete(#{name}_object); @#{name} = nil; end
219
227
  end_eval
220
228
  end
@@ -253,6 +261,11 @@ module Searchgasm
253
261
  @objects ||= []
254
262
  end
255
263
 
264
+ def reset_objects!
265
+ objects.each { |object| eval("@#{object.name} = nil") }
266
+ objects.clear
267
+ end
268
+
256
269
  def remove_conditions_from_protected_assignement(conditions)
257
270
  return conditions if klass.accessible_conditions.nil? && klass.protected_conditions.nil?
258
271
  if klass.accessible_conditions
@@ -55,19 +55,25 @@ module Searchgasm #:nodoc:
55
55
  # Makes using searchgasm in the console less annoying and keeps the output meaningful and useful
56
56
  def inspect
57
57
  current_find_options = {}
58
- AR_OPTIONS.each do |option|
58
+ (AR_OPTIONS - [:conditions]).each do |option|
59
59
  value = send(option)
60
60
  next if value.nil?
61
61
  current_find_options[option] = value
62
62
  end
63
+ conditions_value = conditions.conditions
64
+ current_find_options[:conditions] = conditions_value unless conditions_value.blank?
63
65
  current_find_options[:scope] = scope unless scope.blank?
64
66
  "#<#{klass}Search #{current_find_options.inspect}>"
65
67
  end
66
68
 
67
- # need to remote any duplicate joins that are specified in includes
68
- #def joins
69
- # # If includes are specified, remove the joins
70
- #end
69
+ def joins=(value)
70
+ @memoized_joins = nil
71
+ @joins = value
72
+ end
73
+
74
+ def joins
75
+ @memoized_joins ||= @joins
76
+ end
71
77
 
72
78
  def limit=(value)
73
79
  @set_limit = true
@@ -9,6 +9,7 @@ module Searchgasm
9
9
  klass.class_eval do
10
10
  alias_method_chain :initialize, :conditions
11
11
  alias_method_chain :conditions=, :conditions
12
+ alias_method_chain :conditions, :conditions
12
13
  alias_method_chain :joins, :conditions
13
14
  alias_method_chain :sanitize, :conditions
14
15
  end
@@ -33,6 +34,7 @@ module Searchgasm
33
34
  # now you can create the rest of your search and your "scope" will get merged into your final SQL.
34
35
  # What this does is determine if the value a hash or a conditions object, if not it sets it up as a scope.
35
36
  def conditions_with_conditions=(values)
37
+ @memoized_joins = nil
36
38
  case values
37
39
  when Searchgasm::Conditions::Base
38
40
  @conditions = values
@@ -41,12 +43,17 @@ module Searchgasm
41
43
  end
42
44
  end
43
45
 
46
+ def conditions_with_conditions
47
+ @memoized_joins = nil # have to assume they are calling a condition on a relationship
48
+ conditions_without_conditions
49
+ end
50
+
44
51
  # Tells searchgasm what relationships to join during the search. This is based on what conditions you set.
45
52
  #
46
53
  # <b>Be careful!</b>
47
54
  # ActiveRecord associations can be an SQL train wreck. Make sure you think about what you are searching and that you aren't joining a table with a million records.
48
55
  def joins_with_conditions
49
- merge_joins(joins_without_conditions, conditions.joins)
56
+ @memoized_joins ||= merge_joins(joins_without_conditions, conditions.joins)
50
57
  end
51
58
 
52
59
  def sanitize_with_conditions(searching = true) # :nodoc:
@@ -24,13 +24,14 @@ module Searchgasm
24
24
  end
25
25
 
26
26
  def joins_with_ordering # :nodoc:
27
- merge_joins(joins_without_ordering, order_by_joins)
27
+ @memoized_joins ||= merge_joins(joins_without_ordering, order_by_joins)
28
28
  end
29
29
 
30
30
  def order_with_ordering=(value) # :nodoc
31
31
  @order_by = nil
32
32
  @order_as = nil
33
33
  self.order_by_joins.clear
34
+ @memoized_joins = nil
34
35
  self.order_without_ordering = value
35
36
  end
36
37
 
@@ -101,6 +102,7 @@ module Searchgasm
101
102
  # order_by = [:id, {:user_group => :name}] # => users.id ASC, user_groups.name ASC
102
103
  def order_by=(value)
103
104
  self.order_by_joins.clear
105
+ @memoized_joins = nil
104
106
  @order_by = get_order_by_value(value)
105
107
  @order = order_by_to_order(@order_by, order_as)
106
108
  @order_by
@@ -67,7 +67,7 @@ module Searchgasm
67
67
 
68
68
  MAJOR = 1
69
69
  MINOR = 1
70
- TINY = 2
70
+ TINY = 3
71
71
 
72
72
  # The current version as a Version instance
73
73
  CURRENT = new(MAJOR, MINOR, TINY)
data/searchgasm.gemspec CHANGED
@@ -1,18 +1,18 @@
1
1
 
2
- # Gem::Specification for Searchgasm-1.1.2
2
+ # Gem::Specification for Searchgasm-1.1.3
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.1.2
8
+ version: 1.1.3
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-09-22 00:00:00 -04:00
15
+ date: 2008-09-23 00:00:00 -04:00
16
16
  default_executable:
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
@@ -35,18 +35,6 @@ class TestConditionBase < Test::Unit::TestCase
35
35
  assert_equal condition.column, Account.columns_hash["id"]
36
36
  end
37
37
 
38
- def test_explicitly_set_value
39
- condition = Searchgasm::Condition::Equals.new(Account, Account.columns_hash["name"])
40
- assert !condition.explicitly_set_value?
41
- condition.value = nil
42
- assert condition.explicitly_set_value?
43
-
44
- condition = Searchgasm::Condition::Keywords.new(Account, Account.columns_hash["name"])
45
- assert !condition.explicitly_set_value?
46
- condition.value = nil
47
- assert !condition.explicitly_set_value?
48
- end
49
-
50
38
  def test_ignore_blanks?
51
39
  condition = Searchgasm::Condition::Equals.new(Account, Account.columns_hash["id"])
52
40
  assert !condition.class.ignore_blanks?
@@ -146,16 +146,22 @@ class TestConditionsBase < Test::Unit::TestCase
146
146
 
147
147
  sql = "id in (1,2,3,4)"
148
148
  conditions.conditions = sql
149
- assert_equal v, conditions.conditions
150
- assert_equal sql, conditions.sql
149
+ assert_equal sql, conditions.conditions
151
150
 
152
151
  v2 = {:id_less_than => 5, :name_begins_with => "Beginning of string"}
153
152
  conditions.conditions = v2
154
- assert_equal v.merge(v2), conditions.conditions
153
+ assert_equal v2, conditions.conditions
154
+
155
+ v = {:name_contains => "Binary", :created_at_greater_than => now}
156
+ conditions.conditions = v
157
+ assert_equal v2.merge(v), conditions.conditions
155
158
 
156
159
  sql2 = "id > 5 and name = 'Test'"
157
160
  conditions.conditions = sql2
158
- assert_equal sql2, conditions.sql
161
+ assert_equal sql2, conditions.conditions
162
+
163
+ conditions.name_contains = "awesome"
164
+ assert_equal({:name_contains => "awesome"}, conditions.conditions)
159
165
  end
160
166
 
161
167
  def test_searching
@@ -188,10 +194,15 @@ class TestConditionsBase < Test::Unit::TestCase
188
194
 
189
195
  def test_ignoring_blanks
190
196
  conditions = Account.new_conditions(:name => "", :created_after => nil)
191
- assert_equal({}, conditions.conditions)
197
+ assert_equal(nil, conditions.conditions)
192
198
  conditions.name = ""
193
199
  assert_equal({:name_equals => ""}, conditions.conditions)
194
200
  conditions.created_after = ""
195
201
  assert_equal({:name_equals => ""}, conditions.conditions)
196
202
  end
203
+
204
+ def test_inspect
205
+ conditions = Account.new_conditions
206
+ assert_nothing_raised { conditions.inspect }
207
+ end
197
208
  end
@@ -157,13 +157,14 @@ class TestSearchBase < Test::Unit::TestCase
157
157
  def test_scope
158
158
  search = Account.new_search!
159
159
  search.conditions = "some sql"
160
- assert_equal "some sql", search.conditions.sql
160
+ conditions = search.conditions
161
+ assert_equal "some sql", search.conditions.conditions
161
162
  search.conditions = nil
162
- assert_equal nil, search.conditions.sql
163
+ assert_equal nil, search.conditions.conditions
163
164
  search.conditions = "some sql"
164
- assert_equal "some sql", search.conditions.sql
165
+ assert_equal "some sql", search.conditions.conditions
165
166
  search.conditions = "some sql"
166
- assert_equal "some sql", search.conditions.sql
167
+ assert_equal "some sql", search.conditions.conditions
167
168
  end
168
169
 
169
170
  def test_searching
@@ -210,4 +211,19 @@ class TestSearchBase < Test::Unit::TestCase
210
211
  def test_method_creation_in_scope
211
212
  # test ot make sure methods are not created across the board for all models
212
213
  end
214
+
215
+ =begin
216
+ # AR desont handle this problem either
217
+ def test_specifying_includes
218
+ search = Account.new_search
219
+ search.include = :users
220
+ search.conditions.users.first_name_like = "Ben"
221
+ assert_nothing_raised { search.all }
222
+ end
223
+ =end
224
+
225
+ def test_inspect
226
+ search = Account.new_search
227
+ assert_nothing_raised { search.inspect }
228
+ end
213
229
  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.1.2
4
+ version: 1.1.3
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-09-22 00:00:00 -04:00
12
+ date: 2008-09-23 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency