google-cloud-bigquery 1.18.0 → 1.21.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +48 -0
- data/TROUBLESHOOTING.md +2 -8
- data/lib/google/cloud/bigquery/argument.rb +197 -0
- data/lib/google/cloud/bigquery/copy_job.rb +18 -1
- data/lib/google/cloud/bigquery/data.rb +15 -0
- data/lib/google/cloud/bigquery/dataset.rb +379 -49
- data/lib/google/cloud/bigquery/dataset/list.rb +1 -2
- data/lib/google/cloud/bigquery/extract_job.rb +19 -2
- data/lib/google/cloud/bigquery/job.rb +198 -0
- data/lib/google/cloud/bigquery/job/list.rb +5 -5
- data/lib/google/cloud/bigquery/load_job.rb +273 -26
- data/lib/google/cloud/bigquery/model.rb +6 -4
- data/lib/google/cloud/bigquery/project.rb +82 -22
- data/lib/google/cloud/bigquery/project/list.rb +1 -2
- data/lib/google/cloud/bigquery/query_job.rb +292 -0
- data/lib/google/cloud/bigquery/routine.rb +1108 -0
- data/lib/google/cloud/bigquery/routine/list.rb +165 -0
- data/lib/google/cloud/bigquery/schema.rb +2 -2
- data/lib/google/cloud/bigquery/service.rb +96 -39
- data/lib/google/cloud/bigquery/standard_sql.rb +257 -53
- data/lib/google/cloud/bigquery/table.rb +410 -62
- data/lib/google/cloud/bigquery/table/async_inserter.rb +21 -11
- data/lib/google/cloud/bigquery/table/list.rb +1 -2
- data/lib/google/cloud/bigquery/version.rb +1 -1
- metadata +9 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 66fb05be59bdce437c28d89670548abba36c23a00df0bbe175983156f7ef4677
|
4
|
+
data.tar.gz: 73fdc5465df51fe3e3a2f554fa6540d5ffeb0890146eee2b97e60669abb2a020
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3c0857826bc2c7394e9d9fa8ffe4eee947bbd5ed57f9ad636e34718e0b266c7091e4ddd2734619874b7624d1b939e62f7f43a74f6fe944d33b057966dafea188
|
7
|
+
data.tar.gz: 685a245183d53e26bfc133f6475b949b00ffc33e25eb00dfa1a52e557525bc9e6e61522d435c2398058c188005f535e5b49f79d28e29b8d8d47cb995c5561bea
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,53 @@
|
|
1
1
|
# Release History
|
2
2
|
|
3
|
+
### 1.21.1 / 2020-05-28
|
4
|
+
|
5
|
+
#### Documentation
|
6
|
+
|
7
|
+
* Fix a few broken links
|
8
|
+
|
9
|
+
### 1.21.0 / 2020-03-31
|
10
|
+
|
11
|
+
#### Features
|
12
|
+
|
13
|
+
* Add Job#parent_job_id and Job#script_statistics
|
14
|
+
* Add parent_job to Project#jobs
|
15
|
+
* Add Job#num_child_jobs
|
16
|
+
* Add Job#parent_job_id
|
17
|
+
* Add Job#script_statistics
|
18
|
+
|
19
|
+
### 1.20.0 / 2020-03-11
|
20
|
+
|
21
|
+
#### Features
|
22
|
+
|
23
|
+
* Add Range Partitioning
|
24
|
+
* Add range partitioning methods to Table and Table::Updater
|
25
|
+
* Add range partitioning methods to LoadJob
|
26
|
+
* Add range partitioning methods to QueryJob
|
27
|
+
|
28
|
+
### 1.19.0 / 2020-02-11
|
29
|
+
|
30
|
+
#### Features
|
31
|
+
|
32
|
+
* Add Routine
|
33
|
+
* Add Dataset#create_routine
|
34
|
+
* Add Argument
|
35
|
+
* Update StandardSql classes to expose public initializer
|
36
|
+
* Add Data#ddl_target_routine and QueryJob#ddl_target_routine
|
37
|
+
* Allow row inserts to skip insert_id generation
|
38
|
+
* Streaming inserts using an insert_id are not able to be inserted as fast as inserts without an insert_id
|
39
|
+
* Add the ability for users to skip insert_id generation in order to speed up the inserts
|
40
|
+
* The default behavior continues to generate insert_id values for each row inserted
|
41
|
+
* Add yield documentation for Dataset#insert
|
42
|
+
|
43
|
+
### 1.18.1 / 2019-12-18
|
44
|
+
|
45
|
+
#### Bug Fixes
|
46
|
+
|
47
|
+
* Fix MonitorMixin usage on Ruby 2.7
|
48
|
+
* Ruby 2.7 will error if new_cond is called before super().
|
49
|
+
* Make the call to super() be the first call in initialize
|
50
|
+
|
3
51
|
### 1.18.0 / 2019-11-06
|
4
52
|
|
5
53
|
#### Features
|
data/TROUBLESHOOTING.md
CHANGED
@@ -24,14 +24,8 @@ improved, *please* create a new issue on GitHub so we can talk about it.
|
|
24
24
|
|
25
25
|
- [New issue][gh-ruby]
|
26
26
|
|
27
|
-
Or, you can ask questions on the [Google Cloud Platform Slack][slack-ruby]. You
|
28
|
-
can use the "ruby" channel for general Ruby questions, or use the
|
29
|
-
"google-cloud-ruby" channel if you have questions about this gem in particular.
|
30
|
-
|
31
27
|
[so-ruby]: http://stackoverflow.com/questions/tagged/google-cloud-platform+ruby+bigquery
|
32
28
|
|
33
|
-
[gh-search-ruby]: https://github.com/
|
34
|
-
|
35
|
-
[gh-ruby]: https://github.com/googlecloudplatform/google-cloud-ruby/issues/new
|
29
|
+
[gh-search-ruby]: https://github.com/googleapis/google-cloud-ruby/issues?q=label%3A%22api%3A+bigquery%22
|
36
30
|
|
37
|
-
[
|
31
|
+
[gh-ruby]: https://github.com/googleapis/google-cloud-ruby/issues/new
|
@@ -0,0 +1,197 @@
|
|
1
|
+
# Copyright 2020 Google LLC
|
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
|
+
# https://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
|
+
require "google/cloud/bigquery/standard_sql"
|
17
|
+
|
18
|
+
module Google
|
19
|
+
module Cloud
|
20
|
+
module Bigquery
|
21
|
+
##
|
22
|
+
# # Argument
|
23
|
+
#
|
24
|
+
# Input/output argument of a function or a stored procedure. See {Routine}.
|
25
|
+
#
|
26
|
+
# @example
|
27
|
+
# require "google/cloud/bigquery"
|
28
|
+
#
|
29
|
+
# bigquery = Google::Cloud::Bigquery.new
|
30
|
+
# dataset = bigquery.dataset "my_dataset"
|
31
|
+
# routine = dataset.create_routine "my_routine" do |r|
|
32
|
+
# r.routine_type = "SCALAR_FUNCTION"
|
33
|
+
# r.language = :SQL
|
34
|
+
# r.body = "(SELECT SUM(IF(elem.name = \"foo\",elem.val,null)) FROM UNNEST(arr) AS elem)"
|
35
|
+
# r.arguments = [
|
36
|
+
# Google::Cloud::Bigquery::Argument.new(
|
37
|
+
# name: "arr",
|
38
|
+
# argument_kind: "FIXED_TYPE",
|
39
|
+
# data_type: Google::Cloud::Bigquery::StandardSql::DataType.new(
|
40
|
+
# type_kind: "ARRAY",
|
41
|
+
# array_element_type: Google::Cloud::Bigquery::StandardSql::DataType.new(
|
42
|
+
# type_kind: "STRUCT",
|
43
|
+
# struct_type: Google::Cloud::Bigquery::StandardSql::StructType.new(
|
44
|
+
# fields: [
|
45
|
+
# Google::Cloud::Bigquery::StandardSql::Field.new(
|
46
|
+
# name: "name",
|
47
|
+
# type: Google::Cloud::Bigquery::StandardSql::DataType.new(type_kind: "STRING")
|
48
|
+
# ),
|
49
|
+
# Google::Cloud::Bigquery::StandardSql::Field.new(
|
50
|
+
# name: "val",
|
51
|
+
# type: Google::Cloud::Bigquery::StandardSql::DataType.new(type_kind: "INT64")
|
52
|
+
# )
|
53
|
+
# ]
|
54
|
+
# )
|
55
|
+
# )
|
56
|
+
# )
|
57
|
+
# )
|
58
|
+
# ]
|
59
|
+
# end
|
60
|
+
#
|
61
|
+
class Argument
|
62
|
+
##
|
63
|
+
# Creates a new, immutable Argument object.
|
64
|
+
#
|
65
|
+
# @overload initialize(data_type, kind, mode, name)
|
66
|
+
# @param [StandardSql::DataType, String] data_type The data type of the argument. Required unless
|
67
|
+
# {#argument_kind} is `ANY_TYPE`.
|
68
|
+
# @param [String] argument_kind The kind of argument. Optional. Defaults to `FIXED_TYPE`.
|
69
|
+
#
|
70
|
+
# * `FIXED_TYPE` - The argument is a variable with fully specified type, which can be a struct or an array,
|
71
|
+
# but not a table.
|
72
|
+
# * `ANY_TYPE` - The argument is any type, including struct or array, but not a table.
|
73
|
+
#
|
74
|
+
# To be added: `FIXED_TABLE`, `ANY_TABLE`.
|
75
|
+
# @param [String] mode Specifies whether the argument is input or output. Optional. Can be set for procedures
|
76
|
+
# only.
|
77
|
+
#
|
78
|
+
# * IN - The argument is input-only.
|
79
|
+
# * OUT - The argument is output-only.
|
80
|
+
# * INOUT - The argument is both an input and an output.
|
81
|
+
# @param [String] name The name of the argument. Optional. Can be absent for a function return argument.
|
82
|
+
#
|
83
|
+
def initialize **kwargs
|
84
|
+
kwargs[:data_type] = StandardSql::DataType.gapi_from_string_or_data_type kwargs[:data_type]
|
85
|
+
@gapi = Google::Apis::BigqueryV2::Argument.new(**kwargs)
|
86
|
+
end
|
87
|
+
|
88
|
+
##
|
89
|
+
# The data type of the argument. Required unless {#argument_kind} is `ANY_TYPE`.
|
90
|
+
#
|
91
|
+
# @return [StandardSql::DataType] The data type.
|
92
|
+
#
|
93
|
+
def data_type
|
94
|
+
StandardSql::DataType.from_gapi @gapi.data_type
|
95
|
+
end
|
96
|
+
|
97
|
+
##
|
98
|
+
# The kind of argument. Optional. Defaults to `FIXED_TYPE`.
|
99
|
+
#
|
100
|
+
# * `FIXED_TYPE` - The argument is a variable with fully specified type, which can be a struct or an array, but
|
101
|
+
# not a table.
|
102
|
+
# * `ANY_TYPE` - The argument is any type, including struct or array, but not a table.
|
103
|
+
#
|
104
|
+
# To be added: `FIXED_TABLE`, `ANY_TABLE`.
|
105
|
+
#
|
106
|
+
# @return [String] The upper case kind of argument.
|
107
|
+
#
|
108
|
+
def argument_kind
|
109
|
+
@gapi.argument_kind
|
110
|
+
end
|
111
|
+
|
112
|
+
##
|
113
|
+
# Checks if the value of {#argument_kind} is `FIXED_TYPE`. The default is `true`.
|
114
|
+
#
|
115
|
+
# @return [Boolean] `true` when `FIXED_TYPE`, `false` otherwise.
|
116
|
+
#
|
117
|
+
def fixed_type?
|
118
|
+
return true if @gapi.argument_kind.nil?
|
119
|
+
@gapi.argument_kind == "FIXED_TYPE"
|
120
|
+
end
|
121
|
+
|
122
|
+
##
|
123
|
+
# Checks if the value of {#argument_kind} is `ANY_TYPE`. The default is `false`.
|
124
|
+
#
|
125
|
+
# @return [Boolean] `true` when `ANY_TYPE`, `false` otherwise.
|
126
|
+
#
|
127
|
+
def any_type?
|
128
|
+
@gapi.argument_kind == "ANY_TYPE"
|
129
|
+
end
|
130
|
+
|
131
|
+
##
|
132
|
+
# Specifies whether the argument is input or output. Optional. Can be set for procedures only.
|
133
|
+
#
|
134
|
+
# * IN - The argument is input-only.
|
135
|
+
# * OUT - The argument is output-only.
|
136
|
+
# * INOUT - The argument is both an input and an output.
|
137
|
+
#
|
138
|
+
# @return [String] The upper case input/output mode of the argument.
|
139
|
+
#
|
140
|
+
def mode
|
141
|
+
@gapi.mode
|
142
|
+
end
|
143
|
+
|
144
|
+
##
|
145
|
+
# Checks if the value of {#mode} is `IN`. Can be set for procedures only. The default is `false`.
|
146
|
+
#
|
147
|
+
# @return [Boolean] `true` when `IN`, `false` otherwise.
|
148
|
+
#
|
149
|
+
def in?
|
150
|
+
@gapi.mode == "IN"
|
151
|
+
end
|
152
|
+
|
153
|
+
##
|
154
|
+
# Checks if the value of {#mode} is `OUT`. Can be set for procedures only. The default is `false`.
|
155
|
+
#
|
156
|
+
# @return [Boolean] `true` when `OUT`, `false` otherwise.
|
157
|
+
#
|
158
|
+
def out?
|
159
|
+
@gapi.mode == "OUT"
|
160
|
+
end
|
161
|
+
|
162
|
+
##
|
163
|
+
# Checks if the value of {#mode} is `INOUT`. Can be set for procedures only. The default is `false`.
|
164
|
+
#
|
165
|
+
# @return [Boolean] `true` when `INOUT`, `false` otherwise.
|
166
|
+
#
|
167
|
+
def inout?
|
168
|
+
@gapi.mode == "INOUT"
|
169
|
+
end
|
170
|
+
|
171
|
+
##
|
172
|
+
#
|
173
|
+
# The name of the argument. Optional. Can be absent for a function return argument.
|
174
|
+
#
|
175
|
+
# @return [String] The name of the argument.
|
176
|
+
#
|
177
|
+
def name
|
178
|
+
@gapi.name
|
179
|
+
end
|
180
|
+
|
181
|
+
##
|
182
|
+
# @private
|
183
|
+
def to_gapi
|
184
|
+
@gapi
|
185
|
+
end
|
186
|
+
|
187
|
+
##
|
188
|
+
# @private New Argument from a Google API Client object.
|
189
|
+
def self.from_gapi gapi
|
190
|
+
new.tap do |a|
|
191
|
+
a.instance_variable_set :@gapi, gapi
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
@@ -152,7 +152,7 @@ module Google
|
|
152
152
|
#
|
153
153
|
# @return [Google::Cloud::Bigquery::CopyJob::Updater] A job
|
154
154
|
# configuration object for setting copy options.
|
155
|
-
def self.from_options service, source, target, options
|
155
|
+
def self.from_options service, source, target, options
|
156
156
|
job_ref = service.job_ref_from options[:job_id], options[:prefix]
|
157
157
|
copy_cfg = Google::Apis::BigqueryV2::JobConfigurationTableCopy.new(
|
158
158
|
source_table: source,
|
@@ -284,6 +284,23 @@ module Google
|
|
284
284
|
@gapi.configuration.update! labels: value
|
285
285
|
end
|
286
286
|
|
287
|
+
def cancel
|
288
|
+
raise "not implemented in #{self.class}"
|
289
|
+
end
|
290
|
+
|
291
|
+
def rerun!
|
292
|
+
raise "not implemented in #{self.class}"
|
293
|
+
end
|
294
|
+
|
295
|
+
def reload!
|
296
|
+
raise "not implemented in #{self.class}"
|
297
|
+
end
|
298
|
+
alias refresh! reload!
|
299
|
+
|
300
|
+
def wait_until_done!
|
301
|
+
raise "not implemented in #{self.class}"
|
302
|
+
end
|
303
|
+
|
287
304
|
##
|
288
305
|
# @private Returns the Google API client library version of this job.
|
289
306
|
#
|
@@ -316,6 +316,21 @@ module Google
|
|
316
316
|
job_gapi&.statistics&.query&.ddl_operation_performed
|
317
317
|
end
|
318
318
|
|
319
|
+
##
|
320
|
+
# The DDL target routine, in reference state. (See {Routine#reference?}.)
|
321
|
+
# Present only for `CREATE/DROP FUNCTION/PROCEDURE` queries. (See
|
322
|
+
# {#statement_type}.)
|
323
|
+
#
|
324
|
+
# @return [Google::Cloud::Bigquery::Routine, nil] The DDL target routine, in
|
325
|
+
# reference state.
|
326
|
+
#
|
327
|
+
def ddl_target_routine
|
328
|
+
ensure_service!
|
329
|
+
routine = job_gapi&.statistics&.query&.ddl_target_routine
|
330
|
+
return nil if routine.nil?
|
331
|
+
Google::Cloud::Bigquery::Routine.new_reference_from_gapi routine, service
|
332
|
+
end
|
333
|
+
|
319
334
|
##
|
320
335
|
# The DDL target table, in reference state. (See {Table#reference?}.)
|
321
336
|
# Present only for `CREATE/DROP TABLE/VIEW` queries. (See
|
@@ -18,6 +18,7 @@ require "google/cloud/errors"
|
|
18
18
|
require "google/cloud/bigquery/service"
|
19
19
|
require "google/cloud/bigquery/table"
|
20
20
|
require "google/cloud/bigquery/model"
|
21
|
+
require "google/cloud/bigquery/routine"
|
21
22
|
require "google/cloud/bigquery/external"
|
22
23
|
require "google/cloud/bigquery/dataset/list"
|
23
24
|
require "google/cloud/bigquery/dataset/access"
|
@@ -554,6 +555,40 @@ module Google
|
|
554
555
|
# end
|
555
556
|
# end
|
556
557
|
#
|
558
|
+
# @example With time partitioning and clustering.
|
559
|
+
# require "google/cloud/bigquery"
|
560
|
+
#
|
561
|
+
# bigquery = Google::Cloud::Bigquery.new
|
562
|
+
# dataset = bigquery.dataset "my_dataset"
|
563
|
+
#
|
564
|
+
# table = dataset.create_table "my_table" do |t|
|
565
|
+
# t.schema do |schema|
|
566
|
+
# schema.timestamp "dob", mode: :required
|
567
|
+
# schema.string "first_name", mode: :required
|
568
|
+
# schema.string "last_name", mode: :required
|
569
|
+
# end
|
570
|
+
# t.time_partitioning_type = "DAY"
|
571
|
+
# t.time_partitioning_field = "dob"
|
572
|
+
# t.clustering_fields = ["last_name", "first_name"]
|
573
|
+
# end
|
574
|
+
#
|
575
|
+
# @example With range partitioning.
|
576
|
+
# require "google/cloud/bigquery"
|
577
|
+
#
|
578
|
+
# bigquery = Google::Cloud::Bigquery.new
|
579
|
+
# dataset = bigquery.dataset "my_dataset"
|
580
|
+
#
|
581
|
+
# table = dataset.create_table "my_table" do |t|
|
582
|
+
# t.schema do |schema|
|
583
|
+
# schema.integer "my_table_id", mode: :required
|
584
|
+
# schema.string "my_table_data", mode: :required
|
585
|
+
# end
|
586
|
+
# t.range_partitioning_field = "my_table_id"
|
587
|
+
# t.range_partitioning_start = 0
|
588
|
+
# t.range_partitioning_interval = 10
|
589
|
+
# t.range_partitioning_end = 100
|
590
|
+
# end
|
591
|
+
#
|
557
592
|
# @!group Table
|
558
593
|
#
|
559
594
|
def create_table table_id, name: nil, description: nil
|
@@ -601,12 +636,20 @@ module Google
|
|
601
636
|
# SQL](https://cloud.google.com/bigquery/docs/reference/legacy-sql)
|
602
637
|
# dialect. Optional. The default value is false.
|
603
638
|
# @param [Array<String>, String] udfs User-defined function resources
|
604
|
-
# used in
|
605
|
-
# Google Cloud Storage URI (`gs://bucket/path`), or an inline resource
|
639
|
+
# used in a legacy SQL query. May be either a code resource to load from
|
640
|
+
# a Google Cloud Storage URI (`gs://bucket/path`), or an inline resource
|
606
641
|
# that contains code for a user-defined function (UDF). Providing an
|
607
642
|
# inline code resource is equivalent to providing a URI for a file
|
608
|
-
# containing the same code.
|
609
|
-
#
|
643
|
+
# containing the same code.
|
644
|
+
#
|
645
|
+
# This parameter is used for defining User Defined Function (UDF)
|
646
|
+
# resources only when using legacy SQL. Users of standard SQL should
|
647
|
+
# leverage either DDL (e.g. `CREATE [TEMPORARY] FUNCTION ...`) or the
|
648
|
+
# Routines API to define UDF resources.
|
649
|
+
#
|
650
|
+
# For additional information on migrating, see: [Migrating to
|
651
|
+
# standard SQL - Differences in user-defined JavaScript
|
652
|
+
# functions](https://cloud.google.com/bigquery/docs/reference/standard-sql/migrating-from-legacy-sql#differences_in_user-defined_javascript_functions)
|
610
653
|
#
|
611
654
|
# @return [Google::Cloud::Bigquery::Table] A new table object.
|
612
655
|
#
|
@@ -731,8 +774,7 @@ module Google
|
|
731
774
|
#
|
732
775
|
def tables token: nil, max: nil
|
733
776
|
ensure_service!
|
734
|
-
|
735
|
-
gapi = service.list_tables dataset_id, options
|
777
|
+
gapi = service.list_tables dataset_id, token: token, max: max
|
736
778
|
Table::List.from_gapi gapi, service, dataset_id, max
|
737
779
|
end
|
738
780
|
|
@@ -817,6 +859,174 @@ module Google
|
|
817
859
|
Model::List.from_gapi gapi, service, dataset_id, max
|
818
860
|
end
|
819
861
|
|
862
|
+
##
|
863
|
+
# Creates a new routine. The following attributes may be set in the yielded block:
|
864
|
+
# {Routine::Updater#routine_type=}, {Routine::Updater#language=}, {Routine::Updater#arguments=},
|
865
|
+
# {Routine::Updater#return_type=}, {Routine::Updater#imported_libraries=}, {Routine::Updater#body=}, and
|
866
|
+
# {Routine::Updater#description=}.
|
867
|
+
#
|
868
|
+
# @param [String] routine_id The ID of the routine. The ID must contain only
|
869
|
+
# letters (a-z, A-Z), numbers (0-9), or underscores (_). The maximum length
|
870
|
+
# is 256 characters.
|
871
|
+
# @yield [routine] A block for setting properties on the routine.
|
872
|
+
# @yieldparam [Google::Cloud::Bigquery::Routine::Updater] routine An updater to set additional properties on the
|
873
|
+
# routine.
|
874
|
+
#
|
875
|
+
# @return [Google::Cloud::Bigquery::Routine] A new routine object.
|
876
|
+
#
|
877
|
+
# @example
|
878
|
+
# require "google/cloud/bigquery"
|
879
|
+
#
|
880
|
+
# bigquery = Google::Cloud::Bigquery.new
|
881
|
+
# dataset = bigquery.dataset "my_dataset"
|
882
|
+
#
|
883
|
+
# routine = dataset.create_routine "my_routine" do |r|
|
884
|
+
# r.routine_type = "SCALAR_FUNCTION"
|
885
|
+
# r.language = "SQL"
|
886
|
+
# r.arguments = [
|
887
|
+
# Google::Cloud::Bigquery::Argument.new(name: "x", data_type: "INT64")
|
888
|
+
# ]
|
889
|
+
# r.body = "x * 3"
|
890
|
+
# r.description = "My routine description"
|
891
|
+
# end
|
892
|
+
#
|
893
|
+
# puts routine.routine_id
|
894
|
+
#
|
895
|
+
# @example Extended example:
|
896
|
+
# require "google/cloud/bigquery"
|
897
|
+
#
|
898
|
+
# bigquery = Google::Cloud::Bigquery.new
|
899
|
+
# dataset = bigquery.dataset "my_dataset"
|
900
|
+
# routine = dataset.create_routine "my_routine" do |r|
|
901
|
+
# r.routine_type = "SCALAR_FUNCTION"
|
902
|
+
# r.language = :SQL
|
903
|
+
# r.body = "(SELECT SUM(IF(elem.name = \"foo\",elem.val,null)) FROM UNNEST(arr) AS elem)"
|
904
|
+
# r.arguments = [
|
905
|
+
# Google::Cloud::Bigquery::Argument.new(
|
906
|
+
# name: "arr",
|
907
|
+
# argument_kind: "FIXED_TYPE",
|
908
|
+
# data_type: Google::Cloud::Bigquery::StandardSql::DataType.new(
|
909
|
+
# type_kind: "ARRAY",
|
910
|
+
# array_element_type: Google::Cloud::Bigquery::StandardSql::DataType.new(
|
911
|
+
# type_kind: "STRUCT",
|
912
|
+
# struct_type: Google::Cloud::Bigquery::StandardSql::StructType.new(
|
913
|
+
# fields: [
|
914
|
+
# Google::Cloud::Bigquery::StandardSql::Field.new(
|
915
|
+
# name: "name",
|
916
|
+
# type: Google::Cloud::Bigquery::StandardSql::DataType.new(type_kind: "STRING")
|
917
|
+
# ),
|
918
|
+
# Google::Cloud::Bigquery::StandardSql::Field.new(
|
919
|
+
# name: "val",
|
920
|
+
# type: Google::Cloud::Bigquery::StandardSql::DataType.new(type_kind: "INT64")
|
921
|
+
# )
|
922
|
+
# ]
|
923
|
+
# )
|
924
|
+
# )
|
925
|
+
# )
|
926
|
+
# )
|
927
|
+
# ]
|
928
|
+
# end
|
929
|
+
#
|
930
|
+
# @!group Routine
|
931
|
+
#
|
932
|
+
def create_routine routine_id
|
933
|
+
ensure_service!
|
934
|
+
new_tb = Google::Apis::BigqueryV2::Routine.new(
|
935
|
+
routine_reference: Google::Apis::BigqueryV2::RoutineReference.new(
|
936
|
+
project_id: project_id, dataset_id: dataset_id, routine_id: routine_id
|
937
|
+
)
|
938
|
+
)
|
939
|
+
updater = Routine::Updater.new new_tb
|
940
|
+
|
941
|
+
yield updater if block_given?
|
942
|
+
|
943
|
+
gapi = service.insert_routine dataset_id, updater.to_gapi
|
944
|
+
Routine.from_gapi gapi, service
|
945
|
+
end
|
946
|
+
|
947
|
+
##
|
948
|
+
# Retrieves an existing routine by ID.
|
949
|
+
#
|
950
|
+
# @param [String] routine_id The ID of a routine.
|
951
|
+
# @param [Boolean] skip_lookup Optionally create just a local reference
|
952
|
+
# object without verifying that the resource exists on the BigQuery
|
953
|
+
# service. Calls made on this object will raise errors if the resource
|
954
|
+
# does not exist. Default is `false`. Optional.
|
955
|
+
#
|
956
|
+
# @return [Google::Cloud::Bigquery::Routine, nil] Returns `nil` if the
|
957
|
+
# routine does not exist.
|
958
|
+
#
|
959
|
+
# @example
|
960
|
+
# require "google/cloud/bigquery"
|
961
|
+
#
|
962
|
+
# bigquery = Google::Cloud::Bigquery.new
|
963
|
+
# dataset = bigquery.dataset "my_dataset"
|
964
|
+
#
|
965
|
+
# routine = dataset.routine "my_routine"
|
966
|
+
# puts routine.routine_id
|
967
|
+
#
|
968
|
+
# @example Avoid retrieving the routine resource with `skip_lookup`:
|
969
|
+
# require "google/cloud/bigquery"
|
970
|
+
#
|
971
|
+
# bigquery = Google::Cloud::Bigquery.new
|
972
|
+
#
|
973
|
+
# dataset = bigquery.dataset "my_dataset"
|
974
|
+
#
|
975
|
+
# routine = dataset.routine "my_routine", skip_lookup: true
|
976
|
+
#
|
977
|
+
# @!group Routine
|
978
|
+
#
|
979
|
+
def routine routine_id, skip_lookup: nil
|
980
|
+
ensure_service!
|
981
|
+
return Routine.new_reference project_id, dataset_id, routine_id, service if skip_lookup
|
982
|
+
gapi = service.get_routine dataset_id, routine_id
|
983
|
+
Routine.from_gapi gapi, service
|
984
|
+
rescue Google::Cloud::NotFoundError
|
985
|
+
nil
|
986
|
+
end
|
987
|
+
|
988
|
+
##
|
989
|
+
# Retrieves the list of routines belonging to the dataset.
|
990
|
+
#
|
991
|
+
# @param [String] token A previously-returned page token representing
|
992
|
+
# part of the larger set of results to view.
|
993
|
+
# @param [Integer] max Maximum number of routines to return.
|
994
|
+
# @param [String] filter If set, then only the routines matching this filter are returned. The current supported
|
995
|
+
# form is `routineType:`, with a {Routine#routine_type} enum value. Example: `routineType:SCALAR_FUNCTION`.
|
996
|
+
#
|
997
|
+
# @return [Array<Google::Cloud::Bigquery::Routine>] An array of routines
|
998
|
+
# (See {Google::Cloud::Bigquery::Routine::List})
|
999
|
+
#
|
1000
|
+
# @example
|
1001
|
+
# require "google/cloud/bigquery"
|
1002
|
+
#
|
1003
|
+
# bigquery = Google::Cloud::Bigquery.new
|
1004
|
+
# dataset = bigquery.dataset "my_dataset"
|
1005
|
+
#
|
1006
|
+
# routines = dataset.routines
|
1007
|
+
# routines.each do |routine|
|
1008
|
+
# puts routine.routine_id
|
1009
|
+
# end
|
1010
|
+
#
|
1011
|
+
# @example Retrieve all routines: (See {Routine::List#all})
|
1012
|
+
# require "google/cloud/bigquery"
|
1013
|
+
#
|
1014
|
+
# bigquery = Google::Cloud::Bigquery.new
|
1015
|
+
# dataset = bigquery.dataset "my_dataset"
|
1016
|
+
#
|
1017
|
+
# routines = dataset.routines
|
1018
|
+
# routines.all do |routine|
|
1019
|
+
# puts routine.routine_id
|
1020
|
+
# end
|
1021
|
+
#
|
1022
|
+
# @!group Routine
|
1023
|
+
#
|
1024
|
+
def routines token: nil, max: nil, filter: nil
|
1025
|
+
ensure_service!
|
1026
|
+
gapi = service.list_routines dataset_id, token: token, max: max, filter: filter
|
1027
|
+
Routine::List.from_gapi gapi, service, dataset_id, max, filter: filter
|
1028
|
+
end
|
1029
|
+
|
820
1030
|
##
|
821
1031
|
# Queries data by creating a [query
|
822
1032
|
# job](https://cloud.google.com/bigquery/docs/query-overview#query_jobs).
|
@@ -969,12 +1179,20 @@ module Google
|
|
969
1179
|
# list must have a different key. See [Requirements for
|
970
1180
|
# labels](https://cloud.google.com/bigquery/docs/creating-managing-labels#requirements).
|
971
1181
|
# @param [Array<String>, String] udfs User-defined function resources
|
972
|
-
# used in
|
973
|
-
# Google Cloud Storage URI (`gs://bucket/path`), or an inline resource
|
1182
|
+
# used in a legacy SQL query. May be either a code resource to load from
|
1183
|
+
# a Google Cloud Storage URI (`gs://bucket/path`), or an inline resource
|
974
1184
|
# that contains code for a user-defined function (UDF). Providing an
|
975
1185
|
# inline code resource is equivalent to providing a URI for a file
|
976
|
-
# containing the same code.
|
977
|
-
#
|
1186
|
+
# containing the same code.
|
1187
|
+
#
|
1188
|
+
# This parameter is used for defining User Defined Function (UDF)
|
1189
|
+
# resources only when using legacy SQL. Users of standard SQL should
|
1190
|
+
# leverage either DDL (e.g. `CREATE [TEMPORARY] FUNCTION ...`) or the
|
1191
|
+
# Routines API to define UDF resources.
|
1192
|
+
#
|
1193
|
+
# For additional information on migrating, see: [Migrating to
|
1194
|
+
# standard SQL - Differences in user-defined JavaScript
|
1195
|
+
# functions](https://cloud.google.com/bigquery/docs/reference/standard-sql/migrating-from-legacy-sql#differences_in_user-defined_javascript_functions)
|
978
1196
|
# @param [Integer] maximum_billing_tier Deprecated: Change the billing
|
979
1197
|
# tier to allow high-compute queries.
|
980
1198
|
# @yield [job] a job configuration object
|
@@ -1073,7 +1291,7 @@ module Google
|
|
1073
1291
|
#
|
1074
1292
|
# job.wait_until_done!
|
1075
1293
|
# if !job.failed?
|
1076
|
-
# table_ref = job.ddl_target_table
|
1294
|
+
# table_ref = job.ddl_target_table # Or ddl_target_routine for CREATE/DROP FUNCTION/PROCEDURE
|
1077
1295
|
# end
|
1078
1296
|
#
|
1079
1297
|
# @example Execute a DML statement:
|
@@ -1321,7 +1539,7 @@ module Google
|
|
1321
1539
|
#
|
1322
1540
|
# data = bigquery.query "CREATE TABLE my_table (x INT64)"
|
1323
1541
|
#
|
1324
|
-
# table_ref = data.ddl_target_table
|
1542
|
+
# table_ref = data.ddl_target_table # Or ddl_target_routine for CREATE/DROP FUNCTION/PROCEDURE
|
1325
1543
|
#
|
1326
1544
|
# @example Execute a DML statement:
|
1327
1545
|
# require "google/cloud/bigquery"
|
@@ -1942,7 +2160,7 @@ module Google
|
|
1942
2160
|
# dataset = bigquery.dataset "my_dataset", skip_lookup: true
|
1943
2161
|
# dataset.exists? # true
|
1944
2162
|
#
|
1945
|
-
def exists? force:
|
2163
|
+
def exists? force: false
|
1946
2164
|
return gapi_exists? if force
|
1947
2165
|
# If we have a memoized value, return it
|
1948
2166
|
return @exists unless @exists.nil?
|
@@ -2052,7 +2270,7 @@ module Google
|
|
2052
2270
|
end
|
2053
2271
|
|
2054
2272
|
##
|
2055
|
-
# @private New lazy Dataset object without making an HTTP request.
|
2273
|
+
# @private New lazy Dataset object without making an HTTP request, for use with the skip_lookup option.
|
2056
2274
|
def self.new_reference project_id, dataset_id, service
|
2057
2275
|
raise ArgumentError, "dataset_id is required" unless dataset_id
|
2058
2276
|
new.tap do |b|
|
@@ -2083,12 +2301,13 @@ module Google
|
|
2083
2301
|
# @param [String] table_id The ID of the destination table.
|
2084
2302
|
# @param [Hash, Array<Hash>] rows A hash object or array of hash objects
|
2085
2303
|
# containing the data. Required.
|
2086
|
-
# @param [Array<String
|
2087
|
-
#
|
2088
|
-
#
|
2089
|
-
#
|
2090
|
-
#
|
2091
|
-
#
|
2304
|
+
# @param [Array<String|Symbol>, Symbol] insert_ids A unique ID for each row. BigQuery uses this property to
|
2305
|
+
# detect duplicate insertion requests on a best-effort basis. For more information, see [data
|
2306
|
+
# consistency](https://cloud.google.com/bigquery/streaming-data-into-bigquery#dataconsistency). Optional. If
|
2307
|
+
# not provided, the client library will assign a UUID to each row before the request is sent.
|
2308
|
+
#
|
2309
|
+
# The value `:skip` can be provided to skip the generation of IDs for all rows, or to skip the generation of an
|
2310
|
+
# ID for a specific row in the array.
|
2092
2311
|
# @param [Boolean] skip_invalid Insert all valid rows of a request, even
|
2093
2312
|
# if invalid rows exist. The default value is `false`, which causes
|
2094
2313
|
# the entire request to fail if any invalid rows exist.
|
@@ -2099,6 +2318,12 @@ module Google
|
|
2099
2318
|
# a new table with the given `table_id`, if no table is found for
|
2100
2319
|
# `table_id`. The default value is false.
|
2101
2320
|
#
|
2321
|
+
# @yield [table] a block for setting the table
|
2322
|
+
# @yieldparam [Google::Cloud::Bigquery::Table::Updater] table An updater
|
2323
|
+
# to set additional properties on the table in the API request to
|
2324
|
+
# create it. Only used when `autocreate` is set and the table does not
|
2325
|
+
# already exist.
|
2326
|
+
#
|
2102
2327
|
# @return [Google::Cloud::Bigquery::InsertResponse] An insert response
|
2103
2328
|
# object.
|
2104
2329
|
#
|
@@ -2144,32 +2369,19 @@ module Google
|
|
2144
2369
|
#
|
2145
2370
|
# @!group Data
|
2146
2371
|
#
|
2147
|
-
def insert table_id, rows, insert_ids: nil, skip_invalid: nil, ignore_unknown: nil, autocreate: nil
|
2372
|
+
def insert table_id, rows, insert_ids: nil, skip_invalid: nil, ignore_unknown: nil, autocreate: nil, &block
|
2148
2373
|
rows = [rows] if rows.is_a? Hash
|
2374
|
+
raise ArgumentError, "No rows provided" if rows.empty?
|
2375
|
+
|
2376
|
+
insert_ids = Array.new(rows.count) { :skip } if insert_ids == :skip
|
2149
2377
|
insert_ids = Array insert_ids
|
2150
2378
|
if insert_ids.count.positive? && insert_ids.count != rows.count
|
2151
2379
|
raise ArgumentError, "insert_ids must be the same size as rows"
|
2152
2380
|
end
|
2153
2381
|
|
2154
2382
|
if autocreate
|
2155
|
-
|
2156
|
-
|
2157
|
-
skip_invalid: skip_invalid, ignore_unknown: ignore_unknown, insert_ids: insert_ids
|
2158
|
-
rescue Google::Cloud::NotFoundError
|
2159
|
-
sleep rand(1..60)
|
2160
|
-
begin
|
2161
|
-
create_table table_id do |tbl_updater|
|
2162
|
-
yield tbl_updater if block_given?
|
2163
|
-
end
|
2164
|
-
# rubocop:disable Lint/HandleExceptions
|
2165
|
-
rescue Google::Cloud::AlreadyExistsError
|
2166
|
-
end
|
2167
|
-
# rubocop:enable Lint/HandleExceptions
|
2168
|
-
|
2169
|
-
sleep 60
|
2170
|
-
insert table_id, rows, skip_invalid: skip_invalid, ignore_unknown: ignore_unknown, autocreate: true,
|
2171
|
-
insert_ids: insert_ids
|
2172
|
-
end
|
2383
|
+
insert_data_with_autocreate table_id, rows, skip_invalid: skip_invalid, ignore_unknown: ignore_unknown,
|
2384
|
+
insert_ids: insert_ids, &block
|
2173
2385
|
else
|
2174
2386
|
insert_data table_id, rows, skip_invalid: skip_invalid, ignore_unknown: ignore_unknown,
|
2175
2387
|
insert_ids: insert_ids
|
@@ -2239,15 +2451,30 @@ module Google
|
|
2239
2451
|
|
2240
2452
|
protected
|
2241
2453
|
|
2242
|
-
def
|
2243
|
-
|
2454
|
+
def insert_data_with_autocreate table_id, rows, skip_invalid: nil, ignore_unknown: nil, insert_ids: nil
|
2455
|
+
insert_data table_id, rows, skip_invalid: skip_invalid, ignore_unknown: ignore_unknown, insert_ids: insert_ids
|
2456
|
+
rescue Google::Cloud::NotFoundError
|
2457
|
+
sleep rand(1..60)
|
2458
|
+
begin
|
2459
|
+
create_table table_id do |tbl_updater|
|
2460
|
+
yield tbl_updater if block_given?
|
2461
|
+
end
|
2462
|
+
# rubocop:disable Lint/HandleExceptions
|
2463
|
+
rescue Google::Cloud::AlreadyExistsError
|
2464
|
+
end
|
2465
|
+
# rubocop:enable Lint/HandleExceptions
|
2466
|
+
|
2467
|
+
sleep 60
|
2468
|
+
retry
|
2469
|
+
end
|
2470
|
+
|
2471
|
+
def insert_data table_id, rows, skip_invalid: nil, ignore_unknown: nil, insert_ids: nil
|
2244
2472
|
rows = [rows] if rows.is_a? Hash
|
2245
2473
|
raise ArgumentError, "No rows provided" if rows.empty?
|
2246
2474
|
ensure_service!
|
2247
|
-
|
2248
|
-
|
2249
|
-
|
2250
|
-
gapi = service.insert_tabledata dataset_id, table_id, rows, options
|
2475
|
+
gapi = service.insert_tabledata dataset_id, table_id, rows, skip_invalid: skip_invalid,
|
2476
|
+
ignore_unknown: ignore_unknown,
|
2477
|
+
insert_ids: insert_ids
|
2251
2478
|
InsertResponse.from_gapi rows, gapi
|
2252
2479
|
end
|
2253
2480
|
|
@@ -2444,14 +2671,14 @@ module Google
|
|
2444
2671
|
end
|
2445
2672
|
|
2446
2673
|
##
|
2447
|
-
# Yielded to a block to accumulate changes for a
|
2674
|
+
# Yielded to a block to accumulate changes for a create request. See {Project#create_dataset}.
|
2448
2675
|
class Updater < Dataset
|
2449
2676
|
##
|
2450
|
-
# A list of attributes that were updated.
|
2677
|
+
# @private A list of attributes that were updated.
|
2451
2678
|
attr_reader :updates
|
2452
2679
|
|
2453
2680
|
##
|
2454
|
-
# Create an Updater object.
|
2681
|
+
# @private Create an Updater object.
|
2455
2682
|
def initialize gapi
|
2456
2683
|
@updates = []
|
2457
2684
|
@gapi = gapi
|
@@ -2468,8 +2695,109 @@ module Google
|
|
2468
2695
|
@access
|
2469
2696
|
end
|
2470
2697
|
|
2698
|
+
# rubocop:disable Style/MethodDefParentheses
|
2699
|
+
|
2700
|
+
##
|
2701
|
+
# @raise [RuntimeError] not implemented
|
2702
|
+
def delete(*)
|
2703
|
+
raise "not implemented in #{self.class}"
|
2704
|
+
end
|
2705
|
+
|
2471
2706
|
##
|
2472
|
-
#
|
2707
|
+
# @raise [RuntimeError] not implemented
|
2708
|
+
def create_table(*)
|
2709
|
+
raise "not implemented in #{self.class}"
|
2710
|
+
end
|
2711
|
+
|
2712
|
+
##
|
2713
|
+
# @raise [RuntimeError] not implemented
|
2714
|
+
def create_view(*)
|
2715
|
+
raise "not implemented in #{self.class}"
|
2716
|
+
end
|
2717
|
+
|
2718
|
+
##
|
2719
|
+
# @raise [RuntimeError] not implemented
|
2720
|
+
def table(*)
|
2721
|
+
raise "not implemented in #{self.class}"
|
2722
|
+
end
|
2723
|
+
|
2724
|
+
##
|
2725
|
+
# @raise [RuntimeError] not implemented
|
2726
|
+
def tables(*)
|
2727
|
+
raise "not implemented in #{self.class}"
|
2728
|
+
end
|
2729
|
+
|
2730
|
+
##
|
2731
|
+
# @raise [RuntimeError] not implemented
|
2732
|
+
def model(*)
|
2733
|
+
raise "not implemented in #{self.class}"
|
2734
|
+
end
|
2735
|
+
|
2736
|
+
##
|
2737
|
+
# @raise [RuntimeError] not implemented
|
2738
|
+
def models(*)
|
2739
|
+
raise "not implemented in #{self.class}"
|
2740
|
+
end
|
2741
|
+
|
2742
|
+
##
|
2743
|
+
# @raise [RuntimeError] not implemented
|
2744
|
+
def create_routine(*)
|
2745
|
+
raise "not implemented in #{self.class}"
|
2746
|
+
end
|
2747
|
+
|
2748
|
+
##
|
2749
|
+
# @raise [RuntimeError] not implemented
|
2750
|
+
def routine(*)
|
2751
|
+
raise "not implemented in #{self.class}"
|
2752
|
+
end
|
2753
|
+
|
2754
|
+
##
|
2755
|
+
# @raise [RuntimeError] not implemented
|
2756
|
+
def routines(*)
|
2757
|
+
raise "not implemented in #{self.class}"
|
2758
|
+
end
|
2759
|
+
|
2760
|
+
##
|
2761
|
+
# @raise [RuntimeError] not implemented
|
2762
|
+
def query_job(*)
|
2763
|
+
raise "not implemented in #{self.class}"
|
2764
|
+
end
|
2765
|
+
|
2766
|
+
##
|
2767
|
+
# @raise [RuntimeError] not implemented
|
2768
|
+
def query(*)
|
2769
|
+
raise "not implemented in #{self.class}"
|
2770
|
+
end
|
2771
|
+
|
2772
|
+
##
|
2773
|
+
# @raise [RuntimeError] not implemented
|
2774
|
+
def external(*)
|
2775
|
+
raise "not implemented in #{self.class}"
|
2776
|
+
end
|
2777
|
+
|
2778
|
+
##
|
2779
|
+
# @raise [RuntimeError] not implemented
|
2780
|
+
def load_job(*)
|
2781
|
+
raise "not implemented in #{self.class}"
|
2782
|
+
end
|
2783
|
+
|
2784
|
+
##
|
2785
|
+
# @raise [RuntimeError] not implemented
|
2786
|
+
def load(*)
|
2787
|
+
raise "not implemented in #{self.class}"
|
2788
|
+
end
|
2789
|
+
|
2790
|
+
##
|
2791
|
+
# @raise [RuntimeError] not implemented
|
2792
|
+
def reload!
|
2793
|
+
raise "not implemented in #{self.class}"
|
2794
|
+
end
|
2795
|
+
alias refresh! reload!
|
2796
|
+
|
2797
|
+
# rubocop:enable Style/MethodDefParentheses
|
2798
|
+
|
2799
|
+
##
|
2800
|
+
# @private Make sure any access changes are saved
|
2473
2801
|
def check_for_mutated_access!
|
2474
2802
|
return if @access.nil?
|
2475
2803
|
return unless @access.changed?
|
@@ -2477,6 +2805,8 @@ module Google
|
|
2477
2805
|
patch_gapi! :access
|
2478
2806
|
end
|
2479
2807
|
|
2808
|
+
##
|
2809
|
+
# @private
|
2480
2810
|
def to_gapi
|
2481
2811
|
check_for_mutated_access!
|
2482
2812
|
@gapi
|