jruby-elasticsearch 0.0.11 → 0.0.12
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.
@@ -3,11 +3,12 @@ require "jruby-elasticsearch/request"
|
|
3
3
|
|
4
4
|
class ElasticSearch::BulkRequest < ElasticSearch::Request
|
5
5
|
# Create a new index request.
|
6
|
+
public
|
6
7
|
def initialize(client)
|
7
8
|
@client = client
|
8
9
|
@prep = @client.prepareBulk()
|
9
10
|
super()
|
10
|
-
end
|
11
|
+
end # def initialize
|
11
12
|
|
12
13
|
# Execute this index request.
|
13
14
|
# This call is asynchronous.
|
@@ -17,13 +18,16 @@ class ElasticSearch::BulkRequest < ElasticSearch::Request
|
|
17
18
|
use_callback(&block) if block_given?
|
18
19
|
action = @prep.execute(@handler)
|
19
20
|
return action
|
20
|
-
end
|
21
|
+
end # def execute
|
21
22
|
|
22
23
|
# Execute this index request synchronously
|
24
|
+
public
|
23
25
|
def execute!
|
24
26
|
return @prep.execute.actionGet()
|
25
|
-
end
|
27
|
+
end # def execute!
|
26
28
|
|
29
|
+
# Index a document.
|
30
|
+
public
|
27
31
|
def index(index, type, id=nil, data={})
|
28
32
|
req = org.elasticsearch.action.index.IndexRequest.new(index)
|
29
33
|
req.type(type) if type
|
@@ -32,6 +36,7 @@ class ElasticSearch::BulkRequest < ElasticSearch::Request
|
|
32
36
|
@prep.add(req)
|
33
37
|
end
|
34
38
|
|
39
|
+
public
|
35
40
|
def <<(request)
|
36
41
|
@prep.add(request)
|
37
42
|
end # def <<
|
@@ -1,7 +1,80 @@
|
|
1
1
|
require "jruby-elasticsearch/namespace"
|
2
|
+
require "thread"
|
2
3
|
|
3
4
|
class ElasticSearch::BulkStream
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
# Create a new bulk stream. This allows you to send
|
6
|
+
# index and other bulk events asynchronously and use
|
7
|
+
# the bulk api in ElasticSearch in a streaming way.
|
8
|
+
#
|
9
|
+
# The 'queue_size' is the maximum size of unflushed
|
10
|
+
# requests. If the queue reaches this size, new requests
|
11
|
+
# will block until there is room to move.
|
12
|
+
def initialize(client, queue_size=10, flush_interval=1)
|
13
|
+
@bulkthread = Thread.new { run }
|
14
|
+
@client = client
|
15
|
+
@queue_size = queue_size
|
16
|
+
@queue = SizedQueue.new(@queue_size)
|
17
|
+
@flush_interval = flush_interval
|
18
|
+
end # def initialize
|
19
|
+
|
20
|
+
# See ElasticSearch::BulkRequest#index for arguments.
|
21
|
+
public
|
22
|
+
def index(*args)
|
23
|
+
# TODO(sissel): It's not clear I need to queue this up, I could just
|
24
|
+
# call BulkRequest#index() and when we have 10 or whatnot, flush, but
|
25
|
+
# Queue gives us a nice blocking mechanism anyway.
|
26
|
+
@queue << [:index, *args]
|
27
|
+
end # def index
|
28
|
+
|
29
|
+
# The stream runner.
|
30
|
+
private
|
31
|
+
def run
|
32
|
+
# TODO(sissel): Make a way to shutdown this thread.
|
33
|
+
while true
|
34
|
+
requests = []
|
35
|
+
if @queue.size == @queue_size
|
36
|
+
# queue full, flush now.
|
37
|
+
flush
|
38
|
+
else
|
39
|
+
# Not full, so sleep and flush anyway.
|
40
|
+
sleep(@flush_interval)
|
41
|
+
flush
|
42
|
+
end
|
43
|
+
|
44
|
+
if @stop and @queue.size == 0
|
45
|
+
# Queue empty and it's time to stop.
|
46
|
+
break
|
47
|
+
end
|
48
|
+
end # while true
|
49
|
+
end # def run
|
50
|
+
|
51
|
+
# Stop the stream
|
52
|
+
public
|
53
|
+
def stop
|
54
|
+
@queue << nil
|
55
|
+
@stop = true
|
56
|
+
end # def stop
|
57
|
+
|
58
|
+
# Flush the queue right now. This will block until the
|
59
|
+
# bulk request has completed.
|
60
|
+
public
|
61
|
+
def flush
|
62
|
+
bulk = @client.bulk
|
63
|
+
|
64
|
+
flush_one = proc do
|
65
|
+
# block if no data.
|
66
|
+
method, *args = @queue.pop
|
67
|
+
return if args.nil? # probably we are now stopping.
|
68
|
+
bulk.send(method, *args)
|
69
|
+
end
|
70
|
+
|
71
|
+
flush_one.call
|
72
|
+
|
73
|
+
1.upto([@queue.size, @queue_size - 1].min) do
|
74
|
+
flush_one.call
|
75
|
+
end
|
76
|
+
|
77
|
+
# Block until this finishes
|
78
|
+
bulk.execute!
|
79
|
+
end # def flush
|
80
|
+
end # class ElasticSearch::BulkStream
|
@@ -53,7 +53,12 @@ class ElasticSearch::Client
|
|
53
53
|
# request.
|
54
54
|
public
|
55
55
|
def bulk
|
56
|
-
ElasticSearch::BulkRequest.new(@client)
|
56
|
+
return ElasticSearch::BulkRequest.new(@client)
|
57
|
+
end # def bulk
|
58
|
+
|
59
|
+
public
|
60
|
+
def bulkstream(queue_size=10, flush_interval=1)
|
61
|
+
return ElasticSearch::BulkStream.new(self, queue_size, flush_interval)
|
57
62
|
end # def bulk
|
58
63
|
|
59
64
|
# Index a new document
|
data/lib/jruby-elasticsearch.rb
CHANGED
data/test/test_integration.rb
CHANGED
@@ -4,11 +4,17 @@ class TestElasticSearch < Test::Unit::TestCase
|
|
4
4
|
def setup
|
5
5
|
# Require all the elasticsearch libs
|
6
6
|
raise "Please set ELASTICSEARCH_HOME" if ENV['ELASTICSEARCH_HOME'].nil?
|
7
|
-
|
7
|
+
|
8
|
+
dir = File.join(ENV["ELASTICSEARCH_HOME"], "lib")
|
9
|
+
if !File.directory?(dir)
|
10
|
+
raise "ELASTICSEARCH_HOME set, but #{dir} doesn't exist"
|
11
|
+
end
|
12
|
+
|
13
|
+
Dir.glob(File.join(dir, "*.jar")).each do |jar|
|
8
14
|
require jar
|
9
15
|
end
|
10
16
|
|
11
|
-
$:.unshift("lib")
|
17
|
+
$:.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
|
12
18
|
require "jruby-elasticsearch"
|
13
19
|
|
14
20
|
# Start a local elasticsearch node
|
@@ -69,4 +75,34 @@ class TestElasticSearch < Test::Unit::TestCase
|
|
69
75
|
sleep 1
|
70
76
|
end
|
71
77
|
end
|
72
|
-
|
78
|
+
|
79
|
+
def test_bulk_stream_synchronous
|
80
|
+
stream = @client.bulkstream(10)
|
81
|
+
tries = 10
|
82
|
+
entries = 30
|
83
|
+
1.upto(entries) do |i|
|
84
|
+
stream.index("hello", "world", { "foo" => "bar", "i" => i })
|
85
|
+
end
|
86
|
+
stream.stop
|
87
|
+
|
88
|
+
found = false
|
89
|
+
1.upto(tries) do
|
90
|
+
search = @client.search do
|
91
|
+
index "hello"
|
92
|
+
query "*"
|
93
|
+
end
|
94
|
+
# Results is an org.elasticsearch.action.search.SearchResponse
|
95
|
+
results = search.execute!
|
96
|
+
count = results.hits.totalHits
|
97
|
+
|
98
|
+
if count == entries
|
99
|
+
# assert for good measure
|
100
|
+
found = true
|
101
|
+
break
|
102
|
+
end
|
103
|
+
sleep 0.2
|
104
|
+
end # try a bunch to find our results
|
105
|
+
|
106
|
+
assert(found, "Search results were not found.")
|
107
|
+
end # def test_bulk_stream_synchronous
|
108
|
+
end # class TestElasticSearch
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: jruby-elasticsearch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.12
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Jordan Sissel
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-10-
|
13
|
+
date: 2011-10-14 00:00:00 -07:00
|
14
14
|
default_executable:
|
15
15
|
dependencies: []
|
16
16
|
|