Class: Gcloud::Bigquery::QueryData

Inherits:
Data
  • Object
show all
Defined in:
lib/gcloud/bigquery/query_data.rb

Overview

# QueryData

Represents Data returned from a query a a list of name/value pairs.

Instance Attribute Summary collapse

Attributes inherited from Data

#gapi, #table

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Data

#etag, format_rows, format_values, #kind, #raw, #token, #total

Constructor Details

#initialize(arr = []) ⇒ QueryData

Returns a new instance of QueryData.



31
32
33
34
# File 'lib/gcloud/bigquery/query_data.rb', line 31

def initialize arr = []
  @job = nil
  super
end

Instance Attribute Details

#serviceObject



28
29
30
# File 'lib/gcloud/bigquery/query_data.rb', line 28

def service
  @service
end

Class Method Details

.from_gapi(gapi, service) ⇒ Object



203
204
205
206
207
208
209
210
211
212
213
214
215
# File 'lib/gcloud/bigquery/query_data.rb', line 203

def self.from_gapi gapi, service
  if gapi.schema.nil?
    formatted_rows = []
  else
    formatted_rows = format_rows gapi.rows,
                                 gapi.schema.fields
  end

  data = new formatted_rows
  data.gapi = gapi
  data.service = service
  data
end

Instance Method Details

#all(request_limit: nil) {|row| ... } ⇒ Enumerator

Retrieves all rows by repeatedly loading #next until #next? returns ‘false`. Calls the given block once for each row, which is passed as the parameter.

An Enumerator is returned if no block is given.

This method may make several API calls until all rows are retrieved. Be sure to use as narrow a search criteria as possible. Please use with caution.

Examples:

Iterating each row by passing a block:

require "gcloud"

gcloud = Gcloud.new
bigquery = gcloud.bigquery
job = bigquery.job "my_job"

data = job.query_results
data.all do |row|
  puts row["word"]
end

Using the enumerator by not passing a block:

require "gcloud"

gcloud = Gcloud.new
bigquery = gcloud.bigquery
job = bigquery.job "my_job"

data = job.query_results
words = data.all.map do |row|
  row["word"]
end

Limit the number of API calls made:

require "gcloud"

gcloud = Gcloud.new
bigquery = gcloud.bigquery
job = bigquery.job "my_job"

data = job.query_results
data.all(request_limit: 10) do |row|
  puts row["word"]
end

Parameters:

  • request_limit (Integer) (defaults to: nil)

    The upper limit of API requests to make to load all data. Default is no limit.

Yields:

  • (row)

    The block for accessing each row of data.

Yield Parameters:

  • row (Hash)

    The row object.

Returns:

  • (Enumerator)


174
175
176
177
178
179
180
181
182
183
184
185
186
187
# File 'lib/gcloud/bigquery/query_data.rb', line 174

def all request_limit: nil
  request_limit = request_limit.to_i if request_limit
  return enum_for(:all, request_limit: request_limit) unless block_given?
  results = self
  loop do
    results.each { |r| yield r }
    if request_limit
      request_limit -= 1
      break if request_limit < 0
    end
    break unless results.next?
    results = results.next
  end
end

#cache_hit?Boolean

Whether the query result was fetched from the query cache.

Returns:

  • (Boolean)


50
51
52
# File 'lib/gcloud/bigquery/query_data.rb', line 50

def cache_hit?
  @gapi.cache_hit
end

#complete?Boolean

Whether the query has completed or not. When data is present this will always be ‘true`. When `false`, `total` will not be available.

Returns:

  • (Boolean)


45
46
47
# File 'lib/gcloud/bigquery/query_data.rb', line 45

def complete?
  @gapi.job_complete
end

#fieldsObject

The fields of the data.



62
63
64
65
66
67
# File 'lib/gcloud/bigquery/query_data.rb', line 62

def fields
  f = schema.fields
  f = f.to_hash if f.respond_to? :to_hash
  f = [] if f.nil?
  f
end

#headersObject

The name of the columns in the data.



71
72
73
# File 'lib/gcloud/bigquery/query_data.rb', line 71

def headers
  fields.map(&:name)
end

#jobObject

The BigQuery Job that was created to run the query.



191
192
193
194
195
196
197
198
199
# File 'lib/gcloud/bigquery/query_data.rb', line 191

def job
  return @job if @job
  return nil unless job?
  ensure_service!
  gapi = service.get_job job_id
  @job = Job.from_gapi gapi, service
rescue Gcloud::NotFoundError
  nil
end

#nextQueryData

Retrieve the next page of query data.

Examples:

require "gcloud"

gcloud = Gcloud.new
bigquery = gcloud.bigquery
job = bigquery.job "my_job"

data = job.query_results
if data.next?
  next_data = data.next
end

Returns:



113
114
115
116
117
118
# File 'lib/gcloud/bigquery/query_data.rb', line 113

def next
  return nil unless next?
  ensure_service!
  gapi = service.job_query_results job_id, token: token
  QueryData.from_gapi gapi, service
end

#next?Boolean

Whether there is a next page of query data.

Examples:

require "gcloud"

gcloud = Gcloud.new
bigquery = gcloud.bigquery
job = bigquery.job "my_job"

data = job.query_results
if data.next?
  next_data = data.next
end

Returns:

  • (Boolean)


92
93
94
# File 'lib/gcloud/bigquery/query_data.rb', line 92

def next?
  !token.nil?
end

#schemaObject

The schema of the data.



56
57
58
# File 'lib/gcloud/bigquery/query_data.rb', line 56

def schema
  Schema.from_gapi(@gapi.schema).freeze
end

#total_bytesObject

The total number of bytes processed for this query.



37
38
39
40
41
# File 'lib/gcloud/bigquery/query_data.rb', line 37

def total_bytes
  Integer @gapi.total_bytes_processed
rescue
  nil
end