asari 0.7.3 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +9 -0
- data/lib/asari.rb +22 -3
- data/lib/asari/version.rb +1 -1
- data/spec/documents_spec.rb +30 -4
- data/spec/search_spec.rb +32 -3
- metadata +2 -3
data/README.md
CHANGED
@@ -16,6 +16,9 @@ for easy integration with your Rails apps.
|
|
16
16
|
asari = Asari.new("my-search-domain-asdfkljwe4") # CloudSearch search domain
|
17
17
|
asari.add_item("1", { :name => "Tommy Morgan", :email => "tommy@wellbredgrapefruit.com"})
|
18
18
|
asari.search("tommy") #=> ["1"] - a list of document IDs
|
19
|
+
asari.search("tommy", :rank => "name") # Sort the search
|
20
|
+
asari.search("tommy", :rank => ["name", :desc]) # Sort the search descending
|
21
|
+
asari.search("tommy", :rank => "-name") # Another way to sort the search descending
|
19
22
|
|
20
23
|
#### Sandbox Mode
|
21
24
|
|
@@ -71,6 +74,7 @@ with your AR objects as follows:
|
|
71
74
|
# Klass.asari_find returns a list of model objects in an
|
72
75
|
# Asari::Collection...
|
73
76
|
User.asari_find("tommy") #=> [<User:...>, <User:...>, <User:...>]
|
77
|
+
User.asari_find("tommy", :rank => "name")
|
74
78
|
|
75
79
|
# or with a specific instance, if you need to manually do some index
|
76
80
|
# management...
|
@@ -156,6 +160,11 @@ on the current development status first.
|
|
156
160
|
|
157
161
|
Gem requirements/etc. should be handled by Bundler.
|
158
162
|
|
163
|
+
### Contributors
|
164
|
+
|
165
|
+
* [Emil Soman](https://github.com/emilsoman "emilsoman on Github")
|
166
|
+
* [Chris Vincent](https://github.com/cvincent "cvincent on Github")
|
167
|
+
|
159
168
|
## License
|
160
169
|
Copyright (C) 2012 by Tommy Morgan
|
161
170
|
|
data/lib/asari.rb
CHANGED
@@ -71,6 +71,11 @@ class Asari
|
|
71
71
|
url << "&start=#{start}"
|
72
72
|
end
|
73
73
|
|
74
|
+
if options[:rank]
|
75
|
+
rank = normalize_rank(options[:rank])
|
76
|
+
url << "&rank=#{rank}"
|
77
|
+
end
|
78
|
+
|
74
79
|
begin
|
75
80
|
response = HTTParty.get(url)
|
76
81
|
rescue Exception => e
|
@@ -103,8 +108,9 @@ class Asari
|
|
103
108
|
#
|
104
109
|
def add_item(id, fields)
|
105
110
|
return nil if self.class.mode == :sandbox
|
106
|
-
query = { "type" => "add", "id" => id.to_s, "version" =>
|
111
|
+
query = { "type" => "add", "id" => id.to_s, "version" => Time.now.to_i, "lang" => "en" }
|
107
112
|
fields.each do |k,v|
|
113
|
+
fields[k] = convert_date_or_time(fields[k])
|
108
114
|
fields[k] = "" if v.nil?
|
109
115
|
end
|
110
116
|
|
@@ -147,14 +153,14 @@ class Asari
|
|
147
153
|
def remove_item(id)
|
148
154
|
return nil if self.class.mode == :sandbox
|
149
155
|
|
150
|
-
query = { "type" => "delete", "id" => id.to_s, "version" =>
|
156
|
+
query = { "type" => "delete", "id" => id.to_s, "version" => Time.now.to_i }
|
151
157
|
doc_request query
|
152
158
|
end
|
153
159
|
|
154
160
|
# Internal: helper method: common logic for queries against the doc endpoint.
|
155
161
|
#
|
156
162
|
def doc_request(query)
|
157
|
-
endpoint = "http://doc-#{search_domain}.
|
163
|
+
endpoint = "http://doc-#{search_domain}.#{aws_region}.cloudsearch.amazonaws.com/#{api_version}/documents/batch"
|
158
164
|
|
159
165
|
options = { :body => [query].to_json, :headers => { "Content-Type" => "application/json"} }
|
160
166
|
|
@@ -172,6 +178,19 @@ class Asari
|
|
172
178
|
|
173
179
|
nil
|
174
180
|
end
|
181
|
+
|
182
|
+
protected
|
183
|
+
|
184
|
+
def normalize_rank(rank)
|
185
|
+
rank = Array(rank)
|
186
|
+
rank << :asc if rank.size < 2
|
187
|
+
rank[1] == :desc ? "-#{rank[0]}" : rank[0]
|
188
|
+
end
|
189
|
+
|
190
|
+
def convert_date_or_time(obj)
|
191
|
+
return obj unless [Time, Date, DateTime].include?(obj.class)
|
192
|
+
obj.to_time.to_i
|
193
|
+
end
|
175
194
|
end
|
176
195
|
|
177
196
|
Asari.mode = :sandbox # default to sandbox
|
data/lib/asari/version.rb
CHANGED
data/spec/documents_spec.rb
CHANGED
@@ -6,12 +6,32 @@ describe Asari do
|
|
6
6
|
@asari = Asari.new("testdomain")
|
7
7
|
stub_const("HTTParty", double())
|
8
8
|
HTTParty.stub(:post).and_return(fake_post_success)
|
9
|
+
Time.should_receive(:now).and_return(1)
|
9
10
|
end
|
10
11
|
|
11
|
-
|
12
|
-
|
12
|
+
context "when region is not specified" do
|
13
|
+
it "allows you to add an item to the index using default region." do
|
14
|
+
HTTParty.should_receive(:post).with("http://doc-testdomain.us-east-1.cloudsearch.amazonaws.com/2011-02-01/documents/batch", { :body => [{ "type" => "add", "id" => "1", "version" => 1, "lang" => "en", "fields" => { :name => "fritters"}}].to_json, :headers => { "Content-Type" => "application/json"}})
|
15
|
+
|
16
|
+
expect(@asari.add_item("1", {:name => "fritters"})).to eq(nil)
|
17
|
+
end
|
18
|
+
end
|
13
19
|
|
14
|
-
|
20
|
+
context "when region is specified" do
|
21
|
+
before(:each) do
|
22
|
+
@asari.aws_region = 'my-region'
|
23
|
+
end
|
24
|
+
it "allows you to add an item to the index using specified region." do
|
25
|
+
HTTParty.should_receive(:post).with("http://doc-testdomain.my-region.cloudsearch.amazonaws.com/2011-02-01/documents/batch", { :body => [{ "type" => "add", "id" => "1", "version" => 1, "lang" => "en", "fields" => { :name => "fritters"}}].to_json, :headers => { "Content-Type" => "application/json"}})
|
26
|
+
|
27
|
+
expect(@asari.add_item("1", {:name => "fritters"})).to eq(nil)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
it "converts Time, DateTime, and Date fields to timestamp integers for rankability" do
|
32
|
+
HTTParty.should_receive(:post).with("http://doc-testdomain.us-east-1.cloudsearch.amazonaws.com/2011-02-01/documents/batch", { :body => [{ "type" => "add", "id" => "1", "version" => 1, "lang" => "en", "fields" => { :time => 1333263600, :datetime => 1333238400, :date => 1333252800 }}].to_json, :headers => { "Content-Type" => "application/json"}})
|
33
|
+
|
34
|
+
expect(@asari.add_item("1", {:time => Time.at(1333263600), :datetime => DateTime.new(2012, 4, 1), :date => Date.new(2012, 4, 1)})).to eq(nil)
|
15
35
|
end
|
16
36
|
|
17
37
|
it "allows you to update an item to the index." do
|
@@ -20,8 +40,14 @@ describe Asari do
|
|
20
40
|
expect(@asari.update_item("1", {:name => "fritters"})).to eq(nil)
|
21
41
|
end
|
22
42
|
|
43
|
+
it "converts Time, DateTime, and Date fields to timestamp integers for rankability on update as well" do
|
44
|
+
HTTParty.should_receive(:post).with("http://doc-testdomain.us-east-1.cloudsearch.amazonaws.com/2011-02-01/documents/batch", { :body => [{ "type" => "add", "id" => "1", "version" => 1, "lang" => "en", "fields" => { :time => 1333263600, :datetime => 1333238400, :date => 1333252800 }}].to_json, :headers => { "Content-Type" => "application/json"}})
|
45
|
+
|
46
|
+
expect(@asari.update_item("1", {:time => Time.at(1333263600), :datetime => DateTime.new(2012, 4, 1), :date => Date.new(2012, 4, 1)})).to eq(nil)
|
47
|
+
end
|
48
|
+
|
23
49
|
it "allows you to delete an item from the index." do
|
24
|
-
HTTParty.should_receive(:post).with("http://doc-testdomain.us-east-1.cloudsearch.amazonaws.com/2011-02-01/documents/batch", { :body => [{ "type" => "delete", "id" => "1", "version" =>
|
50
|
+
HTTParty.should_receive(:post).with("http://doc-testdomain.us-east-1.cloudsearch.amazonaws.com/2011-02-01/documents/batch", { :body => [{ "type" => "delete", "id" => "1", "version" => 1}].to_json, :headers => { "Content-Type" => "application/json"}})
|
25
51
|
|
26
52
|
expect(@asari.remove_item("1")).to eq(nil)
|
27
53
|
end
|
data/spec/search_spec.rb
CHANGED
@@ -8,9 +8,21 @@ describe Asari do
|
|
8
8
|
HTTParty.stub(:get).and_return(fake_response)
|
9
9
|
end
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
context "when region is not specified" do
|
12
|
+
it "allows you to search using default region." do
|
13
|
+
HTTParty.should_receive(:get).with("http://search-testdomain.us-east-1.cloudsearch.amazonaws.com/2011-02-01/search?q=testsearch&size=10")
|
14
|
+
@asari.search("testsearch")
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context "when region is not specified" do
|
19
|
+
before(:each) do
|
20
|
+
@asari.aws_region = 'my-region'
|
21
|
+
end
|
22
|
+
it "allows you to search using specified region." do
|
23
|
+
HTTParty.should_receive(:get).with("http://search-testdomain.my-region.cloudsearch.amazonaws.com/2011-02-01/search?q=testsearch&size=10")
|
24
|
+
@asari.search("testsearch")
|
25
|
+
end
|
14
26
|
end
|
15
27
|
|
16
28
|
it "escapes dangerous characters in search terms." do
|
@@ -28,6 +40,23 @@ describe Asari do
|
|
28
40
|
@asari.search("testsearch", :page_size => 20, :page => 3)
|
29
41
|
end
|
30
42
|
|
43
|
+
describe "the rank option" do
|
44
|
+
it "takes a plain string" do
|
45
|
+
HTTParty.should_receive(:get).with("http://search-testdomain.us-east-1.cloudsearch.amazonaws.com/2011-02-01/search?q=testsearch&size=10&rank=some_field")
|
46
|
+
@asari.search("testsearch", :rank => "some_field")
|
47
|
+
end
|
48
|
+
|
49
|
+
it "takes an array with :asc" do
|
50
|
+
HTTParty.should_receive(:get).with("http://search-testdomain.us-east-1.cloudsearch.amazonaws.com/2011-02-01/search?q=testsearch&size=10&rank=some_field")
|
51
|
+
@asari.search("testsearch", :rank => ["some_field", :asc])
|
52
|
+
end
|
53
|
+
|
54
|
+
it "takes an array with :desc" do
|
55
|
+
HTTParty.should_receive(:get).with("http://search-testdomain.us-east-1.cloudsearch.amazonaws.com/2011-02-01/search?q=testsearch&size=10&rank=-some_field")
|
56
|
+
@asari.search("testsearch", :rank => ["some_field", :desc])
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
31
60
|
it "returns a list of document IDs for search results." do
|
32
61
|
result = @asari.search("testsearch")
|
33
62
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: asari
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-04-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: httparty
|
@@ -98,4 +98,3 @@ test_files:
|
|
98
98
|
- spec/conditionals_spec.rb
|
99
99
|
- spec/documents_spec.rb
|
100
100
|
- spec/search_spec.rb
|
101
|
-
has_rdoc:
|