class Daru::TD::QueryEngine
Attributes
clear_progress[R]
connection[R]
show_progress[R]
Public Class Methods
new(connection, database, params={}, header:false, show_progress:false, clear_progress:false)
click to toggle source
# File lib/daru/td/query_engine.rb, line 31 def initialize(connection, database, params={}, header:false, show_progress:false, clear_progress:false) @connection = connection @database = database @params = params @header = header if iruby_notebook? # Enable progress for IRuby notebook @show_progress = show_progress @clear_progress = clear_progress else @show_progress = false @clear_progress = false end end
Public Instance Methods
create_header(name)
click to toggle source
# File lib/daru/td/query_engine.rb, line 52 def create_header(name) return '' unless @header return "-- #{@header}\n" if String === @header "-- #{name}\n" end
execute(query, **kwargs)
click to toggle source
# File lib/daru/td/query_engine.rb, line 58 def execute(query, **kwargs) params = @params.dup params.update(kwargs) # Issue query issued_at = Time.now.utc.round result_url = params.delete(:result_url) priority = params.delete(:priority) retry_limit = params.delete(:retry_limit) job = JobWrapper.new(connection.client.query(@database, query, result_url, priority, retry_limit, params)) job.issued_at = issued_at get_result(job, wait: true) rescue Interrupt job.kill() raise end
get_result(job, wait: true)
click to toggle source
# File lib/daru/td/query_engine.rb, line 85 def get_result(job, wait: true) if wait job.wait(nil, 2, &method(:wait_callback)) end # status check unless job.success? if job.debug && job.debug['stderr'] #logger.error(job.debug['stderr']) $stderr.puts job.debug['stderr'] end raise "job #{job.job_id} #{job.status}" end ResultProxy.new(self, job) end
job_finished?(job)
click to toggle source
# File lib/daru/td/query_engine.rb, line 80 def job_finished?(job) job.update_progress! job.finished? end
type()
click to toggle source
# File lib/daru/td/query_engine.rb, line 48 def type @params[:type] end
wait_callback(job, cursize=nil)
click to toggle source
# File lib/daru/td/query_engine.rb, line 76 def wait_callback(job, cursize=nil) display_progress(job, cursize) end
Private Instance Methods
display_progress(job, cursize=nil)
click to toggle source
# File lib/daru/td/query_engine.rb, line 104 def display_progress(job, cursize=nil) return unless show_progress if show_progress.is_a?(Integer) && job.issued_at return if Time.now.getutc < job.issued_at + show_progress end IRuby::Display.clear_output(true) html = render_progress_html_erb(binding) IRuby.display(IRuby.html(html)) end
escape_html(text)
click to toggle source
# File lib/daru/td/query_engine.rb, line 183 def escape_html(text) CGI.escape_html(text.to_s) end
html_presto_output(cmdout)
click to toggle source
# File lib/daru/td/query_engine.rb, line 148 def html_presto_output(cmdout) template = <<-'END_PRESTO_OUTPUT' <% # started at %> <% cmdout.scan(/started at.*$/) do |text| %> <%= html_text(text) %> <% end %> <% # warning %> <pre style="color: #c44;"> <% cmdout.scan(/^\*{2} .*$/) do |text| %> <%= escape_html(text) %> <% end %> </pre> <% # progress %> <% progress = cmdout.scan(/\n\d{4}-\d{2}-\d{2}.*(?:\n +.*)+/).last %> <% if progress %> <pre><%=escape_html(progress) %></pre> <% end %> <% # rows %> <% cmdout.scan(/^\d+ rows/) do |text| %> <%= escape_html(text) %><br /> <% end %> <% # finished at %> <% cmdout.scan(/finished at.*$/) do |text| %> <%= html_text(text) %> <% end %> END_PRESTO_OUTPUT erb = ERB.new(template) erb.filename = 'html_presto_output' erb.result(binding) end
html_text(text)
click to toggle source
# File lib/daru/td/query_engine.rb, line 179 def html_text(text) %Q[<div style="color: #888;"># #{escape_html(text)}</div>] end
iruby_notebook?()
click to toggle source
# File lib/daru/td/query_engine.rb, line 115 def iruby_notebook? defined?(IRuby) && !$stdout.tty? end
render_progress_html_erb(given_binding)
click to toggle source
# File lib/daru/td/query_engine.rb, line 119 def render_progress_html_erb(given_binding) template = <<-'END_ERB' <div style="border-style: dashed; border-width: 1px;"> <% if job.issued_at %> <%= html_text("issued at #{job.issued_at.iso8601}") %> <% end %> URL: <a href="<%=job.url %>" target="_blank"><%=job.url %></a><br> <% if job.type == :presto %> <% if job.debug && job.debug['cmdout'] %> <%= html_presto_output(job.debug['cmdout']) %> <% end %> <% end %> <% if job.result_size %> Result size: <%=escape_html(job.result_size) %> bytes<br> <% end %> <% if cursize %> Download: <%=escape_html(cursize) %> / <%=escape_html(job.result_size) %> bytes (<%=escape_html('%.2f' % [cursize * 100.0 / job.result_size]) %>%)<br> <% if cursize >= job.result_size %> downloaded at <%=escape_html(Time.now.getutc.round.iso8601) %> <% end %> <% end %> </div> END_ERB erb = ERB.new(template) erb.filename = 'render_progress_html_erb' erb.result(given_binding) end