cloud_search 0.0.5 → 0.0.6
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/.gitignore +1 -0
- data/Guardfile +1 -1
- data/cloud_search.gemspec +2 -1
- data/lib/cloud_search.rb +2 -1
- data/lib/cloud_search/indexer.rb +3 -17
- data/lib/cloud_search/search_response.rb +8 -7
- data/lib/cloud_search/searcher.rb +9 -21
- data/lib/cloud_search/version.rb +1 -1
- data/spec/cloud_search/search_response_spec.rb +126 -14
- data/spec/cloud_search/searcher_spec.rb +10 -2
- metadata +4 -4
data/Guardfile
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
|
4
4
|
guard 'rspec', :version => 2 do
|
5
5
|
watch(%r{^spec/.+_spec\.rb$})
|
6
|
-
watch(%r{^lib/(.+)\.rb$}) { |m| "spec
|
6
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
7
7
|
watch('spec/spec_helper.rb') { "spec" }
|
8
8
|
watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
|
9
9
|
end
|
data/cloud_search.gemspec
CHANGED
@@ -25,6 +25,7 @@ Gem::Specification.new do |gem|
|
|
25
25
|
gem.add_development_dependency "vcr" , "~> 2.2"
|
26
26
|
gem.add_development_dependency "webmock"
|
27
27
|
|
28
|
-
gem.add_dependency "em-http-request" , "~> 1.0"
|
28
|
+
# gem.add_dependency "em-http-request" , "~> 1.0"
|
29
|
+
gem.add_dependency "rest-client", "~> 1.6.7"
|
29
30
|
end
|
30
31
|
|
data/lib/cloud_search.rb
CHANGED
data/lib/cloud_search/indexer.rb
CHANGED
@@ -18,23 +18,9 @@ module CloudSearch
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def index
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
http.callback {
|
26
|
-
message = "#{http.response_header.status} - #{http.response.length} bytes\n#{url}\n"
|
27
|
-
response = JSON.parse(http.response)
|
28
|
-
|
29
|
-
EM.stop
|
30
|
-
}
|
31
|
-
|
32
|
-
http.errback {
|
33
|
-
message = "#{url}\n#{http.error}"
|
34
|
-
|
35
|
-
EM.stop
|
36
|
-
}
|
37
|
-
end
|
21
|
+
cloud_search_response = RestClient.post url, documents_json, headers
|
22
|
+
message = "#{cloud_search_response.code} - #{cloud_search_response.length} bytes\n#{url}\n"
|
23
|
+
response = JSON.parse cloud_search_response.body
|
38
24
|
|
39
25
|
[response, message]
|
40
26
|
end
|
@@ -4,25 +4,25 @@ module CloudSearch
|
|
4
4
|
attr_accessor :http_code
|
5
5
|
|
6
6
|
def results
|
7
|
-
|
7
|
+
_hits["hit"] || []
|
8
8
|
end
|
9
9
|
|
10
10
|
def hits
|
11
|
-
|
11
|
+
_hits["found"] || 0
|
12
12
|
end
|
13
13
|
|
14
14
|
def found?
|
15
|
-
hits
|
15
|
+
hits > 0
|
16
16
|
end
|
17
17
|
|
18
18
|
def body=(body)
|
19
|
-
@body = body
|
19
|
+
@body = body || {}
|
20
20
|
calculate_pages
|
21
21
|
@body
|
22
22
|
end
|
23
23
|
|
24
24
|
def items_per_page
|
25
|
-
@items_per_page
|
25
|
+
@items_per_page || 10
|
26
26
|
end
|
27
27
|
|
28
28
|
alias :page_size :items_per_page
|
@@ -38,18 +38,19 @@ module CloudSearch
|
|
38
38
|
end
|
39
39
|
|
40
40
|
private
|
41
|
+
|
41
42
|
def calculate_pages
|
42
43
|
num_full_pages = hits / items_per_page
|
43
44
|
@total_pages = hits % items_per_page > 0 ? num_full_pages + 1 : num_full_pages
|
44
45
|
@total_pages = 1 if @total_pages == 0
|
45
46
|
|
46
|
-
start =
|
47
|
+
start = _hits["start"] || 0
|
47
48
|
@current_page = (start / items_per_page) + 1
|
48
49
|
@current_page = @total_pages if @current_page > @total_pages
|
49
50
|
end
|
50
51
|
|
51
52
|
def _hits
|
52
|
-
body
|
53
|
+
body["hits"] || {}
|
53
54
|
end
|
54
55
|
end
|
55
56
|
end
|
@@ -1,27 +1,15 @@
|
|
1
|
+
require 'uri'
|
2
|
+
|
1
3
|
module CloudSearch
|
2
4
|
class Searcher
|
3
5
|
include ConfigurationChecking
|
4
6
|
|
5
7
|
def search
|
6
|
-
response
|
7
|
-
|
8
|
-
EM.run do
|
9
|
-
http = EM::HttpRequest.new(url).get
|
10
|
-
|
11
|
-
http.callback do
|
12
|
-
response.http_code = http.response_header.status
|
13
|
-
response.body = JSON.parse(http.response)
|
8
|
+
response = SearchResponse.new
|
14
9
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
http.errback do
|
19
|
-
response.http_code = http.error
|
20
|
-
response.body = http.response
|
21
|
-
|
22
|
-
EM.stop
|
23
|
-
end
|
24
|
-
end
|
10
|
+
cloud_search_response = RestClient.get url
|
11
|
+
response.http_code = cloud_search_response.code
|
12
|
+
response.body = JSON.parse(cloud_search_response.body)
|
25
13
|
|
26
14
|
response.items_per_page = items_per_page
|
27
15
|
response
|
@@ -39,7 +27,7 @@ module CloudSearch
|
|
39
27
|
end
|
40
28
|
|
41
29
|
def query
|
42
|
-
@query
|
30
|
+
URI.escape(@query || '').gsub('&', '%26')
|
43
31
|
end
|
44
32
|
|
45
33
|
def boolean_query?
|
@@ -78,8 +66,8 @@ module CloudSearch
|
|
78
66
|
check_configuration_parameters
|
79
67
|
|
80
68
|
"#{CloudSearch.config.search_url}/search".tap do |u|
|
81
|
-
u.concat("?#{query_parameter}=#{
|
82
|
-
u.concat("&return-fields=#{
|
69
|
+
u.concat("?#{query_parameter}=#{query}&size=#{items_per_page}&start=#{start}")
|
70
|
+
u.concat("&return-fields=#{URI.escape(@fields.join(","))}") if @fields && @fields.any?
|
83
71
|
end
|
84
72
|
end
|
85
73
|
|
data/lib/cloud_search/version.rb
CHANGED
@@ -3,20 +3,20 @@ require "spec_helper"
|
|
3
3
|
describe CloudSearch::SearchResponse do
|
4
4
|
subject { described_class.new }
|
5
5
|
|
6
|
-
before do
|
7
|
-
subject.body = YAML.load_file File.expand_path("../../fixtures/full.yml", __FILE__)
|
8
|
-
end
|
9
|
-
|
10
6
|
context "when there are results" do
|
7
|
+
before do
|
8
|
+
subject.body = YAML.load_file File.expand_path("../../fixtures/full.yml", __FILE__)
|
9
|
+
end
|
10
|
+
|
11
11
|
describe "#results" do
|
12
12
|
it "list matched documents" do
|
13
|
-
subject.results.
|
14
|
-
.should == ["Star Wars: The Clone Wars",
|
15
|
-
"Star Wars",
|
16
|
-
"Star Wars: Episode II - Attack of the Clones",
|
17
|
-
"Star Wars: Episode V - The Empire Strikes Back",
|
18
|
-
"Star Wars: Episode VI - Return of the Jedi",
|
19
|
-
"Star Wars: Episode I - The Phantom Menace",
|
13
|
+
subject.results.map{ |item| item['data']['title'] }.flatten
|
14
|
+
.should == ["Star Wars: The Clone Wars",
|
15
|
+
"Star Wars",
|
16
|
+
"Star Wars: Episode II - Attack of the Clones",
|
17
|
+
"Star Wars: Episode V - The Empire Strikes Back",
|
18
|
+
"Star Wars: Episode VI - Return of the Jedi",
|
19
|
+
"Star Wars: Episode I - The Phantom Menace",
|
20
20
|
"Star Wars: Episode III - Revenge of the Sith"]
|
21
21
|
end
|
22
22
|
end
|
@@ -40,7 +40,7 @@ describe CloudSearch::SearchResponse do
|
|
40
40
|
end
|
41
41
|
|
42
42
|
describe "#items_per_page" do
|
43
|
-
it "returns items per page" do
|
43
|
+
it "returns items per page as default 10" do
|
44
44
|
subject.items_per_page.should == 10
|
45
45
|
end
|
46
46
|
end
|
@@ -52,7 +52,7 @@ describe CloudSearch::SearchResponse do
|
|
52
52
|
end
|
53
53
|
|
54
54
|
describe "#offset" do
|
55
|
-
it "returns offset" do
|
55
|
+
it "returns offset as default 0" do
|
56
56
|
subject.offset.should == 0
|
57
57
|
end
|
58
58
|
end
|
@@ -97,6 +97,118 @@ describe CloudSearch::SearchResponse do
|
|
97
97
|
it "returns offset" do
|
98
98
|
subject.offset.should == 0
|
99
99
|
end
|
100
|
-
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
context "pagination" do
|
104
|
+
let(:seven_hits) { YAML.load_file File.expand_path("../../fixtures/full.yml", __FILE__) }
|
105
|
+
|
106
|
+
it "returns number of pages based on hits" do
|
107
|
+
subject.items_per_page = 8
|
108
|
+
subject.body = seven_hits
|
109
|
+
subject.total_pages.should == 1
|
110
|
+
|
111
|
+
subject.items_per_page = 7
|
112
|
+
subject.body = seven_hits
|
113
|
+
subject.total_pages.should == 1
|
114
|
+
|
115
|
+
subject.items_per_page = 6
|
116
|
+
subject.body = seven_hits
|
117
|
+
subject.total_pages.should == 2
|
118
|
+
|
119
|
+
subject.items_per_page = 5
|
120
|
+
subject.body = seven_hits
|
121
|
+
subject.total_pages.should == 2
|
122
|
+
|
123
|
+
subject.items_per_page = 4
|
124
|
+
subject.body = seven_hits
|
125
|
+
subject.total_pages.should == 2
|
126
|
+
|
127
|
+
subject.items_per_page = 3
|
128
|
+
subject.body = seven_hits
|
129
|
+
subject.total_pages.should == 3
|
130
|
+
|
131
|
+
subject.items_per_page = 2
|
132
|
+
subject.body = seven_hits
|
133
|
+
subject.total_pages.should == 4
|
134
|
+
|
135
|
+
subject.items_per_page = 1
|
136
|
+
subject.body = seven_hits
|
137
|
+
subject.total_pages.should == 7
|
138
|
+
end
|
139
|
+
|
140
|
+
it "returns current page based on start and items per page" do
|
141
|
+
subject.items_per_page = 3
|
142
|
+
seven_hits['hits']['start'] = nil
|
143
|
+
subject.body = seven_hits
|
144
|
+
subject.current_page.should == 1
|
145
|
+
|
146
|
+
subject.items_per_page = 3
|
147
|
+
seven_hits['hits']['start'] = 0
|
148
|
+
subject.body = seven_hits
|
149
|
+
subject.current_page.should == 1
|
150
|
+
|
151
|
+
subject.items_per_page = 3
|
152
|
+
seven_hits['hits']['start'] = 2
|
153
|
+
subject.body = seven_hits
|
154
|
+
subject.current_page.should == 1
|
155
|
+
|
156
|
+
subject.items_per_page = 3
|
157
|
+
seven_hits['hits']['start'] = 3
|
158
|
+
subject.body = seven_hits
|
159
|
+
subject.current_page.should == 2
|
160
|
+
|
161
|
+
subject.items_per_page = 3
|
162
|
+
seven_hits['hits']['start'] = 4
|
163
|
+
subject.body = seven_hits
|
164
|
+
subject.current_page.should == 2
|
165
|
+
|
166
|
+
subject.items_per_page = 3
|
167
|
+
seven_hits['hits']['start'] = 5
|
168
|
+
subject.body = seven_hits
|
169
|
+
subject.current_page.should == 2
|
170
|
+
|
171
|
+
subject.items_per_page = 3
|
172
|
+
seven_hits['hits']['start'] = 6
|
173
|
+
subject.body = seven_hits
|
174
|
+
subject.current_page.should == 3
|
175
|
+
end
|
176
|
+
|
177
|
+
it "calculates offset based on current page and items_per_page" do
|
178
|
+
subject.items_per_page = 3
|
179
|
+
seven_hits['hits']['start'] = nil
|
180
|
+
subject.body = seven_hits
|
181
|
+
subject.offset.should == 0
|
182
|
+
|
183
|
+
subject.items_per_page = 3
|
184
|
+
seven_hits['hits']['start'] = 0
|
185
|
+
subject.body = seven_hits
|
186
|
+
subject.offset.should == 0
|
187
|
+
|
188
|
+
subject.items_per_page = 3
|
189
|
+
seven_hits['hits']['start'] = 2
|
190
|
+
subject.body = seven_hits
|
191
|
+
subject.offset.should == 0
|
192
|
+
|
193
|
+
subject.items_per_page = 3
|
194
|
+
seven_hits['hits']['start'] = 3
|
195
|
+
subject.body = seven_hits
|
196
|
+
subject.offset.should == 3
|
197
|
+
|
198
|
+
subject.items_per_page = 3
|
199
|
+
seven_hits['hits']['start'] = 4
|
200
|
+
subject.body = seven_hits
|
201
|
+
subject.offset.should == 3
|
202
|
+
|
203
|
+
subject.items_per_page = 3
|
204
|
+
seven_hits['hits']['start'] = 5
|
205
|
+
subject.body = seven_hits
|
206
|
+
subject.offset.should == 3
|
207
|
+
|
208
|
+
subject.items_per_page = 3
|
209
|
+
seven_hits['hits']['start'] = 6
|
210
|
+
subject.body = seven_hits
|
211
|
+
subject.offset.should == 6
|
212
|
+
end
|
101
213
|
end
|
102
214
|
end
|
@@ -46,7 +46,7 @@ describe CloudSearch::Searcher do
|
|
46
46
|
|
47
47
|
it "uses 'bq' to specify the query in the URL" do
|
48
48
|
subject.with_boolean_query("year:2000")
|
49
|
-
subject.url.should == "#{url_prefix}bq=year
|
49
|
+
subject.url.should == "#{url_prefix}bq=year:2000&size=10&start=0"
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
@@ -124,6 +124,14 @@ describe CloudSearch::Searcher do
|
|
124
124
|
subject.with_query("foo").url.should == "#{url_prefix}q=foo&size=10&start=0"
|
125
125
|
end
|
126
126
|
|
127
|
+
it "returns cloud search url with foo query" do
|
128
|
+
subject.with_query("f&oo").url.should == "#{url_prefix}q=f%26oo&size=10&start=0"
|
129
|
+
end
|
130
|
+
|
131
|
+
it "returns cloud search url with foo* query" do
|
132
|
+
subject.with_query("foo*").url.should == "#{url_prefix}q=foo*&size=10&start=0"
|
133
|
+
end
|
134
|
+
|
127
135
|
it "returns cloud search url with size equals 20" do
|
128
136
|
subject.with_items_per_page(20).url.should == "#{url_prefix}q=&size=20&start=0"
|
129
137
|
end
|
@@ -133,7 +141,7 @@ describe CloudSearch::Searcher do
|
|
133
141
|
end
|
134
142
|
|
135
143
|
it "returns cloud search url with foo and bar fields" do
|
136
|
-
subject.with_fields(:foo, :bar).url.should == "#{url_prefix}q=&size=10&start=0&return-fields=foo
|
144
|
+
subject.with_fields(:foo, :bar).url.should == "#{url_prefix}q=&size=10&start=0&return-fields=foo,bar"
|
137
145
|
end
|
138
146
|
end
|
139
147
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cloud_search
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -108,13 +108,13 @@ dependencies:
|
|
108
108
|
- !ruby/object:Gem::Version
|
109
109
|
version: '0'
|
110
110
|
- !ruby/object:Gem::Dependency
|
111
|
-
name:
|
111
|
+
name: rest-client
|
112
112
|
requirement: !ruby/object:Gem::Requirement
|
113
113
|
none: false
|
114
114
|
requirements:
|
115
115
|
- - ~>
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version:
|
117
|
+
version: 1.6.7
|
118
118
|
type: :runtime
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -122,7 +122,7 @@ dependencies:
|
|
122
122
|
requirements:
|
123
123
|
- - ~>
|
124
124
|
- !ruby/object:Gem::Version
|
125
|
-
version:
|
125
|
+
version: 1.6.7
|
126
126
|
description: A wraper to Amazon CloudSearch's API
|
127
127
|
email:
|
128
128
|
- willian@willianfernandes.com.br
|