searchlogic 1.5.3 → 1.5.4
Sign up to get free protection for your applications and to get access to all the features.
- 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
data/CHANGELOG.rdoc
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
== 1.5.4 released 2008-11-16
|
2
|
+
|
3
|
+
* Removed subclass requirement for adding conditions in Conditions::Base
|
4
|
+
* Removed DISTINCT in the select clause, instead called uniq! on the results. PostgreSQL complains about DISTINCT and AR uses uniq! when using :includes, so this is the best option.
|
5
|
+
* Converted the return for SQLite's strftime to integer from string. This way day of month, day of year, etc works as expected.
|
6
|
+
|
1
7
|
== 1.5.3 released 2008-10-30
|
2
8
|
|
3
9
|
* Removed ilike conditions and let the like condition determine if it should use like or ilike depending on the connection adapter.
|
data/Manifest
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
CHANGELOG.rdoc
|
2
|
-
examples/README.rdoc
|
3
2
|
init.rb
|
4
3
|
lib/searchlogic/active_record/associations.rb
|
5
4
|
lib/searchlogic/active_record/base.rb
|
@@ -98,26 +97,46 @@ Manifest
|
|
98
97
|
MIT-LICENSE
|
99
98
|
Rakefile
|
100
99
|
README.rdoc
|
100
|
+
test/active_record_tests/associations_test.rb
|
101
|
+
test/active_record_tests/base_test.rb
|
102
|
+
test/condition_tests/base_test.rb
|
103
|
+
test/condition_tests/begins_with_test.rb
|
104
|
+
test/condition_tests/blank_test.rb
|
105
|
+
test/condition_tests/child_of_test.rb
|
106
|
+
test/condition_tests/descendant_of_test.rb
|
107
|
+
test/condition_tests/ends_with_test.rb
|
108
|
+
test/condition_tests/equals_test.rb
|
109
|
+
test/condition_tests/greater_than_or_equal_to_test.rb
|
110
|
+
test/condition_tests/greater_than_test.rb
|
111
|
+
test/condition_tests/inclusive_descendant_of_test.rb
|
112
|
+
test/condition_tests/keyswords_test.rb
|
113
|
+
test/condition_tests/less_than_or_equal_to_test.rb
|
114
|
+
test/condition_tests/less_than_test.rb
|
115
|
+
test/condition_tests/like_test.rb
|
116
|
+
test/condition_tests/nil_test.rb
|
117
|
+
test/condition_tests/not_begin_with_test.rb
|
118
|
+
test/condition_tests/not_blank_test.rb
|
119
|
+
test/condition_tests/not_end_with_test.rb
|
120
|
+
test/condition_tests/not_equal_test.rb
|
121
|
+
test/condition_tests/not_have_keywords_test.rb
|
122
|
+
test/condition_tests/not_like_test.rb
|
123
|
+
test/condition_tests/not_nil_test.rb
|
124
|
+
test/condition_tests/sibling_of_test.rb
|
125
|
+
test/conditions_tests/base_test.rb
|
126
|
+
test/conditions_tests/protection_test.rb
|
127
|
+
test/config_test.rb
|
101
128
|
test/fixtures/accounts.yml
|
102
|
-
test/fixtures/
|
103
|
-
test/fixtures/dogs.yml
|
129
|
+
test/fixtures/animals.yml
|
104
130
|
test/fixtures/orders.yml
|
105
131
|
test/fixtures/user_groups.yml
|
106
132
|
test/fixtures/users.yml
|
107
|
-
test/
|
108
|
-
test/
|
109
|
-
test/
|
110
|
-
test/
|
111
|
-
test/
|
112
|
-
test/
|
113
|
-
test/
|
133
|
+
test/libs/acts_as_tree.rb
|
134
|
+
test/libs/rexml_fix.rb
|
135
|
+
test/modifier_tests/day_of_month_test.rb
|
136
|
+
test/search_tests/base_test.rb
|
137
|
+
test/search_tests/conditions_test.rb
|
138
|
+
test/search_tests/ordering_test.rb
|
139
|
+
test/search_tests/pagination_test.rb
|
140
|
+
test/search_tests/protection_test.rb
|
114
141
|
test/test_helper.rb
|
115
|
-
test/test_search_base.rb
|
116
|
-
test/test_search_conditions.rb
|
117
|
-
test/test_search_ordering.rb
|
118
|
-
test/test_search_pagination.rb
|
119
|
-
test/test_search_protection.rb
|
120
|
-
test_libs/acts_as_tree.rb
|
121
|
-
test_libs/ordered_hash.rb
|
122
|
-
test_libs/rexml_fix.rb
|
123
142
|
TODO.rdoc
|
data/README.rdoc
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
= Searchlogic
|
2
2
|
|
3
|
-
Searchlogic is
|
4
|
-
|
5
|
-
<b>Searchlogic's inspiration comes right from ActiveRecord. ActiveRecord lets you create objects that represent a record in the database, so why can't you create objects that represent searching the database? Now you can! It's searching, ordering, and pagination all in one.</b>
|
3
|
+
Searchlogic is object based ActiveRecord searching, ordering, and pagination all in one.
|
6
4
|
|
7
5
|
== Helpful links
|
8
6
|
|
@@ -58,7 +56,7 @@ same as above, but object based
|
|
58
56
|
|
59
57
|
In both examples, instead of using the "all" method you could use any search method: first, find(:all), find(:first), count, sum, average, etc, just like ActiveRecord.
|
60
58
|
|
61
|
-
== The beauty of
|
59
|
+
== The beauty of Searchlogic, integration into rails
|
62
60
|
|
63
61
|
Using Searchlogic in rails is the best part, because rails has all kinds of nifty methods to make dealing with ActiveRecord objects quick and easy, especially with forms. So let's take advantage of them! That's the idea behind this plugin. Searchlogic is searching, ordering, and pagination all rolled into one simple plugin. Take all of that pagination and searching cruft out of your models and controllers, and let Searchlogic handle it. Check it out:
|
64
62
|
|
@@ -79,7 +77,7 @@ Now your view:
|
|
79
77
|
= orders.select :total_gt, (1..100)
|
80
78
|
= f.submit "Search"
|
81
79
|
|
82
|
-
-
|
80
|
+
- unless @users_count.zero?
|
83
81
|
%table
|
84
82
|
%tr
|
85
83
|
%th= order_by_link :account => :name
|
@@ -93,10 +91,8 @@ Now your view:
|
|
93
91
|
%td= user.last_name
|
94
92
|
%td= user.email
|
95
93
|
|
96
|
-
Per page:
|
97
|
-
|
98
|
-
Page:
|
99
|
-
= page_select
|
94
|
+
== Per page: #{per_page_select}
|
95
|
+
== Page: #{page_select}
|
100
96
|
- else
|
101
97
|
No users were found.
|
102
98
|
|
@@ -186,10 +182,11 @@ Any of the options used in the above example can be used in these, but for the s
|
|
186
182
|
|
187
183
|
As you saw above, the nice thing about Searchlogic is it's integration with forms. I designed the "any" option so that forms can set this as well, just like a condition.
|
188
184
|
|
189
|
-
search = User.new_search(:conditions => {:age_gt => 18})
|
190
|
-
|
191
|
-
|
192
|
-
|
185
|
+
@search = User.new_search(:conditions => {:age_gt => 18}) do |search|
|
186
|
+
search.conditions.first_name_contains = "Ben"
|
187
|
+
search.conditions.any = true # can set this to "true" or "1" or "yes"
|
188
|
+
search.all # will join all conditions with "or" instead of "and"
|
189
|
+
end
|
193
190
|
# ... all operations above are available
|
194
191
|
|
195
192
|
== Scoped searching
|
@@ -197,8 +194,7 @@ As you saw above, the nice thing about Searchlogic is it's integration with form
|
|
197
194
|
@current_user.orders.find(:all, :conditions => {:total_lte => 500})
|
198
195
|
@current_user.orders.count(:conditions => {:total_lte => 500})
|
199
196
|
@current_user.orders.sum('total', :conditions => {:total_lte => 500})
|
200
|
-
|
201
|
-
search = @current_user.orders.build_search(:conditions => {:total_lte => 500})
|
197
|
+
@current_user.orders.build_search(:conditions => {:total_lte => 500})
|
202
198
|
|
203
199
|
== Scope support
|
204
200
|
|
@@ -218,9 +214,9 @@ or
|
|
218
214
|
end
|
219
215
|
end
|
220
216
|
|
221
|
-
==
|
217
|
+
== Protection against SQL injections
|
222
218
|
|
223
|
-
|
219
|
+
SQL injections are not fun, so let's make sure they don't happen. That's why searchlogic protects you by default. The new\_search methods protect mass assignments by default (instantiation and search.options = {}). This means that various checks are done to ensure it is not possible to perform any type of SQL injection during mass assignments. But this also limits how you can search, meaning you can't write raw SQL. If you want to be daring and search without protection, all that you have to do is add ! to the end of the method: new\_search!.
|
224
220
|
|
225
221
|
=== Protected from SQL injections
|
226
222
|
|
data/TODO.rdoc
CHANGED
@@ -1,6 +1,4 @@
|
|
1
1
|
= To Do
|
2
2
|
|
3
3
|
1. Perform "more efficient" checks: year_of_created_at = 2008 and month_of_created_at = 8. Should result in a "BETWEEN" statement utilizing the column indexes. Thanks Georg for letting me know about this.
|
4
|
-
2. Solve conflicts between scope joins and joins in the search (for old versions of AR). Also solve conflicts between joins and includes.
|
5
|
-
3. Add configuration to change the "english" words
|
6
|
-
4. Re-add the distinct option
|
4
|
+
2. Solve conflicts between scope joins and joins in the search (for old versions of AR). Also solve conflicts between joins and includes.
|
data/lib/searchlogic.rb
CHANGED
@@ -44,13 +44,13 @@ require "searchlogic/conditions/base"
|
|
44
44
|
# Condition
|
45
45
|
require "searchlogic/condition/base"
|
46
46
|
require "searchlogic/condition/tree"
|
47
|
-
|
48
|
-
|
47
|
+
SEARCHLOGIC_CONDITIONS = [:begins_with, :blank, :child_of, :descendant_of, :ends_with, :equals, :greater_than, :greater_than_or_equal_to, :inclusive_descendant_of, :like, :nil, :not_begin_with, :not_blank, :not_end_with, :not_equal, :not_have_keywords, :not_nil, :keywords, :less_than, :less_than_or_equal_to, :sibling_of]
|
48
|
+
SEARCHLOGIC_CONDITIONS.each { |condition| require "searchlogic/condition/#{condition}" }
|
49
49
|
|
50
50
|
# Modifiers
|
51
51
|
require "searchlogic/modifiers/base"
|
52
|
-
|
53
|
-
|
52
|
+
SEARCHLOGIC_MODIFIERS = [:absolute, :acos, :asin, :atan, :ceil, :char_length, :cos, :cot, :day_of_month, :day_of_week, :day_of_year, :degrees, :exp, :floor, :hex, :hour, :log, :log10, :log2, :lower, :ltrim, :md5, :microseconds, :milliseconds, :minute, :month, :octal, :radians, :round, :rtrim, :second, :sign, :sin, :square_root, :tan, :trim, :upper, :week, :year]
|
53
|
+
SEARCHLOGIC_MODIFIERS.each { |modifier| require "searchlogic/modifiers/#{modifier}" }
|
54
54
|
|
55
55
|
# Helpers
|
56
56
|
require "searchlogic/helpers/utilities"
|
@@ -79,8 +79,8 @@ module Searchlogic
|
|
79
79
|
include Protection
|
80
80
|
end
|
81
81
|
|
82
|
-
|
83
|
-
|
82
|
+
SEARCHLOGIC_CONDITIONS.each { |condition| Base.register_condition("Searchlogic::Condition::#{condition.to_s.camelize}".constantize) }
|
83
|
+
SEARCHLOGIC_MODIFIERS.each { |modifier| Base.register_modifier("Searchlogic::Modifiers::#{modifier.to_s.camelize}".constantize) }
|
84
84
|
end
|
85
85
|
|
86
86
|
# The namespace I put all cached search classes.
|
@@ -12,39 +12,39 @@ module Searchlogic
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def second_sql(column_name)
|
15
|
-
"strftime('%S', #{column_name})"
|
15
|
+
"(strftime('%S', #{column_name}) * 1)"
|
16
16
|
end
|
17
17
|
|
18
18
|
def minute_sql(column_name)
|
19
|
-
"strftime('%M', #{column_name})"
|
19
|
+
"(strftime('%M', #{column_name}) * 1)"
|
20
20
|
end
|
21
21
|
|
22
22
|
def hour_sql(column_name)
|
23
|
-
"strftime('%H', #{column_name})"
|
23
|
+
"(strftime('%H', #{column_name}) * 1)"
|
24
24
|
end
|
25
25
|
|
26
26
|
def day_of_week_sql(column_name)
|
27
|
-
"strftime('%w', #{column_name})"
|
27
|
+
"(strftime('%w', #{column_name}) * 1)"
|
28
28
|
end
|
29
29
|
|
30
30
|
def day_of_month_sql(column_name)
|
31
|
-
"strftime('%d', #{column_name})"
|
31
|
+
"(strftime('%d', #{column_name}) * 1)"
|
32
32
|
end
|
33
33
|
|
34
34
|
def day_of_year_sql(column_name)
|
35
|
-
"strftime('%j', #{column_name})"
|
35
|
+
"(strftime('%j', #{column_name}) * 1)"
|
36
36
|
end
|
37
37
|
|
38
38
|
def week_sql(column_name)
|
39
|
-
"strftime('%W', #{column_name})"
|
39
|
+
"(strftime('%W', #{column_name}) * 1)"
|
40
40
|
end
|
41
41
|
|
42
42
|
def month_sql(column_name)
|
43
|
-
"strftime('%m', #{column_name})"
|
43
|
+
"(strftime('%m', #{column_name}) * 1)"
|
44
44
|
end
|
45
45
|
|
46
46
|
def year_sql(column_name)
|
47
|
-
"strftime('%Y', #{column_name})"
|
47
|
+
"(strftime('%Y', #{column_name}) * 1)"
|
48
48
|
end
|
49
49
|
|
50
50
|
# String functions
|
@@ -44,8 +44,8 @@ module Searchlogic
|
|
44
44
|
# class SoundsLike < Searchlogic::Condition::Base
|
45
45
|
# # The name of the conditions. By default its the name of the class, if you want alternate or alias conditions just add them on.
|
46
46
|
# # If you don't want to add aliases you don't even need to define this method
|
47
|
-
# def self.
|
48
|
-
# super
|
47
|
+
# def self.condition_names_for_column(column)
|
48
|
+
# super + ["similar_to", "sounds"]
|
49
49
|
# end
|
50
50
|
#
|
51
51
|
# # You can return an array or a string. NOT a hash, because all of these conditions
|
@@ -57,7 +57,7 @@ module Searchlogic
|
|
57
57
|
# end
|
58
58
|
# end
|
59
59
|
#
|
60
|
-
# Searchlogic::
|
60
|
+
# Searchlogic::Conditions::Base.register_condition(SoundsLike)
|
61
61
|
def register_condition(condition_class)
|
62
62
|
raise(ArgumentError, "You can only register conditions that extend Searchlogic::Condition::Base") unless condition_class.ancestors.include?(Searchlogic::Condition::Base)
|
63
63
|
conditions << condition_class unless conditions.include?(condition_class)
|
@@ -170,7 +170,21 @@ module Searchlogic
|
|
170
170
|
|
171
171
|
# Convenience method for determining if we should join the conditions with "AND" or "OR".
|
172
172
|
def any?
|
173
|
-
|
173
|
+
["true", "1", "yes"].include? @any.to_s
|
174
|
+
end
|
175
|
+
|
176
|
+
# Sets the conditions to be searched by "or"
|
177
|
+
def any!
|
178
|
+
any = true
|
179
|
+
end
|
180
|
+
|
181
|
+
def all # :nodoc:
|
182
|
+
not any?
|
183
|
+
end
|
184
|
+
|
185
|
+
# Sets the conditions to be searched by "and"
|
186
|
+
def all!
|
187
|
+
any = false
|
174
188
|
end
|
175
189
|
|
176
190
|
# A list of joins to use when searching, includes relationships
|
@@ -344,7 +358,7 @@ module Searchlogic
|
|
344
358
|
method_name_parts << modifier_name_parts.join("_of_") + "_of" unless modifier_name_parts.blank?
|
345
359
|
method_name_parts << column_name
|
346
360
|
method_name_parts << condition_name unless condition_name.blank?
|
347
|
-
method_name_parts.join("_")
|
361
|
+
method_name_parts.join("_").underscore
|
348
362
|
end
|
349
363
|
|
350
364
|
def method_missing(name, *args, &block)
|
@@ -395,7 +409,7 @@ module Searchlogic
|
|
395
409
|
|
396
410
|
def add_condition!(condition, name, options = {})
|
397
411
|
self.class.condition_names << name
|
398
|
-
options[:column] = options[:column].name
|
412
|
+
options[:column] = options[:column].name
|
399
413
|
|
400
414
|
self.class.class_eval <<-"end_eval", __FILE__, __LINE__
|
401
415
|
def #{name}_object
|
@@ -119,11 +119,6 @@ module Searchlogic #:nodoc:
|
|
119
119
|
find_options
|
120
120
|
end
|
121
121
|
|
122
|
-
def select
|
123
|
-
@select ||= "DISTINCT #{klass.connection.quote_table_name(klass.table_name)}.*" if !joins.blank? && Config.search.remove_duplicates?
|
124
|
-
@select
|
125
|
-
end
|
126
|
-
|
127
122
|
def scope
|
128
123
|
@scope ||= {}
|
129
124
|
end
|
@@ -21,7 +21,9 @@ module Searchlogic
|
|
21
21
|
args[0] = klass.primary_key if [nil, :all].include?(args[0])
|
22
22
|
end
|
23
23
|
args << options
|
24
|
-
klass.#{method}(*args)
|
24
|
+
results = klass.#{method}(*args)
|
25
|
+
results.uniq! if #{SEARCH_METHODS.include?(method)} && results.is_a?(Array) && !joins.blank? && Config.search.remove_duplicates?
|
26
|
+
results
|
25
27
|
end
|
26
28
|
end
|
27
29
|
end_eval
|
data/lib/searchlogic/version.rb
CHANGED
data/searchlogic.gemspec
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = %q{searchlogic}
|
3
|
-
s.version = "1.5.
|
3
|
+
s.version = "1.5.4"
|
4
4
|
|
5
5
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
6
6
|
s.authors = ["Ben Johnson of Binary Logic"]
|
7
|
-
s.date = %q{2008-11-
|
7
|
+
s.date = %q{2008-11-16}
|
8
8
|
s.description = %q{Object based ActiveRecord searching, ordering, pagination, and more!}
|
9
9
|
s.email = %q{bjohnson@binarylogic.com}
|
10
10
|
s.extra_rdoc_files = ["CHANGELOG.rdoc", "lib/searchlogic/active_record/associations.rb", "lib/searchlogic/active_record/base.rb", "lib/searchlogic/active_record/connection_adapters/mysql_adapter.rb", "lib/searchlogic/active_record/connection_adapters/postgresql_adapter.rb", "lib/searchlogic/active_record/connection_adapters/sqlite_adapter.rb", "lib/searchlogic/condition/base.rb", "lib/searchlogic/condition/begins_with.rb", "lib/searchlogic/condition/blank.rb", "lib/searchlogic/condition/child_of.rb", "lib/searchlogic/condition/descendant_of.rb", "lib/searchlogic/condition/ends_with.rb", "lib/searchlogic/condition/equals.rb", "lib/searchlogic/condition/greater_than.rb", "lib/searchlogic/condition/greater_than_or_equal_to.rb", "lib/searchlogic/condition/inclusive_descendant_of.rb", "lib/searchlogic/condition/keywords.rb", "lib/searchlogic/condition/less_than.rb", "lib/searchlogic/condition/less_than_or_equal_to.rb", "lib/searchlogic/condition/like.rb", "lib/searchlogic/condition/nil.rb", "lib/searchlogic/condition/not_begin_with.rb", "lib/searchlogic/condition/not_blank.rb", "lib/searchlogic/condition/not_end_with.rb", "lib/searchlogic/condition/not_equal.rb", "lib/searchlogic/condition/not_have_keywords.rb", "lib/searchlogic/condition/not_like.rb", "lib/searchlogic/condition/not_nil.rb", "lib/searchlogic/condition/sibling_of.rb", "lib/searchlogic/condition/tree.rb", "lib/searchlogic/conditions/base.rb", "lib/searchlogic/conditions/protection.rb", "lib/searchlogic/config/helpers.rb", "lib/searchlogic/config/search.rb", "lib/searchlogic/config.rb", "lib/searchlogic/core_ext/hash.rb", "lib/searchlogic/helpers/control_types/link.rb", "lib/searchlogic/helpers/control_types/links.rb", "lib/searchlogic/helpers/control_types/remote_link.rb", "lib/searchlogic/helpers/control_types/remote_links.rb", "lib/searchlogic/helpers/control_types/remote_select.rb", "lib/searchlogic/helpers/control_types/select.rb", "lib/searchlogic/helpers/form.rb", "lib/searchlogic/helpers/utilities.rb", "lib/searchlogic/modifiers/absolute.rb", "lib/searchlogic/modifiers/acos.rb", "lib/searchlogic/modifiers/asin.rb", "lib/searchlogic/modifiers/atan.rb", "lib/searchlogic/modifiers/base.rb", "lib/searchlogic/modifiers/ceil.rb", "lib/searchlogic/modifiers/char_length.rb", "lib/searchlogic/modifiers/cos.rb", "lib/searchlogic/modifiers/cot.rb", "lib/searchlogic/modifiers/day_of_month.rb", "lib/searchlogic/modifiers/day_of_week.rb", "lib/searchlogic/modifiers/day_of_year.rb", "lib/searchlogic/modifiers/degrees.rb", "lib/searchlogic/modifiers/exp.rb", "lib/searchlogic/modifiers/floor.rb", "lib/searchlogic/modifiers/hex.rb", "lib/searchlogic/modifiers/hour.rb", "lib/searchlogic/modifiers/log.rb", "lib/searchlogic/modifiers/log10.rb", "lib/searchlogic/modifiers/log2.rb", "lib/searchlogic/modifiers/lower.rb", "lib/searchlogic/modifiers/ltrim.rb", "lib/searchlogic/modifiers/md5.rb", "lib/searchlogic/modifiers/microseconds.rb", "lib/searchlogic/modifiers/milliseconds.rb", "lib/searchlogic/modifiers/minute.rb", "lib/searchlogic/modifiers/month.rb", "lib/searchlogic/modifiers/octal.rb", "lib/searchlogic/modifiers/radians.rb", "lib/searchlogic/modifiers/round.rb", "lib/searchlogic/modifiers/rtrim.rb", "lib/searchlogic/modifiers/second.rb", "lib/searchlogic/modifiers/sign.rb", "lib/searchlogic/modifiers/sin.rb", "lib/searchlogic/modifiers/square_root.rb", "lib/searchlogic/modifiers/tan.rb", "lib/searchlogic/modifiers/trim.rb", "lib/searchlogic/modifiers/upper.rb", "lib/searchlogic/modifiers/week.rb", "lib/searchlogic/modifiers/year.rb", "lib/searchlogic/search/base.rb", "lib/searchlogic/search/conditions.rb", "lib/searchlogic/search/ordering.rb", "lib/searchlogic/search/pagination.rb", "lib/searchlogic/search/protection.rb", "lib/searchlogic/search/searching.rb", "lib/searchlogic/shared/utilities.rb", "lib/searchlogic/shared/virtual_classes.rb", "lib/searchlogic/version.rb", "lib/searchlogic.rb", "README.rdoc", "TODO.rdoc"]
|
11
|
-
s.files = ["CHANGELOG.rdoc", "
|
11
|
+
s.files = ["CHANGELOG.rdoc", "init.rb", "lib/searchlogic/active_record/associations.rb", "lib/searchlogic/active_record/base.rb", "lib/searchlogic/active_record/connection_adapters/mysql_adapter.rb", "lib/searchlogic/active_record/connection_adapters/postgresql_adapter.rb", "lib/searchlogic/active_record/connection_adapters/sqlite_adapter.rb", "lib/searchlogic/condition/base.rb", "lib/searchlogic/condition/begins_with.rb", "lib/searchlogic/condition/blank.rb", "lib/searchlogic/condition/child_of.rb", "lib/searchlogic/condition/descendant_of.rb", "lib/searchlogic/condition/ends_with.rb", "lib/searchlogic/condition/equals.rb", "lib/searchlogic/condition/greater_than.rb", "lib/searchlogic/condition/greater_than_or_equal_to.rb", "lib/searchlogic/condition/inclusive_descendant_of.rb", "lib/searchlogic/condition/keywords.rb", "lib/searchlogic/condition/less_than.rb", "lib/searchlogic/condition/less_than_or_equal_to.rb", "lib/searchlogic/condition/like.rb", "lib/searchlogic/condition/nil.rb", "lib/searchlogic/condition/not_begin_with.rb", "lib/searchlogic/condition/not_blank.rb", "lib/searchlogic/condition/not_end_with.rb", "lib/searchlogic/condition/not_equal.rb", "lib/searchlogic/condition/not_have_keywords.rb", "lib/searchlogic/condition/not_like.rb", "lib/searchlogic/condition/not_nil.rb", "lib/searchlogic/condition/sibling_of.rb", "lib/searchlogic/condition/tree.rb", "lib/searchlogic/conditions/base.rb", "lib/searchlogic/conditions/protection.rb", "lib/searchlogic/config/helpers.rb", "lib/searchlogic/config/search.rb", "lib/searchlogic/config.rb", "lib/searchlogic/core_ext/hash.rb", "lib/searchlogic/helpers/control_types/link.rb", "lib/searchlogic/helpers/control_types/links.rb", "lib/searchlogic/helpers/control_types/remote_link.rb", "lib/searchlogic/helpers/control_types/remote_links.rb", "lib/searchlogic/helpers/control_types/remote_select.rb", "lib/searchlogic/helpers/control_types/select.rb", "lib/searchlogic/helpers/form.rb", "lib/searchlogic/helpers/utilities.rb", "lib/searchlogic/modifiers/absolute.rb", "lib/searchlogic/modifiers/acos.rb", "lib/searchlogic/modifiers/asin.rb", "lib/searchlogic/modifiers/atan.rb", "lib/searchlogic/modifiers/base.rb", "lib/searchlogic/modifiers/ceil.rb", "lib/searchlogic/modifiers/char_length.rb", "lib/searchlogic/modifiers/cos.rb", "lib/searchlogic/modifiers/cot.rb", "lib/searchlogic/modifiers/day_of_month.rb", "lib/searchlogic/modifiers/day_of_week.rb", "lib/searchlogic/modifiers/day_of_year.rb", "lib/searchlogic/modifiers/degrees.rb", "lib/searchlogic/modifiers/exp.rb", "lib/searchlogic/modifiers/floor.rb", "lib/searchlogic/modifiers/hex.rb", "lib/searchlogic/modifiers/hour.rb", "lib/searchlogic/modifiers/log.rb", "lib/searchlogic/modifiers/log10.rb", "lib/searchlogic/modifiers/log2.rb", "lib/searchlogic/modifiers/lower.rb", "lib/searchlogic/modifiers/ltrim.rb", "lib/searchlogic/modifiers/md5.rb", "lib/searchlogic/modifiers/microseconds.rb", "lib/searchlogic/modifiers/milliseconds.rb", "lib/searchlogic/modifiers/minute.rb", "lib/searchlogic/modifiers/month.rb", "lib/searchlogic/modifiers/octal.rb", "lib/searchlogic/modifiers/radians.rb", "lib/searchlogic/modifiers/round.rb", "lib/searchlogic/modifiers/rtrim.rb", "lib/searchlogic/modifiers/second.rb", "lib/searchlogic/modifiers/sign.rb", "lib/searchlogic/modifiers/sin.rb", "lib/searchlogic/modifiers/square_root.rb", "lib/searchlogic/modifiers/tan.rb", "lib/searchlogic/modifiers/trim.rb", "lib/searchlogic/modifiers/upper.rb", "lib/searchlogic/modifiers/week.rb", "lib/searchlogic/modifiers/year.rb", "lib/searchlogic/search/base.rb", "lib/searchlogic/search/conditions.rb", "lib/searchlogic/search/ordering.rb", "lib/searchlogic/search/pagination.rb", "lib/searchlogic/search/protection.rb", "lib/searchlogic/search/searching.rb", "lib/searchlogic/shared/utilities.rb", "lib/searchlogic/shared/virtual_classes.rb", "lib/searchlogic/version.rb", "lib/searchlogic.rb", "Manifest", "MIT-LICENSE", "Rakefile", "README.rdoc", "test/active_record_tests/associations_test.rb", "test/active_record_tests/base_test.rb", "test/condition_tests/base_test.rb", "test/condition_tests/begins_with_test.rb", "test/condition_tests/blank_test.rb", "test/condition_tests/child_of_test.rb", "test/condition_tests/descendant_of_test.rb", "test/condition_tests/ends_with_test.rb", "test/condition_tests/equals_test.rb", "test/condition_tests/greater_than_or_equal_to_test.rb", "test/condition_tests/greater_than_test.rb", "test/condition_tests/inclusive_descendant_of_test.rb", "test/condition_tests/keyswords_test.rb", "test/condition_tests/less_than_or_equal_to_test.rb", "test/condition_tests/less_than_test.rb", "test/condition_tests/like_test.rb", "test/condition_tests/nil_test.rb", "test/condition_tests/not_begin_with_test.rb", "test/condition_tests/not_blank_test.rb", "test/condition_tests/not_end_with_test.rb", "test/condition_tests/not_equal_test.rb", "test/condition_tests/not_have_keywords_test.rb", "test/condition_tests/not_like_test.rb", "test/condition_tests/not_nil_test.rb", "test/condition_tests/sibling_of_test.rb", "test/conditions_tests/base_test.rb", "test/conditions_tests/protection_test.rb", "test/config_test.rb", "test/fixtures/accounts.yml", "test/fixtures/animals.yml", "test/fixtures/orders.yml", "test/fixtures/user_groups.yml", "test/fixtures/users.yml", "test/libs/acts_as_tree.rb", "test/libs/rexml_fix.rb", "test/modifier_tests/day_of_month_test.rb", "test/search_tests/base_test.rb", "test/search_tests/conditions_test.rb", "test/search_tests/ordering_test.rb", "test/search_tests/pagination_test.rb", "test/search_tests/protection_test.rb", "test/test_helper.rb", "TODO.rdoc", "searchlogic.gemspec"]
|
12
12
|
s.has_rdoc = true
|
13
13
|
s.homepage = %q{http://github.com/binarylogic/searchlogic}
|
14
14
|
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Searchlogic", "--main", "README.rdoc"]
|
@@ -16,7 +16,7 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.rubyforge_project = %q{searchlogic}
|
17
17
|
s.rubygems_version = %q{1.2.0}
|
18
18
|
s.summary = %q{Object based ActiveRecord searching, ordering, pagination, and more!}
|
19
|
-
s.test_files = ["test/
|
19
|
+
s.test_files = ["test/active_record_tests/associations_test.rb", "test/active_record_tests/base_test.rb", "test/condition_tests/base_test.rb", "test/condition_tests/begins_with_test.rb", "test/condition_tests/blank_test.rb", "test/condition_tests/child_of_test.rb", "test/condition_tests/descendant_of_test.rb", "test/condition_tests/ends_with_test.rb", "test/condition_tests/equals_test.rb", "test/condition_tests/greater_than_or_equal_to_test.rb", "test/condition_tests/greater_than_test.rb", "test/condition_tests/inclusive_descendant_of_test.rb", "test/condition_tests/keyswords_test.rb", "test/condition_tests/less_than_or_equal_to_test.rb", "test/condition_tests/less_than_test.rb", "test/condition_tests/like_test.rb", "test/condition_tests/nil_test.rb", "test/condition_tests/not_begin_with_test.rb", "test/condition_tests/not_blank_test.rb", "test/condition_tests/not_end_with_test.rb", "test/condition_tests/not_equal_test.rb", "test/condition_tests/not_have_keywords_test.rb", "test/condition_tests/not_like_test.rb", "test/condition_tests/not_nil_test.rb", "test/condition_tests/sibling_of_test.rb", "test/conditions_tests/base_test.rb", "test/conditions_tests/protection_test.rb", "test/config_test.rb", "test/modifier_tests/day_of_month_test.rb", "test/search_tests/base_test.rb", "test/search_tests/conditions_test.rb", "test/search_tests/ordering_test.rb", "test/search_tests/pagination_test.rb", "test/search_tests/protection_test.rb", "test/test_helper.rb"]
|
20
20
|
|
21
21
|
if s.respond_to? :specification_version then
|
22
22
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper.rb'
|
2
|
+
|
3
|
+
module ActiveRecordTests
|
4
|
+
class AssociationsTest < ActiveSupport::TestCase
|
5
|
+
def test_has_many
|
6
|
+
binary_logic = accounts(:binary_logic)
|
7
|
+
ben = users(:ben)
|
8
|
+
jennifer = users(:jennifer)
|
9
|
+
|
10
|
+
search = binary_logic.users.new_search
|
11
|
+
assert_kind_of Searchlogic::Search::Base, search
|
12
|
+
assert_equal User, search.klass
|
13
|
+
assert_equal({:conditions => "\"users\".account_id = #{binary_logic.id}"}, search.scope)
|
14
|
+
|
15
|
+
assert_equal [jennifer, ben], search.all
|
16
|
+
assert_equal jennifer, search.first
|
17
|
+
assert_equal ((ben.id + jennifer.id) / 2.0), search.average("id")
|
18
|
+
assert_equal 2, search.count
|
19
|
+
|
20
|
+
search.conditions.first_name_contains = "Ben"
|
21
|
+
|
22
|
+
assert_equal [ben], search.all
|
23
|
+
assert_equal ben, search.first
|
24
|
+
assert_equal ben.id, search.average("id")
|
25
|
+
assert_equal 1, search.count
|
26
|
+
|
27
|
+
assert_equal 2, binary_logic.users.count
|
28
|
+
assert_equal 1, binary_logic.users.all(:conditions => {:first_name_contains => "Ben"}).size
|
29
|
+
assert_equal 0, binary_logic.users.all(:conditions => {:first_name_contains => "No one"}).size
|
30
|
+
assert_equal ben.id, binary_logic.users.sum("id", :conditions => {:first_name_contains => "Ben"})
|
31
|
+
assert_equal 0, binary_logic.users.sum("id", :conditions => {:first_name_contains => "No one"})
|
32
|
+
assert_equal ben.id, binary_logic.users.average("id", :conditions => {:first_name_contains => "Ben"})
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_has_many_through
|
36
|
+
binary_logic = accounts(:binary_logic)
|
37
|
+
|
38
|
+
search = binary_logic.orders.new_search
|
39
|
+
assert_kind_of Searchlogic::Search::Base, search
|
40
|
+
assert_equal Order, search.klass
|
41
|
+
assert_equal({:joins => "INNER JOIN users ON orders.user_id = users.id ", :conditions => "(\"users\".account_id = #{binary_logic.id})"}, search.scope)
|
42
|
+
|
43
|
+
bens_order = orders(:bens_order)
|
44
|
+
assert_equal [bens_order], search.all
|
45
|
+
assert_equal bens_order, search.first
|
46
|
+
assert_equal bens_order.id, search.average("id")
|
47
|
+
assert_equal 1, search.count
|
48
|
+
|
49
|
+
search.conditions.total_gt = 100
|
50
|
+
|
51
|
+
assert_equal [bens_order], search.all
|
52
|
+
assert_equal bens_order, search.first
|
53
|
+
assert_equal bens_order.id, search.average("id")
|
54
|
+
assert_equal 1, search.count
|
55
|
+
|
56
|
+
assert_equal 1, binary_logic.orders.count
|
57
|
+
assert_equal 1, binary_logic.orders.all(:conditions => {:total_gt => 100}).size
|
58
|
+
assert_equal 0, binary_logic.orders.all(:conditions => {:total_gt => 1000}).size
|
59
|
+
assert_equal bens_order.id, binary_logic.orders.sum("id", :conditions => {:total_gt => 100})
|
60
|
+
assert_equal 0, binary_logic.orders.sum("id", :conditions => {:total_gt => 1000})
|
61
|
+
assert_equal bens_order.id, binary_logic.orders.average("id", :conditions => {:total_gt => 100})
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_habtm
|
65
|
+
neco = user_groups(:neco)
|
66
|
+
ben = users(:ben)
|
67
|
+
drew = users(:drew)
|
68
|
+
|
69
|
+
search = neco.users.new_search
|
70
|
+
assert_kind_of Searchlogic::Search::Base, search
|
71
|
+
assert_equal User, search.klass
|
72
|
+
assert_equal({:conditions => "\"user_groups_users\".user_group_id = #{neco.id} ", :joins => "INNER JOIN \"user_groups_users\" ON \"users\".id = \"user_groups_users\".user_id"}, search.scope)
|
73
|
+
|
74
|
+
assert_equal [ben, drew], search.all
|
75
|
+
|
76
|
+
assert_equal ben, search.first
|
77
|
+
assert_equal ((ben.id + drew.id) / 2.0).to_s, search.average("id").to_s
|
78
|
+
assert_equal 2, search.count
|
79
|
+
|
80
|
+
search.conditions.first_name_contains = "Ben"
|
81
|
+
|
82
|
+
assert_equal [ben], search.all
|
83
|
+
assert_equal ben, search.first
|
84
|
+
assert_equal ben.id, search.average("id")
|
85
|
+
assert_equal 1, search.count
|
86
|
+
|
87
|
+
assert_equal 2, neco.users.count
|
88
|
+
assert_equal 1, neco.users.all(:conditions => {:first_name_contains => "Ben"}).size
|
89
|
+
assert_equal 0, neco.users.all(:conditions => {:first_name_contains => "No one"}).size
|
90
|
+
assert_equal ben.id, neco.users.sum("id", :conditions => {:first_name_contains => "Ben"})
|
91
|
+
assert_equal 0, neco.users.sum("id", :conditions => {:first_name_contains => "No one"})
|
92
|
+
assert_equal ben.id, neco.users.average("id", :conditions => {:first_name_contains => "Ben"})
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|