searchlogic 1.5.3 → 1.5.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. data/CHANGELOG.rdoc +6 -0
  2. data/Manifest +37 -18
  3. data/README.rdoc +13 -17
  4. data/TODO.rdoc +1 -3
  5. data/lib/searchlogic.rb +6 -6
  6. data/lib/searchlogic/active_record/connection_adapters/sqlite_adapter.rb +9 -9
  7. data/lib/searchlogic/conditions/base.rb +20 -6
  8. data/lib/searchlogic/search/base.rb +0 -5
  9. data/lib/searchlogic/search/searching.rb +3 -1
  10. data/lib/searchlogic/version.rb +1 -1
  11. data/searchlogic.gemspec +4 -4
  12. data/test/active_record_tests/associations_test.rb +95 -0
  13. data/test/active_record_tests/base_test.rb +108 -0
  14. data/test/condition_tests/base_test.rb +54 -0
  15. data/test/condition_tests/begins_with_test.rb +11 -0
  16. data/test/condition_tests/blank_test.rb +31 -0
  17. data/test/condition_tests/child_of_test.rb +17 -0
  18. data/test/condition_tests/descendant_of_test.rb +16 -0
  19. data/test/condition_tests/ends_with_test.rb +11 -0
  20. data/test/condition_tests/equals_test.rb +19 -0
  21. data/test/condition_tests/greater_than_or_equal_to_test.rb +11 -0
  22. data/test/condition_tests/greater_than_test.rb +11 -0
  23. data/test/condition_tests/inclusive_descendant_of_test.rb +16 -0
  24. data/test/condition_tests/keyswords_test.rb +19 -0
  25. data/test/condition_tests/less_than_or_equal_to_test.rb +11 -0
  26. data/test/condition_tests/less_than_test.rb +11 -0
  27. data/test/condition_tests/like_test.rb +11 -0
  28. data/test/condition_tests/nil_test.rb +31 -0
  29. data/test/condition_tests/not_begin_with_test.rb +8 -0
  30. data/test/condition_tests/not_blank_test.rb +8 -0
  31. data/test/condition_tests/not_end_with_test.rb +8 -0
  32. data/test/condition_tests/not_equal_test.rb +19 -0
  33. data/test/condition_tests/not_have_keywords_test.rb +8 -0
  34. data/test/condition_tests/not_like_test.rb +8 -0
  35. data/test/condition_tests/not_nil_test.rb +13 -0
  36. data/test/condition_tests/sibling_of_test.rb +15 -0
  37. data/test/conditions_tests/base_test.rb +221 -0
  38. data/test/conditions_tests/protection_test.rb +18 -0
  39. data/test/{test_config.rb → config_test.rb} +1 -1
  40. data/test/fixtures/accounts.yml +0 -3
  41. data/test/fixtures/animals.yml +7 -0
  42. data/test/fixtures/orders.yml +2 -4
  43. data/test/fixtures/user_groups.yml +3 -9
  44. data/test/fixtures/users.yml +6 -12
  45. data/{test_libs → test/libs}/acts_as_tree.rb +0 -0
  46. data/{test_libs → test/libs}/rexml_fix.rb +0 -0
  47. data/test/modifier_tests/day_of_month_test.rb +16 -0
  48. data/test/search_tests/base_test.rb +237 -0
  49. data/test/search_tests/conditions_test.rb +21 -0
  50. data/test/search_tests/ordering_test.rb +167 -0
  51. data/test/search_tests/pagination_test.rb +74 -0
  52. data/test/search_tests/protection_test.rb +26 -0
  53. data/test/test_helper.rb +79 -83
  54. metadata +73 -32
  55. data/examples/README.rdoc +0 -4
  56. data/test/fixtures/cats.yml +0 -3
  57. data/test/fixtures/dogs.yml +0 -3
  58. data/test/test_active_record_associations.rb +0 -81
  59. data/test/test_active_record_base.rb +0 -93
  60. data/test/test_condition_base.rb +0 -52
  61. data/test/test_condition_types.rb +0 -143
  62. data/test/test_conditions_base.rb +0 -242
  63. data/test/test_conditions_protection.rb +0 -16
  64. data/test/test_search_base.rb +0 -227
  65. data/test/test_search_conditions.rb +0 -19
  66. data/test/test_search_ordering.rb +0 -165
  67. data/test/test_search_pagination.rb +0 -72
  68. data/test/test_search_protection.rb +0 -24
  69. 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/cats.yml
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/test_active_record_associations.rb
108
- test/test_active_record_base.rb
109
- test/test_condition_base.rb
110
- test/test_condition_types.rb
111
- test/test_conditions_base.rb
112
- test/test_conditions_protection.rb
113
- test/test_config.rb
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 orgasmic. Maybe not orgasmic, but you will get aroused. So go grab a towel and let's dive in.
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 searchlogic, integration into rails
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
- - if @users_count > 0
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
- = per_page_select
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
- search.conditions.first_name_contains = "Ben"
191
- search.conditions.any = true # can set this to "true" or "1" or "yes"
192
- search.all # will join all conditions with "or" instead of "and"
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
- == Always use protection...against SQL injections
217
+ == Protection against SQL injections
222
218
 
223
- If there is one thing we all know, it's to always use protection against SQL injections. 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!.
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
- SEARCHGASM_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
- SEARCHGASM_CONDITIONS.each { |condition| require "searchlogic/condition/#{condition}" }
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
- SEARCHGASM_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
- SEARCHGASM_MODIFIERS.each { |modifier| require "searchlogic/modifiers/#{modifier}" }
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
- SEARCHGASM_CONDITIONS.each { |condition| Base.register_condition("Searchlogic::Condition::#{condition.to_s.camelize}".constantize) }
83
- SEARCHGASM_MODIFIERS.each { |modifier| Base.register_modifier("Searchlogic::Modifiers::#{modifier.to_s.camelize}".constantize) }
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.name_for_column(column)
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::Seearch::Conditions.register_condition(SoundsLike)
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
- @any == true || @any == "true" || @any == "1" || @any == "yes"
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 if options[:column].class < ::ActiveRecord::ConnectionAdapters::Column
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
@@ -67,7 +67,7 @@ module Searchlogic
67
67
 
68
68
  MAJOR = 1
69
69
  MINOR = 5
70
- TINY = 3
70
+ TINY = 4
71
71
 
72
72
  # The current version as a Version instance
73
73
  CURRENT = new(MAJOR, MINOR, TINY)
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"
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-03}
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", "examples/README.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/fixtures/accounts.yml", "test/fixtures/cats.yml", "test/fixtures/dogs.yml", "test/fixtures/orders.yml", "test/fixtures/user_groups.yml", "test/fixtures/users.yml", "test/test_active_record_associations.rb", "test/test_active_record_base.rb", "test/test_condition_base.rb", "test/test_condition_types.rb", "test/test_conditions_base.rb", "test/test_conditions_protection.rb", "test/test_config.rb", "test/test_helper.rb", "test/test_search_base.rb", "test/test_search_conditions.rb", "test/test_search_ordering.rb", "test/test_search_pagination.rb", "test/test_search_protection.rb", "test_libs/acts_as_tree.rb", "test_libs/ordered_hash.rb", "test_libs/rexml_fix.rb", "TODO.rdoc", "searchlogic.gemspec"]
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/test_active_record_associations.rb", "test/test_active_record_base.rb", "test/test_condition_base.rb", "test/test_condition_types.rb", "test/test_conditions_base.rb", "test/test_conditions_protection.rb", "test/test_config.rb", "test/test_helper.rb", "test/test_search_base.rb", "test/test_search_conditions.rb", "test/test_search_ordering.rb", "test/test_search_pagination.rb", "test/test_search_protection.rb"]
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