schof-searchlogic 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +302 -0
- data/MIT-LICENSE +20 -0
- data/Manifest +157 -0
- data/README.rdoc +461 -0
- data/Rakefile +13 -0
- data/TODO.rdoc +4 -0
- data/init.rb +1 -0
- data/lib/searchlogic.rb +100 -0
- data/lib/searchlogic/active_record/associations.rb +52 -0
- data/lib/searchlogic/active_record/base.rb +224 -0
- data/lib/searchlogic/active_record/connection_adapters/mysql_adapter.rb +176 -0
- data/lib/searchlogic/active_record/connection_adapters/postgresql_adapter.rb +172 -0
- data/lib/searchlogic/active_record/connection_adapters/sqlite_adapter.rb +80 -0
- data/lib/searchlogic/condition/base.rb +165 -0
- data/lib/searchlogic/condition/begins_with.rb +17 -0
- data/lib/searchlogic/condition/blank.rb +21 -0
- data/lib/searchlogic/condition/child_of.rb +11 -0
- data/lib/searchlogic/condition/descendant_of.rb +11 -0
- data/lib/searchlogic/condition/ends_with.rb +17 -0
- data/lib/searchlogic/condition/equals.rb +33 -0
- data/lib/searchlogic/condition/greater_than.rb +15 -0
- data/lib/searchlogic/condition/greater_than_or_equal_to.rb +15 -0
- data/lib/searchlogic/condition/inclusive_descendant_of.rb +10 -0
- data/lib/searchlogic/condition/keywords.rb +47 -0
- data/lib/searchlogic/condition/less_than.rb +15 -0
- data/lib/searchlogic/condition/less_than_or_equal_to.rb +15 -0
- data/lib/searchlogic/condition/like.rb +15 -0
- data/lib/searchlogic/condition/nested_set.rb +17 -0
- data/lib/searchlogic/condition/nil.rb +21 -0
- data/lib/searchlogic/condition/not_begin_with.rb +20 -0
- data/lib/searchlogic/condition/not_blank.rb +19 -0
- data/lib/searchlogic/condition/not_end_with.rb +20 -0
- data/lib/searchlogic/condition/not_equal.rb +27 -0
- data/lib/searchlogic/condition/not_have_keywords.rb +20 -0
- data/lib/searchlogic/condition/not_like.rb +20 -0
- data/lib/searchlogic/condition/not_nil.rb +19 -0
- data/lib/searchlogic/condition/sibling_of.rb +14 -0
- data/lib/searchlogic/conditions/any_or_all.rb +42 -0
- data/lib/searchlogic/conditions/base.rb +244 -0
- data/lib/searchlogic/conditions/groups.rb +74 -0
- data/lib/searchlogic/conditions/magic_methods.rb +286 -0
- data/lib/searchlogic/conditions/multiparameter_attributes.rb +105 -0
- data/lib/searchlogic/conditions/protection.rb +36 -0
- data/lib/searchlogic/config.rb +31 -0
- data/lib/searchlogic/config/helpers.rb +338 -0
- data/lib/searchlogic/config/search.rb +53 -0
- data/lib/searchlogic/core_ext/hash.rb +75 -0
- data/lib/searchlogic/core_ext/object.rb +19 -0
- data/lib/searchlogic/helpers/control_types/link.rb +310 -0
- data/lib/searchlogic/helpers/control_types/links.rb +242 -0
- data/lib/searchlogic/helpers/control_types/remote_link.rb +87 -0
- data/lib/searchlogic/helpers/control_types/remote_links.rb +72 -0
- data/lib/searchlogic/helpers/control_types/remote_select.rb +36 -0
- data/lib/searchlogic/helpers/control_types/select.rb +82 -0
- data/lib/searchlogic/helpers/form.rb +208 -0
- data/lib/searchlogic/helpers/utilities.rb +197 -0
- data/lib/searchlogic/modifiers/absolute.rb +15 -0
- data/lib/searchlogic/modifiers/acos.rb +11 -0
- data/lib/searchlogic/modifiers/asin.rb +11 -0
- data/lib/searchlogic/modifiers/atan.rb +11 -0
- data/lib/searchlogic/modifiers/avg.rb +15 -0
- data/lib/searchlogic/modifiers/base.rb +27 -0
- data/lib/searchlogic/modifiers/ceil.rb +15 -0
- data/lib/searchlogic/modifiers/char_length.rb +15 -0
- data/lib/searchlogic/modifiers/cos.rb +15 -0
- data/lib/searchlogic/modifiers/cot.rb +15 -0
- data/lib/searchlogic/modifiers/count.rb +11 -0
- data/lib/searchlogic/modifiers/day_of_month.rb +15 -0
- data/lib/searchlogic/modifiers/day_of_week.rb +15 -0
- data/lib/searchlogic/modifiers/day_of_year.rb +15 -0
- data/lib/searchlogic/modifiers/degrees.rb +11 -0
- data/lib/searchlogic/modifiers/exp.rb +15 -0
- data/lib/searchlogic/modifiers/floor.rb +15 -0
- data/lib/searchlogic/modifiers/hex.rb +11 -0
- data/lib/searchlogic/modifiers/hour.rb +11 -0
- data/lib/searchlogic/modifiers/log.rb +15 -0
- data/lib/searchlogic/modifiers/log10.rb +11 -0
- data/lib/searchlogic/modifiers/log2.rb +11 -0
- data/lib/searchlogic/modifiers/lower.rb +15 -0
- data/lib/searchlogic/modifiers/ltrim.rb +15 -0
- data/lib/searchlogic/modifiers/md5.rb +11 -0
- data/lib/searchlogic/modifiers/microseconds.rb +11 -0
- data/lib/searchlogic/modifiers/milliseconds.rb +11 -0
- data/lib/searchlogic/modifiers/minute.rb +15 -0
- data/lib/searchlogic/modifiers/month.rb +15 -0
- data/lib/searchlogic/modifiers/octal.rb +15 -0
- data/lib/searchlogic/modifiers/radians.rb +11 -0
- data/lib/searchlogic/modifiers/round.rb +11 -0
- data/lib/searchlogic/modifiers/rtrim.rb +15 -0
- data/lib/searchlogic/modifiers/second.rb +15 -0
- data/lib/searchlogic/modifiers/sign.rb +11 -0
- data/lib/searchlogic/modifiers/sin.rb +11 -0
- data/lib/searchlogic/modifiers/square_root.rb +15 -0
- data/lib/searchlogic/modifiers/sum.rb +11 -0
- data/lib/searchlogic/modifiers/tan.rb +15 -0
- data/lib/searchlogic/modifiers/trim.rb +15 -0
- data/lib/searchlogic/modifiers/upper.rb +15 -0
- data/lib/searchlogic/modifiers/week.rb +11 -0
- data/lib/searchlogic/modifiers/year.rb +11 -0
- data/lib/searchlogic/search/base.rb +148 -0
- data/lib/searchlogic/search/conditions.rb +53 -0
- data/lib/searchlogic/search/ordering.rb +244 -0
- data/lib/searchlogic/search/pagination.rb +121 -0
- data/lib/searchlogic/search/protection.rb +89 -0
- data/lib/searchlogic/search/searching.rb +32 -0
- data/lib/searchlogic/shared/utilities.rb +56 -0
- data/lib/searchlogic/shared/virtual_classes.rb +39 -0
- data/lib/searchlogic/version.rb +79 -0
- data/searchlogic.gemspec +41 -0
- data/test/active_record_tests/associations_test.rb +94 -0
- data/test/active_record_tests/base_test.rb +115 -0
- data/test/condition_tests/base_test.rb +54 -0
- data/test/condition_tests/begins_with_test.rb +11 -0
- data/test/condition_tests/blank_test.rb +31 -0
- data/test/condition_tests/child_of_test.rb +17 -0
- data/test/condition_tests/descendant_of_test.rb +12 -0
- data/test/condition_tests/ends_with_test.rb +11 -0
- data/test/condition_tests/equals_test.rb +28 -0
- data/test/condition_tests/greater_than_or_equal_to_test.rb +11 -0
- data/test/condition_tests/greater_than_test.rb +11 -0
- data/test/condition_tests/inclusive_descendant_of_test.rb +12 -0
- data/test/condition_tests/keywords_test.rb +23 -0
- data/test/condition_tests/less_than_or_equal_to_test.rb +11 -0
- data/test/condition_tests/less_than_test.rb +11 -0
- data/test/condition_tests/like_test.rb +11 -0
- data/test/condition_tests/nil_test.rb +31 -0
- data/test/condition_tests/not_begin_with_test.rb +8 -0
- data/test/condition_tests/not_blank_test.rb +8 -0
- data/test/condition_tests/not_end_with_test.rb +8 -0
- data/test/condition_tests/not_equal_test.rb +19 -0
- data/test/condition_tests/not_have_keywords_test.rb +8 -0
- data/test/condition_tests/not_like_test.rb +8 -0
- data/test/condition_tests/not_nil_test.rb +13 -0
- data/test/condition_tests/sibling_of_test.rb +15 -0
- data/test/conditions_tests/any_or_all_test.rb +23 -0
- data/test/conditions_tests/base_test.rb +185 -0
- data/test/conditions_tests/groups_test.rb +68 -0
- data/test/conditions_tests/magic_methods_test.rb +36 -0
- data/test/conditions_tests/multiparameter_attributes_test.rb +15 -0
- data/test/conditions_tests/protection_test.rb +18 -0
- data/test/config_test.rb +23 -0
- data/test/fixtures/accounts.yml +12 -0
- data/test/fixtures/animals.yml +7 -0
- data/test/fixtures/orders.yml +12 -0
- data/test/fixtures/user_groups.yml +5 -0
- data/test/fixtures/users.yml +45 -0
- data/test/libs/awesome_nested_set.rb +545 -0
- data/test/libs/awesome_nested_set/compatability.rb +29 -0
- data/test/libs/awesome_nested_set/helper.rb +40 -0
- data/test/libs/awesome_nested_set/named_scope.rb +140 -0
- data/test/libs/rexml_fix.rb +14 -0
- data/test/modifier_tests/day_of_month_test.rb +16 -0
- data/test/search_tests/base_test.rb +241 -0
- data/test/search_tests/conditions_test.rb +21 -0
- data/test/search_tests/ordering_test.rb +167 -0
- data/test/search_tests/pagination_test.rb +74 -0
- data/test/search_tests/protection_test.rb +26 -0
- data/test/test_helper.rb +116 -0
- metadata +385 -0
@@ -0,0 +1,11 @@
|
|
1
|
+
module Searchlogic
|
2
|
+
module Condition
|
3
|
+
class ChildOf < NestedSet
|
4
|
+
def to_conditions(value)
|
5
|
+
parent_association = klass.reflect_on_association(:parent)
|
6
|
+
foreign_key_name = (parent_association && parent_association.options[:foreign_key]) || "parent_id"
|
7
|
+
["#{quoted_table_name}.#{quote_column_name(foreign_key_name)} = ?", (value.is_a?(klass) ? value.send(klass.primary_key) : value)]
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Searchlogic
|
2
|
+
module Condition
|
3
|
+
class DescendantOf < NestedSet
|
4
|
+
def to_conditions(value)
|
5
|
+
condition = InclusiveDescendantOf.new(klass, options)
|
6
|
+
condition.value = value
|
7
|
+
scope_condition(merge_conditions(["#{quoted_table_name}.#{quote_column_name(klass.primary_key)} != ?", (value.is_a?(klass) ? value.send(klass.primary_key) : value)], condition.sanitize))
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Searchlogic
|
2
|
+
module Condition
|
3
|
+
class EndsWith < Base
|
4
|
+
self.join_arrays_with_or = true
|
5
|
+
|
6
|
+
class << self
|
7
|
+
def condition_names_for_column
|
8
|
+
super + ["ew", "ends", "end"]
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_conditions(value)
|
13
|
+
["#{column_sql} LIKE ?", "%#{value}"]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Searchlogic
|
2
|
+
module Condition
|
3
|
+
class Equals < Base
|
4
|
+
self.handle_array_value = true
|
5
|
+
self.ignore_meaningless_value = false
|
6
|
+
|
7
|
+
class << self
|
8
|
+
def condition_names_for_column
|
9
|
+
super + ["", "is"]
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_conditions(value)
|
14
|
+
return value if value.is_a?(Array) && value.empty?
|
15
|
+
|
16
|
+
# Let ActiveRecord handle this
|
17
|
+
args = []
|
18
|
+
case value
|
19
|
+
when Range
|
20
|
+
args = [value.first, value.last]
|
21
|
+
else
|
22
|
+
args << value
|
23
|
+
end
|
24
|
+
|
25
|
+
begin
|
26
|
+
return [klass.send(:attribute_condition, column_sql, value), *args]
|
27
|
+
rescue ArgumentError
|
28
|
+
return ["#{column_sql} #{klass.send(:attribute_condition, value)}", *args] # for older versions of AR
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Searchlogic
|
2
|
+
module Condition
|
3
|
+
class GreaterThanOrEqualTo < Base
|
4
|
+
class << self
|
5
|
+
def condition_names_for_column
|
6
|
+
super + ["gte", "at_least", "least"]
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_conditions(value)
|
11
|
+
["#{column_sql} >= ?", value]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module Searchlogic
|
2
|
+
module Condition
|
3
|
+
class InclusiveDescendantOf < NestedSet
|
4
|
+
def to_conditions(value)
|
5
|
+
root = (value.is_a?(klass) ? value : klass.find(value)) rescue return
|
6
|
+
["(#{quoted_table_name}.#{quote_column_name(klass.left_column_name)} >= ? AND #{quoted_table_name}.#{quote_column_name(klass.right_column_name)} <= ?)", root.left, root.right]
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Searchlogic
|
2
|
+
module Condition
|
3
|
+
class Keywords < Base
|
4
|
+
# Because be default it joins with AND, so padding an array just gives you more options. Joining with and is no different than combining all of the words.
|
5
|
+
self.join_arrays_with_or = true
|
6
|
+
|
7
|
+
BLACKLISTED_WORDS = ('a'..'z').to_a + ["about", "an", "are", "as", "at", "be", "by", "com", "de", "en", "for", "from", "how", "in", "is", "it", "la", "of", "on", "or", "that", "the", "the", "this", "to", "und", "was", "what", "when", "where", "who", "will", "with", "www"] # from ranks.nl
|
8
|
+
ALLOWED_CHARACTERS = 'àáâãäåßéèêëìíîïñòóôõöùúûüýÿ\-_\.@'
|
9
|
+
|
10
|
+
class << self
|
11
|
+
def condition_names_for_column
|
12
|
+
super + ["kwords", "kw"]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_conditions(value)
|
17
|
+
strs = []
|
18
|
+
subs = []
|
19
|
+
|
20
|
+
search_parts = value.to_s.gsub(/,/, " ").split(/ /)
|
21
|
+
replace_non_alnum_characters!(search_parts)
|
22
|
+
search_parts.uniq!
|
23
|
+
remove_blacklisted_words!(search_parts)
|
24
|
+
return if search_parts.blank?
|
25
|
+
|
26
|
+
search_parts.each do |search_part|
|
27
|
+
strs << "#{column_sql} #{like_condition_name} ?"
|
28
|
+
subs << "%#{search_part}%"
|
29
|
+
end
|
30
|
+
|
31
|
+
[strs.join(" AND "), *subs]
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
def replace_non_alnum_characters!(search_parts)
|
36
|
+
search_parts.each do |word|
|
37
|
+
word.downcase!
|
38
|
+
word.gsub!(/[^[:alnum:]#{ALLOWED_CHARACTERS}]/, '')
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def remove_blacklisted_words!(search_parts)
|
43
|
+
search_parts.delete_if { |word| word.blank? || BLACKLISTED_WORDS.include?(word.downcase) }
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Searchlogic
|
2
|
+
module Condition
|
3
|
+
class LessThanOrEqualTo < Base
|
4
|
+
class << self
|
5
|
+
def condition_names_for_column
|
6
|
+
super + ["lte", "at_most", "most"]
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_conditions(value)
|
11
|
+
["#{column_sql} <= ?", value]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Searchlogic
|
2
|
+
module Condition
|
3
|
+
class Like < Base
|
4
|
+
class << self
|
5
|
+
def condition_names_for_column
|
6
|
+
super + ["contains", "has"]
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_conditions(value)
|
11
|
+
["#{column_sql} #{like_condition_name} ?", "%#{value}%"]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Searchlogic
|
2
|
+
module Condition
|
3
|
+
class NestedSet < Base # :nodoc:
|
4
|
+
self.join_arrays_with_or = true
|
5
|
+
|
6
|
+
class << self
|
7
|
+
def condition_names_for_column
|
8
|
+
[]
|
9
|
+
end
|
10
|
+
|
11
|
+
def condition_names_for_model
|
12
|
+
[condition_type_name]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Searchlogic
|
2
|
+
module Condition
|
3
|
+
class Nil < Base
|
4
|
+
self.value_type = :boolean
|
5
|
+
|
6
|
+
class << self
|
7
|
+
def condition_names_for_column
|
8
|
+
super + ["is_nil", "is_null", "null"]
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_conditions(value)
|
13
|
+
if value == true
|
14
|
+
"#{column_sql} IS NULL"
|
15
|
+
elsif value == false
|
16
|
+
"#{column_sql} IS NOT NULL"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Searchlogic
|
2
|
+
module Condition
|
3
|
+
class NotBeginWith < Base
|
4
|
+
class << self
|
5
|
+
def condition_names_for_column
|
6
|
+
super + ["not_bw", "not_sw", "not_start_with", "not_start", "beginning_is_not", "beginning_not"]
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_conditions(value)
|
11
|
+
begin_with = BeginsWith.new(klass, options)
|
12
|
+
begin_with.value = value
|
13
|
+
conditions = being_with.sanitize
|
14
|
+
return conditions if conditions.blank?
|
15
|
+
conditions.first.gsub!(" LIKE ", " NOT LIKE ")
|
16
|
+
conditions
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Searchlogic
|
2
|
+
module Condition
|
3
|
+
class NotBlank < Base
|
4
|
+
self.value_type = :boolean
|
5
|
+
|
6
|
+
class << self
|
7
|
+
def condition_names_for_column
|
8
|
+
super + ["is_not_blank"]
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_conditions(value)
|
13
|
+
blank = Blank.new(klass, options)
|
14
|
+
blank.value = !value
|
15
|
+
blank.sanitize
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Searchlogic
|
2
|
+
module Condition
|
3
|
+
class NotEndWith < Base
|
4
|
+
class << self
|
5
|
+
def condition_names_for_column
|
6
|
+
super + ["not_ew", "not_end", "end_is_not", "end_not"]
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_conditions(value)
|
11
|
+
ends_with = EndsWith.new(klass, options)
|
12
|
+
ends_with.value = value
|
13
|
+
conditions = ends_with.sanitize
|
14
|
+
return conditions if conditions.blank?
|
15
|
+
conditions.first.gsub!(" LIKE ", " NOT LIKE ")
|
16
|
+
conditions
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Searchlogic
|
2
|
+
module Condition
|
3
|
+
class NotEqual < Base
|
4
|
+
self.handle_array_value = true
|
5
|
+
self.ignore_meaningless_value = false
|
6
|
+
|
7
|
+
class << self
|
8
|
+
def condition_names_for_column
|
9
|
+
super + ["does_not_equal", "not_equal", "is_not", "not", "ne"]
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_conditions(value)
|
14
|
+
# Delegate to equals and then change
|
15
|
+
condition = Equals.new(klass, options)
|
16
|
+
condition.value = value
|
17
|
+
conditions_array = condition.sanitize
|
18
|
+
return conditions_array if conditions_array.blank?
|
19
|
+
conditions_array.first.gsub!(/ IS /, " IS NOT ")
|
20
|
+
conditions_array.first.gsub!(/ BETWEEN /, " NOT BETWEEN ")
|
21
|
+
conditions_array.first.gsub!(/ IN /, " NOT IN ")
|
22
|
+
conditions_array.first.gsub!(/=/, "!=")
|
23
|
+
conditions_array
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Searchlogic
|
2
|
+
module Condition
|
3
|
+
class NotHaveKeywords < Base
|
4
|
+
class << self
|
5
|
+
def condition_names_for_column
|
6
|
+
super + ["not_have_keywords", "not_keywords", "not_have_kw", "not_kw", "not_have_kwwords", "not_kwwords"]
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_conditions(value)
|
11
|
+
keywords = Keywords.new(klass, options)
|
12
|
+
keywords.value = value
|
13
|
+
conditions = keywords.sanitize
|
14
|
+
return conditions if conditions.blank?
|
15
|
+
conditions.first.gsub!(" #{like_condition_name} ", " NOT #{like_condition_name} ")
|
16
|
+
conditions
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Searchlogic
|
2
|
+
module Condition
|
3
|
+
class NotLike < Base
|
4
|
+
class << self
|
5
|
+
def condition_names_for_column
|
6
|
+
super + ["not_contain", "not_have"]
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_conditions(value)
|
11
|
+
like = Like.new(klass, options)
|
12
|
+
like.value = value
|
13
|
+
conditions = like.sanitize
|
14
|
+
return conditions if conditions.blank?
|
15
|
+
conditions.first.gsub!(" #{like_condition_name} ", " NOT #{like_condition_name} ")
|
16
|
+
conditions
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Searchlogic
|
2
|
+
module Condition
|
3
|
+
class NotNil < Base
|
4
|
+
self.value_type = :boolean
|
5
|
+
|
6
|
+
class << self
|
7
|
+
def condition_names_for_column
|
8
|
+
super + ["is_not_nil", "is_not_null", "not_null"]
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_conditions(value)
|
13
|
+
is_nil = Nil.new(klass, options)
|
14
|
+
is_nil.value = !value
|
15
|
+
is_nil.sanitize
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Searchlogic
|
2
|
+
module Condition
|
3
|
+
class SiblingOf < NestedSet
|
4
|
+
def to_conditions(value)
|
5
|
+
parent_association = klass.reflect_on_association(:parent)
|
6
|
+
foreign_key_name = (parent_association && parent_association.options[:foreign_key]) || "parent_id"
|
7
|
+
parent_id = (value.is_a?(klass) ? value : klass.find(value)).send(foreign_key_name)
|
8
|
+
condition = ChildOf.new(klass, options)
|
9
|
+
condition.value = parent_id
|
10
|
+
merge_conditions(["#{quoted_table_name}.#{quote_column_name(klass.primary_key)} != ?", (value.is_a?(klass) ? value.send(klass.primary_key) : value)], condition.sanitize)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Searchlogic
|
2
|
+
module Conditions
|
3
|
+
# = Any or All
|
4
|
+
#
|
5
|
+
# Adds the ability to join all conditions wth "AND" or "OR".
|
6
|
+
module AnyOrAll
|
7
|
+
# Determines if we should join the conditions with "AND" or "OR".
|
8
|
+
#
|
9
|
+
# === Examples
|
10
|
+
#
|
11
|
+
# search.conditions.any = true # will join all conditions with "or", you can also set this to "true", "1", or "yes"
|
12
|
+
# search.conditions.any = false # will join all conditions with "and"
|
13
|
+
def any=(value)
|
14
|
+
(association_objects + group_objects).each { |object| object.any = value }
|
15
|
+
@any = value
|
16
|
+
end
|
17
|
+
|
18
|
+
def any # :nodoc:
|
19
|
+
@any
|
20
|
+
end
|
21
|
+
|
22
|
+
# Convenience method for determining if we should join the conditions with "AND" or "OR".
|
23
|
+
def any?
|
24
|
+
["true", "1", "yes"].include? @any.to_s
|
25
|
+
end
|
26
|
+
|
27
|
+
# Sets the conditions to be searched by "or"
|
28
|
+
def any!
|
29
|
+
self.any = true
|
30
|
+
end
|
31
|
+
|
32
|
+
def all? # :nodoc:
|
33
|
+
!any?
|
34
|
+
end
|
35
|
+
|
36
|
+
# Sets the conditions to be searched by "and"
|
37
|
+
def all!
|
38
|
+
self.any = false
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|