searchgasm 1.3.1 → 1.3.2
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 +11 -0
- data/lib/searchgasm/active_record/base.rb +0 -1
- data/lib/searchgasm/condition/base.rb +26 -16
- data/lib/searchgasm/condition/blank.rb +0 -1
- data/lib/searchgasm/conditions/base.rb +32 -4
- data/lib/searchgasm/config.rb +1 -1
- data/lib/searchgasm/core_ext/hash.rb +1 -1
- data/lib/searchgasm/search/base.rb +0 -11
- data/lib/searchgasm/search/searching.rb +9 -2
- data/lib/searchgasm/version.rb +1 -1
- data/searchgasm.gemspec +3 -3
- data/test/test_active_record_associations.rb +1 -1
- data/test/test_condition_types.rb +4 -4
- data/test/test_conditions_base.rb +3 -2
- data/test/test_search_base.rb +10 -1
- metadata +2 -2
data/CHANGELOG.rdoc
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
== 1.3.2 released 2008-10-03
|
2
|
+
|
3
|
+
* Fixed condition to type cast all values in an array
|
4
|
+
* Fixed bug to properly set the type for the type cast column
|
5
|
+
* Fixed bug to allow conditions on local columns
|
6
|
+
* Apparently ActiveRecord 2.2 doesnt remove duplicates on all joins, need to enforce this for ALL versions of ActiveRecord
|
7
|
+
* Fixed bug when passing a symbol as the SQL type for condition return types
|
8
|
+
* Moved duplicate removal to only apply when searching or calculating from a search object. Anything done in a normal ActiveRecord method should remain untouched and let ActiveRecord handle it. Just like in ActiveRecord if you do a User.all search and pass some :joins, you might get duplicate records. Searchgasm should not change that behavior, unless called from a searchgasm object.
|
9
|
+
* Discard meaningless array values when setting a condition.
|
10
|
+
* Delete blank strings from mass assignments on conditions.
|
11
|
+
|
1
12
|
== 1.3.1 released 2008-10-02
|
2
13
|
|
3
14
|
* Fixed bug when requiring a connection adapter that is not present
|
@@ -11,7 +11,6 @@ module Searchgasm
|
|
11
11
|
def calculate_with_searchgasm(*args)
|
12
12
|
options = args.extract_options!
|
13
13
|
options = filter_options_with_searchgasm(options, false)
|
14
|
-
args[1] = primary_key if options[:distinct] && [nil, :all].include?(args[1]) # quick fix for adding a column name if distinct is true and no specific column is provided
|
15
14
|
args << options
|
16
15
|
calculate_without_searchgasm(*args)
|
17
16
|
end
|
@@ -44,8 +44,8 @@ module Searchgasm
|
|
44
44
|
|
45
45
|
if column_obj
|
46
46
|
self.column = column_obj.class < ::ActiveRecord::ConnectionAdapters::Column ? column_obj : klass.columns_hash[column_obj.to_s]
|
47
|
-
column_type
|
48
|
-
self.column_for_type_cast = column.class.new(column.name, column.default.to_s,
|
47
|
+
type = (!self.class.value_type.blank? && self.class.value_type.to_s) || (!column_type.blank? && column_type.to_s) || column.sql_type
|
48
|
+
self.column_for_type_cast = column.class.new(column.name, column.default.to_s, type, column.null)
|
49
49
|
self.column_sql = column_sql || "#{klass.connection.quote_table_name(klass.table_name)}.#{klass.connection.quote_column_name(column.name)}"
|
50
50
|
end
|
51
51
|
end
|
@@ -60,13 +60,9 @@ module Searchgasm
|
|
60
60
|
@explicitly_set_value == true
|
61
61
|
end
|
62
62
|
|
63
|
-
def meaningless_value?
|
64
|
-
!explicitly_set_value? || (self.class.ignore_meaningless_value? && meaningless?(@value))
|
65
|
-
end
|
66
|
-
|
67
63
|
# You should refrain from overwriting this method, it performs various tasks before callign your to_conditions method, allowing you to keep to_conditions simple.
|
68
64
|
def sanitize(alt_value = nil) # :nodoc:
|
69
|
-
return if
|
65
|
+
return if value_is_meaningless?
|
70
66
|
v = alt_value || value
|
71
67
|
if v.is_a?(Array) && !self.class.handle_array_value?
|
72
68
|
merge_conditions(*v.collect { |i| sanitize(i) })
|
@@ -78,13 +74,7 @@ module Searchgasm
|
|
78
74
|
|
79
75
|
# The value for the condition
|
80
76
|
def value
|
81
|
-
|
82
|
-
|
83
|
-
if !column_for_type_cast || meaningless_value?
|
84
|
-
@casted_value = @value
|
85
|
-
else
|
86
|
-
@casted_value = @value.is_a?(String) ? column_for_type_cast.type_cast(@value) : @value
|
87
|
-
end
|
77
|
+
@casted_value ||= type_cast_value(@value)
|
88
78
|
end
|
89
79
|
|
90
80
|
# Sets the value for the condition
|
@@ -94,10 +84,19 @@ module Searchgasm
|
|
94
84
|
@value = v
|
95
85
|
end
|
96
86
|
|
87
|
+
def value_is_meaningless? # :nodoc:
|
88
|
+
meaningless?(@value)
|
89
|
+
end
|
90
|
+
|
97
91
|
private
|
98
92
|
def meaningless?(v)
|
99
|
-
|
100
|
-
|
93
|
+
case v
|
94
|
+
when Array
|
95
|
+
v.each { |i| return false unless meaningless?(i) }
|
96
|
+
true
|
97
|
+
else
|
98
|
+
!explicitly_set_value? || (self.class.ignore_meaningless_value? && v != false && v.blank?)
|
99
|
+
end
|
101
100
|
end
|
102
101
|
|
103
102
|
def meaningful?(v)
|
@@ -115,6 +114,17 @@ module Searchgasm
|
|
115
114
|
def quoted_table_name
|
116
115
|
quote_table_name(klass.table_name)
|
117
116
|
end
|
117
|
+
|
118
|
+
def type_cast_value(v)
|
119
|
+
case v
|
120
|
+
when Array
|
121
|
+
v.collect { |i| type_cast_value(i) }.compact
|
122
|
+
else
|
123
|
+
return if meaningless?(v)
|
124
|
+
return v if !column_for_type_cast || !v.is_a?(String)
|
125
|
+
column_for_type_cast.type_cast(v)
|
126
|
+
end
|
127
|
+
end
|
118
128
|
end
|
119
129
|
end
|
120
130
|
end
|
@@ -199,7 +199,22 @@ module Searchgasm
|
|
199
199
|
when Hash
|
200
200
|
assert_valid_conditions(value)
|
201
201
|
remove_conditions_from_protected_assignement(value).each do |condition, condition_value|
|
202
|
-
|
202
|
+
|
203
|
+
# delete all blanks from mass assignments, forms submit blanks, blanks are meaningless
|
204
|
+
# equals condition thinks everything is meaningful, and arrays can be pased
|
205
|
+
new_condition_value = nil
|
206
|
+
case condition_value
|
207
|
+
when Array
|
208
|
+
new_condition_value = []
|
209
|
+
condition_value.each { |v| new_condition_value << v unless v == "" }
|
210
|
+
next if new_condition_value.size == 0
|
211
|
+
new_condition_value = new_condition_value.first if new_condition_value.size == 1
|
212
|
+
else
|
213
|
+
next if condition_value == ""
|
214
|
+
new_condition_value = condition_value
|
215
|
+
end
|
216
|
+
|
217
|
+
send("#{condition}=", new_condition_value)
|
203
218
|
end
|
204
219
|
else
|
205
220
|
reset_objects!
|
@@ -219,7 +234,7 @@ module Searchgasm
|
|
219
234
|
next if relationship_conditions.blank?
|
220
235
|
conditions_hash[object.relationship_name.to_sym] = relationship_conditions
|
221
236
|
else
|
222
|
-
next if object.
|
237
|
+
next if object.value_is_meaningless?
|
223
238
|
conditions_hash[name] = object.value
|
224
239
|
end
|
225
240
|
end
|
@@ -374,7 +389,7 @@ module Searchgasm
|
|
374
389
|
@conditions = nil
|
375
390
|
|
376
391
|
#{name}_object.value = value
|
377
|
-
reset_#{name}! if #{name}_object.
|
392
|
+
reset_#{name}! if #{name}_object.value_is_meaningless?
|
378
393
|
value
|
379
394
|
end
|
380
395
|
|
@@ -395,7 +410,20 @@ module Searchgasm
|
|
395
410
|
|
396
411
|
def assert_valid_conditions(conditions)
|
397
412
|
conditions.each do |condition, value|
|
398
|
-
|
413
|
+
next if (self.class.condition_names + self.class.association_names + ["any"]).include?(condition.to_s)
|
414
|
+
|
415
|
+
go_to_next = false
|
416
|
+
self.class.column_details.each do |column_detail|
|
417
|
+
if column_detail[:column].name == condition.to_s || column_detail[:aliases].include?(condition.to_s)
|
418
|
+
go_to_next = true
|
419
|
+
break
|
420
|
+
end
|
421
|
+
end
|
422
|
+
next if go_to_next
|
423
|
+
|
424
|
+
next unless respond_to?(condition)
|
425
|
+
|
426
|
+
raise(ArgumentError, "The #{condition} condition is not a valid condition")
|
399
427
|
end
|
400
428
|
end
|
401
429
|
|
data/lib/searchgasm/config.rb
CHANGED
@@ -156,7 +156,7 @@ module Searchgasm
|
|
156
156
|
|
157
157
|
def remove_duplicates # :nodoc:
|
158
158
|
return @remove_duplicates if @set_remove_duplicates
|
159
|
-
@remove_duplicates ||=
|
159
|
+
@remove_duplicates ||= true
|
160
160
|
end
|
161
161
|
|
162
162
|
def remove_duplicates? # :nodoc:
|
@@ -113,17 +113,6 @@ module Searchgasm #:nodoc:
|
|
113
113
|
find_options[find_option] = value
|
114
114
|
end
|
115
115
|
|
116
|
-
if Config.remove_duplicates?
|
117
|
-
unless find_options[:joins].blank?
|
118
|
-
# The following is to return uniq records since we are using joins instead of includes
|
119
|
-
if searching
|
120
|
-
find_options[:group] ||= "#{quote_table_name(klass.table_name)}.#{quote_column_name(klass.primary_key)}"
|
121
|
-
else
|
122
|
-
find_options[:distinct] = true
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
116
|
find_options
|
128
117
|
end
|
129
118
|
|
@@ -21,8 +21,15 @@ module Searchgasm
|
|
21
21
|
find_options = {}
|
22
22
|
options = args.extract_options! # can't pass options, your options are in the search
|
23
23
|
klass.send(:with_scope, :find => scope) do
|
24
|
-
|
25
|
-
|
24
|
+
options = sanitize(#{SEARCH_METHODS.include?(method)})
|
25
|
+
if #{CALCULATION_METHODS.include?(method)}
|
26
|
+
options[:distinct] = true
|
27
|
+
args[0] = klass.primary_key if [nil, :all].include?(args[0])
|
28
|
+
end
|
29
|
+
args << options
|
30
|
+
result = klass.#{method}(*args)
|
31
|
+
result.uniq! if result.is_a?(Array) && Config.remove_duplicates?
|
32
|
+
result
|
26
33
|
end
|
27
34
|
end
|
28
35
|
end_eval
|
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.2
|
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.2
|
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-03 00:00:00 -04:00
|
16
16
|
default_executable:
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
@@ -65,7 +65,7 @@ class TestActiveRecordAssociations < Test::Unit::TestCase
|
|
65
65
|
assert_equal 2, search.count
|
66
66
|
|
67
67
|
search.conditions.first_name_contains = "Ben"
|
68
|
-
|
68
|
+
|
69
69
|
assert_equal [User.find(1)], search.all
|
70
70
|
assert_equal User.find(1), search.first
|
71
71
|
assert_equal 1, search.average("id")
|
@@ -7,19 +7,19 @@ class TestConditionTypes < Test::Unit::TestCase
|
|
7
7
|
assert_equal ["\"accounts\".\"name\" LIKE ?", "Binary%"], condition.sanitize
|
8
8
|
|
9
9
|
condition = Searchgasm::Condition::Blank.new(Account, Account.columns_hash["id"])
|
10
|
-
condition.value = true
|
10
|
+
condition.value = "true"
|
11
11
|
assert_equal "\"accounts\".\"id\" is NULL or \"accounts\".\"id\" = ''", condition.sanitize
|
12
12
|
|
13
13
|
condition = Searchgasm::Condition::Blank.new(Account, Account.columns_hash["id"])
|
14
|
-
condition.value = false
|
14
|
+
condition.value = "false"
|
15
15
|
assert_equal "\"accounts\".\"id\" is NOT NULL and \"accounts\".\"id\" != ''", condition.sanitize
|
16
16
|
|
17
17
|
condition = Searchgasm::Condition::Blank.new(Account, Account.columns_hash["id"])
|
18
|
-
condition.value =
|
18
|
+
condition.value = true
|
19
19
|
assert_equal "\"accounts\".\"id\" is NULL or \"accounts\".\"id\" = ''", condition.sanitize
|
20
20
|
|
21
21
|
condition = Searchgasm::Condition::Blank.new(Account, Account.columns_hash["id"])
|
22
|
-
condition.value =
|
22
|
+
condition.value = false
|
23
23
|
assert_equal "\"accounts\".\"id\" is NOT NULL and \"accounts\".\"id\" != ''", condition.sanitize
|
24
24
|
|
25
25
|
condition = Searchgasm::Condition::Blank.new(Account, Account.columns_hash["id"])
|
@@ -117,8 +117,9 @@ class TestConditionsBase < Test::Unit::TestCase
|
|
117
117
|
conditions.name_contains = "awesome"
|
118
118
|
assert_equal({:name_like => "awesome"}, conditions.conditions)
|
119
119
|
|
120
|
-
|
121
|
-
|
120
|
+
now = Time.now
|
121
|
+
conditions.conditions = {:id_gt => "", :id => "", :name => ["", "", ""], :created_at => ["", now], :name_starts_with => "Ben"}
|
122
|
+
assert_equal({:name_like => "awesome", :name_begins_with => "Ben", :created_at_equals => now}, conditions.conditions)
|
122
123
|
end
|
123
124
|
|
124
125
|
# Other general usage tests, need to clean these up
|
data/test/test_search_base.rb
CHANGED
@@ -140,7 +140,7 @@ class TestSearchBase < Test::Unit::TestCase
|
|
140
140
|
search.conditions.users.id_greater_than = 2
|
141
141
|
search.page = 3
|
142
142
|
search.readonly = true
|
143
|
-
assert_equal({:joins => :users, :
|
143
|
+
assert_equal({:joins => :users, :offset => 4, :readonly => true, :conditions => ["(\"accounts\".\"name\" LIKE ?) AND (\"users\".\"id\" > ?)", "%Binary%", 2], :limit => 2 }, search.sanitize)
|
144
144
|
end
|
145
145
|
|
146
146
|
def test_scope
|
@@ -199,6 +199,15 @@ class TestSearchBase < Test::Unit::TestCase
|
|
199
199
|
|
200
200
|
search.readonly = true
|
201
201
|
assert_equal 4, search.sum('id')
|
202
|
+
|
203
|
+
search = Account.new_search(:conditions => {:users => {:orders => {:id_gt => 1}}})
|
204
|
+
assert_equal 1, search.count
|
205
|
+
|
206
|
+
search = Order.new_search(:conditions => {:user => {:account => {:id_gt => 1}}})
|
207
|
+
assert_equal 1, search.count
|
208
|
+
|
209
|
+
search = UserGroup.new_search(:conditions => {:users => {:orders => {:id_gt => 1}}})
|
210
|
+
assert_equal 1, search.count
|
202
211
|
end
|
203
212
|
|
204
213
|
def test_method_creation_in_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.3.
|
4
|
+
version: 1.3.2
|
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-03 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|