class Blazer::Adapters::BigQueryAdapter

Public Instance Methods

parameter_binding() click to toggle source

cloud.google.com/bigquery/docs/parameterized-queries

# File lib/blazer/adapters/bigquery_adapter.rb, line 52
def parameter_binding
  :positional
end
preview_statement() click to toggle source
# File lib/blazer/adapters/bigquery_adapter.rb, line 42
def preview_statement
  "SELECT * FROM `{table}` LIMIT 10"
end
quoting() click to toggle source

cloud.google.com/bigquery/docs/reference/standard-sql/lexical#string_and_bytes_literals

# File lib/blazer/adapters/bigquery_adapter.rb, line 47
def quoting
  :backslash_escape
end
run_statement(statement, comment, bind_params) click to toggle source
# File lib/blazer/adapters/bigquery_adapter.rb, line 4
def run_statement(statement, comment, bind_params)
  columns = []
  rows = []
  error = nil

  begin
    results = bigquery.query(statement, params: bind_params)

    # 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.all.map(&:values)
    else
      error = Blazer::TIMEOUT_MESSAGE
    end
  rescue => e
    error = e.message
    error = Blazer::VARIABLE_MESSAGE if error.include?("Syntax error: Unexpected \"?\"")
  end

  [columns, rows, error]
end
schema() click to toggle source
# File lib/blazer/adapters/bigquery_adapter.rb, line 32
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 28
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 58
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 72
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 68
def table_refs
  bigquery.datasets.map(&:tables).flat_map { |table_list| table_list.map(&:table_ref) }
end