schof-searchlogic 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (159) hide show
  1. data/CHANGELOG.rdoc +302 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Manifest +157 -0
  4. data/README.rdoc +461 -0
  5. data/Rakefile +13 -0
  6. data/TODO.rdoc +4 -0
  7. data/init.rb +1 -0
  8. data/lib/searchlogic.rb +100 -0
  9. data/lib/searchlogic/active_record/associations.rb +52 -0
  10. data/lib/searchlogic/active_record/base.rb +224 -0
  11. data/lib/searchlogic/active_record/connection_adapters/mysql_adapter.rb +176 -0
  12. data/lib/searchlogic/active_record/connection_adapters/postgresql_adapter.rb +172 -0
  13. data/lib/searchlogic/active_record/connection_adapters/sqlite_adapter.rb +80 -0
  14. data/lib/searchlogic/condition/base.rb +165 -0
  15. data/lib/searchlogic/condition/begins_with.rb +17 -0
  16. data/lib/searchlogic/condition/blank.rb +21 -0
  17. data/lib/searchlogic/condition/child_of.rb +11 -0
  18. data/lib/searchlogic/condition/descendant_of.rb +11 -0
  19. data/lib/searchlogic/condition/ends_with.rb +17 -0
  20. data/lib/searchlogic/condition/equals.rb +33 -0
  21. data/lib/searchlogic/condition/greater_than.rb +15 -0
  22. data/lib/searchlogic/condition/greater_than_or_equal_to.rb +15 -0
  23. data/lib/searchlogic/condition/inclusive_descendant_of.rb +10 -0
  24. data/lib/searchlogic/condition/keywords.rb +47 -0
  25. data/lib/searchlogic/condition/less_than.rb +15 -0
  26. data/lib/searchlogic/condition/less_than_or_equal_to.rb +15 -0
  27. data/lib/searchlogic/condition/like.rb +15 -0
  28. data/lib/searchlogic/condition/nested_set.rb +17 -0
  29. data/lib/searchlogic/condition/nil.rb +21 -0
  30. data/lib/searchlogic/condition/not_begin_with.rb +20 -0
  31. data/lib/searchlogic/condition/not_blank.rb +19 -0
  32. data/lib/searchlogic/condition/not_end_with.rb +20 -0
  33. data/lib/searchlogic/condition/not_equal.rb +27 -0
  34. data/lib/searchlogic/condition/not_have_keywords.rb +20 -0
  35. data/lib/searchlogic/condition/not_like.rb +20 -0
  36. data/lib/searchlogic/condition/not_nil.rb +19 -0
  37. data/lib/searchlogic/condition/sibling_of.rb +14 -0
  38. data/lib/searchlogic/conditions/any_or_all.rb +42 -0
  39. data/lib/searchlogic/conditions/base.rb +244 -0
  40. data/lib/searchlogic/conditions/groups.rb +74 -0
  41. data/lib/searchlogic/conditions/magic_methods.rb +286 -0
  42. data/lib/searchlogic/conditions/multiparameter_attributes.rb +105 -0
  43. data/lib/searchlogic/conditions/protection.rb +36 -0
  44. data/lib/searchlogic/config.rb +31 -0
  45. data/lib/searchlogic/config/helpers.rb +338 -0
  46. data/lib/searchlogic/config/search.rb +53 -0
  47. data/lib/searchlogic/core_ext/hash.rb +75 -0
  48. data/lib/searchlogic/core_ext/object.rb +19 -0
  49. data/lib/searchlogic/helpers/control_types/link.rb +310 -0
  50. data/lib/searchlogic/helpers/control_types/links.rb +242 -0
  51. data/lib/searchlogic/helpers/control_types/remote_link.rb +87 -0
  52. data/lib/searchlogic/helpers/control_types/remote_links.rb +72 -0
  53. data/lib/searchlogic/helpers/control_types/remote_select.rb +36 -0
  54. data/lib/searchlogic/helpers/control_types/select.rb +82 -0
  55. data/lib/searchlogic/helpers/form.rb +208 -0
  56. data/lib/searchlogic/helpers/utilities.rb +197 -0
  57. data/lib/searchlogic/modifiers/absolute.rb +15 -0
  58. data/lib/searchlogic/modifiers/acos.rb +11 -0
  59. data/lib/searchlogic/modifiers/asin.rb +11 -0
  60. data/lib/searchlogic/modifiers/atan.rb +11 -0
  61. data/lib/searchlogic/modifiers/avg.rb +15 -0
  62. data/lib/searchlogic/modifiers/base.rb +27 -0
  63. data/lib/searchlogic/modifiers/ceil.rb +15 -0
  64. data/lib/searchlogic/modifiers/char_length.rb +15 -0
  65. data/lib/searchlogic/modifiers/cos.rb +15 -0
  66. data/lib/searchlogic/modifiers/cot.rb +15 -0
  67. data/lib/searchlogic/modifiers/count.rb +11 -0
  68. data/lib/searchlogic/modifiers/day_of_month.rb +15 -0
  69. data/lib/searchlogic/modifiers/day_of_week.rb +15 -0
  70. data/lib/searchlogic/modifiers/day_of_year.rb +15 -0
  71. data/lib/searchlogic/modifiers/degrees.rb +11 -0
  72. data/lib/searchlogic/modifiers/exp.rb +15 -0
  73. data/lib/searchlogic/modifiers/floor.rb +15 -0
  74. data/lib/searchlogic/modifiers/hex.rb +11 -0
  75. data/lib/searchlogic/modifiers/hour.rb +11 -0
  76. data/lib/searchlogic/modifiers/log.rb +15 -0
  77. data/lib/searchlogic/modifiers/log10.rb +11 -0
  78. data/lib/searchlogic/modifiers/log2.rb +11 -0
  79. data/lib/searchlogic/modifiers/lower.rb +15 -0
  80. data/lib/searchlogic/modifiers/ltrim.rb +15 -0
  81. data/lib/searchlogic/modifiers/md5.rb +11 -0
  82. data/lib/searchlogic/modifiers/microseconds.rb +11 -0
  83. data/lib/searchlogic/modifiers/milliseconds.rb +11 -0
  84. data/lib/searchlogic/modifiers/minute.rb +15 -0
  85. data/lib/searchlogic/modifiers/month.rb +15 -0
  86. data/lib/searchlogic/modifiers/octal.rb +15 -0
  87. data/lib/searchlogic/modifiers/radians.rb +11 -0
  88. data/lib/searchlogic/modifiers/round.rb +11 -0
  89. data/lib/searchlogic/modifiers/rtrim.rb +15 -0
  90. data/lib/searchlogic/modifiers/second.rb +15 -0
  91. data/lib/searchlogic/modifiers/sign.rb +11 -0
  92. data/lib/searchlogic/modifiers/sin.rb +11 -0
  93. data/lib/searchlogic/modifiers/square_root.rb +15 -0
  94. data/lib/searchlogic/modifiers/sum.rb +11 -0
  95. data/lib/searchlogic/modifiers/tan.rb +15 -0
  96. data/lib/searchlogic/modifiers/trim.rb +15 -0
  97. data/lib/searchlogic/modifiers/upper.rb +15 -0
  98. data/lib/searchlogic/modifiers/week.rb +11 -0
  99. data/lib/searchlogic/modifiers/year.rb +11 -0
  100. data/lib/searchlogic/search/base.rb +148 -0
  101. data/lib/searchlogic/search/conditions.rb +53 -0
  102. data/lib/searchlogic/search/ordering.rb +244 -0
  103. data/lib/searchlogic/search/pagination.rb +121 -0
  104. data/lib/searchlogic/search/protection.rb +89 -0
  105. data/lib/searchlogic/search/searching.rb +32 -0
  106. data/lib/searchlogic/shared/utilities.rb +56 -0
  107. data/lib/searchlogic/shared/virtual_classes.rb +39 -0
  108. data/lib/searchlogic/version.rb +79 -0
  109. data/searchlogic.gemspec +41 -0
  110. data/test/active_record_tests/associations_test.rb +94 -0
  111. data/test/active_record_tests/base_test.rb +115 -0
  112. data/test/condition_tests/base_test.rb +54 -0
  113. data/test/condition_tests/begins_with_test.rb +11 -0
  114. data/test/condition_tests/blank_test.rb +31 -0
  115. data/test/condition_tests/child_of_test.rb +17 -0
  116. data/test/condition_tests/descendant_of_test.rb +12 -0
  117. data/test/condition_tests/ends_with_test.rb +11 -0
  118. data/test/condition_tests/equals_test.rb +28 -0
  119. data/test/condition_tests/greater_than_or_equal_to_test.rb +11 -0
  120. data/test/condition_tests/greater_than_test.rb +11 -0
  121. data/test/condition_tests/inclusive_descendant_of_test.rb +12 -0
  122. data/test/condition_tests/keywords_test.rb +23 -0
  123. data/test/condition_tests/less_than_or_equal_to_test.rb +11 -0
  124. data/test/condition_tests/less_than_test.rb +11 -0
  125. data/test/condition_tests/like_test.rb +11 -0
  126. data/test/condition_tests/nil_test.rb +31 -0
  127. data/test/condition_tests/not_begin_with_test.rb +8 -0
  128. data/test/condition_tests/not_blank_test.rb +8 -0
  129. data/test/condition_tests/not_end_with_test.rb +8 -0
  130. data/test/condition_tests/not_equal_test.rb +19 -0
  131. data/test/condition_tests/not_have_keywords_test.rb +8 -0
  132. data/test/condition_tests/not_like_test.rb +8 -0
  133. data/test/condition_tests/not_nil_test.rb +13 -0
  134. data/test/condition_tests/sibling_of_test.rb +15 -0
  135. data/test/conditions_tests/any_or_all_test.rb +23 -0
  136. data/test/conditions_tests/base_test.rb +185 -0
  137. data/test/conditions_tests/groups_test.rb +68 -0
  138. data/test/conditions_tests/magic_methods_test.rb +36 -0
  139. data/test/conditions_tests/multiparameter_attributes_test.rb +15 -0
  140. data/test/conditions_tests/protection_test.rb +18 -0
  141. data/test/config_test.rb +23 -0
  142. data/test/fixtures/accounts.yml +12 -0
  143. data/test/fixtures/animals.yml +7 -0
  144. data/test/fixtures/orders.yml +12 -0
  145. data/test/fixtures/user_groups.yml +5 -0
  146. data/test/fixtures/users.yml +45 -0
  147. data/test/libs/awesome_nested_set.rb +545 -0
  148. data/test/libs/awesome_nested_set/compatability.rb +29 -0
  149. data/test/libs/awesome_nested_set/helper.rb +40 -0
  150. data/test/libs/awesome_nested_set/named_scope.rb +140 -0
  151. data/test/libs/rexml_fix.rb +14 -0
  152. data/test/modifier_tests/day_of_month_test.rb +16 -0
  153. data/test/search_tests/base_test.rb +241 -0
  154. data/test/search_tests/conditions_test.rb +21 -0
  155. data/test/search_tests/ordering_test.rb +167 -0
  156. data/test/search_tests/pagination_test.rb +74 -0
  157. data/test/search_tests/protection_test.rb +26 -0
  158. data/test/test_helper.rb +116 -0
  159. 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 GreaterThan < Base
4
+ class << self
5
+ def condition_names_for_column
6
+ super + ["gt", "after"]
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 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 LessThan < Base
4
+ class << self
5
+ def condition_names_for_column
6
+ super + ["lt", "before"]
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 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