searchlogic 1.5.3
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 +228 -0
- data/MIT-LICENSE +20 -0
- data/Manifest +123 -0
- data/README.rdoc +383 -0
- data/Rakefile +15 -0
- data/TODO.rdoc +6 -0
- data/examples/README.rdoc +4 -0
- data/init.rb +1 -0
- data/lib/searchlogic.rb +89 -0
- data/lib/searchlogic/active_record/associations.rb +52 -0
- data/lib/searchlogic/active_record/base.rb +218 -0
- data/lib/searchlogic/active_record/connection_adapters/mysql_adapter.rb +172 -0
- data/lib/searchlogic/active_record/connection_adapters/postgresql_adapter.rb +168 -0
- data/lib/searchlogic/active_record/connection_adapters/sqlite_adapter.rb +75 -0
- data/lib/searchlogic/condition/base.rb +159 -0
- data/lib/searchlogic/condition/begins_with.rb +17 -0
- data/lib/searchlogic/condition/blank.rb +21 -0
- data/lib/searchlogic/condition/child_of.rb +11 -0
- data/lib/searchlogic/condition/descendant_of.rb +24 -0
- data/lib/searchlogic/condition/ends_with.rb +17 -0
- data/lib/searchlogic/condition/equals.rb +27 -0
- data/lib/searchlogic/condition/greater_than.rb +15 -0
- data/lib/searchlogic/condition/greater_than_or_equal_to.rb +15 -0
- data/lib/searchlogic/condition/inclusive_descendant_of.rb +11 -0
- data/lib/searchlogic/condition/keywords.rb +47 -0
- data/lib/searchlogic/condition/less_than.rb +15 -0
- data/lib/searchlogic/condition/less_than_or_equal_to.rb +15 -0
- data/lib/searchlogic/condition/like.rb +15 -0
- data/lib/searchlogic/condition/nil.rb +21 -0
- data/lib/searchlogic/condition/not_begin_with.rb +20 -0
- data/lib/searchlogic/condition/not_blank.rb +19 -0
- data/lib/searchlogic/condition/not_end_with.rb +20 -0
- data/lib/searchlogic/condition/not_equal.rb +26 -0
- data/lib/searchlogic/condition/not_have_keywords.rb +20 -0
- data/lib/searchlogic/condition/not_like.rb +20 -0
- data/lib/searchlogic/condition/not_nil.rb +19 -0
- data/lib/searchlogic/condition/sibling_of.rb +14 -0
- data/lib/searchlogic/condition/tree.rb +17 -0
- data/lib/searchlogic/conditions/base.rb +484 -0
- data/lib/searchlogic/conditions/protection.rb +36 -0
- data/lib/searchlogic/config.rb +31 -0
- data/lib/searchlogic/config/helpers.rb +289 -0
- data/lib/searchlogic/config/search.rb +53 -0
- data/lib/searchlogic/core_ext/hash.rb +75 -0
- data/lib/searchlogic/helpers/control_types/link.rb +310 -0
- data/lib/searchlogic/helpers/control_types/links.rb +241 -0
- data/lib/searchlogic/helpers/control_types/remote_link.rb +87 -0
- data/lib/searchlogic/helpers/control_types/remote_links.rb +72 -0
- data/lib/searchlogic/helpers/control_types/remote_select.rb +36 -0
- data/lib/searchlogic/helpers/control_types/select.rb +82 -0
- data/lib/searchlogic/helpers/form.rb +208 -0
- data/lib/searchlogic/helpers/utilities.rb +197 -0
- data/lib/searchlogic/modifiers/absolute.rb +15 -0
- data/lib/searchlogic/modifiers/acos.rb +11 -0
- data/lib/searchlogic/modifiers/asin.rb +11 -0
- data/lib/searchlogic/modifiers/atan.rb +11 -0
- data/lib/searchlogic/modifiers/base.rb +27 -0
- data/lib/searchlogic/modifiers/ceil.rb +15 -0
- data/lib/searchlogic/modifiers/char_length.rb +15 -0
- data/lib/searchlogic/modifiers/cos.rb +15 -0
- data/lib/searchlogic/modifiers/cot.rb +15 -0
- data/lib/searchlogic/modifiers/day_of_month.rb +15 -0
- data/lib/searchlogic/modifiers/day_of_week.rb +15 -0
- data/lib/searchlogic/modifiers/day_of_year.rb +15 -0
- data/lib/searchlogic/modifiers/degrees.rb +11 -0
- data/lib/searchlogic/modifiers/exp.rb +15 -0
- data/lib/searchlogic/modifiers/floor.rb +15 -0
- data/lib/searchlogic/modifiers/hex.rb +11 -0
- data/lib/searchlogic/modifiers/hour.rb +11 -0
- data/lib/searchlogic/modifiers/log.rb +15 -0
- data/lib/searchlogic/modifiers/log10.rb +11 -0
- data/lib/searchlogic/modifiers/log2.rb +11 -0
- data/lib/searchlogic/modifiers/lower.rb +15 -0
- data/lib/searchlogic/modifiers/ltrim.rb +15 -0
- data/lib/searchlogic/modifiers/md5.rb +11 -0
- data/lib/searchlogic/modifiers/microseconds.rb +11 -0
- data/lib/searchlogic/modifiers/milliseconds.rb +11 -0
- data/lib/searchlogic/modifiers/minute.rb +15 -0
- data/lib/searchlogic/modifiers/month.rb +15 -0
- data/lib/searchlogic/modifiers/octal.rb +15 -0
- data/lib/searchlogic/modifiers/radians.rb +11 -0
- data/lib/searchlogic/modifiers/round.rb +11 -0
- data/lib/searchlogic/modifiers/rtrim.rb +15 -0
- data/lib/searchlogic/modifiers/second.rb +15 -0
- data/lib/searchlogic/modifiers/sign.rb +11 -0
- data/lib/searchlogic/modifiers/sin.rb +11 -0
- data/lib/searchlogic/modifiers/square_root.rb +15 -0
- data/lib/searchlogic/modifiers/tan.rb +15 -0
- data/lib/searchlogic/modifiers/trim.rb +15 -0
- data/lib/searchlogic/modifiers/upper.rb +15 -0
- data/lib/searchlogic/modifiers/week.rb +11 -0
- data/lib/searchlogic/modifiers/year.rb +11 -0
- data/lib/searchlogic/search/base.rb +148 -0
- data/lib/searchlogic/search/conditions.rb +53 -0
- data/lib/searchlogic/search/ordering.rb +244 -0
- data/lib/searchlogic/search/pagination.rb +121 -0
- data/lib/searchlogic/search/protection.rb +89 -0
- data/lib/searchlogic/search/searching.rb +31 -0
- data/lib/searchlogic/shared/utilities.rb +50 -0
- data/lib/searchlogic/shared/virtual_classes.rb +39 -0
- data/lib/searchlogic/version.rb +79 -0
- data/searchlogic.gemspec +39 -0
- data/test/fixtures/accounts.yml +15 -0
- data/test/fixtures/cats.yml +3 -0
- data/test/fixtures/dogs.yml +3 -0
- data/test/fixtures/orders.yml +14 -0
- data/test/fixtures/user_groups.yml +13 -0
- data/test/fixtures/users.yml +36 -0
- data/test/test_active_record_associations.rb +81 -0
- data/test/test_active_record_base.rb +93 -0
- data/test/test_condition_base.rb +52 -0
- data/test/test_condition_types.rb +143 -0
- data/test/test_conditions_base.rb +242 -0
- data/test/test_conditions_protection.rb +16 -0
- data/test/test_config.rb +23 -0
- data/test/test_helper.rb +134 -0
- data/test/test_search_base.rb +227 -0
- data/test/test_search_conditions.rb +19 -0
- data/test/test_search_ordering.rb +165 -0
- data/test/test_search_pagination.rb +72 -0
- data/test/test_search_protection.rb +24 -0
- data/test_libs/acts_as_tree.rb +98 -0
- data/test_libs/ordered_hash.rb +9 -0
- data/test_libs/rexml_fix.rb +14 -0
- metadata +317 -0
data/test/test_config.rb
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
|
2
|
+
|
|
3
|
+
class TestConfig < Test::Unit::TestCase
|
|
4
|
+
def test_per_page
|
|
5
|
+
Searchlogic::Config.search.per_page = 1
|
|
6
|
+
|
|
7
|
+
assert Account.count > 1
|
|
8
|
+
assert Account.all.size > 1
|
|
9
|
+
assert User.all.size > 1
|
|
10
|
+
assert User.find(:all, :per_page => 1).size == 1
|
|
11
|
+
assert User.new_search.all.size == 1
|
|
12
|
+
assert User.new_search(:per_page => nil).all.size > 1
|
|
13
|
+
|
|
14
|
+
Searchlogic::Config.search.per_page = nil
|
|
15
|
+
|
|
16
|
+
assert Account.count > 1
|
|
17
|
+
assert Account.all.size > 1
|
|
18
|
+
assert User.all.size > 1
|
|
19
|
+
assert User.find(:all, :per_page => 1).size == 1
|
|
20
|
+
assert User.new_search.all.size > 1
|
|
21
|
+
assert User.new_search(:per_page => 1).all.size == 1
|
|
22
|
+
end
|
|
23
|
+
end
|
data/test/test_helper.rb
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
require "test/unit"
|
|
2
|
+
require "rubygems"
|
|
3
|
+
require "ruby-debug"
|
|
4
|
+
require "active_record"
|
|
5
|
+
require File.dirname(__FILE__) + '/../test_libs/acts_as_tree'
|
|
6
|
+
require File.dirname(__FILE__) + '/../test_libs/ordered_hash'
|
|
7
|
+
require File.dirname(__FILE__) + '/../test_libs/rexml_fix'
|
|
8
|
+
require File.dirname(__FILE__) + '/../lib/searchlogic'
|
|
9
|
+
|
|
10
|
+
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :dbfile => ":memory:")
|
|
11
|
+
|
|
12
|
+
class Account < ActiveRecord::Base
|
|
13
|
+
has_one :admin, :class_name => "User", :conditions => {:first_name => "Ben"}
|
|
14
|
+
has_many :users, :dependent => :destroy
|
|
15
|
+
has_many :orders, :through => :users
|
|
16
|
+
|
|
17
|
+
named_scope :scope1, :conditions => {:users => {:first_name_contains => "Ben"}}
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
class UserGroup < ActiveRecord::Base
|
|
21
|
+
has_and_belongs_to_many :users
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
class User < ActiveRecord::Base
|
|
25
|
+
acts_as_tree
|
|
26
|
+
belongs_to :account
|
|
27
|
+
has_many :orders, :dependent => :destroy
|
|
28
|
+
has_many :cats, :dependent => :destroy
|
|
29
|
+
has_many :dogs, :dependent => :destroy
|
|
30
|
+
has_and_belongs_to_many :user_groups
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
class Order < ActiveRecord::Base
|
|
34
|
+
belongs_to :user
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# STI
|
|
38
|
+
class Animal < ActiveRecord::Base
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
class Dog < Animal
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
class Cat < Animal
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
class Test::Unit::TestCase
|
|
48
|
+
def setup_db
|
|
49
|
+
ActiveRecord::Schema.define(:version => 1) do
|
|
50
|
+
create_table :accounts do |t|
|
|
51
|
+
t.datetime :created_at
|
|
52
|
+
t.datetime :updated_at
|
|
53
|
+
t.string :name
|
|
54
|
+
t.boolean :active
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
create_table :user_groups do |t|
|
|
58
|
+
t.datetime :created_at
|
|
59
|
+
t.datetime :updated_at
|
|
60
|
+
t.string :name
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
create_table :user_groups_users, :id => false do |t|
|
|
64
|
+
t.integer :user_group_id
|
|
65
|
+
t.integer :user_id
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
create_table :users do |t|
|
|
69
|
+
t.datetime :created_at
|
|
70
|
+
t.datetime :updated_at
|
|
71
|
+
t.integer :account_id
|
|
72
|
+
t.integer :parent_id
|
|
73
|
+
t.string :first_name
|
|
74
|
+
t.string :last_name
|
|
75
|
+
t.boolean :active
|
|
76
|
+
t.text :bio
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
create_table :orders do |t|
|
|
80
|
+
t.datetime :created_at
|
|
81
|
+
t.datetime :updated_at
|
|
82
|
+
t.integer :user_id
|
|
83
|
+
t.float :total
|
|
84
|
+
t.text :description
|
|
85
|
+
t.binary :receipt
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
create_table :animals do |t|
|
|
89
|
+
t.datetime :created_at
|
|
90
|
+
t.datetime :updated_at
|
|
91
|
+
t.string :type
|
|
92
|
+
t.text :description
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def load_fixtures
|
|
98
|
+
fixtures = [:accounts, :orders, :users, :user_groups, :dogs, :cats]
|
|
99
|
+
fixtures.each do |fixture|
|
|
100
|
+
records = YAML.load(File.read(File.dirname(__FILE__) + "/fixtures/#{fixture.to_s}.yml"))
|
|
101
|
+
records.each do |name, attributes|
|
|
102
|
+
record = fixture.to_s.singularize.classify.constantize.new
|
|
103
|
+
attributes.each { |k, v| record.send("#{k}=", v) }
|
|
104
|
+
record.save!
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# Not sure why I have to do this, but sick of dealing with it
|
|
109
|
+
UserGroup.all.each do |user_group|
|
|
110
|
+
user_ids = user_group.user_ids.uniq!
|
|
111
|
+
user_group.users.clear
|
|
112
|
+
user_group.user_ids = user_ids
|
|
113
|
+
user_group.save!
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Create the cached virtual classes
|
|
117
|
+
fixtures.each { |fixture| fixture.to_s.classify.constantize.new_search }
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def teardown_db
|
|
121
|
+
ActiveRecord::Base.connection.tables.each do |table|
|
|
122
|
+
ActiveRecord::Base.connection.drop_table(table)
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def setup
|
|
127
|
+
setup_db
|
|
128
|
+
load_fixtures
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def teardown
|
|
132
|
+
teardown_db
|
|
133
|
+
end
|
|
134
|
+
end
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
|
2
|
+
|
|
3
|
+
class TestSearchBase < Test::Unit::TestCase
|
|
4
|
+
def test_needed
|
|
5
|
+
assert Searchlogic::Search::Base.needed?(Account, :page => 2, :conditions => {:name => "Ben"})
|
|
6
|
+
assert !Searchlogic::Search::Base.needed?(Account, :conditions => {:name => "Ben"})
|
|
7
|
+
assert Searchlogic::Search::Base.needed?(Account, :limit => 2, :conditions => {:name_contains => "Ben"})
|
|
8
|
+
assert !Searchlogic::Search::Base.needed?(Account, :limit => 2)
|
|
9
|
+
assert Searchlogic::Search::Base.needed?(Account, :per_page => 2)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def test_initialize
|
|
13
|
+
assert_nothing_raised { Account.new_search }
|
|
14
|
+
search = Account.new_search!(:conditions => {:name_like => "binary"}, :page => 2, :limit => 10, :readonly => true)
|
|
15
|
+
assert_equal Account, search.klass
|
|
16
|
+
assert_equal "binary", search.conditions.name_like
|
|
17
|
+
assert_equal 2, search.page
|
|
18
|
+
assert_equal 10, search.limit
|
|
19
|
+
assert_equal true, search.readonly
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def test_acting_as_filter
|
|
23
|
+
search = Account.new_search
|
|
24
|
+
search.acting_as_filter = true
|
|
25
|
+
assert search.acting_as_filter?
|
|
26
|
+
search.acting_as_filter = false
|
|
27
|
+
assert !search.acting_as_filter?
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def test_setting_first_level_options
|
|
31
|
+
search = Account.new_search!(:include => :users, :joins => :users, :offset => 5, :limit => 20, :order => "name ASC", :select => "name", :readonly => true, :group => "name", :from => "accounts", :lock => true)
|
|
32
|
+
assert_equal :users, search.include
|
|
33
|
+
assert_equal :users, search.joins
|
|
34
|
+
assert_equal 5, search.offset
|
|
35
|
+
assert_equal 20, search.limit
|
|
36
|
+
assert_equal "name ASC", search.order
|
|
37
|
+
assert_equal "name", search.select
|
|
38
|
+
assert_equal true, search.readonly
|
|
39
|
+
assert_equal "name", search.group
|
|
40
|
+
assert_equal "accounts", search.from
|
|
41
|
+
assert_equal true, search.lock
|
|
42
|
+
|
|
43
|
+
search = Account.new_search(:per_page => nil)
|
|
44
|
+
|
|
45
|
+
search.include = :users
|
|
46
|
+
assert_equal :users, search.include
|
|
47
|
+
|
|
48
|
+
# treat it like SQL, just like AR
|
|
49
|
+
search.joins = "users"
|
|
50
|
+
assert_equal "users", search.joins
|
|
51
|
+
|
|
52
|
+
search.page = 5
|
|
53
|
+
assert_equal 1, search.page
|
|
54
|
+
assert_equal nil, search.offset
|
|
55
|
+
|
|
56
|
+
search.limit = 20
|
|
57
|
+
assert_equal search.limit, 20
|
|
58
|
+
assert_equal search.per_page, 20
|
|
59
|
+
assert_equal search.page, 5
|
|
60
|
+
assert_equal search.offset, 80
|
|
61
|
+
search.limit = nil
|
|
62
|
+
assert_equal nil, search.limit
|
|
63
|
+
assert_equal nil, search.per_page
|
|
64
|
+
assert_equal 1, search.page
|
|
65
|
+
assert_equal nil, search.offset
|
|
66
|
+
|
|
67
|
+
search.offset = 50
|
|
68
|
+
assert_equal 50, search.offset
|
|
69
|
+
assert_equal 1, search.page
|
|
70
|
+
search.limit = 50
|
|
71
|
+
assert_equal 2, search.page
|
|
72
|
+
search.offset = nil
|
|
73
|
+
assert_equal nil, search.offset
|
|
74
|
+
assert_equal 1, search.page
|
|
75
|
+
|
|
76
|
+
search.per_page = 2
|
|
77
|
+
assert_equal 2, search.per_page
|
|
78
|
+
assert_equal 2, search.limit
|
|
79
|
+
search.offset = 50
|
|
80
|
+
assert_equal 26, search.page
|
|
81
|
+
assert_equal 50, search.offset
|
|
82
|
+
|
|
83
|
+
search.order = "name ASC"
|
|
84
|
+
assert_equal search.order, "name ASC"
|
|
85
|
+
|
|
86
|
+
search.select = "name"
|
|
87
|
+
assert_equal search.select, "name"
|
|
88
|
+
|
|
89
|
+
search.readonly = true
|
|
90
|
+
assert_equal search.readonly, true
|
|
91
|
+
|
|
92
|
+
search.group = "name"
|
|
93
|
+
assert_equal search.group, "name"
|
|
94
|
+
|
|
95
|
+
search.from = "accounts"
|
|
96
|
+
assert_equal search.from, "accounts"
|
|
97
|
+
|
|
98
|
+
search.lock = true
|
|
99
|
+
assert_equal search.lock, true
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def test_joins
|
|
103
|
+
search = Account.new_search
|
|
104
|
+
assert_equal nil, search.joins
|
|
105
|
+
search.conditions.name_contains = "Binary"
|
|
106
|
+
assert_equal nil, search.joins
|
|
107
|
+
search.conditions.users.first_name_contains = "Ben"
|
|
108
|
+
assert_equal(:users, search.joins)
|
|
109
|
+
search.conditions.users.orders.id_gt = 2
|
|
110
|
+
assert_equal({:users => :orders}, search.joins)
|
|
111
|
+
search.conditions.users.reset_orders!
|
|
112
|
+
assert_equal(:users, search.joins)
|
|
113
|
+
search.conditions.users.orders.id_gt = 2
|
|
114
|
+
search.conditions.reset_users!
|
|
115
|
+
assert_equal nil, search.joins
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def test_limit
|
|
119
|
+
search = Account.new_search
|
|
120
|
+
search.limit = 10
|
|
121
|
+
assert_equal 10, search.limit
|
|
122
|
+
search.page = 2
|
|
123
|
+
assert_equal 10, search.offset
|
|
124
|
+
search.limit = 25
|
|
125
|
+
assert_equal 25, search.offset
|
|
126
|
+
assert_equal 2, search.page
|
|
127
|
+
search.page = 5
|
|
128
|
+
assert_equal 5, search.page
|
|
129
|
+
assert_equal 25, search.limit
|
|
130
|
+
search.limit = 3
|
|
131
|
+
assert_equal 12, search.offset
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def test_options
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def test_sanitize
|
|
138
|
+
search = Account.new_search
|
|
139
|
+
search.per_page = 2
|
|
140
|
+
search.conditions.name_like = "Binary"
|
|
141
|
+
search.conditions.users.id_greater_than = 2
|
|
142
|
+
search.page = 3
|
|
143
|
+
search.readonly = true
|
|
144
|
+
assert_equal({:joins => :users, :offset => 4, :select => "DISTINCT \"accounts\".*", :readonly => true, :conditions => ["(\"accounts\".\"name\" LIKE ?) AND (\"users\".\"id\" > ?)", "%Binary%", 2], :limit => 2 }, search.sanitize)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def test_scope
|
|
148
|
+
search = Account.new_search!
|
|
149
|
+
search.conditions = "some sql"
|
|
150
|
+
conditions = search.conditions
|
|
151
|
+
assert_equal "some sql", search.conditions.conditions
|
|
152
|
+
search.conditions = nil
|
|
153
|
+
assert_equal nil, search.conditions.conditions
|
|
154
|
+
search.conditions = "some sql"
|
|
155
|
+
assert_equal "some sql", search.conditions.conditions
|
|
156
|
+
search.conditions = "some sql"
|
|
157
|
+
assert_equal "some sql", search.conditions.conditions
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def test_searching
|
|
161
|
+
search = Account.new_search
|
|
162
|
+
search.conditions.name_like = "Binary"
|
|
163
|
+
assert_equal [Account.find(1), Account.find(3)], search.all
|
|
164
|
+
assert_equal [Account.find(1), Account.find(3)], search.find(:all)
|
|
165
|
+
assert_equal Account.find(1), search.first
|
|
166
|
+
assert_equal Account.find(1), search.find(:first)
|
|
167
|
+
|
|
168
|
+
search.per_page = 20
|
|
169
|
+
search.page = 2
|
|
170
|
+
|
|
171
|
+
assert_equal [], search.all
|
|
172
|
+
assert_equal [], search.find(:all)
|
|
173
|
+
assert_equal nil, search.first
|
|
174
|
+
assert_equal nil, search.find(:first)
|
|
175
|
+
|
|
176
|
+
search.per_page = 0
|
|
177
|
+
search.page = nil
|
|
178
|
+
search.conditions.users.first_name_contains = "Ben"
|
|
179
|
+
search.conditions.users.orders.description_keywords = "products, &*ap#ple $%^&*"
|
|
180
|
+
assert_equal [Account.find(1)], search.all
|
|
181
|
+
assert_equal [Account.find(1)], search.find(:all)
|
|
182
|
+
assert_equal Account.find(1), search.first
|
|
183
|
+
assert_equal Account.find(1), search.find(:first)
|
|
184
|
+
|
|
185
|
+
search = Account.new_search
|
|
186
|
+
search.select = "id, name"
|
|
187
|
+
assert_equal Account.all, search.all
|
|
188
|
+
|
|
189
|
+
search = Account.scope1.new_search!(:conditions => {:users => {:first_name_starts_with => "Ben"}})
|
|
190
|
+
assert_equal [Account.find(1)], search.all
|
|
191
|
+
search2 = search.dup
|
|
192
|
+
assert_equal [Account.find(1)], search2.all
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
def test_calculations
|
|
196
|
+
search = Account.new_search
|
|
197
|
+
search.conditions.name_like = "Binary"
|
|
198
|
+
assert_equal 2, search.average('id')
|
|
199
|
+
assert_equal 2, search.calculate(:avg, 'id')
|
|
200
|
+
assert_equal 3, search.calculate(:max, 'id')
|
|
201
|
+
assert_equal 2, search.count
|
|
202
|
+
assert_equal 3, search.maximum('id')
|
|
203
|
+
assert_equal 1, search.minimum('id')
|
|
204
|
+
assert_equal 4, search.sum('id')
|
|
205
|
+
|
|
206
|
+
search.readonly = true
|
|
207
|
+
assert_equal 4, search.sum('id')
|
|
208
|
+
|
|
209
|
+
search = Account.new_search(:conditions => {:users => {:orders => {:id_gt => 1}}})
|
|
210
|
+
assert_equal 1, search.count
|
|
211
|
+
|
|
212
|
+
search = Order.new_search(:conditions => {:user => {:account => {:id_gt => 1}}})
|
|
213
|
+
assert_equal 1, search.count
|
|
214
|
+
|
|
215
|
+
search = UserGroup.new_search(:conditions => {:users => {:orders => {:id_gt => 1}}})
|
|
216
|
+
assert_equal 1, search.count
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
def test_inspect
|
|
220
|
+
search = Account.new_search
|
|
221
|
+
assert_nothing_raised { search.inspect }
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
def test_sti
|
|
225
|
+
|
|
226
|
+
end
|
|
227
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
|
2
|
+
|
|
3
|
+
class TestSearchConditions < Test::Unit::TestCase
|
|
4
|
+
def test_conditions
|
|
5
|
+
search = Account.new_search
|
|
6
|
+
assert_kind_of Searchlogic::Conditions::Base, search.conditions
|
|
7
|
+
assert_equal search.conditions.klass, Account
|
|
8
|
+
|
|
9
|
+
search.conditions = {:name_like => "Binary"}
|
|
10
|
+
assert_kind_of Searchlogic::Conditions::Base, search.conditions
|
|
11
|
+
|
|
12
|
+
search = Account.new_search(:conditions => {:name_like => "Ben"})
|
|
13
|
+
assert_equal({:name_like => "Ben"}, search.conditions.conditions)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def test_sanitize
|
|
17
|
+
# This is tested in test_search_base
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
|
2
|
+
|
|
3
|
+
class TestSearchOrdering < Test::Unit::TestCase
|
|
4
|
+
def test_order_to_order_by
|
|
5
|
+
search = Account.new_search
|
|
6
|
+
search.order = "name"
|
|
7
|
+
assert_equal "name", search.order_by
|
|
8
|
+
search.order = "users.first_name"
|
|
9
|
+
assert_equal({"users" => "first_name"}, search.order_by)
|
|
10
|
+
search.order = "\"users\".\"first_name\""
|
|
11
|
+
assert_equal({"users" => "first_name"}, search.order_by)
|
|
12
|
+
search.order = "\"users\".\"first_name\", name ASC"
|
|
13
|
+
assert_equal([{"users" => "first_name"}, "name"], search.order_by)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def test_order_by
|
|
17
|
+
search = Account.new_search
|
|
18
|
+
assert_equal nil, search.order
|
|
19
|
+
assert_equal nil, search.order_by
|
|
20
|
+
|
|
21
|
+
search.order_by = "first_name"
|
|
22
|
+
assert_equal "first_name", search.order_by
|
|
23
|
+
assert_equal "\"accounts\".\"first_name\"", search.order
|
|
24
|
+
|
|
25
|
+
search.order_by = "last_name"
|
|
26
|
+
assert_equal "last_name", search.order_by
|
|
27
|
+
assert_equal "\"accounts\".\"last_name\"", search.order
|
|
28
|
+
|
|
29
|
+
search.order_by = ["first_name", "last_name"]
|
|
30
|
+
assert_equal ["first_name", "last_name"], search.order_by
|
|
31
|
+
assert_equal "\"accounts\".\"first_name\", \"accounts\".\"last_name\"", search.order
|
|
32
|
+
|
|
33
|
+
search.order = "created_at DESC"
|
|
34
|
+
assert_equal "created_at", search.order_by
|
|
35
|
+
assert_equal "created_at DESC", search.order
|
|
36
|
+
|
|
37
|
+
search.order = "\"users\".updated_at ASC"
|
|
38
|
+
assert_equal({"users" => "updated_at"}, search.order_by)
|
|
39
|
+
assert_equal "\"users\".updated_at ASC", search.order
|
|
40
|
+
|
|
41
|
+
search.order = "`users`.first_name DESC"
|
|
42
|
+
assert_equal({"users" => "first_name"}, search.order_by)
|
|
43
|
+
assert_equal "`users`.first_name DESC", search.order
|
|
44
|
+
|
|
45
|
+
search.order = "`accounts`.name DESC"
|
|
46
|
+
assert_equal "name", search.order_by
|
|
47
|
+
assert_equal "`accounts`.name DESC", search.order
|
|
48
|
+
|
|
49
|
+
search.order = "accounts.name DESC"
|
|
50
|
+
assert_equal "name", search.order_by
|
|
51
|
+
assert_equal "accounts.name DESC", search.order
|
|
52
|
+
|
|
53
|
+
search.order = "`users`.first_name DESC, name DESC, `accounts`.id DESC"
|
|
54
|
+
assert_equal [{"users" => "first_name"}, "name", "id"], search.order_by
|
|
55
|
+
assert_equal "`users`.first_name DESC, name DESC, `accounts`.id DESC", search.order
|
|
56
|
+
|
|
57
|
+
search.order = "`users`.first_name DESC, `line_items`.id DESC, `accounts`.id DESC"
|
|
58
|
+
assert_equal [{"users" => "first_name"}, "id"], search.order_by
|
|
59
|
+
assert_equal "`users`.first_name DESC, `line_items`.id DESC, `accounts`.id DESC", search.order
|
|
60
|
+
|
|
61
|
+
search.order = "`line_items`.id DESC"
|
|
62
|
+
assert_equal nil, search.order_by
|
|
63
|
+
assert_equal "`line_items`.id DESC", search.order
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def test_order_as
|
|
67
|
+
search = Account.new_search
|
|
68
|
+
assert_equal nil, search.order
|
|
69
|
+
assert_equal nil, search.order_as
|
|
70
|
+
assert search.asc?
|
|
71
|
+
assert !search.desc?
|
|
72
|
+
|
|
73
|
+
search.order_as = "DESC"
|
|
74
|
+
assert_equal nil, search.order_as
|
|
75
|
+
assert !search.desc?
|
|
76
|
+
assert_equal nil, search.order
|
|
77
|
+
|
|
78
|
+
search.order_by = "name"
|
|
79
|
+
assert_equal "\"accounts\".\"name\" DESC", search.order
|
|
80
|
+
|
|
81
|
+
search.order_as = "ASC"
|
|
82
|
+
assert_equal "\"accounts\".\"name\" ASC", search.order
|
|
83
|
+
assert search.asc?
|
|
84
|
+
|
|
85
|
+
search.order = "id ASC"
|
|
86
|
+
assert_equal "ASC", search.order_as
|
|
87
|
+
assert search.asc?
|
|
88
|
+
assert_equal "id ASC", search.order
|
|
89
|
+
|
|
90
|
+
search.order = "id DESC"
|
|
91
|
+
assert_equal "DESC", search.order_as
|
|
92
|
+
assert search.desc?
|
|
93
|
+
assert_equal "id DESC", search.order
|
|
94
|
+
|
|
95
|
+
search.order_by = "name"
|
|
96
|
+
assert_equal "DESC", search.order_as
|
|
97
|
+
assert search.desc?
|
|
98
|
+
assert_equal "\"accounts\".\"name\" DESC", search.order
|
|
99
|
+
|
|
100
|
+
assert_raise(ArgumentError) { search.order_as = "awesome" }
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def test_order_by_auto_joins
|
|
104
|
+
search = Account.new_search
|
|
105
|
+
assert_equal nil, search.order_by_auto_joins
|
|
106
|
+
search.order_by = :name
|
|
107
|
+
assert_equal nil, search.order_by_auto_joins
|
|
108
|
+
search.order_by = {:users => :first_name}
|
|
109
|
+
assert_equal :users, search.order_by_auto_joins
|
|
110
|
+
search.order_by = [{:users => :first_name}, {:orders => :total}, {:users => {:user_groups => :name}}]
|
|
111
|
+
assert_equal [:users, :orders, {:users => :user_groups}], search.order_by_auto_joins
|
|
112
|
+
search.priority_order_by = {:users => :first_name}
|
|
113
|
+
assert_equal [:users, :orders, {:users => :user_groups}], search.order_by_auto_joins
|
|
114
|
+
search.priority_order_by = {:users => {:orders => :total}}
|
|
115
|
+
assert_equal({:users => :orders}, search.priority_order_by_auto_joins)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def test_priority_order_by
|
|
119
|
+
search = Account.new_search
|
|
120
|
+
assert_equal nil, search.priority_order
|
|
121
|
+
assert_equal nil, search.priority_order_by
|
|
122
|
+
assert_equal nil, search.priority_order_as
|
|
123
|
+
|
|
124
|
+
search.priority_order_by = :name
|
|
125
|
+
assert_equal "\"accounts\".\"name\"", search.priority_order
|
|
126
|
+
assert_equal "\"accounts\".\"name\"", search.sanitize[:order]
|
|
127
|
+
assert_equal nil, search.order
|
|
128
|
+
assert_equal :name, search.priority_order_by
|
|
129
|
+
assert_equal nil, search.priority_order_as
|
|
130
|
+
|
|
131
|
+
search.order_by = :id
|
|
132
|
+
assert_equal "\"accounts\".\"name\", \"accounts\".\"id\"", search.sanitize[:order]
|
|
133
|
+
search.order_as = "DESC"
|
|
134
|
+
assert_equal "\"accounts\".\"name\", \"accounts\".\"id\" DESC", search.sanitize[:order]
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def test_priority_order_as
|
|
138
|
+
search = Account.new_search
|
|
139
|
+
assert_equal nil, search.priority_order_as
|
|
140
|
+
assert_equal nil, search.order_as
|
|
141
|
+
search.priority_order_as = "ASC"
|
|
142
|
+
assert_equal nil, search.priority_order_as
|
|
143
|
+
assert_equal nil, search.order_as
|
|
144
|
+
search.priority_order_by = :name
|
|
145
|
+
assert_equal "ASC", search.priority_order_as
|
|
146
|
+
assert_equal nil, search.order_as
|
|
147
|
+
search.priority_order_as = "DESC"
|
|
148
|
+
assert_equal "DESC", search.priority_order_as
|
|
149
|
+
assert_equal nil, search.order_as
|
|
150
|
+
assert_raise(ArgumentError) { search.priority_order_as = "awesome" }
|
|
151
|
+
search.priority_order = nil
|
|
152
|
+
assert_equal nil, search.priority_order_as
|
|
153
|
+
assert_equal nil, search.order_as
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def test_sanitize
|
|
157
|
+
# tested in test_priority_order_by
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def test_ordering_includes_blank
|
|
161
|
+
search = User.new_search!
|
|
162
|
+
search.order_by = {:account => :name}
|
|
163
|
+
assert_equal 4, search.count
|
|
164
|
+
end
|
|
165
|
+
end
|