google-cloud-bigquery 0.21.0 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.yardopts +7 -0
- data/LICENSE +201 -0
- data/README.md +74 -0
- data/lib/google-cloud-bigquery.rb +2 -2
- data/lib/google/cloud/bigquery.rb +118 -8
- data/lib/google/cloud/bigquery/data.rb +5 -0
- data/lib/google/cloud/bigquery/dataset.rb +197 -17
- data/lib/google/cloud/bigquery/job.rb +3 -3
- data/lib/google/cloud/bigquery/project.rb +248 -20
- data/lib/google/cloud/bigquery/query_job.rb +14 -0
- data/lib/google/cloud/bigquery/service.rb +152 -4
- data/lib/google/cloud/bigquery/table.rb +3 -3
- data/lib/google/cloud/bigquery/time.rb +59 -0
- data/lib/google/cloud/bigquery/version.rb +1 -1
- data/lib/google/cloud/bigquery/view.rb +7 -7
- metadata +11 -7
@@ -98,6 +98,20 @@ module Google
|
|
98
98
|
table.table_id
|
99
99
|
end
|
100
100
|
|
101
|
+
##
|
102
|
+
# Checks if the query job is using legacy sql.
|
103
|
+
def legacy_sql?
|
104
|
+
val = @gapi.configuration.query.use_legacy_sql
|
105
|
+
return true if val.nil?
|
106
|
+
val
|
107
|
+
end
|
108
|
+
|
109
|
+
##
|
110
|
+
# Checks if the query job is using standard sql.
|
111
|
+
def standard_sql?
|
112
|
+
!legacy_sql?
|
113
|
+
end
|
114
|
+
|
101
115
|
##
|
102
116
|
# Retrieves the query results for the job.
|
103
117
|
#
|
@@ -19,6 +19,7 @@ require "google/apis/bigquery_v2"
|
|
19
19
|
require "pathname"
|
20
20
|
require "digest/md5"
|
21
21
|
require "mime/types"
|
22
|
+
require "date"
|
22
23
|
|
23
24
|
module Google
|
24
25
|
module Cloud
|
@@ -380,12 +381,14 @@ module Google
|
|
380
381
|
)
|
381
382
|
end
|
382
383
|
|
384
|
+
# rubocop:disable all
|
385
|
+
|
383
386
|
##
|
384
387
|
# Job description for query job
|
385
388
|
def query_table_config query, options
|
386
389
|
dest_table = table_ref_from options[:table]
|
387
390
|
default_dataset = dataset_ref_from options[:dataset]
|
388
|
-
API::Job.new(
|
391
|
+
req = API::Job.new(
|
389
392
|
configuration: API::JobConfiguration.new(
|
390
393
|
query: API::JobConfigurationQuery.new(
|
391
394
|
query: query,
|
@@ -397,23 +400,168 @@ module Google
|
|
397
400
|
write_disposition: write_disposition(options[:write]),
|
398
401
|
allow_large_results: options[:large_results],
|
399
402
|
flatten_results: options[:flatten],
|
400
|
-
default_dataset: default_dataset
|
403
|
+
default_dataset: default_dataset,
|
404
|
+
use_legacy_sql: resolve_legacy_sql(options[:legacy_sql],
|
405
|
+
options[:standard_sql])
|
401
406
|
)
|
402
407
|
)
|
403
408
|
)
|
409
|
+
|
410
|
+
if options[:params]
|
411
|
+
if Array === options[:params]
|
412
|
+
req.configuration.query.use_legacy_sql = false
|
413
|
+
req.configuration.query.parameter_mode = "POSITIONAL"
|
414
|
+
req.configuration.query.query_parameters = options[:params].map do |param|
|
415
|
+
to_query_param param
|
416
|
+
end
|
417
|
+
elsif Hash === options[:params]
|
418
|
+
req.configuration.query.use_legacy_sql = false
|
419
|
+
req.configuration.query.parameter_mode = "NAMED"
|
420
|
+
req.configuration.query.query_parameters = options[:params].map do |name, param|
|
421
|
+
to_query_param(param).tap do |named_param|
|
422
|
+
named_param.name = String name
|
423
|
+
end
|
424
|
+
end
|
425
|
+
else
|
426
|
+
fail "Query parameters must be an Array or a Hash."
|
427
|
+
end
|
428
|
+
end
|
429
|
+
|
430
|
+
req
|
404
431
|
end
|
405
432
|
|
406
433
|
def query_config query, options = {}
|
407
434
|
dataset_config = dataset_ref_from options[:dataset], options[:project]
|
408
435
|
|
409
|
-
API::QueryRequest.new(
|
436
|
+
req = API::QueryRequest.new(
|
410
437
|
query: query,
|
411
438
|
max_results: options[:max],
|
412
439
|
default_dataset: dataset_config,
|
413
440
|
timeout_ms: options[:timeout],
|
414
441
|
dry_run: options[:dryrun],
|
415
|
-
use_query_cache: options[:cache]
|
442
|
+
use_query_cache: options[:cache],
|
443
|
+
use_legacy_sql: resolve_legacy_sql(options[:legacy_sql],
|
444
|
+
options[:standard_sql])
|
416
445
|
)
|
446
|
+
|
447
|
+
if options[:params]
|
448
|
+
if Array === options[:params]
|
449
|
+
req.use_legacy_sql = false
|
450
|
+
req.parameter_mode = "POSITIONAL"
|
451
|
+
req.query_parameters = options[:params].map do |param|
|
452
|
+
to_query_param param
|
453
|
+
end
|
454
|
+
elsif Hash === options[:params]
|
455
|
+
req.use_legacy_sql = false
|
456
|
+
req.parameter_mode = "NAMED"
|
457
|
+
req.query_parameters = options[:params].map do |name, param|
|
458
|
+
to_query_param(param).tap do |named_param|
|
459
|
+
named_param.name = String name
|
460
|
+
end
|
461
|
+
end
|
462
|
+
else
|
463
|
+
fail "Query parameters must be an Array or a Hash."
|
464
|
+
end
|
465
|
+
end
|
466
|
+
|
467
|
+
req
|
468
|
+
end
|
469
|
+
|
470
|
+
def to_query_param value
|
471
|
+
if TrueClass === value
|
472
|
+
return API::QueryParameter.new(
|
473
|
+
parameter_type: API::QueryParameterType.new(type: "BOOL"),
|
474
|
+
parameter_value: API::QueryParameterValue.new(value: true)
|
475
|
+
)
|
476
|
+
elsif FalseClass === value
|
477
|
+
return API::QueryParameter.new(
|
478
|
+
parameter_type: API::QueryParameterType.new(type: "BOOL"),
|
479
|
+
parameter_value: API::QueryParameterValue.new(value: false)
|
480
|
+
)
|
481
|
+
elsif Integer === value
|
482
|
+
return API::QueryParameter.new(
|
483
|
+
parameter_type: API::QueryParameterType.new(type: "INT64"),
|
484
|
+
parameter_value: API::QueryParameterValue.new(value: value)
|
485
|
+
)
|
486
|
+
elsif Float === value
|
487
|
+
return API::QueryParameter.new(
|
488
|
+
parameter_type: API::QueryParameterType.new(type: "FLOAT64"),
|
489
|
+
parameter_value: API::QueryParameterValue.new(value: value)
|
490
|
+
)
|
491
|
+
elsif String === value
|
492
|
+
return API::QueryParameter.new(
|
493
|
+
parameter_type: API::QueryParameterType.new(type: "STRING"),
|
494
|
+
parameter_value: API::QueryParameterValue.new(value: value)
|
495
|
+
)
|
496
|
+
elsif DateTime === value
|
497
|
+
return API::QueryParameter.new(
|
498
|
+
parameter_type: API::QueryParameterType.new(type: "DATETIME"),
|
499
|
+
parameter_value: API::QueryParameterValue.new(
|
500
|
+
value: value.strftime("%Y-%m-%d %H:%M:%S.%6N"))
|
501
|
+
)
|
502
|
+
elsif Date === value
|
503
|
+
return API::QueryParameter.new(
|
504
|
+
parameter_type: API::QueryParameterType.new(type: "DATE"),
|
505
|
+
parameter_value: API::QueryParameterValue.new(value: value.to_s)
|
506
|
+
)
|
507
|
+
elsif ::Time === value
|
508
|
+
return API::QueryParameter.new(
|
509
|
+
parameter_type: API::QueryParameterType.new(type: "TIMESTAMP"),
|
510
|
+
parameter_value: API::QueryParameterValue.new(
|
511
|
+
value: value.strftime("%Y-%m-%d %H:%M:%S.%6N%:z"))
|
512
|
+
)
|
513
|
+
elsif Bigquery::Time === value
|
514
|
+
return API::QueryParameter.new(
|
515
|
+
parameter_type: API::QueryParameterType.new(type: "TIME"),
|
516
|
+
parameter_value: API::QueryParameterValue.new(value: value.value)
|
517
|
+
)
|
518
|
+
elsif value.respond_to?(:read) && value.respond_to?(:rewind)
|
519
|
+
value.rewind
|
520
|
+
return API::QueryParameter.new(
|
521
|
+
parameter_type: API::QueryParameterType.new(type: "BYTES"),
|
522
|
+
parameter_value: API::QueryParameterValue.new(
|
523
|
+
value: value.read.force_encoding("ASCII-8BIT"))
|
524
|
+
)
|
525
|
+
elsif Array === value
|
526
|
+
array_params = value.map { |param| to_query_param param }
|
527
|
+
return API::QueryParameter.new(
|
528
|
+
parameter_type: API::QueryParameterType.new(
|
529
|
+
type: "ARRAY",
|
530
|
+
array_type: array_params.first.parameter_type
|
531
|
+
),
|
532
|
+
parameter_value: API::QueryParameterValue.new(
|
533
|
+
array_values: array_params.map(&:parameter_value)
|
534
|
+
)
|
535
|
+
)
|
536
|
+
elsif Hash === value
|
537
|
+
struct_pairs = value.map do |name, param|
|
538
|
+
struct_param = to_query_param param
|
539
|
+
[API::QueryParameterType::StructType.new(
|
540
|
+
name: String(name),
|
541
|
+
type: struct_param.parameter_type
|
542
|
+
), struct_param.parameter_value]
|
543
|
+
end
|
544
|
+
|
545
|
+
return API::QueryParameter.new(
|
546
|
+
parameter_type: API::QueryParameterType.new(
|
547
|
+
type: "STRUCT",
|
548
|
+
struct_types: struct_pairs.map(&:first)
|
549
|
+
),
|
550
|
+
parameter_value: API::QueryParameterValue.new(
|
551
|
+
struct_values: struct_pairs.map(&:last)
|
552
|
+
)
|
553
|
+
)
|
554
|
+
else
|
555
|
+
fail "A query parameter of type #{value.class} is not supported."
|
556
|
+
end
|
557
|
+
v
|
558
|
+
end
|
559
|
+
|
560
|
+
# rubocop:enable all
|
561
|
+
|
562
|
+
def resolve_legacy_sql legacy_sql, standard_sql
|
563
|
+
return legacy_sql unless legacy_sql.nil?
|
564
|
+
return !standard_sql unless standard_sql.nil?
|
417
565
|
end
|
418
566
|
|
419
567
|
##
|
@@ -247,7 +247,7 @@ module Google
|
|
247
247
|
def created_at
|
248
248
|
ensure_full_data!
|
249
249
|
begin
|
250
|
-
Time.at(Integer(@gapi.creation_time) / 1000.0)
|
250
|
+
::Time.at(Integer(@gapi.creation_time) / 1000.0)
|
251
251
|
rescue
|
252
252
|
nil
|
253
253
|
end
|
@@ -263,7 +263,7 @@ module Google
|
|
263
263
|
def expires_at
|
264
264
|
ensure_full_data!
|
265
265
|
begin
|
266
|
-
Time.at(Integer(@gapi.expiration_time) / 1000.0)
|
266
|
+
::Time.at(Integer(@gapi.expiration_time) / 1000.0)
|
267
267
|
rescue
|
268
268
|
nil
|
269
269
|
end
|
@@ -277,7 +277,7 @@ module Google
|
|
277
277
|
def modified_at
|
278
278
|
ensure_full_data!
|
279
279
|
begin
|
280
|
-
Time.at(Integer(@gapi.last_modified_time) / 1000.0)
|
280
|
+
::Time.at(Integer(@gapi.last_modified_time) / 1000.0)
|
281
281
|
rescue
|
282
282
|
nil
|
283
283
|
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# Copyright 2016 Google Inc. All rights reserved.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
|
16
|
+
module Google
|
17
|
+
module Cloud
|
18
|
+
module Bigquery
|
19
|
+
##
|
20
|
+
# # Time
|
21
|
+
#
|
22
|
+
# A TIME data type represents a time, independent of a specific date.
|
23
|
+
#
|
24
|
+
# @attr_writer [String] value The BigQuery TIME.
|
25
|
+
#
|
26
|
+
# @example
|
27
|
+
# require "google/cloud/bigquery"
|
28
|
+
#
|
29
|
+
# bigquery = Google::Cloud::Bigquery.new
|
30
|
+
#
|
31
|
+
# fourpm = Google::Cloud::Bigquery::Time.new "16:00:00"
|
32
|
+
# data = bigquery.query "SELECT name " \
|
33
|
+
# "FROM [my_proj:my_data.my_table]" \
|
34
|
+
# "WHERE time_of_date = @time",
|
35
|
+
# params: { time: fourpm }
|
36
|
+
#
|
37
|
+
# data.each do |row|
|
38
|
+
# puts row["name"]
|
39
|
+
# end
|
40
|
+
#
|
41
|
+
# @example Create Time with fractional seconds:
|
42
|
+
# require "google/cloud/bigquery"
|
43
|
+
#
|
44
|
+
# bigquery = Google::Cloud::Bigquery.new
|
45
|
+
#
|
46
|
+
# precise_time = Google::Cloud::Bigquery::Time.new "16:35:15.376541"
|
47
|
+
# data = bigquery.query "SELECT name " \
|
48
|
+
# "FROM [my_proj:my_data.my_table]" \
|
49
|
+
# "WHERE time_of_date >= @time",
|
50
|
+
# params: { time: precise_time }
|
51
|
+
#
|
52
|
+
# data.each do |row|
|
53
|
+
# puts row["name"]
|
54
|
+
# end
|
55
|
+
#
|
56
|
+
Time = Struct.new :value
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -120,9 +120,9 @@ module Google
|
|
120
120
|
#
|
121
121
|
# bigquery = Google::Cloud::Bigquery.new
|
122
122
|
# dataset = bigquery.dataset "my_dataset"
|
123
|
-
#
|
123
|
+
# view = dataset.table "my_view"
|
124
124
|
#
|
125
|
-
# data = bigquery.query "SELECT name FROM #{
|
125
|
+
# data = bigquery.query "SELECT name FROM #{view.query_id}"
|
126
126
|
#
|
127
127
|
# @!group Attributes
|
128
128
|
#
|
@@ -197,7 +197,7 @@ module Google
|
|
197
197
|
def created_at
|
198
198
|
ensure_full_data!
|
199
199
|
begin
|
200
|
-
Time.at(Integer(@gapi.creation_time) / 1000.0)
|
200
|
+
::Time.at(Integer(@gapi.creation_time) / 1000.0)
|
201
201
|
rescue
|
202
202
|
nil
|
203
203
|
end
|
@@ -213,7 +213,7 @@ module Google
|
|
213
213
|
def expires_at
|
214
214
|
ensure_full_data!
|
215
215
|
begin
|
216
|
-
Time.at(Integer(@gapi.expiration_time) / 1000.0)
|
216
|
+
::Time.at(Integer(@gapi.expiration_time) / 1000.0)
|
217
217
|
rescue
|
218
218
|
nil
|
219
219
|
end
|
@@ -227,7 +227,7 @@ module Google
|
|
227
227
|
def modified_at
|
228
228
|
ensure_full_data!
|
229
229
|
begin
|
230
|
-
Time.at(Integer(@gapi.last_modified_time) / 1000.0)
|
230
|
+
::Time.at(Integer(@gapi.last_modified_time) / 1000.0)
|
231
231
|
rescue
|
232
232
|
nil
|
233
233
|
end
|
@@ -385,9 +385,9 @@ module Google
|
|
385
385
|
#
|
386
386
|
# bigquery = Google::Cloud::Bigquery.new
|
387
387
|
# dataset = bigquery.dataset "my_dataset"
|
388
|
-
#
|
388
|
+
# view = dataset.table "my_view"
|
389
389
|
#
|
390
|
-
#
|
390
|
+
# view.delete
|
391
391
|
#
|
392
392
|
# @!group Lifecycle
|
393
393
|
#
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: google-cloud-bigquery
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.23.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Moore
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-
|
12
|
+
date: 2016-12-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: google-cloud-core
|
@@ -31,14 +31,14 @@ dependencies:
|
|
31
31
|
requirements:
|
32
32
|
- - "~>"
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version: 0.9.
|
34
|
+
version: 0.9.18
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
39
|
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version: 0.9.
|
41
|
+
version: 0.9.18
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
43
|
name: minitest
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
@@ -157,14 +157,14 @@ dependencies:
|
|
157
157
|
requirements:
|
158
158
|
- - "~>"
|
159
159
|
- !ruby/object:Gem::Version
|
160
|
-
version: 0.1.
|
160
|
+
version: 0.1.8
|
161
161
|
type: :development
|
162
162
|
prerelease: false
|
163
163
|
version_requirements: !ruby/object:Gem::Requirement
|
164
164
|
requirements:
|
165
165
|
- - "~>"
|
166
166
|
- !ruby/object:Gem::Version
|
167
|
-
version: 0.1.
|
167
|
+
version: 0.1.8
|
168
168
|
description: google-cloud-bigquery is the official library for Google BigQuery.
|
169
169
|
email:
|
170
170
|
- mike@blowmage.com
|
@@ -173,6 +173,9 @@ executables: []
|
|
173
173
|
extensions: []
|
174
174
|
extra_rdoc_files: []
|
175
175
|
files:
|
176
|
+
- ".yardopts"
|
177
|
+
- LICENSE
|
178
|
+
- README.md
|
176
179
|
- lib/google-cloud-bigquery.rb
|
177
180
|
- lib/google/cloud/bigquery.rb
|
178
181
|
- lib/google/cloud/bigquery/copy_job.rb
|
@@ -194,6 +197,7 @@ files:
|
|
194
197
|
- lib/google/cloud/bigquery/service.rb
|
195
198
|
- lib/google/cloud/bigquery/table.rb
|
196
199
|
- lib/google/cloud/bigquery/table/list.rb
|
200
|
+
- lib/google/cloud/bigquery/time.rb
|
197
201
|
- lib/google/cloud/bigquery/version.rb
|
198
202
|
- lib/google/cloud/bigquery/view.rb
|
199
203
|
homepage: http://googlecloudplatform.github.io/google-cloud-ruby/
|
@@ -216,7 +220,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
216
220
|
version: '0'
|
217
221
|
requirements: []
|
218
222
|
rubyforge_project:
|
219
|
-
rubygems_version: 2.
|
223
|
+
rubygems_version: 2.4.5.1
|
220
224
|
signing_key:
|
221
225
|
specification_version: 4
|
222
226
|
summary: API Client library for Google BigQuery
|