searchlogic 1.5.3 → 1.5.4
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 +6 -0
- data/Manifest +37 -18
- data/README.rdoc +13 -17
- data/TODO.rdoc +1 -3
- data/lib/searchlogic.rb +6 -6
- data/lib/searchlogic/active_record/connection_adapters/sqlite_adapter.rb +9 -9
- data/lib/searchlogic/conditions/base.rb +20 -6
- data/lib/searchlogic/search/base.rb +0 -5
- data/lib/searchlogic/search/searching.rb +3 -1
- data/lib/searchlogic/version.rb +1 -1
- data/searchlogic.gemspec +4 -4
- data/test/active_record_tests/associations_test.rb +95 -0
- data/test/active_record_tests/base_test.rb +108 -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 +16 -0
- data/test/condition_tests/ends_with_test.rb +11 -0
- data/test/condition_tests/equals_test.rb +19 -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 +16 -0
- data/test/condition_tests/keyswords_test.rb +19 -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/base_test.rb +221 -0
- data/test/conditions_tests/protection_test.rb +18 -0
- data/test/{test_config.rb → config_test.rb} +1 -1
- data/test/fixtures/accounts.yml +0 -3
- data/test/fixtures/animals.yml +7 -0
- data/test/fixtures/orders.yml +2 -4
- data/test/fixtures/user_groups.yml +3 -9
- data/test/fixtures/users.yml +6 -12
- data/{test_libs → test/libs}/acts_as_tree.rb +0 -0
- data/{test_libs → test/libs}/rexml_fix.rb +0 -0
- data/test/modifier_tests/day_of_month_test.rb +16 -0
- data/test/search_tests/base_test.rb +237 -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 +79 -83
- metadata +73 -32
- data/examples/README.rdoc +0 -4
- data/test/fixtures/cats.yml +0 -3
- data/test/fixtures/dogs.yml +0 -3
- data/test/test_active_record_associations.rb +0 -81
- data/test/test_active_record_base.rb +0 -93
- data/test/test_condition_base.rb +0 -52
- data/test/test_condition_types.rb +0 -143
- data/test/test_conditions_base.rb +0 -242
- data/test/test_conditions_protection.rb +0 -16
- data/test/test_search_base.rb +0 -227
- data/test/test_search_conditions.rb +0 -19
- data/test/test_search_ordering.rb +0 -165
- data/test/test_search_pagination.rb +0 -72
- data/test/test_search_protection.rb +0 -24
- data/test_libs/ordered_hash.rb +0 -9
@@ -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,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,221 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper.rb'
|
2
|
+
|
3
|
+
module ConditionsTests
|
4
|
+
class BaseTest < ActiveSupport::TestCase
|
5
|
+
def test_register_conditions
|
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_association_names
|
14
|
+
["dogs", "children", "user_groups", "orders", "account", "parent", "cats"].each do |name|
|
15
|
+
assert Searchlogic::Cache::UserConditions.association_names.include? name
|
16
|
+
end
|
17
|
+
["admin", "orders", "users"].each do |name|
|
18
|
+
Searchlogic::Cache::AccountConditions.association_names.include? name
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_needed
|
23
|
+
assert (not Searchlogic::Conditions::Base.needed?(User, {}))
|
24
|
+
assert (not Searchlogic::Conditions::Base.needed?(User, {:first_name => "Ben"}))
|
25
|
+
assert Searchlogic::Conditions::Base.needed?(User, {:first_name_contains => "Awesome"})
|
26
|
+
assert (not Searchlogic::Conditions::Base.needed?(User, {"orders.id" => 2}))
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_initialize
|
30
|
+
conditions = Searchlogic::Cache::AccountConditions.new(:name_contains => "Binary")
|
31
|
+
assert_equal conditions.klass, Account
|
32
|
+
assert_equal conditions.name_contains, "Binary"
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_any
|
36
|
+
conditions = Searchlogic::Cache::AccountConditions.new
|
37
|
+
assert (not conditions.any?)
|
38
|
+
conditions = Searchlogic::Cache::AccountConditions.new(:any => true)
|
39
|
+
assert conditions.any?
|
40
|
+
conditions.any = "false"
|
41
|
+
assert (not conditions.any?)
|
42
|
+
conditions = Searchlogic::Cache::AccountConditions.new
|
43
|
+
conditions.name_contains = "Binary"
|
44
|
+
assert_equal_sql ["\"accounts\".\"name\" LIKE ?", "%Binary%"], conditions.sanitize
|
45
|
+
conditions.id = 1
|
46
|
+
assert_equal_sql ["(\"accounts\".\"id\" = ?) AND (\"accounts\".\"name\" LIKE ?)", 1, "%Binary%"], conditions.sanitize
|
47
|
+
conditions.any = true
|
48
|
+
assert_equal_sql ["(\"accounts\".\"id\" = ?) OR (\"accounts\".\"name\" LIKE ?)", 1, "%Binary%"], conditions.sanitize
|
49
|
+
conditions.any = false
|
50
|
+
assert_equal_sql ["(\"accounts\".\"id\" = ?) AND (\"accounts\".\"name\" LIKE ?)", 1, "%Binary%"], conditions.sanitize
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_auto_joins
|
54
|
+
conditions = Searchlogic::Cache::AccountConditions.new
|
55
|
+
assert_equal conditions.auto_joins, nil
|
56
|
+
|
57
|
+
conditions.name_like = "Binary"
|
58
|
+
assert_equal conditions.auto_joins, nil
|
59
|
+
|
60
|
+
conditions.users.first_name_like = "Ben"
|
61
|
+
assert_equal conditions.auto_joins, :users
|
62
|
+
|
63
|
+
conditions.users.orders.description_like = "apple"
|
64
|
+
assert_equal conditions.auto_joins, {:users => :orders}
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_inspect
|
68
|
+
conditions = Searchlogic::Cache::AccountConditions.new
|
69
|
+
assert_nothing_raised { conditions.inspect }
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_sanitize
|
73
|
+
conditions = Searchlogic::Cache::AccountConditions.new
|
74
|
+
conditions.name_contains = "Binary"
|
75
|
+
conditions.id_gt = 5
|
76
|
+
now = Time.now
|
77
|
+
conditions.created_after = now
|
78
|
+
assert_equal_sql ["(\"accounts\".\"created_at\" > ?) AND (\"accounts\".\"id\" > ?) AND (\"accounts\".\"name\" LIKE ?)", now, 5, "%Binary%"], conditions.sanitize
|
79
|
+
|
80
|
+
# test out associations
|
81
|
+
conditions.users.first_name_like = "Ben"
|
82
|
+
conditions.users.id_gt = 10
|
83
|
+
conditions.users.orders.total_lt = 500
|
84
|
+
assert_equal_sql ["(\"accounts\".\"created_at\" > ?) AND (\"accounts\".\"id\" > ?) AND (\"accounts\".\"name\" LIKE ?) AND ((\"users\".\"first_name\" LIKE ?) AND (\"users\".\"id\" > ?) AND (\"orders\".\"total\" < ?))", now, 5, "%Binary%", "%Ben%", 10, 500], conditions.sanitize
|
85
|
+
|
86
|
+
# test that raw sql is returned
|
87
|
+
conditions.conditions = "awesome"
|
88
|
+
assert_equal "awesome", conditions.sanitize
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_conditions
|
92
|
+
conditions = Searchlogic::Cache::AccountConditions.new
|
93
|
+
now = Time.now
|
94
|
+
v = {:name_like => "Binary", :created_at_greater_than => now}
|
95
|
+
conditions.conditions = v
|
96
|
+
assert_equal v, conditions.conditions
|
97
|
+
|
98
|
+
sql = "id in (1,2,3,4)"
|
99
|
+
conditions.conditions = sql
|
100
|
+
assert_equal sql, conditions.conditions
|
101
|
+
assert_equal({}, conditions.send(:objects))
|
102
|
+
|
103
|
+
v2 = {:id_less_than => 5, :name_begins_with => "Beginning of string"}
|
104
|
+
conditions.conditions = v2
|
105
|
+
assert_equal v2, conditions.conditions
|
106
|
+
|
107
|
+
v = {:name_like => "Binary", :created_at_greater_than => now}
|
108
|
+
conditions.conditions = v
|
109
|
+
assert_equal v2.merge(v), conditions.conditions
|
110
|
+
|
111
|
+
sql2 = "id > 5 and name = 'Test'"
|
112
|
+
conditions.conditions = sql2
|
113
|
+
assert_equal sql2, conditions.conditions
|
114
|
+
assert_equal({}, conditions.send(:objects))
|
115
|
+
|
116
|
+
conditions.name_contains = "awesome"
|
117
|
+
assert_equal({:name_like => "awesome"}, conditions.conditions)
|
118
|
+
|
119
|
+
now = Time.now
|
120
|
+
conditions.conditions = {:id_gt => "", :id => "", :name => ["", "", ""], :created_at => ["", now], :name_starts_with => "Ben"}
|
121
|
+
assert_equal({:name_like => "awesome", :name_begins_with => "Ben", :created_at_equals => now}, conditions.conditions)
|
122
|
+
end
|
123
|
+
|
124
|
+
# Other general usage tests, need to clean these up
|
125
|
+
|
126
|
+
def test_setting_conditions
|
127
|
+
[Account, User, Order].each do |klass|
|
128
|
+
conditions = "Searchlogic::Cache::#{klass}Conditions".constantize.new
|
129
|
+
conditions.class.condition_names.each do |condition_name|
|
130
|
+
conditions.send("#{condition_name}=", 1)
|
131
|
+
assert_equal 1, conditions.send(condition_name)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
def test_accessible_protected_conditions
|
137
|
+
Account.conditions_accessible << :name_contains
|
138
|
+
conditions = Searchlogic::Cache::AccountConditions.new
|
139
|
+
conditions.conditions = {:created_after => Time.now, :name_contains => "Binary"}
|
140
|
+
assert({:name_contains => "Binary"}, conditions.conditions)
|
141
|
+
Account.send(:write_inheritable_attribute, :conditions_accessible, nil)
|
142
|
+
|
143
|
+
Account.conditions_protected << :name_contains
|
144
|
+
conditions = Searchlogic::Cache::AccountConditions.new
|
145
|
+
now = Time.now
|
146
|
+
conditions.conditions = {:created_after => now, :name_contains => "Binary"}
|
147
|
+
assert({:created_after => now}, conditions.conditions)
|
148
|
+
Account.send(:write_inheritable_attribute, :conditions_protected, nil)
|
149
|
+
end
|
150
|
+
|
151
|
+
def test_assert_valid_values
|
152
|
+
conditions = Searchlogic::Cache::UserConditions.new
|
153
|
+
assert_raise(NoMethodError) { conditions.conditions = {:unknown => "blah"} }
|
154
|
+
assert_nothing_raised { conditions.conditions = {:first_name => "blah"} }
|
155
|
+
assert_nothing_raised { conditions.conditions = {:first_name_contains => "blah"} }
|
156
|
+
end
|
157
|
+
|
158
|
+
def test_setting_associations
|
159
|
+
conditions = Searchlogic::Cache::AccountConditions.new(:users => {:first_name_like => "Ben"})
|
160
|
+
assert_equal conditions.users.first_name_like, "Ben"
|
161
|
+
|
162
|
+
conditions.users.last_name_begins_with = "Ben"
|
163
|
+
assert_equal conditions.users.last_name_begins_with, "Ben"
|
164
|
+
end
|
165
|
+
|
166
|
+
def test_virtual_columns
|
167
|
+
conditions = Searchlogic::Cache::AccountConditions.new
|
168
|
+
conditions.hour_of_created_gt = 2
|
169
|
+
assert_equal_sql ["strftime('%H', \"accounts\".\"created_at\") > ?", 2], conditions.sanitize
|
170
|
+
conditions.dow_of_created_at_most = 5
|
171
|
+
assert_equal_sql ["(strftime('%w', \"accounts\".\"created_at\") <= ?) AND (strftime('%H', \"accounts\".\"created_at\") > ?)", 5, 2], conditions.sanitize
|
172
|
+
conditions.month_of_created_at_nil = true
|
173
|
+
assert_equal_sql ["(strftime('%w', \"accounts\".\"created_at\") <= ?) AND (strftime('%H', \"accounts\".\"created_at\") > ?) AND (strftime('%m', \"accounts\".\"created_at\") IS NULL)", 5, 2], conditions.sanitize
|
174
|
+
conditions.min_of_hour_of_month_of_created_at_nil = true
|
175
|
+
assert_equal_sql ["(strftime('%w', \"accounts\".\"created_at\") <= ?) AND (strftime('%H', \"accounts\".\"created_at\") > ?) AND (strftime('%m', strftime('%H', strftime('%M', \"accounts\".\"created_at\"))) IS NULL) AND (strftime('%m', \"accounts\".\"created_at\") IS NULL)", 5, 2], conditions.sanitize
|
176
|
+
end
|
177
|
+
|
178
|
+
def test_objects
|
179
|
+
conditions = Searchlogic::Cache::AccountConditions.new
|
180
|
+
assert_equal({}, conditions.send(:objects))
|
181
|
+
|
182
|
+
conditions.name_contains = "Binary"
|
183
|
+
assert_equal 1, conditions.send(:objects).size
|
184
|
+
|
185
|
+
conditions.users.first_name_contains = "Ben"
|
186
|
+
assert_equal 2, conditions.send(:objects).size
|
187
|
+
end
|
188
|
+
|
189
|
+
def test_reset
|
190
|
+
conditions = Searchlogic::Cache::AccountConditions.new
|
191
|
+
|
192
|
+
conditions.name_contains = "Binary"
|
193
|
+
assert_equal 1, conditions.send(:objects).size
|
194
|
+
|
195
|
+
conditions.reset_name_like!
|
196
|
+
conditions.reset_name_contains! # should set up aliases for reset
|
197
|
+
assert_equal({}, conditions.send(:objects))
|
198
|
+
|
199
|
+
conditions.users.first_name_like = "Ben"
|
200
|
+
assert_equal 1, conditions.send(:objects).size
|
201
|
+
|
202
|
+
conditions.reset_users!
|
203
|
+
assert_equal({}, conditions.send(:objects))
|
204
|
+
|
205
|
+
conditions.name_begins_with ="Binary"
|
206
|
+
conditions.users.orders.total_gt = 200
|
207
|
+
assert_equal 2, conditions.send(:objects).size
|
208
|
+
|
209
|
+
conditions.reset_name_begins_with!
|
210
|
+
assert_equal 1, conditions.send(:objects).size
|
211
|
+
|
212
|
+
conditions.reset_users!
|
213
|
+
assert_equal({}, conditions.send(:objects))
|
214
|
+
end
|
215
|
+
|
216
|
+
def test_method_conflicts
|
217
|
+
conditions = Searchlogic::Cache::AccountConditions.new
|
218
|
+
assert_nil conditions.id
|
219
|
+
end
|
220
|
+
end
|
221
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper.rb'
|
2
|
+
|
3
|
+
module ConditionsTests
|
4
|
+
class ProtectionTest < ActiveSupport::TestCase
|
5
|
+
def test_protection
|
6
|
+
assert_raise(ArgumentError) { Account.new_search(:conditions => "(DELETE FROM users)") }
|
7
|
+
assert_nothing_raised { Account.new_search!(:conditions => "(DELETE FROM users)") }
|
8
|
+
|
9
|
+
account = Account.first
|
10
|
+
|
11
|
+
assert_raise(ArgumentError) { account.users.new_search(:conditions => "(DELETE FROM users)") }
|
12
|
+
assert_nothing_raised { account.users.new_search!(:conditions => "(DELETE FROM users)") }
|
13
|
+
|
14
|
+
search = Account.new_search
|
15
|
+
assert_raise(ArgumentError) { search.conditions = "(DELETE FROM users)" }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/test/fixtures/accounts.yml
CHANGED
data/test/fixtures/orders.yml
CHANGED
@@ -1,13 +1,11 @@
|
|
1
1
|
bens_order:
|
2
|
-
|
3
|
-
user_id: 1
|
2
|
+
user: ben
|
4
3
|
total: 500.23
|
5
4
|
description: A bunch of apple products, etc.
|
6
5
|
receipt: some binary text
|
7
6
|
|
8
7
|
drews_order:
|
9
|
-
|
10
|
-
user_id: 2
|
8
|
+
user: drew
|
11
9
|
total: 2.12
|
12
10
|
description: Some more apple projects, ipod, etc
|
13
11
|
receipt: some more binary text
|
data/test/fixtures/users.yml
CHANGED
@@ -1,34 +1,28 @@
|
|
1
1
|
ben:
|
2
|
-
|
3
|
-
account_id: 1
|
4
|
-
parent_id: null
|
2
|
+
account: binary_logic
|
5
3
|
first_name: Ben
|
6
4
|
last_name: Johnson
|
7
5
|
active: true
|
8
6
|
bio: Totally awesome!
|
9
7
|
|
10
8
|
drew:
|
11
|
-
|
12
|
-
|
13
|
-
parent_id: 1
|
9
|
+
account: neco
|
10
|
+
parent: ben
|
14
11
|
first_name: Drew
|
15
12
|
last_name: Mills
|
16
13
|
active: false
|
17
14
|
bio: Totally not awesome!
|
18
15
|
|
19
16
|
jennifer:
|
20
|
-
|
21
|
-
|
22
|
-
parent_id: 2
|
17
|
+
account: binary_logic
|
18
|
+
parent: drew
|
23
19
|
first_name: Jennifer
|
24
20
|
last_name: Hopkins
|
25
21
|
active: false
|
26
22
|
bio: Totally not awesome at all!
|
27
23
|
|
28
24
|
tren:
|
29
|
-
|
30
|
-
account_id:
|
31
|
-
parent_id:
|
25
|
+
parent: ben
|
32
26
|
first_name: Tren
|
33
27
|
last_name: Garfield
|
34
28
|
active: false
|
File without changes
|
File without changes
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper.rb'
|
2
|
+
|
3
|
+
module ConditionsTests
|
4
|
+
class DayOfMonthTest < ActiveSupport::TestCase
|
5
|
+
def test_modifier_names
|
6
|
+
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_usage
|
10
|
+
search = User.new_search
|
11
|
+
search.conditions.dom_of_created_at_gt = "1"
|
12
|
+
assert_equal({:conditions => ["(strftime('%d', \"users\".\"created_at\") * 1) > ?", 1], :limit => 25}, search.sanitize)
|
13
|
+
search.all
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|