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