poliqarpr 0.1.7 → 0.1.8
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/changelog.txt +4 -0
- data/lib/poliqarpr/client.rb +53 -16
- data/lib/poliqarpr/connector.rb +2 -0
- data/lib/poliqarpr/exceptions.rb +4 -1
- data/poliqarpr.gemspec +1 -1
- data/spec/client.rb +14 -2
- metadata +2 -2
data/changelog.txt
CHANGED
data/lib/poliqarpr/client.rb
CHANGED
@@ -28,7 +28,8 @@ module Poliqarp
|
|
28
28
|
@connector = Connector.new(self)
|
29
29
|
@config = Config.new(self,500000)
|
30
30
|
@answer_queue = Queue.new
|
31
|
-
@
|
31
|
+
@waiting_mutex = Mutex.new
|
32
|
+
@query_mutex = Mutex.new
|
32
33
|
new_session
|
33
34
|
config.left_context_size = 5
|
34
35
|
config.right_context_size = 5
|
@@ -380,24 +381,34 @@ protected
|
|
380
381
|
|
381
382
|
# *Asynchronous* Sends the query to the server
|
382
383
|
# * +query+ query to send
|
384
|
+
# * +should_wait+ flag indicating that before sending the
|
385
|
+
# query to the server, the receiver should start wating
|
386
|
+
# (i.e. the call is async).
|
383
387
|
# * +handler+ if given, the method returns immediately,
|
384
388
|
# and the answer is sent to the handler. In this case
|
385
389
|
# the result returned by make_query should be IGNORED!
|
386
|
-
def make_query(query,
|
390
|
+
def make_query(query, should_wait=false,&handler)
|
387
391
|
if @last_query != query
|
388
|
-
@last_query
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
392
|
+
if @last_query != nil
|
393
|
+
begin
|
394
|
+
talk("CANCEL")
|
395
|
+
stop_waiting
|
396
|
+
finish_query
|
397
|
+
rescue InvalidJobId
|
398
|
+
# this is ok - there might be no job running
|
399
|
+
end
|
394
400
|
end
|
401
|
+
@last_query = query
|
402
|
+
talk("MAKE-QUERY #{query}")
|
403
|
+
start_waiting if should_wait
|
404
|
+
run_query
|
395
405
|
result = talk("RUN-QUERY #{config.buffer_size}", :async, &handler)
|
396
406
|
if handler.nil?
|
397
407
|
@last_result = result
|
398
408
|
end
|
399
409
|
else
|
400
|
-
|
410
|
+
start_waiting if should_wait
|
411
|
+
stop_waiting if query_done?
|
401
412
|
end
|
402
413
|
@last_result
|
403
414
|
end
|
@@ -416,7 +427,7 @@ protected
|
|
416
427
|
|
417
428
|
# Stop waiting for the ansynchonous answer.
|
418
429
|
def stop_waiting
|
419
|
-
@
|
430
|
+
@waiting_mutex.synchronize {
|
420
431
|
@should_wait = false
|
421
432
|
}
|
422
433
|
debug("WAITING stopped")
|
@@ -425,7 +436,7 @@ protected
|
|
425
436
|
# Check if the thread should still wait for the answer.
|
426
437
|
def should_wait?
|
427
438
|
should_wait = nil
|
428
|
-
@
|
439
|
+
@waiting_mutex.synchronize {
|
429
440
|
should_wait = @should_wait
|
430
441
|
}
|
431
442
|
should_wait
|
@@ -433,23 +444,49 @@ protected
|
|
433
444
|
|
434
445
|
# Start waiting for the answer.
|
435
446
|
def start_waiting
|
436
|
-
@
|
447
|
+
@waiting_mutex.synchronize {
|
437
448
|
@should_wait = true
|
438
449
|
}
|
439
450
|
debug("WAITING started")
|
440
451
|
end
|
441
452
|
|
453
|
+
def run_query
|
454
|
+
@query_mutex.synchronize {
|
455
|
+
@query_done = false
|
456
|
+
}
|
457
|
+
debug("QUERY started")
|
458
|
+
end
|
459
|
+
|
460
|
+
def query_done?
|
461
|
+
done = nil
|
462
|
+
@query_mutex.synchronize {
|
463
|
+
done = @query_done
|
464
|
+
}
|
465
|
+
done
|
466
|
+
end
|
467
|
+
|
468
|
+
def finish_query
|
469
|
+
@query_mutex.synchronize {
|
470
|
+
@query_done = true
|
471
|
+
}
|
472
|
+
debug("QUERY finished")
|
473
|
+
end
|
474
|
+
|
442
475
|
def make_async_query(query,answer_offset)
|
443
|
-
raise IndexOutOfBounds.new(answer_offset) if answer_offset
|
444
|
-
start_waiting
|
476
|
+
raise IndexOutOfBounds.new(answer_offset) if answer_offset >= config.buffer_size
|
445
477
|
# we access the result count through BUFFER-STATE call
|
446
|
-
make_query(query)
|
478
|
+
make_query(query,true) do |msg|
|
479
|
+
if msg =~ /QUERY-DONE/
|
480
|
+
stop_waiting
|
481
|
+
finish_query
|
482
|
+
end
|
483
|
+
end
|
447
484
|
result_count = 0
|
448
485
|
begin
|
449
486
|
# the result count might be not exact!
|
450
487
|
result_count = talk("BUFFER-STATE").split(" ")[2].to_i
|
451
488
|
break unless should_wait?
|
452
|
-
end while result_count
|
489
|
+
end while result_count <= answer_offset
|
453
490
|
# force stop waiting if the result offset is reached before the query has finished
|
454
491
|
stop_waiting
|
455
492
|
@last_result = "OK #{result_count}"
|
data/lib/poliqarpr/connector.rb
CHANGED
data/lib/poliqarpr/exceptions.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Poliqarp
|
2
2
|
# Author:: Aleksander Pohl (mailto:apohllo@o2.pl)
|
3
3
|
# License:: MIT License
|
4
|
-
|
4
|
+
|
5
5
|
# Base for all poliqarp exceptions.
|
6
6
|
class PoliqarpException < Exception; end
|
7
7
|
|
@@ -10,6 +10,9 @@ module Poliqarp
|
|
10
10
|
# asynchronous call.
|
11
11
|
class JobInProgress < PoliqarpException; end
|
12
12
|
|
13
|
+
# The InvalidJobId exceptions is raised when there is no job to be cancelled.
|
14
|
+
class InvalidJobId < PoliqarpException; end
|
15
|
+
|
13
16
|
# The IndexOutOfBounds exception is raised if the index of given excerpt
|
14
17
|
# is larger than the size of query buffer.
|
15
18
|
class IndexOutOfBounds < PoliqarpException
|
data/poliqarpr.gemspec
CHANGED
data/spec/client.rb
CHANGED
@@ -30,7 +30,7 @@ describe Poliqarp::Client do
|
|
30
30
|
|
31
31
|
it "should work with debug turned on" do
|
32
32
|
@client.debug = true
|
33
|
-
(proc do
|
33
|
+
(proc do
|
34
34
|
@client.ping
|
35
35
|
end).should_not raise_error(Exception)
|
36
36
|
end
|
@@ -49,7 +49,7 @@ describe Poliqarp::Client do
|
|
49
49
|
end
|
50
50
|
|
51
51
|
it "should raise error if failed to open corpus" do
|
52
|
-
(proc do
|
52
|
+
(proc do
|
53
53
|
@client.open_corpus("")
|
54
54
|
end).should raise_error(Poliqarp::PoliqarpException)
|
55
55
|
end
|
@@ -186,6 +186,18 @@ describe Poliqarp::Client do
|
|
186
186
|
@client.find("nachalny",:index => 2)
|
187
187
|
end).should raise_error(Poliqarp::IndexOutOfBounds)
|
188
188
|
end
|
189
|
+
|
190
|
+
it "should work for examples with distant index" do
|
191
|
+
@client.config.buffer_size = 10000
|
192
|
+
@client.find("i",:index => 100)
|
193
|
+
end
|
194
|
+
|
195
|
+
it "should work for subseqent examples with distant indices" do
|
196
|
+
@client.config.buffer_size = 10001
|
197
|
+
@client.find("a",:index => 1)
|
198
|
+
@client.find("a",:index => 10000)
|
199
|
+
end
|
200
|
+
|
189
201
|
end
|
190
202
|
|
191
203
|
describe("(with lemmata flags set to true)") do
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: poliqarpr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.1.
|
5
|
+
version: 0.1.8
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Aleksander Pohl
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-
|
13
|
+
date: 2011-03-08 00:00:00 +01:00
|
14
14
|
default_executable:
|
15
15
|
dependencies: []
|
16
16
|
|