google-cloud-bigquery 0.28.0 → 0.29.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/google-cloud-bigquery.rb +2 -2
- data/lib/google/cloud/bigquery.rb +10 -12
- data/lib/google/cloud/bigquery/copy_job.rb +42 -6
- data/lib/google/cloud/bigquery/data.rb +129 -23
- data/lib/google/cloud/bigquery/dataset.rb +708 -66
- data/lib/google/cloud/bigquery/dataset/access.rb +533 -27
- data/lib/google/cloud/bigquery/dataset/list.rb +5 -3
- data/lib/google/cloud/bigquery/external.rb +2353 -0
- data/lib/google/cloud/bigquery/extract_job.rb +52 -11
- data/lib/google/cloud/bigquery/insert_response.rb +90 -2
- data/lib/google/cloud/bigquery/job.rb +160 -21
- data/lib/google/cloud/bigquery/load_job.rb +128 -11
- data/lib/google/cloud/bigquery/project.rb +187 -44
- data/lib/google/cloud/bigquery/query_job.rb +323 -13
- data/lib/google/cloud/bigquery/schema.rb +57 -1
- data/lib/google/cloud/bigquery/schema/field.rb +118 -17
- data/lib/google/cloud/bigquery/service.rb +196 -43
- data/lib/google/cloud/bigquery/table.rb +739 -49
- data/lib/google/cloud/bigquery/table/async_inserter.rb +280 -0
- data/lib/google/cloud/bigquery/version.rb +1 -1
- data/lib/google/cloud/bigquery/view.rb +306 -69
- metadata +18 -3
- data/lib/google/cloud/bigquery/query_data.rb +0 -234
@@ -14,6 +14,7 @@
|
|
14
14
|
|
15
15
|
|
16
16
|
require "google/cloud/bigquery/service"
|
17
|
+
require "google/cloud/bigquery/data"
|
17
18
|
|
18
19
|
module Google
|
19
20
|
module Cloud
|
@@ -29,9 +30,29 @@ module Google
|
|
29
30
|
# @see https://cloud.google.com/bigquery/docs/reference/v2/jobs Jobs API
|
30
31
|
# reference
|
31
32
|
#
|
33
|
+
# @example
|
34
|
+
# require "google/cloud/bigquery"
|
35
|
+
#
|
36
|
+
# bigquery = Google::Cloud::Bigquery.new
|
37
|
+
#
|
38
|
+
# job = bigquery.query_job "SELECT COUNT(word) as count FROM " \
|
39
|
+
# "publicdata.samples.shakespeare"
|
40
|
+
#
|
41
|
+
# job.wait_until_done!
|
42
|
+
#
|
43
|
+
# if job.failed?
|
44
|
+
# puts job.error
|
45
|
+
# else
|
46
|
+
# puts job.data.first
|
47
|
+
# end
|
48
|
+
#
|
32
49
|
class QueryJob < Job
|
33
50
|
##
|
34
51
|
# Checks if the priority for the query is `BATCH`.
|
52
|
+
#
|
53
|
+
# @return [Boolean] `true` when the priority is `BATCH`, `false`
|
54
|
+
# otherwise.
|
55
|
+
#
|
35
56
|
def batch?
|
36
57
|
val = @gapi.configuration.query.priority
|
37
58
|
val == "BATCH"
|
@@ -39,6 +60,10 @@ module Google
|
|
39
60
|
|
40
61
|
##
|
41
62
|
# Checks if the priority for the query is `INTERACTIVE`.
|
63
|
+
#
|
64
|
+
# @return [Boolean] `true` when the priority is `INTERACTIVE`, `false`
|
65
|
+
# otherwise.
|
66
|
+
#
|
42
67
|
def interactive?
|
43
68
|
val = @gapi.configuration.query.priority
|
44
69
|
return true if val.nil?
|
@@ -48,6 +73,10 @@ module Google
|
|
48
73
|
##
|
49
74
|
# Checks if the the query job allows arbitrarily large results at a
|
50
75
|
# slight cost to performance.
|
76
|
+
#
|
77
|
+
# @return [Boolean] `true` when large results are allowed, `false`
|
78
|
+
# otherwise.
|
79
|
+
#
|
51
80
|
def large_results?
|
52
81
|
val = @gapi.configuration.query.allow_large_results
|
53
82
|
return false if val.nil?
|
@@ -58,6 +87,10 @@ module Google
|
|
58
87
|
# Checks if the query job looks for an existing result in the query
|
59
88
|
# cache. For more information, see [Query
|
60
89
|
# Caching](https://cloud.google.com/bigquery/querying-data#querycaching).
|
90
|
+
#
|
91
|
+
# @return [Boolean] `true` when the query cache will be used, `false`
|
92
|
+
# otherwise.
|
93
|
+
#
|
61
94
|
def cache?
|
62
95
|
val = @gapi.configuration.query.use_query_cache
|
63
96
|
return false if val.nil?
|
@@ -68,6 +101,10 @@ module Google
|
|
68
101
|
# Checks if the query job flattens nested and repeated fields in the
|
69
102
|
# query results. The default is `true`. If the value is `false`,
|
70
103
|
# #large_results? should return `true`.
|
104
|
+
#
|
105
|
+
# @return [Boolean] `true` when the job flattens results, `false`
|
106
|
+
# otherwise.
|
107
|
+
#
|
71
108
|
def flatten?
|
72
109
|
val = @gapi.configuration.query.flatten_results
|
73
110
|
return true if val.nil?
|
@@ -75,15 +112,27 @@ module Google
|
|
75
112
|
end
|
76
113
|
|
77
114
|
##
|
78
|
-
# Limits the billing tier for this job.
|
79
|
-
#
|
115
|
+
# Limits the billing tier for this job. Queries that have resource usage
|
116
|
+
# beyond this tier will fail (without incurring a charge). If
|
117
|
+
# unspecified, this will be set to your project default. For more
|
118
|
+
# information, see [High-Compute
|
80
119
|
# queries](https://cloud.google.com/bigquery/pricing#high-compute).
|
120
|
+
#
|
121
|
+
# @return [Integer, nil] The tier number, or `nil` for the project
|
122
|
+
# default.
|
123
|
+
#
|
81
124
|
def maximum_billing_tier
|
82
125
|
@gapi.configuration.query.maximum_billing_tier
|
83
126
|
end
|
84
127
|
|
85
128
|
##
|
86
|
-
# Limits the bytes billed for this job.
|
129
|
+
# Limits the bytes billed for this job. Queries that will have bytes
|
130
|
+
# billed beyond this limit will fail (without incurring a charge). If
|
131
|
+
# `nil`, this will be set to your project default.
|
132
|
+
#
|
133
|
+
# @return [Integer, nil] The number of bytes, or `nil` for the project
|
134
|
+
# default.
|
135
|
+
#
|
87
136
|
def maximum_bytes_billed
|
88
137
|
Integer @gapi.configuration.query.maximum_bytes_billed
|
89
138
|
rescue
|
@@ -92,20 +141,62 @@ module Google
|
|
92
141
|
|
93
142
|
##
|
94
143
|
# Checks if the query results are from the query cache.
|
144
|
+
#
|
145
|
+
# @return [Boolean] `true` when the job statistics indicate a cache hit,
|
146
|
+
# `false` otherwise.
|
147
|
+
#
|
95
148
|
def cache_hit?
|
96
149
|
@gapi.statistics.query.cache_hit
|
97
150
|
end
|
98
151
|
|
99
152
|
##
|
100
153
|
# The number of bytes processed by the query.
|
154
|
+
#
|
155
|
+
# @return [Integer] Total bytes processed for the job.
|
156
|
+
#
|
101
157
|
def bytes_processed
|
102
158
|
Integer @gapi.statistics.query.total_bytes_processed
|
103
159
|
rescue
|
104
160
|
nil
|
105
161
|
end
|
106
162
|
|
163
|
+
##
|
164
|
+
# Describes the execution plan for the query.
|
165
|
+
#
|
166
|
+
# @return [Array<Google::Cloud::Bigquery::QueryJob::Stage>] An array
|
167
|
+
# containing the stages of the execution plan.
|
168
|
+
#
|
169
|
+
# @example
|
170
|
+
# require "google/cloud/bigquery"
|
171
|
+
#
|
172
|
+
# bigquery = Google::Cloud::Bigquery.new
|
173
|
+
#
|
174
|
+
# sql = "SELECT word FROM publicdata.samples.shakespeare"
|
175
|
+
# job = bigquery.query_job sql
|
176
|
+
#
|
177
|
+
# job.wait_until_done!
|
178
|
+
#
|
179
|
+
# stages = job.query_plan
|
180
|
+
# stages.each do |stage|
|
181
|
+
# puts stage.name
|
182
|
+
# stage.steps.each do |step|
|
183
|
+
# puts step.kind
|
184
|
+
# puts step.substeps.inspect
|
185
|
+
# end
|
186
|
+
# end
|
187
|
+
#
|
188
|
+
def query_plan
|
189
|
+
return nil unless @gapi.statistics.query.query_plan
|
190
|
+
Array(@gapi.statistics.query.query_plan).map do |stage|
|
191
|
+
Stage.from_gapi stage
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
107
195
|
##
|
108
196
|
# The table in which the query results are stored.
|
197
|
+
#
|
198
|
+
# @return [Table] A table instance.
|
199
|
+
#
|
109
200
|
def destination
|
110
201
|
table = @gapi.configuration.query.destination_table
|
111
202
|
return nil unless table
|
@@ -116,6 +207,9 @@ module Google
|
|
116
207
|
|
117
208
|
##
|
118
209
|
# Checks if the query job is using legacy sql.
|
210
|
+
#
|
211
|
+
# @return [Boolean] `true` when legacy sql is used, `false` otherwise.
|
212
|
+
#
|
119
213
|
def legacy_sql?
|
120
214
|
val = @gapi.configuration.query.use_legacy_sql
|
121
215
|
return true if val.nil?
|
@@ -124,10 +218,61 @@ module Google
|
|
124
218
|
|
125
219
|
##
|
126
220
|
# Checks if the query job is using standard sql.
|
221
|
+
#
|
222
|
+
# @return [Boolean] `true` when standard sql is used, `false` otherwise.
|
223
|
+
#
|
127
224
|
def standard_sql?
|
128
225
|
!legacy_sql?
|
129
226
|
end
|
130
227
|
|
228
|
+
##
|
229
|
+
# The user-defined function resources used in the query. May be either a
|
230
|
+
# code resource to load from a Google Cloud Storage URI
|
231
|
+
# (`gs://bucket/path`), or an inline resource that contains code for a
|
232
|
+
# user-defined function (UDF). Providing an inline code resource is
|
233
|
+
# equivalent to providing a URI for a file containing the same code. See
|
234
|
+
# [User-Defined Functions](https://cloud.google.com/bigquery/docs/reference/standard-sql/user-defined-functions).
|
235
|
+
#
|
236
|
+
# @return [Array<String>] An array containing Google Cloud Storage URIs
|
237
|
+
# and/or inline source code.
|
238
|
+
#
|
239
|
+
def udfs
|
240
|
+
udfs_gapi = @gapi.configuration.query.user_defined_function_resources
|
241
|
+
return nil unless udfs_gapi
|
242
|
+
Array(udfs_gapi).map do |udf|
|
243
|
+
udf.inline_code || udf.resource_uri
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
##
|
248
|
+
# Refreshes the job until the job is `DONE`.
|
249
|
+
# The delay between refreshes will incrementally increase.
|
250
|
+
#
|
251
|
+
# @example
|
252
|
+
# require "google/cloud/bigquery"
|
253
|
+
#
|
254
|
+
# bigquery = Google::Cloud::Bigquery.new
|
255
|
+
#
|
256
|
+
# sql = "SELECT word FROM publicdata.samples.shakespeare"
|
257
|
+
# job = bigquery.query_job sql
|
258
|
+
#
|
259
|
+
# job.wait_until_done!
|
260
|
+
# job.done? #=> true
|
261
|
+
#
|
262
|
+
def wait_until_done!
|
263
|
+
return if done?
|
264
|
+
|
265
|
+
ensure_service!
|
266
|
+
loop do
|
267
|
+
query_results_gapi = service.job_query_results job_id, max: 0
|
268
|
+
if query_results_gapi.job_complete
|
269
|
+
@destination_schema_gapi = query_results_gapi.schema
|
270
|
+
break
|
271
|
+
end
|
272
|
+
end
|
273
|
+
reload!
|
274
|
+
end
|
275
|
+
|
131
276
|
##
|
132
277
|
# Retrieves the query results for the job.
|
133
278
|
#
|
@@ -135,11 +280,9 @@ module Google
|
|
135
280
|
# identifying the result set.
|
136
281
|
# @param [Integer] max Maximum number of results to return.
|
137
282
|
# @param [Integer] start Zero-based index of the starting row to read.
|
138
|
-
# @param [Integer] timeout How long to wait for the query to complete,
|
139
|
-
# in milliseconds, before returning. Default is 10,000 milliseconds
|
140
|
-
# (10 seconds).
|
141
283
|
#
|
142
|
-
# @return [Google::Cloud::Bigquery::
|
284
|
+
# @return [Google::Cloud::Bigquery::Data] An object providing access to
|
285
|
+
# data read from the destination table for the job.
|
143
286
|
#
|
144
287
|
# @example
|
145
288
|
# require "google/cloud/bigquery"
|
@@ -150,17 +293,184 @@ module Google
|
|
150
293
|
# job = bigquery.query_job sql
|
151
294
|
#
|
152
295
|
# job.wait_until_done!
|
153
|
-
# data = job.
|
296
|
+
# data = job.data
|
154
297
|
# data.each do |row|
|
155
298
|
# puts row[:word]
|
156
299
|
# end
|
157
300
|
# data = data.next if data.next?
|
158
301
|
#
|
159
|
-
def
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
302
|
+
def data token: nil, max: nil, start: nil
|
303
|
+
return nil unless done?
|
304
|
+
|
305
|
+
ensure_schema!
|
306
|
+
|
307
|
+
options = { token: token, max: max, start: start }
|
308
|
+
data_gapi = service.list_tabledata destination_table_dataset_id,
|
309
|
+
destination_table_table_id, options
|
310
|
+
Data.from_gapi data_gapi, destination_table_gapi, service
|
311
|
+
end
|
312
|
+
alias_method :query_results, :data
|
313
|
+
|
314
|
+
##
|
315
|
+
# Represents a stage in the execution plan for the query.
|
316
|
+
#
|
317
|
+
# @attr_reader [Float] compute_ratio_avg Relative amount of time the
|
318
|
+
# average shard spent on CPU-bound tasks.
|
319
|
+
# @attr_reader [Float] compute_ratio_max Relative amount of time the
|
320
|
+
# slowest shard spent on CPU-bound tasks.
|
321
|
+
# @attr_reader [Integer] id Unique ID for the stage within the query
|
322
|
+
# plan.
|
323
|
+
# @attr_reader [String] name Human-readable name for the stage.
|
324
|
+
# @attr_reader [Float] read_ratio_avg Relative amount of time the
|
325
|
+
# average shard spent reading input.
|
326
|
+
# @attr_reader [Float] read_ratio_max Relative amount of time the
|
327
|
+
# slowest shard spent reading input.
|
328
|
+
# @attr_reader [Integer] records_read Number of records read into the
|
329
|
+
# stage.
|
330
|
+
# @attr_reader [Integer] records_written Number of records written by
|
331
|
+
# the stage.
|
332
|
+
# @attr_reader [Array<Step>] steps List of operations within the stage
|
333
|
+
# in dependency order (approximately chronological).
|
334
|
+
# @attr_reader [Float] wait_ratio_avg Relative amount of time the
|
335
|
+
# average shard spent waiting to be scheduled.
|
336
|
+
# @attr_reader [Float] wait_ratio_max Relative amount of time the
|
337
|
+
# slowest shard spent waiting to be scheduled.
|
338
|
+
# @attr_reader [Float] write_ratio_avg Relative amount of time the
|
339
|
+
# average shard spent on writing output.
|
340
|
+
# @attr_reader [Float] write_ratio_max Relative amount of time the
|
341
|
+
# slowest shard spent on writing output.
|
342
|
+
#
|
343
|
+
# @example
|
344
|
+
# require "google/cloud/bigquery"
|
345
|
+
#
|
346
|
+
# bigquery = Google::Cloud::Bigquery.new
|
347
|
+
#
|
348
|
+
# sql = "SELECT word FROM publicdata.samples.shakespeare"
|
349
|
+
# job = bigquery.query_job sql
|
350
|
+
#
|
351
|
+
# job.wait_until_done!
|
352
|
+
#
|
353
|
+
# stages = job.query_plan
|
354
|
+
# stages.each do |stage|
|
355
|
+
# puts stage.name
|
356
|
+
# stage.steps.each do |step|
|
357
|
+
# puts step.kind
|
358
|
+
# puts step.substeps.inspect
|
359
|
+
# end
|
360
|
+
# end
|
361
|
+
#
|
362
|
+
class Stage
|
363
|
+
attr_reader :compute_ratio_avg, :compute_ratio_max, :id, :name,
|
364
|
+
:read_ratio_avg, :read_ratio_max, :records_read,
|
365
|
+
:records_written, :status, :steps, :wait_ratio_avg,
|
366
|
+
:wait_ratio_max, :write_ratio_avg, :write_ratio_max
|
367
|
+
|
368
|
+
##
|
369
|
+
# @private Creates a new Stage instance.
|
370
|
+
def initialize compute_ratio_avg, compute_ratio_max, id, name,
|
371
|
+
read_ratio_avg, read_ratio_max, records_read,
|
372
|
+
records_written, status, steps, wait_ratio_avg,
|
373
|
+
wait_ratio_max, write_ratio_avg, write_ratio_max
|
374
|
+
@compute_ratio_avg = compute_ratio_avg
|
375
|
+
@compute_ratio_max = compute_ratio_max
|
376
|
+
@id = id
|
377
|
+
@name = name
|
378
|
+
@read_ratio_avg = read_ratio_avg
|
379
|
+
@read_ratio_max = read_ratio_max
|
380
|
+
@records_read = records_read
|
381
|
+
@records_written = records_written
|
382
|
+
@status = status
|
383
|
+
@steps = steps
|
384
|
+
@wait_ratio_avg = wait_ratio_avg
|
385
|
+
@wait_ratio_max = wait_ratio_max
|
386
|
+
@write_ratio_avg = write_ratio_avg
|
387
|
+
@write_ratio_max = write_ratio_max
|
388
|
+
end
|
389
|
+
|
390
|
+
##
|
391
|
+
# @private New Stage from a statistics.query.queryPlan element.
|
392
|
+
def self.from_gapi gapi
|
393
|
+
steps = Array(gapi.steps).map { |g| Step.from_gapi g }
|
394
|
+
new gapi.compute_ratio_avg, gapi.compute_ratio_max, gapi.id,
|
395
|
+
gapi.name, gapi.read_ratio_avg, gapi.read_ratio_max,
|
396
|
+
gapi.records_read, gapi.records_written, gapi.status, steps,
|
397
|
+
gapi.wait_ratio_avg, gapi.wait_ratio_max, gapi.write_ratio_avg,
|
398
|
+
gapi.write_ratio_max
|
399
|
+
end
|
400
|
+
end
|
401
|
+
|
402
|
+
##
|
403
|
+
# Represents an operation in a stage in the execution plan for the
|
404
|
+
# query.
|
405
|
+
#
|
406
|
+
# @attr_reader [String] kind Machine-readable operation type. For a full
|
407
|
+
# list of operation types, see [Steps
|
408
|
+
# metadata](https://cloud.google.com/bigquery/query-plan-explanation#steps_metadata).
|
409
|
+
# @attr_reader [Array<String>] substeps Human-readable stage
|
410
|
+
# descriptions.
|
411
|
+
#
|
412
|
+
# @example
|
413
|
+
# require "google/cloud/bigquery"
|
414
|
+
#
|
415
|
+
# bigquery = Google::Cloud::Bigquery.new
|
416
|
+
#
|
417
|
+
# sql = "SELECT word FROM publicdata.samples.shakespeare"
|
418
|
+
# job = bigquery.query_job sql
|
419
|
+
#
|
420
|
+
# job.wait_until_done!
|
421
|
+
#
|
422
|
+
# stages = job.query_plan
|
423
|
+
# stages.each do |stage|
|
424
|
+
# puts stage.name
|
425
|
+
# stage.steps.each do |step|
|
426
|
+
# puts step.kind
|
427
|
+
# puts step.substeps.inspect
|
428
|
+
# end
|
429
|
+
# end
|
430
|
+
#
|
431
|
+
class Step
|
432
|
+
attr_reader :kind, :substeps
|
433
|
+
|
434
|
+
##
|
435
|
+
# @private Creates a new Stage instance.
|
436
|
+
def initialize kind, substeps
|
437
|
+
@kind = kind
|
438
|
+
@substeps = substeps
|
439
|
+
end
|
440
|
+
|
441
|
+
##
|
442
|
+
# @private New Step from a statistics.query.queryPlan[].steps element.
|
443
|
+
def self.from_gapi gapi
|
444
|
+
new gapi.kind, Array(gapi.substeps)
|
445
|
+
end
|
446
|
+
end
|
447
|
+
|
448
|
+
protected
|
449
|
+
|
450
|
+
def ensure_schema!
|
451
|
+
return unless destination_schema.nil?
|
452
|
+
|
453
|
+
query_results_gapi = service.job_query_results job_id, max: 0
|
454
|
+
# fail "unable to retrieve schema" if query_results_gapi.schema.nil?
|
455
|
+
@destination_schema_gapi = query_results_gapi.schema
|
456
|
+
end
|
457
|
+
|
458
|
+
def destination_schema
|
459
|
+
@destination_schema_gapi
|
460
|
+
end
|
461
|
+
|
462
|
+
def destination_table_dataset_id
|
463
|
+
@gapi.configuration.query.destination_table.dataset_id
|
464
|
+
end
|
465
|
+
|
466
|
+
def destination_table_table_id
|
467
|
+
@gapi.configuration.query.destination_table.table_id
|
468
|
+
end
|
469
|
+
|
470
|
+
def destination_table_gapi
|
471
|
+
Google::Apis::BigqueryV2::Table.new \
|
472
|
+
table_reference: @gapi.configuration.query.destination_table,
|
473
|
+
schema: destination_schema
|
164
474
|
end
|
165
475
|
end
|
166
476
|
end
|
@@ -46,6 +46,22 @@ module Google
|
|
46
46
|
class Schema
|
47
47
|
##
|
48
48
|
# The fields of the table schema.
|
49
|
+
#
|
50
|
+
# @return [Array<Field>] An array of field objects.
|
51
|
+
#
|
52
|
+
# @example
|
53
|
+
# require "google/cloud/bigquery"
|
54
|
+
#
|
55
|
+
# bigquery = Google::Cloud::Bigquery.new
|
56
|
+
# dataset = bigquery.dataset "my_dataset"
|
57
|
+
# table = dataset.table "my_table"
|
58
|
+
#
|
59
|
+
# schema = table.schema
|
60
|
+
#
|
61
|
+
# schema.fields.each do |field|
|
62
|
+
# puts field.name
|
63
|
+
# end
|
64
|
+
#
|
49
65
|
def fields
|
50
66
|
if frozen?
|
51
67
|
Array(@gapi.fields).map { |f| Field.from_gapi(f).freeze }.freeze
|
@@ -56,12 +72,41 @@ module Google
|
|
56
72
|
|
57
73
|
##
|
58
74
|
# The names of the fields as symbols.
|
75
|
+
#
|
76
|
+
# @return [Array<Symbol>] An array of column names.
|
77
|
+
#
|
78
|
+
# @example
|
79
|
+
# require "google/cloud/bigquery"
|
80
|
+
#
|
81
|
+
# bigquery = Google::Cloud::Bigquery.new
|
82
|
+
# dataset = bigquery.dataset "my_dataset"
|
83
|
+
# table = dataset.create_table "my_table"
|
84
|
+
#
|
85
|
+
# schema = table.schema
|
86
|
+
#
|
87
|
+
# schema.headers.each do |header|
|
88
|
+
# puts header
|
89
|
+
# end
|
90
|
+
#
|
59
91
|
def headers
|
60
92
|
fields.map(&:name).map(&:to_sym)
|
61
93
|
end
|
62
94
|
|
63
95
|
##
|
64
|
-
#
|
96
|
+
# Retrieve a field by name.
|
97
|
+
#
|
98
|
+
# @return [Field] A field object.
|
99
|
+
#
|
100
|
+
# @example
|
101
|
+
# require "google/cloud/bigquery"
|
102
|
+
#
|
103
|
+
# bigquery = Google::Cloud::Bigquery.new
|
104
|
+
# dataset = bigquery.dataset "my_dataset"
|
105
|
+
# table = dataset.table "my_table"
|
106
|
+
#
|
107
|
+
# field = table.schema.field "name"
|
108
|
+
# field.required? #=> true
|
109
|
+
#
|
65
110
|
def field name
|
66
111
|
f = fields.find { |fld| fld.name == name.to_s }
|
67
112
|
return nil if f.nil?
|
@@ -71,6 +116,9 @@ module Google
|
|
71
116
|
|
72
117
|
##
|
73
118
|
# Whether the schema has no fields defined.
|
119
|
+
#
|
120
|
+
# @return [Boolean] `true` when there are no fields, `false` otherwise.
|
121
|
+
#
|
74
122
|
def empty?
|
75
123
|
fields.empty?
|
76
124
|
end
|
@@ -86,6 +134,7 @@ module Google
|
|
86
134
|
# @param [Symbol] mode The field's mode. The possible values are
|
87
135
|
# `:nullable`, `:required`, and `:repeated`. The default value is
|
88
136
|
# `:nullable`.
|
137
|
+
#
|
89
138
|
def string name, description: nil, mode: :nullable
|
90
139
|
add_field name, :string, description: description, mode: mode
|
91
140
|
end
|
@@ -101,6 +150,7 @@ module Google
|
|
101
150
|
# @param [Symbol] mode The field's mode. The possible values are
|
102
151
|
# `:nullable`, `:required`, and `:repeated`. The default value is
|
103
152
|
# `:nullable`.
|
153
|
+
#
|
104
154
|
def integer name, description: nil, mode: :nullable
|
105
155
|
add_field name, :integer, description: description, mode: mode
|
106
156
|
end
|
@@ -116,6 +166,7 @@ module Google
|
|
116
166
|
# @param [Symbol] mode The field's mode. The possible values are
|
117
167
|
# `:nullable`, `:required`, and `:repeated`. The default value is
|
118
168
|
# `:nullable`.
|
169
|
+
#
|
119
170
|
def float name, description: nil, mode: :nullable
|
120
171
|
add_field name, :float, description: description, mode: mode
|
121
172
|
end
|
@@ -131,6 +182,7 @@ module Google
|
|
131
182
|
# @param [Symbol] mode The field's mode. The possible values are
|
132
183
|
# `:nullable`, `:required`, and `:repeated`. The default value is
|
133
184
|
# `:nullable`.
|
185
|
+
#
|
134
186
|
def boolean name, description: nil, mode: :nullable
|
135
187
|
add_field name, :boolean, description: description, mode: mode
|
136
188
|
end
|
@@ -146,6 +198,7 @@ module Google
|
|
146
198
|
# @param [Symbol] mode The field's mode. The possible values are
|
147
199
|
# `:nullable`, `:required`, and `:repeated`. The default value is
|
148
200
|
# `:nullable`.
|
201
|
+
#
|
149
202
|
def bytes name, description: nil, mode: :nullable
|
150
203
|
add_field name, :bytes, description: description, mode: mode
|
151
204
|
end
|
@@ -176,6 +229,7 @@ module Google
|
|
176
229
|
# @param [Symbol] mode The field's mode. The possible values are
|
177
230
|
# `:nullable`, `:required`, and `:repeated`. The default value is
|
178
231
|
# `:nullable`.
|
232
|
+
#
|
179
233
|
def time name, description: nil, mode: :nullable
|
180
234
|
add_field name, :time, description: description, mode: mode
|
181
235
|
end
|
@@ -191,6 +245,7 @@ module Google
|
|
191
245
|
# @param [Symbol] mode The field's mode. The possible values are
|
192
246
|
# `:nullable`, `:required`, and `:repeated`. The default value is
|
193
247
|
# `:nullable`.
|
248
|
+
#
|
194
249
|
def datetime name, description: nil, mode: :nullable
|
195
250
|
add_field name, :datetime, description: description, mode: mode
|
196
251
|
end
|
@@ -206,6 +261,7 @@ module Google
|
|
206
261
|
# @param [Symbol] mode The field's mode. The possible values are
|
207
262
|
# `:nullable`, `:required`, and `:repeated`. The default value is
|
208
263
|
# `:nullable`.
|
264
|
+
#
|
209
265
|
def date name, description: nil, mode: :nullable
|
210
266
|
add_field name, :date, description: description, mode: mode
|
211
267
|
end
|