google-cloud-bigquery 1.23.0 → 1.28.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +62 -0
- data/CONTRIBUTING.md +1 -1
- data/lib/google/cloud/bigquery/dataset.rb +97 -10
- data/lib/google/cloud/bigquery/dataset/access.rb +293 -16
- data/lib/google/cloud/bigquery/external.rb +328 -3
- data/lib/google/cloud/bigquery/extract_job.rb +4 -8
- data/lib/google/cloud/bigquery/job.rb +35 -1
- data/lib/google/cloud/bigquery/load_job.rb +182 -28
- data/lib/google/cloud/bigquery/policy.rb +431 -0
- data/lib/google/cloud/bigquery/project.rb +1 -2
- data/lib/google/cloud/bigquery/query_job.rb +9 -6
- data/lib/google/cloud/bigquery/routine.rb +127 -5
- data/lib/google/cloud/bigquery/service.rb +35 -0
- data/lib/google/cloud/bigquery/table.rb +257 -41
- data/lib/google/cloud/bigquery/version.rb +1 -1
- metadata +7 -6
@@ -981,8 +981,7 @@ module Google
|
|
981
981
|
# @param [String] description A user-friendly description of the
|
982
982
|
# dataset.
|
983
983
|
# @param [Integer] expiration The default lifetime of all tables in the
|
984
|
-
# dataset, in milliseconds. The minimum value is
|
985
|
-
# (one hour).
|
984
|
+
# dataset, in milliseconds. The minimum value is `3_600_000` (one hour).
|
986
985
|
# @param [String] location The geographic location where the dataset
|
987
986
|
# should reside. Possible values include `EU` and `US`. The default
|
988
987
|
# value is `US`.
|
@@ -94,8 +94,7 @@ module Google
|
|
94
94
|
# otherwise.
|
95
95
|
#
|
96
96
|
def batch?
|
97
|
-
|
98
|
-
val == "BATCH"
|
97
|
+
@gapi.configuration.query.priority == "BATCH"
|
99
98
|
end
|
100
99
|
|
101
100
|
##
|
@@ -528,8 +527,9 @@ module Google
|
|
528
527
|
# The period for which the destination table will be partitioned, if
|
529
528
|
# any. See [Partitioned Tables](https://cloud.google.com/bigquery/docs/partitioned-tables).
|
530
529
|
#
|
531
|
-
# @return [String, nil] The partition type.
|
532
|
-
#
|
530
|
+
# @return [String, nil] The partition type. The supported types are `DAY`,
|
531
|
+
# `HOUR`, `MONTH`, and `YEAR`, which will generate one partition per day,
|
532
|
+
# hour, month, and year, respectively; or `nil` if not present.
|
533
533
|
#
|
534
534
|
# @!group Attributes
|
535
535
|
#
|
@@ -1302,13 +1302,16 @@ module Google
|
|
1302
1302
|
##
|
1303
1303
|
# Sets the partitioning for the destination table. See [Partitioned
|
1304
1304
|
# Tables](https://cloud.google.com/bigquery/docs/partitioned-tables).
|
1305
|
+
# The supported types are `DAY`, `HOUR`, `MONTH`, and `YEAR`, which will
|
1306
|
+
# generate one partition per day, hour, month, and year, respectively.
|
1305
1307
|
#
|
1306
1308
|
# You can only set the partitioning field while creating a table.
|
1307
1309
|
# BigQuery does not allow you to change partitioning on an existing
|
1308
1310
|
# table.
|
1309
1311
|
#
|
1310
|
-
# @param [String] type The partition type.
|
1311
|
-
#
|
1312
|
+
# @param [String] type The partition type. The supported types are `DAY`,
|
1313
|
+
# `HOUR`, `MONTH`, and `YEAR`, which will generate one partition per day,
|
1314
|
+
# hour, month, and year, respectively.
|
1312
1315
|
#
|
1313
1316
|
# @example
|
1314
1317
|
# require "google/cloud/bigquery"
|
@@ -603,6 +603,93 @@ module Google
|
|
603
603
|
update_gapi!
|
604
604
|
end
|
605
605
|
|
606
|
+
###
|
607
|
+
# The JavaScript UDF determinism level. Optional.
|
608
|
+
#
|
609
|
+
# * `DETERMINISTIC` - Deterministic indicates that two calls with the same input to a UDF yield the same output.
|
610
|
+
# If all JavaScript UDFs are `DETERMINISTIC`, the query result is potentially cachable.
|
611
|
+
# * `NOT_DETERMINISTIC` - Not deterministic indicates that the output of the UDF is not guaranteed to yield the
|
612
|
+
# same output each time for a given set of inputs. If any JavaScript UDF is `NOT_DETERMINISTIC`, the query
|
613
|
+
# result is not cacheable.
|
614
|
+
#
|
615
|
+
# Even if a JavaScript UDF is deterministic, many other factors can prevent usage of cached query results.
|
616
|
+
# Example factors include but not limited to: DDL/DML, non-deterministic SQL function calls, update of
|
617
|
+
# referenced tables/views/UDFs or imported JavaScript libraries. SQL UDFs cannot have determinism specified.
|
618
|
+
# Their determinism is automatically determined.
|
619
|
+
#
|
620
|
+
# @return [String, nil] The routine determinism level in upper case, or `nil` if not set or the object is a
|
621
|
+
# reference (see {#reference?}).
|
622
|
+
#
|
623
|
+
# @example
|
624
|
+
# require "google/cloud/bigquery"
|
625
|
+
#
|
626
|
+
# bigquery = Google::Cloud::Bigquery.new
|
627
|
+
# dataset = bigquery.dataset "my_dataset"
|
628
|
+
# routine = dataset.routine "my_routine"
|
629
|
+
#
|
630
|
+
# routine.determinism_level #=> "NOT_DETERMINISTIC"
|
631
|
+
#
|
632
|
+
# @!group Attributes
|
633
|
+
#
|
634
|
+
def determinism_level
|
635
|
+
return nil if reference?
|
636
|
+
ensure_full_data!
|
637
|
+
@gapi.determinism_level
|
638
|
+
end
|
639
|
+
|
640
|
+
##
|
641
|
+
# Updates the JavaScript UDF determinism level. Optional.
|
642
|
+
#
|
643
|
+
# * `DETERMINISTIC` - Deterministic indicates that two calls with the same input to a UDF yield the same output.
|
644
|
+
# If all JavaScript UDFs are `DETERMINISTIC`, the query result is potentially cachable.
|
645
|
+
# * `NOT_DETERMINISTIC` - Not deterministic indicates that the output of the UDF is not guaranteed to yield the
|
646
|
+
# same output each time for a given set of inputs. If any JavaScript UDF is `NOT_DETERMINISTIC`, the query
|
647
|
+
# result is not cacheable.
|
648
|
+
#
|
649
|
+
# @param [String, nil] new_determinism_level The new routine determinism level in upper case.
|
650
|
+
#
|
651
|
+
# @example
|
652
|
+
# require "google/cloud/bigquery"
|
653
|
+
#
|
654
|
+
# bigquery = Google::Cloud::Bigquery.new
|
655
|
+
# dataset = bigquery.dataset "my_dataset"
|
656
|
+
# routine = dataset.routine "my_routine"
|
657
|
+
#
|
658
|
+
# routine.determinism_level #=> "NOT_DETERMINISTIC"
|
659
|
+
# routine.determinism_level = "DETERMINISTIC"
|
660
|
+
#
|
661
|
+
# @!group Attributes
|
662
|
+
#
|
663
|
+
def determinism_level= new_determinism_level
|
664
|
+
ensure_full_data!
|
665
|
+
@gapi.determinism_level = new_determinism_level
|
666
|
+
update_gapi!
|
667
|
+
end
|
668
|
+
|
669
|
+
##
|
670
|
+
# Checks if the value of {#determinism_level} is `DETERMINISTIC`. The default is `false`.
|
671
|
+
#
|
672
|
+
# @return [Boolean] `true` when `DETERMINISTIC` and the object is not a reference (see {#reference?}), `false`
|
673
|
+
# otherwise.
|
674
|
+
#
|
675
|
+
# @!group Attributes
|
676
|
+
#
|
677
|
+
def determinism_level_deterministic?
|
678
|
+
@gapi.determinism_level == "DETERMINISTIC"
|
679
|
+
end
|
680
|
+
|
681
|
+
##
|
682
|
+
# Checks if the value of {#determinism_level} is `NOT_DETERMINISTIC`. The default is `false`.
|
683
|
+
#
|
684
|
+
# @return [Boolean] `true` when `NOT_DETERMINISTIC` and the object is not a reference (see {#reference?}),
|
685
|
+
# `false` otherwise.
|
686
|
+
#
|
687
|
+
# @!group Attributes
|
688
|
+
#
|
689
|
+
def determinism_level_not_deterministic?
|
690
|
+
@gapi.determinism_level == "NOT_DETERMINISTIC"
|
691
|
+
end
|
692
|
+
|
606
693
|
##
|
607
694
|
# Updates the routine with changes made in the given block in a single update request. The following attributes
|
608
695
|
# may be set: {Updater#routine_type=}, {Updater#language=}, {Updater#arguments=}, {Updater#return_type=},
|
@@ -999,7 +1086,9 @@ module Google
|
|
999
1086
|
# routine = dataset.routine "my_routine"
|
1000
1087
|
#
|
1001
1088
|
# routine.return_type.type_kind #=> "INT64"
|
1002
|
-
# routine.
|
1089
|
+
# routine.update do |r|
|
1090
|
+
# r.return_type = "STRING"
|
1091
|
+
# end
|
1003
1092
|
#
|
1004
1093
|
def return_type= new_return_type
|
1005
1094
|
@gapi.return_type = StandardSql::DataType.gapi_from_string_or_data_type new_return_type
|
@@ -1019,9 +1108,11 @@ module Google
|
|
1019
1108
|
# dataset = bigquery.dataset "my_dataset"
|
1020
1109
|
# routine = dataset.routine "my_routine"
|
1021
1110
|
#
|
1022
|
-
# routine.
|
1023
|
-
#
|
1024
|
-
#
|
1111
|
+
# routine.update do |r|
|
1112
|
+
# r.imported_libraries = [
|
1113
|
+
# "gs://cloud-samples-data/bigquery/udfs/max-value.js"
|
1114
|
+
# ]
|
1115
|
+
# end
|
1025
1116
|
#
|
1026
1117
|
def imported_libraries= new_imported_libraries
|
1027
1118
|
@gapi.imported_libraries = new_imported_libraries
|
@@ -1069,12 +1160,43 @@ module Google
|
|
1069
1160
|
# routine = dataset.routine "my_routine"
|
1070
1161
|
#
|
1071
1162
|
# routine.description #=> "My routine description"
|
1072
|
-
# routine.
|
1163
|
+
# routine.update do |r|
|
1164
|
+
# r.description = "My updated routine description"
|
1165
|
+
# end
|
1073
1166
|
#
|
1074
1167
|
def description= new_description
|
1075
1168
|
@gapi.description = new_description
|
1076
1169
|
end
|
1077
1170
|
|
1171
|
+
##
|
1172
|
+
# Updates the JavaScript UDF determinism level. Optional.
|
1173
|
+
#
|
1174
|
+
# * `DETERMINISTIC` - Deterministic indicates that two calls with the same input to a UDF yield the same
|
1175
|
+
# output. If all JavaScript UDFs are `DETERMINISTIC`, the query result is potentially cachable.
|
1176
|
+
# * `NOT_DETERMINISTIC` - Not deterministic indicates that the output of the UDF is not guaranteed to yield
|
1177
|
+
# the same output each time for a given set of inputs. If any JavaScript UDF is `NOT_DETERMINISTIC`, the
|
1178
|
+
# query result is not cacheable.
|
1179
|
+
#
|
1180
|
+
# @param [String, nil] new_determinism_level The new routine determinism level in upper case.
|
1181
|
+
#
|
1182
|
+
# @example
|
1183
|
+
# require "google/cloud/bigquery"
|
1184
|
+
#
|
1185
|
+
# bigquery = Google::Cloud::Bigquery.new
|
1186
|
+
# dataset = bigquery.dataset "my_dataset"
|
1187
|
+
# routine = dataset.routine "my_routine"
|
1188
|
+
#
|
1189
|
+
# routine.determinism_level #=> "NOT_DETERMINISTIC"
|
1190
|
+
# routine.update do |r|
|
1191
|
+
# r.determinism_level = "DETERMINISTIC"
|
1192
|
+
# end
|
1193
|
+
#
|
1194
|
+
# @!group Attributes
|
1195
|
+
#
|
1196
|
+
def determinism_level= new_determinism_level
|
1197
|
+
@gapi.determinism_level = new_determinism_level
|
1198
|
+
end
|
1199
|
+
|
1078
1200
|
def update
|
1079
1201
|
raise "not implemented in #{self.class}"
|
1080
1202
|
end
|
@@ -65,6 +65,8 @@ module Google
|
|
65
65
|
service.request_options.header ||= {}
|
66
66
|
service.request_options.header["x-goog-api-client"] = \
|
67
67
|
"gl-ruby/#{RUBY_VERSION} gccl/#{Google::Cloud::Bigquery::VERSION}"
|
68
|
+
service.request_options.query ||= {}
|
69
|
+
service.request_options.query["prettyPrint"] = false
|
68
70
|
service.request_options.quota_project = @quota_project if @quota_project
|
69
71
|
service.authorization = @credentials.client
|
70
72
|
service.root_url = host if host
|
@@ -180,6 +182,34 @@ module Google
|
|
180
182
|
end
|
181
183
|
end
|
182
184
|
|
185
|
+
##
|
186
|
+
# Returns Google::Apis::BigqueryV2::Policy
|
187
|
+
def get_table_policy dataset_id, table_id
|
188
|
+
policy_options = API::GetPolicyOptions.new requested_policy_version: 1
|
189
|
+
execute do
|
190
|
+
service.get_table_iam_policy table_path(dataset_id, table_id),
|
191
|
+
API::GetIamPolicyRequest.new(options: policy_options)
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
##
|
196
|
+
# @param [Google::Apis::BigqueryV2::Policy] new_policy
|
197
|
+
def set_table_policy dataset_id, table_id, new_policy
|
198
|
+
execute do
|
199
|
+
service.set_table_iam_policy table_path(dataset_id, table_id),
|
200
|
+
API::SetIamPolicyRequest.new(policy: new_policy)
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
##
|
205
|
+
# Returns Google::Apis::BigqueryV2::TestIamPermissionsResponse
|
206
|
+
def test_table_permissions dataset_id, table_id, permissions
|
207
|
+
execute do
|
208
|
+
service.test_table_iam_permissions table_path(dataset_id, table_id),
|
209
|
+
API::TestIamPermissionsRequest.new(permissions: permissions)
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
183
213
|
##
|
184
214
|
# Deletes the table specified by tableId from the dataset.
|
185
215
|
# If the table contains data, all the data will be deleted.
|
@@ -506,6 +536,11 @@ module Google
|
|
506
536
|
|
507
537
|
protected
|
508
538
|
|
539
|
+
# Creates a formatted table path.
|
540
|
+
def table_path dataset_id, table_id
|
541
|
+
"projects/#{@project}/datasets/#{dataset_id}/tables/#{table_id}"
|
542
|
+
end
|
543
|
+
|
509
544
|
# Generate a random string similar to the BigQuery service job IDs.
|
510
545
|
def generate_id
|
511
546
|
SecureRandom.urlsafe_base64 21
|
@@ -23,6 +23,7 @@ require "google/cloud/bigquery/external"
|
|
23
23
|
require "google/cloud/bigquery/insert_response"
|
24
24
|
require "google/cloud/bigquery/table/async_inserter"
|
25
25
|
require "google/cloud/bigquery/convert"
|
26
|
+
require "google/cloud/bigquery/policy"
|
26
27
|
require "google/apis/bigquery_v2"
|
27
28
|
|
28
29
|
module Google
|
@@ -36,16 +37,16 @@ module Google
|
|
36
37
|
# repeated fields.
|
37
38
|
#
|
38
39
|
# The Table class can also represent a
|
39
|
-
# [view](https://cloud.google.com/bigquery/docs/views), which is a virtual
|
40
|
-
# table defined by a SQL query
|
41
|
-
# materialized views,
|
42
|
-
#
|
43
|
-
#
|
44
|
-
# indirectly by the top-level query. (See {#view?}, {#query}, {#query=},
|
45
|
-
# and {Dataset#create_view}.)
|
40
|
+
# [logical view](https://cloud.google.com/bigquery/docs/views), which is a virtual
|
41
|
+
# table defined by a SQL query (see {#view?} and {Dataset#create_view}); or a
|
42
|
+
# [materialized view](https://cloud.google.com/bigquery/docs/materialized-views-intro),
|
43
|
+
# which is a precomputed view that periodically caches results of a query for increased
|
44
|
+
# performance and efficiency (see {#materialized_view?} and {Dataset#create_materialized_view}).
|
46
45
|
#
|
47
46
|
# @see https://cloud.google.com/bigquery/docs/loading-data#loading_denormalized_nested_and_repeated_data
|
48
47
|
# Loading denormalized, nested, and repeated data
|
48
|
+
# @see https://cloud.google.com/bigquery/docs/views Creating views
|
49
|
+
# @see https://cloud.google.com/bigquery/docs/materialized-views-intro Introduction to materialized views
|
49
50
|
#
|
50
51
|
# @example
|
51
52
|
# require "google/cloud/bigquery"
|
@@ -76,7 +77,7 @@ module Google
|
|
76
77
|
# }
|
77
78
|
# table.insert row
|
78
79
|
#
|
79
|
-
# @example Creating a
|
80
|
+
# @example Creating a logical view:
|
80
81
|
# require "google/cloud/bigquery"
|
81
82
|
#
|
82
83
|
# bigquery = Google::Cloud::Bigquery.new
|
@@ -85,6 +86,15 @@ module Google
|
|
85
86
|
# "SELECT name, age FROM `my_project.my_dataset.my_table`"
|
86
87
|
# view.view? # true
|
87
88
|
#
|
89
|
+
# @example Creating a materialized view:
|
90
|
+
# require "google/cloud/bigquery"
|
91
|
+
#
|
92
|
+
# bigquery = Google::Cloud::Bigquery.new
|
93
|
+
# dataset = bigquery.dataset "my_dataset"
|
94
|
+
# view = dataset.create_materialized_view "my_materialized_view",
|
95
|
+
# "SELECT name, age FROM `my_project.my_dataset.my_table`"
|
96
|
+
# view.materialized_view? # true
|
97
|
+
#
|
88
98
|
class Table
|
89
99
|
##
|
90
100
|
# @private The Service object.
|
@@ -250,9 +260,10 @@ module Google
|
|
250
260
|
# The period for which the table is time partitioned, if any. See
|
251
261
|
# [Partitioned Tables](https://cloud.google.com/bigquery/docs/partitioned-tables).
|
252
262
|
#
|
253
|
-
# @return [String, nil] The time partition type.
|
254
|
-
#
|
255
|
-
#
|
263
|
+
# @return [String, nil] The time partition type. The supported types are `DAY`,
|
264
|
+
# `HOUR`, `MONTH`, and `YEAR`, which will generate one partition per day,
|
265
|
+
# hour, month, and year, respectively; or `nil` if not set or the object is a
|
266
|
+
# reference (see {#reference?}).
|
256
267
|
#
|
257
268
|
# @!group Attributes
|
258
269
|
#
|
@@ -265,13 +276,16 @@ module Google
|
|
265
276
|
##
|
266
277
|
# Sets the time partitioning type for the table. See [Partitioned
|
267
278
|
# Tables](https://cloud.google.com/bigquery/docs/partitioned-tables).
|
279
|
+
# The supported types are `DAY`, `HOUR`, `MONTH`, and `YEAR`, which will
|
280
|
+
# generate one partition per day, hour, month, and year, respectively.
|
268
281
|
#
|
269
282
|
# You can only set time partitioning when creating a table as in
|
270
283
|
# the example below. BigQuery does not allow you to change time partitioning
|
271
284
|
# on an existing table.
|
272
285
|
#
|
273
|
-
# @param [String] type The time partition type.
|
274
|
-
#
|
286
|
+
# @param [String] type The time partition type. The supported types are `DAY`,
|
287
|
+
# `HOUR`, `MONTH`, and `YEAR`, which will generate one partition per day,
|
288
|
+
# hour, month, and year, respectively.
|
275
289
|
#
|
276
290
|
# @example
|
277
291
|
# require "google/cloud/bigquery"
|
@@ -721,7 +735,7 @@ module Google
|
|
721
735
|
end
|
722
736
|
|
723
737
|
##
|
724
|
-
# Checks if the table's type is
|
738
|
+
# Checks if the table's type is `TABLE`.
|
725
739
|
#
|
726
740
|
# @return [Boolean, nil] `true` when the type is `TABLE`, `false`
|
727
741
|
# otherwise, if the object is a resource (see {#resource?}); `nil` if
|
@@ -735,8 +749,10 @@ module Google
|
|
735
749
|
end
|
736
750
|
|
737
751
|
##
|
738
|
-
# Checks if the table's type is
|
739
|
-
# represents a BigQuery view. See {Dataset#create_view}.
|
752
|
+
# Checks if the table's type is `VIEW`, indicating that the table
|
753
|
+
# represents a BigQuery logical view. See {Dataset#create_view}.
|
754
|
+
#
|
755
|
+
# @see https://cloud.google.com/bigquery/docs/views Creating views
|
740
756
|
#
|
741
757
|
# @return [Boolean, nil] `true` when the type is `VIEW`, `false`
|
742
758
|
# otherwise, if the object is a resource (see {#resource?}); `nil` if
|
@@ -750,7 +766,25 @@ module Google
|
|
750
766
|
end
|
751
767
|
|
752
768
|
##
|
753
|
-
# Checks if the table's type is
|
769
|
+
# Checks if the table's type is `MATERIALIZED_VIEW`, indicating that
|
770
|
+
# the table represents a BigQuery materialized view.
|
771
|
+
# See {Dataset#create_materialized_view}.
|
772
|
+
#
|
773
|
+
# @see https://cloud.google.com/bigquery/docs/materialized-views-intro Introduction to materialized views
|
774
|
+
#
|
775
|
+
# @return [Boolean, nil] `true` when the type is `MATERIALIZED_VIEW`,
|
776
|
+
# `false` otherwise, if the object is a resource (see {#resource?});
|
777
|
+
# `nil` if the object is a reference (see {#reference?}).
|
778
|
+
#
|
779
|
+
# @!group Attributes
|
780
|
+
#
|
781
|
+
def materialized_view?
|
782
|
+
return nil if reference?
|
783
|
+
@gapi.type == "MATERIALIZED_VIEW"
|
784
|
+
end
|
785
|
+
|
786
|
+
##
|
787
|
+
# Checks if the table's type is `EXTERNAL`, indicating that the table
|
754
788
|
# represents an External Data Source. See {#external?} and
|
755
789
|
# {External::DataSource}.
|
756
790
|
#
|
@@ -1133,21 +1167,24 @@ module Google
|
|
1133
1167
|
end
|
1134
1168
|
|
1135
1169
|
##
|
1136
|
-
# The query that
|
1170
|
+
# The query that defines the view or materialized view. See {#view?} and
|
1171
|
+
# {#materialized_view?}.
|
1137
1172
|
#
|
1138
|
-
# @return [String] The query that defines the view
|
1173
|
+
# @return [String, nil] The query that defines the view or materialized_view;
|
1174
|
+
# or `nil` if not a view or materialized view.
|
1139
1175
|
#
|
1140
1176
|
# @!group Attributes
|
1141
1177
|
#
|
1142
1178
|
def query
|
1143
|
-
@gapi.view&.query
|
1179
|
+
view? ? @gapi.view&.query : @gapi.materialized_view&.query
|
1144
1180
|
end
|
1145
1181
|
|
1146
1182
|
##
|
1147
|
-
# Updates the query that
|
1183
|
+
# Updates the query that defines the view. (See {#view?}.) Not supported
|
1184
|
+
# for materialized views.
|
1148
1185
|
#
|
1149
|
-
# This sets the query using standard SQL. To specify legacy SQL or
|
1150
|
-
# use user-defined function resources use (#set_query) instead.
|
1186
|
+
# This method sets the query using standard SQL. To specify legacy SQL or
|
1187
|
+
# to use user-defined function resources for a view, use (#set_query) instead.
|
1151
1188
|
#
|
1152
1189
|
# @see https://cloud.google.com/bigquery/query-reference BigQuery Query
|
1153
1190
|
# Reference
|
@@ -1162,7 +1199,7 @@ module Google
|
|
1162
1199
|
# view = dataset.table "my_view"
|
1163
1200
|
#
|
1164
1201
|
# view.query = "SELECT first_name FROM " \
|
1165
|
-
#
|
1202
|
+
# "`my_project.my_dataset.my_table`"
|
1166
1203
|
#
|
1167
1204
|
# @!group Lifecycle
|
1168
1205
|
#
|
@@ -1171,12 +1208,12 @@ module Google
|
|
1171
1208
|
end
|
1172
1209
|
|
1173
1210
|
##
|
1174
|
-
# Updates the query that
|
1175
|
-
#
|
1176
|
-
# resources.
|
1211
|
+
# Updates the query that defines the view. (See {#view?}.) Not supported for
|
1212
|
+
# materialized views.
|
1177
1213
|
#
|
1178
|
-
#
|
1179
|
-
#
|
1214
|
+
# Allows setting of standard vs. legacy SQL and user-defined function resources.
|
1215
|
+
#
|
1216
|
+
# @see https://cloud.google.com/bigquery/query-reference BigQuery Query Reference
|
1180
1217
|
#
|
1181
1218
|
# @param [String] query The query that defines the view.
|
1182
1219
|
# @param [Boolean] standard_sql Specifies whether to use BigQuery's
|
@@ -1188,11 +1225,12 @@ module Google
|
|
1188
1225
|
# SQL](https://cloud.google.com/bigquery/docs/reference/legacy-sql)
|
1189
1226
|
# dialect. Optional. The default value is false.
|
1190
1227
|
# @param [Array<String>, String] udfs User-defined function resources
|
1191
|
-
# used in a legacy SQL query.
|
1192
|
-
#
|
1193
|
-
#
|
1194
|
-
#
|
1195
|
-
#
|
1228
|
+
# used in a legacy SQL query. Optional.
|
1229
|
+
#
|
1230
|
+
# May be either a code resource to load from a Google Cloud Storage URI
|
1231
|
+
# (`gs://bucket/path`), or an inline resource that contains code for a
|
1232
|
+
# user-defined function (UDF). Providing an inline code resource is equivalent
|
1233
|
+
# to providing a URI for a file containing the same code.
|
1196
1234
|
#
|
1197
1235
|
# This parameter is used for defining User Defined Function (UDF)
|
1198
1236
|
# resources only when using legacy SQL. Users of standard SQL should
|
@@ -1203,7 +1241,7 @@ module Google
|
|
1203
1241
|
# standard SQL - Differences in user-defined JavaScript
|
1204
1242
|
# functions](https://cloud.google.com/bigquery/docs/reference/standard-sql/migrating-from-legacy-sql#differences_in_user-defined_javascript_functions)
|
1205
1243
|
#
|
1206
|
-
# @example
|
1244
|
+
# @example Update a view:
|
1207
1245
|
# require "google/cloud/bigquery"
|
1208
1246
|
#
|
1209
1247
|
# bigquery = Google::Cloud::Bigquery.new
|
@@ -1211,12 +1249,13 @@ module Google
|
|
1211
1249
|
# view = dataset.table "my_view"
|
1212
1250
|
#
|
1213
1251
|
# view.set_query "SELECT first_name FROM " \
|
1214
|
-
#
|
1252
|
+
# "`my_project.my_dataset.my_table`",
|
1215
1253
|
# standard_sql: true
|
1216
1254
|
#
|
1217
1255
|
# @!group Lifecycle
|
1218
1256
|
#
|
1219
1257
|
def set_query query, standard_sql: nil, legacy_sql: nil, udfs: nil
|
1258
|
+
raise "Updating the query is not supported for Table type: #{@gapi.type}" unless view?
|
1220
1259
|
use_legacy_sql = Convert.resolve_legacy_sql standard_sql, legacy_sql
|
1221
1260
|
@gapi.view = Google::Apis::BigqueryV2::ViewDefinition.new(
|
1222
1261
|
query: query,
|
@@ -1227,26 +1266,28 @@ module Google
|
|
1227
1266
|
end
|
1228
1267
|
|
1229
1268
|
##
|
1230
|
-
# Checks if the view's query is using legacy sql.
|
1269
|
+
# Checks if the view's query is using legacy sql. See {#view?}.
|
1231
1270
|
#
|
1232
|
-
# @return [Boolean] `true` when legacy sql is used, `false` otherwise.
|
1271
|
+
# @return [Boolean] `true` when legacy sql is used, `false` otherwise; or `nil` if not a logical view.
|
1233
1272
|
#
|
1234
1273
|
# @!group Attributes
|
1235
1274
|
#
|
1236
1275
|
def query_legacy_sql?
|
1276
|
+
return nil unless @gapi.view
|
1237
1277
|
val = @gapi.view.use_legacy_sql
|
1238
1278
|
return true if val.nil?
|
1239
1279
|
val
|
1240
1280
|
end
|
1241
1281
|
|
1242
1282
|
##
|
1243
|
-
# Checks if the view's query is using standard sql.
|
1283
|
+
# Checks if the view's query is using standard sql. See {#view?}.
|
1244
1284
|
#
|
1245
1285
|
# @return [Boolean] `true` when standard sql is used, `false` otherwise.
|
1246
1286
|
#
|
1247
1287
|
# @!group Attributes
|
1248
1288
|
#
|
1249
1289
|
def query_standard_sql?
|
1290
|
+
return nil unless @gapi.view
|
1250
1291
|
!query_legacy_sql?
|
1251
1292
|
end
|
1252
1293
|
|
@@ -1258,18 +1299,193 @@ module Google
|
|
1258
1299
|
# equivalent to providing a URI for a file containing the same code. See
|
1259
1300
|
# [User-Defined
|
1260
1301
|
# Functions](https://cloud.google.com/bigquery/docs/reference/standard-sql/user-defined-functions).
|
1302
|
+
# See {#view?}.
|
1261
1303
|
#
|
1262
|
-
# @return [Array<String
|
1263
|
-
# and/or inline source code.
|
1304
|
+
# @return [Array<String>, nil] An array containing Google Cloud Storage URIs
|
1305
|
+
# and/or inline source code, or `nil` if not a logical view.
|
1264
1306
|
#
|
1265
1307
|
# @!group Attributes
|
1266
1308
|
#
|
1267
1309
|
def query_udfs
|
1310
|
+
return nil unless @gapi.view
|
1268
1311
|
udfs_gapi = @gapi.view.user_defined_function_resources
|
1269
1312
|
return [] if udfs_gapi.nil?
|
1270
1313
|
Array(udfs_gapi).map { |udf| udf.inline_code || udf.resource_uri }
|
1271
1314
|
end
|
1272
1315
|
|
1316
|
+
##
|
1317
|
+
# Whether automatic refresh of the materialized view is enabled. When true,
|
1318
|
+
# the materialized view is updated when the base table is updated. The default
|
1319
|
+
# value is true. See {#materialized_view?}.
|
1320
|
+
#
|
1321
|
+
# @return [Boolean, nil] `true` when automatic refresh is enabled, `false` otherwise;
|
1322
|
+
# or `nil` if not a materialized view.
|
1323
|
+
#
|
1324
|
+
# @!group Attributes
|
1325
|
+
#
|
1326
|
+
def enable_refresh?
|
1327
|
+
return nil unless @gapi.materialized_view
|
1328
|
+
val = @gapi.materialized_view.enable_refresh
|
1329
|
+
return true if val.nil?
|
1330
|
+
val
|
1331
|
+
end
|
1332
|
+
|
1333
|
+
##
|
1334
|
+
# Sets whether automatic refresh of the materialized view is enabled. When true,
|
1335
|
+
# the materialized view is updated when the base table is updated. See {#materialized_view?}.
|
1336
|
+
#
|
1337
|
+
# @param [Boolean] new_enable_refresh `true` when automatic refresh is enabled, `false` otherwise.
|
1338
|
+
#
|
1339
|
+
# @!group Attributes
|
1340
|
+
#
|
1341
|
+
def enable_refresh= new_enable_refresh
|
1342
|
+
@gapi.materialized_view = Google::Apis::BigqueryV2::MaterializedViewDefinition.new(
|
1343
|
+
enable_refresh: new_enable_refresh
|
1344
|
+
)
|
1345
|
+
patch_gapi! :materialized_view
|
1346
|
+
end
|
1347
|
+
|
1348
|
+
##
|
1349
|
+
# The time when the materialized view was last modified.
|
1350
|
+
# See {#materialized_view?}.
|
1351
|
+
#
|
1352
|
+
# @return [Time, nil] The time, or `nil` if not present or not a materialized view.
|
1353
|
+
#
|
1354
|
+
# @!group Attributes
|
1355
|
+
#
|
1356
|
+
def last_refresh_time
|
1357
|
+
Convert.millis_to_time @gapi.materialized_view&.last_refresh_time
|
1358
|
+
end
|
1359
|
+
|
1360
|
+
##
|
1361
|
+
# The maximum frequency in milliseconds at which the materialized view will be refreshed.
|
1362
|
+
# See {#materialized_view?}.
|
1363
|
+
#
|
1364
|
+
# @return [Integer, nil] The maximum frequency in milliseconds;
|
1365
|
+
# or `nil` if not a materialized view.
|
1366
|
+
#
|
1367
|
+
# @!group Attributes
|
1368
|
+
#
|
1369
|
+
def refresh_interval_ms
|
1370
|
+
@gapi.materialized_view&.refresh_interval_ms
|
1371
|
+
end
|
1372
|
+
|
1373
|
+
##
|
1374
|
+
# Sets the maximum frequency at which the materialized view will be refreshed.
|
1375
|
+
# See {#materialized_view?}.
|
1376
|
+
#
|
1377
|
+
# @param [Integer] new_refresh_interval_ms The maximum frequency in milliseconds.
|
1378
|
+
#
|
1379
|
+
# @!group Attributes
|
1380
|
+
#
|
1381
|
+
def refresh_interval_ms= new_refresh_interval_ms
|
1382
|
+
@gapi.materialized_view = Google::Apis::BigqueryV2::MaterializedViewDefinition.new(
|
1383
|
+
refresh_interval_ms: new_refresh_interval_ms
|
1384
|
+
)
|
1385
|
+
patch_gapi! :materialized_view
|
1386
|
+
end
|
1387
|
+
|
1388
|
+
##
|
1389
|
+
# Gets the Cloud IAM access control policy for the table. The latest policy will be read from the service. See
|
1390
|
+
# also {#update_policy}.
|
1391
|
+
#
|
1392
|
+
# @see https://cloud.google.com/iam/docs/managing-policies Managing Policies
|
1393
|
+
# @see https://cloud.google.com/bigquery/docs/table-access-controls-intro Controlling access to tables
|
1394
|
+
#
|
1395
|
+
# @return [Policy] The frozen policy for the table.
|
1396
|
+
#
|
1397
|
+
# @example
|
1398
|
+
# require "google/cloud/bigquery"
|
1399
|
+
#
|
1400
|
+
# bigquery = Google::Cloud::Bigquery.new
|
1401
|
+
# dataset = bigquery.dataset "my_dataset"
|
1402
|
+
# table = dataset.table "my_table"
|
1403
|
+
#
|
1404
|
+
# policy = table.policy
|
1405
|
+
#
|
1406
|
+
# policy.frozen? #=> true
|
1407
|
+
# binding_owner = policy.bindings.find { |b| b.role == "roles/owner" }
|
1408
|
+
# binding_owner.role #=> "roles/owner"
|
1409
|
+
# binding_owner.members #=> ["user:owner@example.com"]
|
1410
|
+
# binding_owner.frozen? #=> true
|
1411
|
+
# binding_owner.members.frozen? #=> true
|
1412
|
+
#
|
1413
|
+
def policy
|
1414
|
+
raise ArgumentError, "Block argument not supported: Use #update_policy instead." if block_given?
|
1415
|
+
ensure_service!
|
1416
|
+
gapi = service.get_table_policy dataset_id, table_id
|
1417
|
+
Policy.from_gapi(gapi).freeze
|
1418
|
+
end
|
1419
|
+
|
1420
|
+
##
|
1421
|
+
# Updates the Cloud IAM access control policy for the table. The latest policy will be read from the service.
|
1422
|
+
# See also {#policy}.
|
1423
|
+
#
|
1424
|
+
# @see https://cloud.google.com/iam/docs/managing-policies Managing Policies
|
1425
|
+
# @see https://cloud.google.com/bigquery/docs/table-access-controls-intro Controlling access to tables
|
1426
|
+
#
|
1427
|
+
# @yield [policy] A block for updating the policy. The latest policy will be read from the service and passed to
|
1428
|
+
# the block. After the block completes, the modified policy will be written to the service.
|
1429
|
+
# @yieldparam [Policy] policy The mutable Policy for the table.
|
1430
|
+
#
|
1431
|
+
# @return [Policy] The updated and frozen policy for the table.
|
1432
|
+
#
|
1433
|
+
# @example Update the policy by passing a block.
|
1434
|
+
# require "google/cloud/bigquery"
|
1435
|
+
#
|
1436
|
+
# bigquery = Google::Cloud::Bigquery.new
|
1437
|
+
# dataset = bigquery.dataset "my_dataset"
|
1438
|
+
# table = dataset.table "my_table"
|
1439
|
+
#
|
1440
|
+
# table.update_policy do |p|
|
1441
|
+
# p.grant role: "roles/viewer", members: "user:viewer@example.com"
|
1442
|
+
# p.revoke role: "roles/editor", members: "user:editor@example.com"
|
1443
|
+
# p.revoke role: "roles/owner"
|
1444
|
+
# end # 2 API calls
|
1445
|
+
#
|
1446
|
+
def update_policy
|
1447
|
+
raise ArgumentError, "A block updating the policy must be provided" unless block_given?
|
1448
|
+
ensure_service!
|
1449
|
+
gapi = service.get_table_policy dataset_id, table_id
|
1450
|
+
policy = Policy.from_gapi gapi
|
1451
|
+
yield policy
|
1452
|
+
# TODO: Check for changes before calling RPC
|
1453
|
+
gapi = service.set_table_policy dataset_id, table_id, policy.to_gapi
|
1454
|
+
Policy.from_gapi(gapi).freeze
|
1455
|
+
end
|
1456
|
+
|
1457
|
+
##
|
1458
|
+
# Tests the specified permissions against the [Cloud
|
1459
|
+
# IAM](https://cloud.google.com/iam/) access control policy.
|
1460
|
+
#
|
1461
|
+
# @see https://cloud.google.com/iam/docs/managing-policies Managing Policies
|
1462
|
+
#
|
1463
|
+
# @param [String, Array<String>] permissions The set of permissions
|
1464
|
+
# against which to check access. Permissions must be of the format
|
1465
|
+
# `bigquery.resource.capability`.
|
1466
|
+
# See https://cloud.google.com/bigquery/docs/access-control#bigquery.
|
1467
|
+
#
|
1468
|
+
# @return [Array<String>] The frozen array of permissions held by the caller.
|
1469
|
+
#
|
1470
|
+
# @example
|
1471
|
+
# require "google/cloud/bigquery"
|
1472
|
+
#
|
1473
|
+
# bigquery = Google::Cloud::Bigquery.new
|
1474
|
+
# dataset = bigquery.dataset "my_dataset"
|
1475
|
+
# table = dataset.table "my_table"
|
1476
|
+
#
|
1477
|
+
# permissions = table.test_iam_permissions "bigquery.tables.get",
|
1478
|
+
# "bigquery.tables.delete"
|
1479
|
+
# permissions.include? "bigquery.tables.get" #=> true
|
1480
|
+
# permissions.include? "bigquery.tables.delete" #=> false
|
1481
|
+
#
|
1482
|
+
def test_iam_permissions *permissions
|
1483
|
+
permissions = Array(permissions).flatten
|
1484
|
+
ensure_service!
|
1485
|
+
gapi = service.test_table_permissions dataset_id, table_id, permissions
|
1486
|
+
gapi.permissions.freeze
|
1487
|
+
end
|
1488
|
+
|
1273
1489
|
##
|
1274
1490
|
# Retrieves data from the table.
|
1275
1491
|
#
|