class Blazer::Adapters::BigQueryAdapter

Public Instance Methods

preview_statement() click to toggle source
# File lib/blazer/adapters/bigquery_adapter.rb, line 41
def preview_statement
  "SELECT * FROM `{table}` LIMIT 10"
end
run_statement(statement, comment) click to toggle source
# File lib/blazer/adapters/bigquery_adapter.rb, line 4
def run_statement(statement, comment)
  columns = []
  rows = []
  error = nil

  begin
    results = bigquery.query(statement)

    # complete? was removed in google-cloud-bigquery 0.29.0
    # code is for backward compatibility
    if !results.respond_to?(:complete?) || results.complete?
      columns = results.first.keys.map(&:to_s) if results.size > 0
      rows = results.map(&:values)
    else
      error = Blazer::TIMEOUT_MESSAGE
    end
  rescue => e
    error = e.message
  end

  [columns, rows, error]
end
schema() click to toggle source
# File lib/blazer/adapters/bigquery_adapter.rb, line 31
def schema
  table_refs.map do |table_ref|
    {
      schema: table_ref.dataset_id,
      table: table_ref.table_id,
      columns: table_columns(table_ref)
    }
  end
end
tables() click to toggle source
# File lib/blazer/adapters/bigquery_adapter.rb, line 27
def tables
  table_refs.map { |t| "#{t.project_id}.#{t.dataset_id}.#{t.table_id}" }
end

Private Instance Methods

bigquery() click to toggle source
# File lib/blazer/adapters/bigquery_adapter.rb, line 47
def bigquery
  @bigquery ||= begin
    require "google/cloud/bigquery"
    Google::Cloud::Bigquery.new(
      project: settings["project"],
      keyfile: settings["keyfile"]
    )
  end
end
table_columns(table_ref) click to toggle source
# File lib/blazer/adapters/bigquery_adapter.rb, line 61
def table_columns(table_ref)
  schema = bigquery.service.get_table(table_ref.dataset_id, table_ref.table_id).schema
  return [] if schema.nil?
  schema.fields.map { |field| {name: field.name, data_type: field.type} }
end
table_refs() click to toggle source
# File lib/blazer/adapters/bigquery_adapter.rb, line 57
def table_refs
  bigquery.datasets.map(&:tables).flat_map { |table_list| table_list.map(&:table_ref) }
end