pose 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +11 -1
- data/lib/pose.rb +2 -2
- data/lib/pose/base_additions.rb +2 -1
- data/lib/{pose_assignment.rb → pose/models/pose_assignment.rb} +0 -0
- data/lib/{pose_word.rb → pose/models/pose_word.rb} +0 -0
- data/lib/pose/static_helpers.rb +11 -6
- data/lib/pose/version.rb +1 -1
- data/spec/pose_assignment_spec.rb +5 -5
- data/spec/pose_spec.rb +29 -8
- data/spec/pose_word_spec.rb +2 -2
- metadata +21 -21
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Pose
|
1
|
+
# Pose [![Build Status](https://secure.travis-ci.org/kevgo/pose.png)](http://travis-ci.org/#!/kevgo/pose)
|
2
2
|
|
3
3
|
Pose ("Polymorphic Search") allows fulltext search for ActiveRecord objects.
|
4
4
|
|
@@ -113,6 +113,16 @@ In this example, it found two results of type _MyClass_ and no results of type _
|
|
113
113
|
Happy searching! :)
|
114
114
|
|
115
115
|
|
116
|
+
## Search options
|
117
|
+
|
118
|
+
```ruby
|
119
|
+
result = Pose.search 'foo',
|
120
|
+
MyClass,
|
121
|
+
:limit => 3, # Limit the result count to 3.
|
122
|
+
:result_type => :ids # Don't load the resulting objects, return just their ids instead.
|
123
|
+
```
|
124
|
+
|
125
|
+
|
116
126
|
# Autocomplete support
|
117
127
|
|
118
128
|
Because the search index contains a list of all the words known to the search engine,
|
data/lib/pose.rb
CHANGED
data/lib/pose/base_additions.rb
CHANGED
@@ -2,8 +2,9 @@ module Pose
|
|
2
2
|
module BaseAdditions
|
3
3
|
|
4
4
|
def posify &block
|
5
|
+
raise "You must provide a block that returns the searchable content to 'posify'." unless block_given?
|
5
6
|
include Pose::ModelAdditions
|
6
|
-
self.pose_content =
|
7
|
+
self.pose_content = block
|
7
8
|
end
|
8
9
|
|
9
10
|
end
|
File without changes
|
File without changes
|
data/lib/pose/static_helpers.rb
CHANGED
@@ -90,10 +90,10 @@ module Pose
|
|
90
90
|
#
|
91
91
|
# @param [String] query
|
92
92
|
# @param (Class|[Array<Class>]) classes
|
93
|
-
# @param [
|
93
|
+
# @param [Hash?] options Additional options.
|
94
94
|
#
|
95
95
|
# @return [Hash<Class, ActiveRecord::Relation>]
|
96
|
-
def search query, classes,
|
96
|
+
def search query, classes, options = {}
|
97
97
|
|
98
98
|
# Turn 'classes' into an array.
|
99
99
|
classes = [classes].flatten
|
@@ -106,11 +106,16 @@ module Pose
|
|
106
106
|
current_word_classes_and_ids = {}
|
107
107
|
classes.each { |clazz| current_word_classes_and_ids[clazz.name] = [] }
|
108
108
|
query = PoseAssignment.joins(:pose_word) \
|
109
|
+
.select('pose_assignments.posable_id, pose_assignments.posable_type') \
|
109
110
|
.where('pose_words.text LIKE ?', "#{query_word}%") \
|
110
111
|
.where('posable_type IN (?)', classes_names)
|
111
|
-
query.each do |pose_assignment|
|
112
|
-
current_word_classes_and_ids[pose_assignment
|
112
|
+
PoseAssignment.connection.select_all(query.to_sql).each do |pose_assignment|
|
113
|
+
current_word_classes_and_ids[pose_assignment['posable_type']] << pose_assignment['posable_id']
|
113
114
|
end
|
115
|
+
# This is the old ActiveRecord way. Removed for performance reasons.
|
116
|
+
# query.each do |pose_assignment|
|
117
|
+
# current_word_classes_and_ids[pose_assignment.posable_type] << pose_assignment.posable_id
|
118
|
+
# end
|
114
119
|
|
115
120
|
current_word_classes_and_ids.each do |class_name, ids|
|
116
121
|
if result_classes_and_ids.has_key? class_name
|
@@ -127,8 +132,8 @@ module Pose
|
|
127
132
|
result_class = Kernel.const_get class_name
|
128
133
|
|
129
134
|
if ids.any? && classes.include?(result_class)
|
130
|
-
ids = ids.slice(0, limit) if limit
|
131
|
-
result[result_class] = result_class.where
|
135
|
+
ids = ids.slice(0, options[:limit]) if options[:limit]
|
136
|
+
result[result_class] = options[:result_type] == :ids ? ids : result_class.where(:id => ids)
|
132
137
|
else
|
133
138
|
result[result_class] = []
|
134
139
|
end
|
data/lib/pose/version.rb
CHANGED
@@ -9,8 +9,8 @@ describe PoseAssignment do
|
|
9
9
|
describe "delete_class_index" do
|
10
10
|
|
11
11
|
before :each do
|
12
|
-
|
13
|
-
|
12
|
+
FactoryGirl.create :pose_assignment, :posable_id => 1, :posable_type => 'PosableOne'
|
13
|
+
FactoryGirl.create :pose_assignment, :posable_id => 2, :posable_type => 'PosableTwo'
|
14
14
|
PoseAssignment.delete_class_index PosableOne
|
15
15
|
end
|
16
16
|
|
@@ -26,20 +26,20 @@ describe PoseAssignment do
|
|
26
26
|
describe "cleanup_orphaned_pose_assignments" do
|
27
27
|
|
28
28
|
it "deletes the assignment if the posable object doesn't exist" do
|
29
|
-
|
29
|
+
FactoryGirl.create :pose_assignment, :posable_id => 2, :posable_type => 'PosableOne'
|
30
30
|
PoseAssignment.count.should > 0
|
31
31
|
PoseAssignment.cleanup_orphaned_pose_assignments
|
32
32
|
PoseAssignment.should have(0).items
|
33
33
|
end
|
34
34
|
|
35
35
|
it "deletes the assignment if the pose_word doesn't exist" do
|
36
|
-
assignment =
|
36
|
+
assignment = FactoryGirl.create :pose_assignment, :pose_word => nil, :pose_word_id => 27
|
37
37
|
PoseAssignment.cleanup_orphaned_pose_assignments
|
38
38
|
PoseAssignment.find_by_id(assignment.id).should be_nil
|
39
39
|
end
|
40
40
|
|
41
41
|
it "doesn't delete the assignment if it is still used" do
|
42
|
-
assignment =
|
42
|
+
assignment = FactoryGirl.create :pose_assignment
|
43
43
|
PoseAssignment.cleanup_orphaned_pose_assignments
|
44
44
|
PoseAssignment.find_by_id(assignment.id).should_not be_nil
|
45
45
|
end
|
data/spec/pose_spec.rb
CHANGED
@@ -208,7 +208,7 @@ describe Pose do
|
|
208
208
|
result[PosableOne][0].should == pos1
|
209
209
|
end
|
210
210
|
|
211
|
-
|
211
|
+
describe 'classes parameter' do
|
212
212
|
it 'returns all different classes by default' do
|
213
213
|
pos1 = PosableOne.create :text => 'foo'
|
214
214
|
pos2 = PosableTwo.create :text => 'foo'
|
@@ -242,7 +242,7 @@ describe Pose do
|
|
242
242
|
end
|
243
243
|
end
|
244
244
|
|
245
|
-
|
245
|
+
describe 'query parameter' do
|
246
246
|
|
247
247
|
it 'returns an empty array if nothing matches' do
|
248
248
|
pos1 = PosableOne.create :text => 'one'
|
@@ -273,19 +273,40 @@ describe Pose do
|
|
273
273
|
end
|
274
274
|
end
|
275
275
|
|
276
|
-
|
276
|
+
describe "'limit' parameter" do
|
277
277
|
|
278
278
|
it 'works' do
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
279
|
+
FactoryGirl.create :posable_one, :text => 'foo one'
|
280
|
+
FactoryGirl.create :posable_one, :text => 'foo two'
|
281
|
+
FactoryGirl.create :posable_one, :text => 'foo three'
|
282
|
+
FactoryGirl.create :posable_one, :text => 'foo four'
|
283
283
|
|
284
|
-
result = Pose.search 'foo', PosableOne, 3
|
284
|
+
result = Pose.search 'foo', PosableOne, :limit => 3
|
285
285
|
|
286
286
|
result[PosableOne].should have(3).items
|
287
287
|
end
|
288
288
|
end
|
289
|
+
|
290
|
+
describe "'result_type' parameter" do
|
291
|
+
|
292
|
+
before :each do
|
293
|
+
@foo_one = FactoryGirl.create :posable_one, :text => 'foo one'
|
294
|
+
end
|
295
|
+
|
296
|
+
describe 'default behavior' do
|
297
|
+
it 'returns full objects' do
|
298
|
+
result = Pose.search 'foo', PosableOne
|
299
|
+
result[PosableOne][0].should == @foo_one
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
context ':ids given' do
|
304
|
+
it 'returns ids instead of objects' do
|
305
|
+
result = Pose.search 'foo', PosableOne, :result_type => :ids
|
306
|
+
result[PosableOne][0].should == @foo_one.id
|
307
|
+
end
|
308
|
+
end
|
309
|
+
end
|
289
310
|
end
|
290
311
|
|
291
312
|
describe 'autocomplete_words' do
|
data/spec/pose_word_spec.rb
CHANGED
@@ -9,13 +9,13 @@ describe PoseWord do
|
|
9
9
|
describe 'remove_unused_words' do
|
10
10
|
|
11
11
|
it 'removes unused words' do
|
12
|
-
|
12
|
+
FactoryGirl.create :pose_word
|
13
13
|
PoseWord.remove_unused_words
|
14
14
|
PoseWord.count.should == 0
|
15
15
|
end
|
16
16
|
|
17
17
|
it "doesn't remove used words" do
|
18
|
-
snippet =
|
18
|
+
snippet = FactoryGirl.create :posable_one
|
19
19
|
PoseWord.remove_unused_words
|
20
20
|
PoseWord.count.should > 0
|
21
21
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pose
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-06-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
16
|
-
requirement: &
|
16
|
+
requirement: &70182202899340 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 3.0.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70182202899340
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rake
|
27
|
-
requirement: &
|
27
|
+
requirement: &70182202897100 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70182202897100
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: ruby-progressbar
|
38
|
-
requirement: &
|
38
|
+
requirement: &70182202895340 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70182202895340
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: factory_girl
|
49
|
-
requirement: &
|
49
|
+
requirement: &70182202890340 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70182202890340
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: faker
|
60
|
-
requirement: &
|
60
|
+
requirement: &70182202708040 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70182202708040
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: hashie
|
71
|
-
requirement: &
|
71
|
+
requirement: &70182202704860 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70182202704860
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: rspec
|
82
|
-
requirement: &
|
82
|
+
requirement: &70182202700960 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *70182202700960
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: sqlite3
|
93
|
-
requirement: &
|
93
|
+
requirement: &70182202696980 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ! '>='
|
@@ -98,7 +98,7 @@ dependencies:
|
|
98
98
|
version: '0'
|
99
99
|
type: :development
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *70182202696980
|
102
102
|
description: Pose ('Polymorphic Search') allows fulltext search for ActiveRecord objects.
|
103
103
|
email:
|
104
104
|
- kevin.goslar@gmail.com
|
@@ -129,12 +129,12 @@ files:
|
|
129
129
|
- lib/generators/templates/migration.rb
|
130
130
|
- lib/pose/base_additions.rb
|
131
131
|
- lib/pose/model_additions.rb
|
132
|
+
- lib/pose/models/pose_assignment.rb
|
133
|
+
- lib/pose/models/pose_word.rb
|
132
134
|
- lib/pose/railtie.rb
|
133
135
|
- lib/pose/static_helpers.rb
|
134
136
|
- lib/pose/version.rb
|
135
137
|
- lib/pose.rb
|
136
|
-
- lib/pose_assignment.rb
|
137
|
-
- lib/pose_word.rb
|
138
138
|
- lib/tasks/pose_tasks.rake
|
139
139
|
- MIT-LICENSE
|
140
140
|
- Rakefile
|
@@ -164,7 +164,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
164
164
|
version: '0'
|
165
165
|
requirements: []
|
166
166
|
rubyforge_project:
|
167
|
-
rubygems_version: 1.8.
|
167
|
+
rubygems_version: 1.8.15
|
168
168
|
signing_key:
|
169
169
|
specification_version: 3
|
170
170
|
summary: A polymorphic, storage-system independent search engine for Ruby on Rails.
|