Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Implement queries as jobs (listable on rethinkdb.jobs)
- Loading branch information
1 parent
f4789f8
commit 0c01c69
Showing
6 changed files
with
115 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
require "uuid" | ||
|
||
abstract class ReQL::Job | ||
getter id = UUID.random | ||
getter start_time = Time.utc | ||
getter running = true | ||
|
||
def initialize(@job_manager : JobManager) | ||
@job_manager.lock.synchronize do | ||
@job_manager.jobs[@id] = self | ||
end | ||
end | ||
|
||
def finish_job | ||
@running = false | ||
@job_manager.lock.synchronize do | ||
@job_manager.jobs.delete(@id) | ||
end | ||
end | ||
|
||
abstract def type : String | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
require "./query_job" | ||
|
||
class ReQL::JobManager | ||
getter jobs = Hash(UUID, Job).new | ||
getter lock = Mutex.new | ||
|
||
def run_query(evaluator : Evaluator, term : Term::Type) | ||
QueryJob.new(self, evaluator, term).result | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
require "./job" | ||
require "../executor/stream" | ||
|
||
class ReQL::QueryJob < ReQL::Job | ||
@future_result : Concurrent::Future(ReQL::AbstractValue)? | ||
getter term | ||
|
||
def initialize(job_manager, @evaluator : Evaluator, @term : Term::Type) | ||
super(job_manager) | ||
|
||
@future_result = future do | ||
begin | ||
result = @evaluator.eval(term) | ||
if result.is_a? ReQL::Stream | ||
ResultStream.new(result, self) | ||
else | ||
finish_job | ||
result | ||
end | ||
rescue error | ||
finish_job | ||
raise error | ||
end | ||
end | ||
end | ||
|
||
def result | ||
@future_result.not_nil!.get | ||
end | ||
|
||
def type : String | ||
"query" | ||
end | ||
|
||
struct ResultStream < ReQL::Stream | ||
@stream : Box(Stream) | ||
|
||
def initialize(stream : Stream, @job : ReQL::QueryJob) | ||
@stream = Box(Stream).new(stream) | ||
end | ||
|
||
def start_reading | ||
raise QueryLogicError.new "Query terminated." unless @job.running | ||
@stream.object.start_reading | ||
end | ||
|
||
def next_val | ||
raise QueryLogicError.new "Query terminated." unless @job.running | ||
@stream.object.next_val | ||
end | ||
|
||
def finish_reading | ||
@stream.object.finish_reading | ||
@job.finish_job | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters