searchgasm 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +1 -0
- data/MIT-LICENSE +20 -0
- data/Manifest +28 -0
- data/README.mdown +240 -0
- data/Rakefile +17 -0
- data/init.rb +1 -0
- data/lib/searchgasm/active_record/associations.rb +56 -0
- data/lib/searchgasm/active_record/base.rb +70 -0
- data/lib/searchgasm/active_record/protection.rb +37 -0
- data/lib/searchgasm/helpers.rb +100 -0
- data/lib/searchgasm/search/base.rb +142 -0
- data/lib/searchgasm/search/condition.rb +168 -0
- data/lib/searchgasm/search/conditions.rb +154 -0
- data/lib/searchgasm/search/utilities.rb +34 -0
- data/lib/searchgasm/version.rb +82 -0
- data/lib/searchgasm.rb +9 -0
- data/searchgasm.gemspec +124 -0
- data/test/fixtures/accounts.yml +15 -0
- data/test/fixtures/orders.yml +14 -0
- data/test/fixtures/users.yml +27 -0
- data/test/libs/acts_as_tree.rb +98 -0
- data/test/libs/rexml_fix.rb +14 -0
- data/test/test_active_record_associations.rb +38 -0
- data/test/test_active_record_base.rb +48 -0
- data/test/test_active_record_protection.rb +0 -0
- data/test/test_helper.rb +78 -0
- data/test/test_searchgasm_base.rb +116 -0
- data/test/test_searchgasm_condition.rb +149 -0
- data/test/test_searchgasm_conditions.rb +137 -0
- metadata +122 -0
@@ -0,0 +1,149 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
+
|
3
|
+
class TestSearchgasmCondition < Test::Unit::TestCase
|
4
|
+
fixtures :accounts, :users, :orders
|
5
|
+
|
6
|
+
def setup
|
7
|
+
setup_db
|
8
|
+
load_fixtures
|
9
|
+
end
|
10
|
+
|
11
|
+
def teardown
|
12
|
+
teardown_db
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_generate_name
|
16
|
+
name = BinaryLogic::Searchgasm::Search::Condition.generate_name(Account.columns_hash["id"], :equals)
|
17
|
+
assert_equal name, "id_equals"
|
18
|
+
|
19
|
+
name = BinaryLogic::Searchgasm::Search::Condition.generate_name("test", :equals)
|
20
|
+
assert_equal name, "test_equals"
|
21
|
+
|
22
|
+
name = BinaryLogic::Searchgasm::Search::Condition.generate_name("test", "")
|
23
|
+
assert_equal name, "test"
|
24
|
+
|
25
|
+
name = BinaryLogic::Searchgasm::Search::Condition.generate_name("test", nil)
|
26
|
+
assert_equal name, "test"
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_initialize
|
30
|
+
condition = BinaryLogic::Searchgasm::Search::Condition.new(:equals, Account, Account.columns_hash["id"])
|
31
|
+
assert_equal condition.condition, :equals
|
32
|
+
assert_equal condition.name, "id_equals"
|
33
|
+
assert_equal condition.klass, Account
|
34
|
+
assert_equal condition.column, Account.columns_hash["id"]
|
35
|
+
|
36
|
+
condition = BinaryLogic::Searchgasm::Search::Condition.new(:equals, Account, "id")
|
37
|
+
assert_equal condition.column, Account.columns_hash["id"]
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_explicitly_set_value
|
41
|
+
condition = BinaryLogic::Searchgasm::Search::Condition.new(:equals, Account, Account.columns_hash["id"])
|
42
|
+
assert !condition.explicitly_set_value?
|
43
|
+
condition.value = nil
|
44
|
+
assert condition.explicitly_set_value?
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_ignore_blanks?
|
48
|
+
condition = BinaryLogic::Searchgasm::Search::Condition.new(:equals, Account, Account.columns_hash["id"])
|
49
|
+
assert !condition.ignore_blanks?
|
50
|
+
|
51
|
+
condition = BinaryLogic::Searchgasm::Search::Condition.new(:greater_than, Account, Account.columns_hash["id"])
|
52
|
+
assert condition.ignore_blanks?
|
53
|
+
|
54
|
+
condition = BinaryLogic::Searchgasm::Search::Condition.new(:contains, Account, Account.columns_hash["name"])
|
55
|
+
assert condition.ignore_blanks?
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_sanitize
|
59
|
+
condition = BinaryLogic::Searchgasm::Search::Condition.new(:equals, Account, Account.columns_hash["id"])
|
60
|
+
condition.value = 12
|
61
|
+
assert_equal condition.sanitize, ["\"accounts\".\"id\" = 12"]
|
62
|
+
|
63
|
+
condition = BinaryLogic::Searchgasm::Search::Condition.new(:equals, Account, Account.columns_hash["id"])
|
64
|
+
condition.value = nil
|
65
|
+
assert_equal condition.sanitize, ["\"accounts\".\"id\" IS NULL"]
|
66
|
+
|
67
|
+
condition = BinaryLogic::Searchgasm::Search::Condition.new(:equals, Account, Account.columns_hash["id"])
|
68
|
+
condition.value = (1..100)
|
69
|
+
assert_equal condition.sanitize, ["\"accounts\".\"id\" BETWEEN 1 AND 100"]
|
70
|
+
|
71
|
+
condition = BinaryLogic::Searchgasm::Search::Condition.new(:equals, Account, Account.columns_hash["id"])
|
72
|
+
condition.value = [1,2,3,4,5]
|
73
|
+
assert_equal condition.sanitize, ["\"accounts\".\"id\" IN (1,2,3,4,5)"]
|
74
|
+
|
75
|
+
condition = BinaryLogic::Searchgasm::Search::Condition.new(:does_not_equal, Account, Account.columns_hash["id"])
|
76
|
+
condition.value = 12
|
77
|
+
assert_equal condition.sanitize, ["\"accounts\".\"id\" != 12"]
|
78
|
+
|
79
|
+
condition = BinaryLogic::Searchgasm::Search::Condition.new(:does_not_equal, Account, Account.columns_hash["id"])
|
80
|
+
condition.value = nil
|
81
|
+
assert_equal condition.sanitize, ["\"accounts\".\"id\" IS NOT NULL"]
|
82
|
+
|
83
|
+
condition = BinaryLogic::Searchgasm::Search::Condition.new(:does_not_equal, Account, Account.columns_hash["id"])
|
84
|
+
condition.value = (1..100)
|
85
|
+
assert_equal condition.sanitize, ["\"accounts\".\"id\" NOT BETWEEN 1 AND 100"]
|
86
|
+
|
87
|
+
condition = BinaryLogic::Searchgasm::Search::Condition.new(:does_not_equal, Account, Account.columns_hash["id"])
|
88
|
+
condition.value = [1,2,3,4,5]
|
89
|
+
assert_equal condition.sanitize, ["\"accounts\".\"id\" NOT IN (1,2,3,4,5)"]
|
90
|
+
|
91
|
+
condition = BinaryLogic::Searchgasm::Search::Condition.new(:begins_with, Account, Account.columns_hash["name"])
|
92
|
+
condition.value = "Binary"
|
93
|
+
assert_equal condition.sanitize, ["\"accounts\".\"name\" LIKE ?", "Binary%"]
|
94
|
+
|
95
|
+
condition = BinaryLogic::Searchgasm::Search::Condition.new(:contains, Account, Account.columns_hash["name"])
|
96
|
+
condition.value = "Binary"
|
97
|
+
assert_equal condition.sanitize, ["\"accounts\".\"name\" LIKE ?", "%Binary%"]
|
98
|
+
|
99
|
+
condition = BinaryLogic::Searchgasm::Search::Condition.new(:ends_with, Account, Account.columns_hash["name"])
|
100
|
+
condition.value = "Binary"
|
101
|
+
assert_equal condition.sanitize, ["\"accounts\".\"name\" LIKE ?", "%Binary"]
|
102
|
+
|
103
|
+
condition = BinaryLogic::Searchgasm::Search::Condition.new(:greater_than, Account, Account.columns_hash["id"])
|
104
|
+
condition.value = 2
|
105
|
+
assert_equal condition.sanitize, ["\"accounts\".\"id\" > ?", 2]
|
106
|
+
|
107
|
+
condition = BinaryLogic::Searchgasm::Search::Condition.new(:greater_than_or_equal_to, Account, Account.columns_hash["id"])
|
108
|
+
condition.value = 2
|
109
|
+
assert_equal condition.sanitize, ["\"accounts\".\"id\" >= ?", 2]
|
110
|
+
|
111
|
+
condition = BinaryLogic::Searchgasm::Search::Condition.new(:keywords, Account, Account.columns_hash["name"])
|
112
|
+
condition.value = "freedom yeah, freedom YEAH right"
|
113
|
+
assert_equal condition.sanitize, ["\"accounts\".\"name\" LIKE ? AND \"accounts\".\"name\" LIKE ? AND \"accounts\".\"name\" LIKE ?", "%freedom%", "%yeah%", "%right%"]
|
114
|
+
|
115
|
+
condition = BinaryLogic::Searchgasm::Search::Condition.new(:keywords, Account, Account.columns_hash["name"])
|
116
|
+
condition.value = "$^&*()!"
|
117
|
+
assert_equal condition.sanitize, [""]
|
118
|
+
|
119
|
+
condition = BinaryLogic::Searchgasm::Search::Condition.new(:less_than, Account, Account.columns_hash["id"])
|
120
|
+
condition.value = 2
|
121
|
+
assert_equal condition.sanitize, ["\"accounts\".\"id\" < ?", 2]
|
122
|
+
|
123
|
+
condition = BinaryLogic::Searchgasm::Search::Condition.new(:less_than_or_equal_to, Account, Account.columns_hash["id"])
|
124
|
+
condition.value = 2
|
125
|
+
assert_equal condition.sanitize, ["\"accounts\".\"id\" <= ?", 2]
|
126
|
+
|
127
|
+
assert_raise(ArgumentError) { BinaryLogic::Searchgasm::Search::Condition.new(:descendent_of, Account, nil) }
|
128
|
+
|
129
|
+
condition = BinaryLogic::Searchgasm::Search::Condition.new(:child_of, User, nil)
|
130
|
+
condition.value = 1
|
131
|
+
assert_equal condition.sanitize, ["\"users\".\"parent_id\" = ?", 1]
|
132
|
+
|
133
|
+
condition = BinaryLogic::Searchgasm::Search::Condition.new(:sibling_of, User, nil)
|
134
|
+
condition.value = 2
|
135
|
+
assert_equal condition.sanitize, ["\"users\".\"parent_id\" = ?", 1]
|
136
|
+
|
137
|
+
condition = BinaryLogic::Searchgasm::Search::Condition.new(:descendent_of, User, nil)
|
138
|
+
condition.value = 1
|
139
|
+
assert_equal condition.sanitize, ["\"users\".\"id\" = ? OR \"users\".\"id\" = ?", 2, 3]
|
140
|
+
|
141
|
+
condition = BinaryLogic::Searchgasm::Search::Condition.new(:inclusive_descendent_of, User, nil)
|
142
|
+
condition.value = 1
|
143
|
+
assert_equal condition.sanitize, ["(\"users\".\"id\" = ?) OR (\"users\".\"id\" = ? OR \"users\".\"id\" = ?)", 1, 2, 3]
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_value
|
147
|
+
end
|
148
|
+
|
149
|
+
end
|
@@ -0,0 +1,137 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
+
|
3
|
+
class TestSearchgasmConditions < Test::Unit::TestCase
|
4
|
+
fixtures :accounts, :users, :orders
|
5
|
+
|
6
|
+
def setup
|
7
|
+
setup_db
|
8
|
+
load_fixtures
|
9
|
+
end
|
10
|
+
|
11
|
+
def teardown
|
12
|
+
teardown_db
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_initialize
|
16
|
+
conditions = BinaryLogic::Searchgasm::Search::Conditions.new(Account, :name_contains => "Binary")
|
17
|
+
assert_equal conditions.klass, Account
|
18
|
+
assert_equal conditions.name_contains, "Binary"
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_setting_conditions
|
22
|
+
[Account, User, Order].each do |klass|
|
23
|
+
conditions = BinaryLogic::Searchgasm::Search::Conditions.new(klass)
|
24
|
+
|
25
|
+
klass.columns.each do |column|
|
26
|
+
value = column_value(column)
|
27
|
+
BinaryLogic::Searchgasm::Search::Conditions.conditions_for_column_type(column.type).each do |condition|
|
28
|
+
name = BinaryLogic::Searchgasm::Search::Condition.generate_name(column, condition)
|
29
|
+
conditions.send("#{name}=", value)
|
30
|
+
assert_equal conditions.send(name), value
|
31
|
+
BinaryLogic::Searchgasm::Search::Conditions.alias_conditions(condition).each do |alias_condition|
|
32
|
+
alias_name = BinaryLogic::Searchgasm::Search::Condition.generate_name(column, alias_condition)
|
33
|
+
conditions.send("#{alias_name}=", value)
|
34
|
+
assert_equal conditions.send(alias_name), value
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_setting_associations
|
42
|
+
conditions = BinaryLogic::Searchgasm::Search::Conditions.new(Account, :users => {:first_name_like => "Ben"})
|
43
|
+
assert_equal conditions.users.first_name_like, "Ben"
|
44
|
+
|
45
|
+
conditions.users.last_name_begins_with = "Ben"
|
46
|
+
assert_equal conditions.users.last_name_begins_with, "Ben"
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_includes
|
50
|
+
conditions = BinaryLogic::Searchgasm::Search::Conditions.new(Account)
|
51
|
+
assert_equal conditions.includes, nil
|
52
|
+
|
53
|
+
conditions.name_like = "Binary"
|
54
|
+
assert_equal conditions.includes, nil
|
55
|
+
|
56
|
+
conditions.users.first_name_like = "Ben"
|
57
|
+
assert_equal conditions.includes, :users
|
58
|
+
|
59
|
+
conditions.users.orders.description_like = "apple"
|
60
|
+
assert_equal conditions.includes, {:users => :orders}
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_objects
|
64
|
+
conditions = BinaryLogic::Searchgasm::Search::Conditions.new(Account)
|
65
|
+
assert_equal conditions.objects, []
|
66
|
+
|
67
|
+
conditions.name_contains = "Binary"
|
68
|
+
assert_equal conditions.objects.size, 1
|
69
|
+
|
70
|
+
conditions.users.first_name_contains = "Ben"
|
71
|
+
assert_equal conditions.objects.size, 2
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_reset
|
75
|
+
conditions = BinaryLogic::Searchgasm::Search::Conditions.new(Account)
|
76
|
+
|
77
|
+
conditions.name_contains = "Binary"
|
78
|
+
assert_equal conditions.objects.size, 1
|
79
|
+
|
80
|
+
conditions.reset_name_contains!
|
81
|
+
assert_equal conditions.objects, []
|
82
|
+
|
83
|
+
conditions.users.first_name_like = "Ben"
|
84
|
+
assert_equal conditions.objects.size, 1
|
85
|
+
|
86
|
+
conditions.reset_users!
|
87
|
+
assert_equal conditions.objects, []
|
88
|
+
|
89
|
+
conditions.name_begins_with ="Binary"
|
90
|
+
conditions.users.orders.total_gt = 200
|
91
|
+
conditions.users.first_name_keywords = "Silly name"
|
92
|
+
conditions.reset!
|
93
|
+
assert_equal conditions.objects, []
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_sanitize
|
97
|
+
conditions = BinaryLogic::Searchgasm::Search::Conditions.new(Account)
|
98
|
+
conditions.name_contains = "Binary"
|
99
|
+
conditions.id_gt = 5
|
100
|
+
now = Time.now
|
101
|
+
conditions.created_at_after = now
|
102
|
+
assert_equal conditions.sanitize, ["(\"accounts\".\"name\" LIKE ?) AND (\"accounts\".\"id\" > ?) AND (\"accounts\".\"created_at\" > ?)", "%Binary%", 5, now]
|
103
|
+
|
104
|
+
# test out associations
|
105
|
+
conditions.users.first_name_like = "Ben"
|
106
|
+
conditions.users.id_gt = 10
|
107
|
+
conditions.users.orders.total_lt = 500
|
108
|
+
assert_equal conditions.sanitize, ["(\"accounts\".\"name\" LIKE ?) AND (\"accounts\".\"id\" > ?) AND (\"accounts\".\"created_at\" > ?) AND ((\"users\".\"first_name\" LIKE ?) AND (\"users\".\"id\" > ?) AND (\"orders\".\"total\" < ?))", "%Binary%", 5, now, "%Ben%", 10, 500]
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_value
|
112
|
+
conditions = BinaryLogic::Searchgasm::Search::Conditions.new(Account)
|
113
|
+
now = Time.now
|
114
|
+
conditions.value = {:name_like => "Binary", :created_at_after => now}
|
115
|
+
assert_equal conditions.value, {:name_contains => "Binary", :created_at_greater_than => now}
|
116
|
+
|
117
|
+
conditions.value = "id in (1,2,3,4)"
|
118
|
+
assert_equal conditions.value, {}
|
119
|
+
assert_equal conditions.scope, "id in (1,2,3,4)"
|
120
|
+
end
|
121
|
+
|
122
|
+
private
|
123
|
+
def column_value(column)
|
124
|
+
case column.type
|
125
|
+
when :string, :text, :binary
|
126
|
+
Array.new(50) { (rand(122-97) + 97).chr }.join
|
127
|
+
when :integer
|
128
|
+
rand(99999)
|
129
|
+
when :float, :decimal
|
130
|
+
rand * 100
|
131
|
+
when :datetime, :timestamp, :time
|
132
|
+
Time.now
|
133
|
+
when :date
|
134
|
+
Date.today
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
metadata
ADDED
@@ -0,0 +1,122 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: searchgasm
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.9.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ben Johnson of Binary Logic
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2008-09-01 00:00:00 -04:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: activerecord
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: echoe
|
27
|
+
type: :development
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: "0"
|
34
|
+
version:
|
35
|
+
description: Makes ActiveRecord searching easier, robust, and powerful. Automatic conditions, pagination support, object based searching, and more.
|
36
|
+
email: bjohnson@binarylogic.com
|
37
|
+
executables: []
|
38
|
+
|
39
|
+
extensions: []
|
40
|
+
|
41
|
+
extra_rdoc_files:
|
42
|
+
- CHANGELOG
|
43
|
+
- lib/searchgasm/active_record/associations.rb
|
44
|
+
- lib/searchgasm/active_record/base.rb
|
45
|
+
- lib/searchgasm/active_record/protection.rb
|
46
|
+
- lib/searchgasm/helpers.rb
|
47
|
+
- lib/searchgasm/search/base.rb
|
48
|
+
- lib/searchgasm/search/condition.rb
|
49
|
+
- lib/searchgasm/search/conditions.rb
|
50
|
+
- lib/searchgasm/search/utilities.rb
|
51
|
+
- lib/searchgasm/version.rb
|
52
|
+
- lib/searchgasm.rb
|
53
|
+
- README.mdown
|
54
|
+
files:
|
55
|
+
- CHANGELOG
|
56
|
+
- init.rb
|
57
|
+
- lib/searchgasm/active_record/associations.rb
|
58
|
+
- lib/searchgasm/active_record/base.rb
|
59
|
+
- lib/searchgasm/active_record/protection.rb
|
60
|
+
- lib/searchgasm/helpers.rb
|
61
|
+
- lib/searchgasm/search/base.rb
|
62
|
+
- lib/searchgasm/search/condition.rb
|
63
|
+
- lib/searchgasm/search/conditions.rb
|
64
|
+
- lib/searchgasm/search/utilities.rb
|
65
|
+
- lib/searchgasm/version.rb
|
66
|
+
- lib/searchgasm.rb
|
67
|
+
- Manifest
|
68
|
+
- MIT-LICENSE
|
69
|
+
- Rakefile
|
70
|
+
- README.mdown
|
71
|
+
- test/fixtures/accounts.yml
|
72
|
+
- test/fixtures/orders.yml
|
73
|
+
- test/fixtures/users.yml
|
74
|
+
- test/libs/acts_as_tree.rb
|
75
|
+
- test/libs/rexml_fix.rb
|
76
|
+
- test/test_active_record_associations.rb
|
77
|
+
- test/test_active_record_base.rb
|
78
|
+
- test/test_active_record_protection.rb
|
79
|
+
- test/test_helper.rb
|
80
|
+
- test/test_searchgasm_base.rb
|
81
|
+
- test/test_searchgasm_condition.rb
|
82
|
+
- test/test_searchgasm_conditions.rb
|
83
|
+
- searchgasm.gemspec
|
84
|
+
has_rdoc: true
|
85
|
+
homepage: http://github.com/binarylogic/searchgasm
|
86
|
+
post_install_message:
|
87
|
+
rdoc_options:
|
88
|
+
- --line-numbers
|
89
|
+
- --inline-source
|
90
|
+
- --title
|
91
|
+
- Searchgasm
|
92
|
+
- --main
|
93
|
+
- README.mdown
|
94
|
+
require_paths:
|
95
|
+
- lib
|
96
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
97
|
+
requirements:
|
98
|
+
- - ">="
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: "0"
|
101
|
+
version:
|
102
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
103
|
+
requirements:
|
104
|
+
- - "="
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: "1.2"
|
107
|
+
version:
|
108
|
+
requirements: []
|
109
|
+
|
110
|
+
rubyforge_project: searchgasm
|
111
|
+
rubygems_version: 1.2.0
|
112
|
+
signing_key:
|
113
|
+
specification_version: 2
|
114
|
+
summary: Orgasmic ActiveRecord searching
|
115
|
+
test_files:
|
116
|
+
- test/test_active_record_associations.rb
|
117
|
+
- test/test_active_record_base.rb
|
118
|
+
- test/test_active_record_protection.rb
|
119
|
+
- test/test_helper.rb
|
120
|
+
- test/test_searchgasm_base.rb
|
121
|
+
- test/test_searchgasm_condition.rb
|
122
|
+
- test/test_searchgasm_conditions.rb
|