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
+ require File.dirname(__FILE__) + '/../test_helper.rb'
2
+
3
+ module ConditionTests
4
+ class LessThanOrEqualToTest < ActiveSupport::TestCase
5
+ def test_sanitize
6
+ condition = Searchlogic::Condition::LessThanOrEqualTo.new(Account, :column => Account.columns_hash["id"])
7
+ condition.value = 2
8
+ assert_equal ["\"accounts\".\"id\" <= ?", 2], condition.sanitize
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ require File.dirname(__FILE__) + '/../test_helper.rb'
2
+
3
+ module ConditionTests
4
+ class LessThanTest < ActiveSupport::TestCase
5
+ def test_sanitize
6
+ condition = Searchlogic::Condition::LessThan.new(Account, :column => Account.columns_hash["id"])
7
+ condition.value = 2
8
+ assert_equal ["\"accounts\".\"id\" < ?", 2], condition.sanitize
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ require File.dirname(__FILE__) + '/../test_helper.rb'
2
+
3
+ module ConditionTests
4
+ class LikeTest < ActiveSupport::TestCase
5
+ def test_sanitize
6
+ condition = Searchlogic::Condition::Like.new(Account, :column => Account.columns_hash["name"])
7
+ condition.value = "Binary and blah"
8
+ assert_equal ["\"accounts\".\"name\" LIKE ?", "%Binary and blah%"], condition.sanitize
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,31 @@
1
+ require File.dirname(__FILE__) + '/../test_helper.rb'
2
+
3
+ module ConditionTests
4
+ class NilTest < ActiveSupport::TestCase
5
+ def test_sanitize
6
+ condition = Searchlogic::Condition::Nil.new(Account, :column => Account.columns_hash["id"])
7
+ condition.value = true
8
+ assert_equal "\"accounts\".\"id\" IS NULL", condition.sanitize
9
+
10
+ condition = Searchlogic::Condition::Nil.new(Account, :column => Account.columns_hash["id"])
11
+ condition.value = false
12
+ assert_equal "\"accounts\".\"id\" IS NOT NULL", condition.sanitize
13
+
14
+ condition = Searchlogic::Condition::Nil.new(Account, :column => Account.columns_hash["id"])
15
+ condition.value = "true"
16
+ assert_equal "\"accounts\".\"id\" IS NULL", condition.sanitize
17
+
18
+ condition = Searchlogic::Condition::Nil.new(Account, :column => Account.columns_hash["id"])
19
+ condition.value = "false"
20
+ assert_equal "\"accounts\".\"id\" IS NOT NULL", condition.sanitize
21
+
22
+ condition = Searchlogic::Condition::Nil.new(Account, :column => Account.columns_hash["id"])
23
+ condition.value = nil
24
+ assert_nil condition.sanitize
25
+
26
+ condition = Searchlogic::Condition::Nil.new(Account, :column => Account.columns_hash["id"])
27
+ condition.value = ""
28
+ assert_nil condition.sanitize
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,8 @@
1
+ require File.dirname(__FILE__) + '/../test_helper.rb'
2
+
3
+ module ConditionTests
4
+ class NotBeginWithTest < ActiveSupport::TestCase
5
+ def test_sanitize
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ require File.dirname(__FILE__) + '/../test_helper.rb'
2
+
3
+ module ConditionTests
4
+ class NotBlankTest < ActiveSupport::TestCase
5
+ def test_sanitize
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ require File.dirname(__FILE__) + '/../test_helper.rb'
2
+
3
+ module ConditionTests
4
+ class NotEndWithTest < ActiveSupport::TestCase
5
+ def test_sanitize
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,19 @@
1
+ require File.dirname(__FILE__) + '/../test_helper.rb'
2
+
3
+ module ConditionTests
4
+ class NotEqualTest < ActiveSupport::TestCase
5
+ def test_sanitize
6
+ condition = Searchlogic::Condition::NotEqual.new(Account, :column => Account.columns_hash["id"])
7
+ condition.value = 12
8
+ assert_equal ["\"accounts\".\"id\" != ?", 12], condition.sanitize
9
+
10
+ condition = Searchlogic::Condition::NotEqual.new(Account, :column => Account.columns_hash["id"])
11
+ condition.value = [1,2,3,4]
12
+ assert_equal ["\"accounts\".\"id\" NOT IN (?)", [1, 2, 3, 4]], condition.sanitize
13
+
14
+ condition = Searchlogic::Condition::NotEqual.new(Account, :column => Account.columns_hash["id"])
15
+ condition.value = (1..10)
16
+ assert_equal ["\"accounts\".\"id\" NOT BETWEEN ? AND ?", 1, 10], condition.sanitize
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,8 @@
1
+ require File.dirname(__FILE__) + '/../test_helper.rb'
2
+
3
+ module ConditionTests
4
+ class NotHaveKeywordsTest < ActiveSupport::TestCase
5
+ def test_sanitize
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ require File.dirname(__FILE__) + '/../test_helper.rb'
2
+
3
+ module ConditionTests
4
+ class NotLikeTest < ActiveSupport::TestCase
5
+ def test_sanitize
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,13 @@
1
+ require File.dirname(__FILE__) + '/../test_helper.rb'
2
+
3
+ module ConditionTests
4
+ class NotNilTest < ActiveSupport::TestCase
5
+ def test_sanitize
6
+ condition = Searchlogic::Condition::NotNil.new(Account, :column => Account.columns_hash["created_at"])
7
+ condition.value = "1"
8
+ assert_equal "\"accounts\".\"created_at\" IS NOT NULL", condition.sanitize
9
+ condition.value = "false"
10
+ assert_equal "\"accounts\".\"created_at\" IS NULL", condition.sanitize
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ require File.dirname(__FILE__) + '/../test_helper.rb'
2
+
3
+ module ConditionTests
4
+ class SiblingOfTest < ActiveSupport::TestCase
5
+ def test_sanitize
6
+ ben = users(:ben)
7
+ drew = users(:drew)
8
+ jennifer = users(:jennifer)
9
+
10
+ condition = Searchlogic::Condition::SiblingOf.new(User)
11
+ condition.value = drew
12
+ assert_equal ["\"users\".\"id\" != ? AND \"users\".\"parent_id\" = ?", drew.id, ben.id], condition.sanitize
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,23 @@
1
+ require File.dirname(__FILE__) + '/../test_helper.rb'
2
+
3
+ module ConditionsTests
4
+ class AnyOrAllTest < ActiveSupport::TestCase
5
+ def test_any
6
+ conditions = Searchlogic::Cache::AccountConditions.new
7
+ assert !conditions.any?
8
+ conditions = Searchlogic::Cache::AccountConditions.new(:any => true)
9
+ assert conditions.any?
10
+ conditions.any = "false"
11
+ assert !conditions.any?
12
+ conditions = Searchlogic::Cache::AccountConditions.new
13
+ conditions.name_contains = "Binary"
14
+ assert_equal ["\"accounts\".\"name\" LIKE ?", "%Binary%"], conditions.sanitize
15
+ conditions.id = 1
16
+ assert_equal ["\"accounts\".\"name\" LIKE ? AND \"accounts\".\"id\" = ?", "%Binary%", 1], conditions.sanitize
17
+ conditions.any = true
18
+ assert_equal ["\"accounts\".\"name\" LIKE ? OR \"accounts\".\"id\" = ?", "%Binary%", 1], conditions.sanitize
19
+ conditions.any = false
20
+ assert_equal ["\"accounts\".\"name\" LIKE ? AND \"accounts\".\"id\" = ?", "%Binary%", 1], conditions.sanitize
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,185 @@
1
+ require File.dirname(__FILE__) + '/../test_helper.rb'
2
+
3
+ module ConditionsTests
4
+ class BaseTest < ActiveSupport::TestCase
5
+ def test_register_condition
6
+ Searchlogic::Conditions::Base.register_condition(Searchlogic::Condition::Keywords)
7
+ assert [Searchlogic::Condition::Keywords], Searchlogic::Conditions::Base.conditions
8
+
9
+ Searchlogic::Conditions::Base.register_condition(Searchlogic::Condition::Like)
10
+ assert [Searchlogic::Condition::Keywords, Searchlogic::Condition::Like], Searchlogic::Conditions::Base.conditions
11
+ end
12
+
13
+ def test_register_modifier
14
+ Searchlogic::Conditions::Base.register_modifier(Searchlogic::Modifiers::Absolute)
15
+ assert [Searchlogic::Modifiers::Absolute], Searchlogic::Conditions::Base.modifiers
16
+
17
+ Searchlogic::Conditions::Base.register_modifier(Searchlogic::Modifiers::Cos)
18
+ assert [Searchlogic::Modifiers::Absolute, Searchlogic::Modifiers::Cos], Searchlogic::Conditions::Base.modifiers
19
+ end
20
+
21
+ def test_needed
22
+ assert (not Searchlogic::Conditions::Base.needed?(User, {}))
23
+ assert (not Searchlogic::Conditions::Base.needed?(User, {:first_name => "Ben"}))
24
+ assert Searchlogic::Conditions::Base.needed?(User, {:first_name_contains => "Awesome"})
25
+ assert (not Searchlogic::Conditions::Base.needed?(User, {"orders.id" => 2}))
26
+ end
27
+
28
+ def test_initialize
29
+ conditions = Searchlogic::Cache::AccountConditions.new(:name_contains => "Binary")
30
+ assert_equal conditions.klass, Account
31
+ assert_equal conditions.name_contains, "Binary"
32
+ end
33
+
34
+ def test_auto_joins
35
+ conditions = Searchlogic::Cache::AccountConditions.new
36
+ assert_equal conditions.auto_joins, nil
37
+
38
+ conditions.name_like = "Binary"
39
+ assert_equal conditions.auto_joins, nil
40
+
41
+ conditions.users.first_name_like = "Ben"
42
+ assert_equal conditions.auto_joins, :users
43
+
44
+ conditions.users.orders.description_like = "apple"
45
+ assert_equal conditions.auto_joins, {:users => :orders}
46
+ end
47
+
48
+ def test_inspect
49
+ conditions = Searchlogic::Cache::AccountConditions.new
50
+ assert_nothing_raised { conditions.inspect }
51
+ end
52
+
53
+ def test_sanitize
54
+ conditions = Searchlogic::Cache::AccountConditions.new
55
+ conditions.name_contains = "Binary"
56
+ conditions.id_gt = 5
57
+ now = Time.now
58
+ conditions.created_after = now
59
+ assert_equal ["\"accounts\".\"name\" LIKE ? AND \"accounts\".\"id\" > ? AND \"accounts\".\"created_at\" > ?", "%Binary%", 5, now], conditions.sanitize
60
+
61
+ # test out associations
62
+ conditions.users.first_name_like = "Ben"
63
+ conditions.users.id_gt = 10
64
+ conditions.users.orders.total_lt = 500
65
+ assert_equal ["\"accounts\".\"name\" LIKE ? AND \"accounts\".\"id\" > ? AND \"accounts\".\"created_at\" > ? AND \"users\".\"first_name\" LIKE ? AND \"users\".\"id\" > ? AND \"orders\".\"total\" < ?", "%Binary%", 5, now, "%Ben%", 10, 500], conditions.sanitize
66
+
67
+ # test that raw sql is returned
68
+ conditions.conditions = "awesome"
69
+ assert_equal "awesome", conditions.sanitize
70
+ end
71
+
72
+ def test_sanitize_with_and_or_any
73
+ conditions = Searchlogic::Cache::AccountConditions.new
74
+ conditions.name_contains = "Binary"
75
+ conditions.or_id_gt = 5
76
+ assert conditions.id_gt_object.explicit_any?
77
+ assert_equal ["\"accounts\".\"name\" LIKE ? OR \"accounts\".\"id\" > ?", "%Binary%", 5], conditions.sanitize
78
+ now = Time.now
79
+ conditions.created_at_after = now
80
+ assert_equal ["\"accounts\".\"name\" LIKE ? OR \"accounts\".\"id\" > ? AND \"accounts\".\"created_at\" > ?", "%Binary%", 5, now], conditions.sanitize
81
+ end
82
+
83
+ def test_conditions
84
+ conditions = Searchlogic::Cache::AccountConditions.new
85
+ now = Time.now
86
+ v = {:name_like => "Binary", :created_at_greater_than => now}
87
+ conditions.conditions = v
88
+ assert_equal v, conditions.conditions
89
+
90
+ sql = "id in (1,2,3,4)"
91
+ conditions.conditions = sql
92
+ assert_equal sql, conditions.conditions
93
+ assert_equal [], conditions.send(:objects)
94
+
95
+ v2 = {:id_less_than => 5, :name_begins_with => "Beginning of string"}
96
+ conditions.conditions = v2
97
+ assert_equal v2, conditions.conditions
98
+
99
+ v = {:name_like => "Binary", :created_at_greater_than => now}
100
+ conditions.conditions = v
101
+ assert_equal v2.merge(v), conditions.conditions
102
+
103
+ sql2 = "id > 5 and name = 'Test'"
104
+ conditions.conditions = sql2
105
+ assert_equal sql2, conditions.conditions
106
+ assert_equal [], conditions.send(:objects)
107
+
108
+ conditions.name_contains = "awesome"
109
+ assert_equal({:name_like => "awesome"}, conditions.conditions)
110
+
111
+ now = Time.now
112
+ conditions.conditions = {:id_gt => "", :id => "", :name => ["", "", ""], :created_at => ["", now], :name_starts_with => "Ben"}
113
+ assert_equal({:name_like => "awesome", :name_begins_with => "Ben", :created_at_equals => now}, conditions.conditions)
114
+ end
115
+
116
+ def test_conditions_with_protected_assignments
117
+ Account.conditions_accessible << :name_contains
118
+ conditions = Searchlogic::Cache::AccountConditions.new
119
+ conditions.conditions = {:created_after => Time.now, :name_contains => "Binary"}
120
+ assert({:name_contains => "Binary"}, conditions.conditions)
121
+ Account.send(:write_inheritable_attribute, :conditions_accessible, nil)
122
+
123
+ Account.conditions_protected << :name_contains
124
+ conditions = Searchlogic::Cache::AccountConditions.new
125
+ now = Time.now
126
+ conditions.conditions = {:created_after => now, :name_contains => "Binary"}
127
+ assert({:created_after => now}, conditions.conditions)
128
+ Account.send(:write_inheritable_attribute, :conditions_protected, nil)
129
+ end
130
+
131
+ def test_conditions_unknown
132
+ conditions = Searchlogic::Cache::UserConditions.new
133
+ assert_raise(NoMethodError) { conditions.conditions = {:unknown => "blah"} }
134
+ assert_nothing_raised { conditions.conditions = {:first_name => "blah"} }
135
+ assert_nothing_raised { conditions.conditions = {:first_name_contains => "blah"} }
136
+ end
137
+
138
+ def test_setting_associations
139
+ conditions = Searchlogic::Cache::AccountConditions.new(:users => {:first_name_like => "Ben"})
140
+ assert_equal conditions.users.first_name_like, "Ben"
141
+
142
+ conditions.users.last_name_begins_with = "Ben"
143
+ assert_equal conditions.users.last_name_begins_with, "Ben"
144
+ end
145
+
146
+ def test_reset
147
+ conditions = Searchlogic::Cache::AccountConditions.new
148
+
149
+ conditions.name_contains = "Binary"
150
+ assert_equal 1, conditions.send(:objects).size
151
+
152
+ conditions.reset_name_like!
153
+ conditions.reset_name_contains! # should set up aliases for reset
154
+ assert_equal [], conditions.send(:objects)
155
+
156
+ conditions.users.first_name_like = "Ben"
157
+ assert_equal 1, conditions.send(:objects).size
158
+
159
+ conditions.reset_users!
160
+ assert_equal [], conditions.send(:objects)
161
+
162
+ conditions.name_begins_with ="Binary"
163
+ conditions.users.orders.total_gt = 200
164
+ assert_equal 2, conditions.send(:objects).size
165
+
166
+ conditions.reset_name_begins_with!
167
+ assert_equal 1, conditions.send(:objects).size
168
+
169
+ conditions.reset_users!
170
+ assert_equal [], conditions.send(:objects)
171
+
172
+ conditions.name_begins_with ="Binary"
173
+ assert_equal 1, conditions.send(:objects).size
174
+ conditions.reset!
175
+ assert_equal [], conditions.send(:objects)
176
+ end
177
+
178
+ def test_join_with_or_with_association
179
+ conditions = Searchlogic::Cache::AccountConditions.new
180
+ conditions.name_ends_with = "Binary"
181
+ conditions.users.or_first_name_like = "whatever"
182
+ assert_equal ["\"accounts\".\"name\" LIKE ? OR \"users\".\"first_name\" LIKE ?", "%Binary", "%whatever%"], conditions.sanitize
183
+ end
184
+ end
185
+ end
@@ -0,0 +1,68 @@
1
+ require File.dirname(__FILE__) + '/../test_helper.rb'
2
+
3
+ module ConditionsTests
4
+ class GroupsTest < ActiveSupport::TestCase
5
+ def test_group_object
6
+ conditions = Searchlogic::Cache::AccountConditions.new
7
+ conditions.id_gt = 3
8
+ group1 = conditions.group
9
+ group1.name_like = "Binary"
10
+ group2 = conditions.group
11
+ group2.id_gt = 5
12
+ group21 = group2.group
13
+ group21.id_lt = 20
14
+ now = Time.now
15
+ group21.created_at_after = now
16
+ assert_equal ["\"accounts\".\"id\" > ? AND (\"accounts\".\"name\" LIKE ?) AND (\"accounts\".\"id\" > ? AND (\"accounts\".\"id\" < ? AND \"accounts\".\"created_at\" > ?))", 3, "%Binary%", 5, 20, now], conditions.sanitize
17
+ end
18
+
19
+ def test_group_block
20
+ conditions = Searchlogic::Cache::AccountConditions.new
21
+ conditions.id_gt = 3
22
+ conditions.group do |group1|
23
+ group1.name_like = "Binary"
24
+ end
25
+ now = Time.now
26
+ conditions.group do |group2|
27
+ group2.id_gt = 5
28
+ group2.group do |group21|
29
+ group21.id_lt = 20
30
+ group21.created_at_after = now
31
+ end
32
+ end
33
+ assert_equal ["\"accounts\".\"id\" > ? AND (\"accounts\".\"name\" LIKE ?) AND (\"accounts\".\"id\" > ? AND (\"accounts\".\"id\" < ? AND \"accounts\".\"created_at\" > ?))", 3, "%Binary%", 5, 20, now], conditions.sanitize
34
+ end
35
+
36
+ def test_group_hash
37
+ now = Time.now
38
+ conditions = Searchlogic::Cache::AccountConditions.new([
39
+ {:id_gt => 3},
40
+ {:group => {:name_like => "Binary"}},
41
+ {:group => [
42
+ {:id_gt => 5},
43
+ {:group => [
44
+ {:id_lt => 20},
45
+ {:created_at_after => now}
46
+ ]}
47
+ ]}
48
+ ])
49
+ assert_equal ["\"accounts\".\"id\" > ? AND (\"accounts\".\"name\" LIKE ?) AND (\"accounts\".\"id\" > ? AND (\"accounts\".\"id\" < ? AND \"accounts\".\"created_at\" > ?))", 3, "%Binary%", 5, 20, now], conditions.sanitize
50
+ end
51
+
52
+ def test_auto_joins
53
+ conditions = Searchlogic::Cache::AccountConditions.new
54
+ conditions.group do |g|
55
+ g.users.first_name_like = "Ben"
56
+ end
57
+ assert_equal :users, conditions.auto_joins
58
+
59
+ search = Searchlogic::Cache::AccountSearch.new
60
+ search.conditions.users.first_name_like = "Ben"
61
+ search.conditions.group do |g|
62
+ g.users.orders.id_gt = 5
63
+ end
64
+ assert_equal [:users, {:users => :orders}], search.conditions.auto_joins
65
+ assert_nothing_raised { search.all }
66
+ end
67
+ end
68
+ end