google-cloud-bigquery 1.12.0 → 1.16.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4fb1722765075dded454afdeea337efe2c088c118f6f966c55a84ff9bb065df1
4
- data.tar.gz: 2884b2a12b6a5137234dd4a3fd1fc2420ed2c05eaae223ebeae285caa1ba44b8
3
+ metadata.gz: 95ecbf392c1c918219849034d540067effe661d635f7d435c1f73c0bbdcbefb3
4
+ data.tar.gz: 6452936f3e68a2fb9249fbdd23e54374ce67a86945b936adc6d06571b0266d5d
5
5
  SHA512:
6
- metadata.gz: 851560e73e7e1f48b58e08f99ada6f2f822f33f9dfe246e19b6d3abec4b0bfb2ef4802f402e2951ca0e40cb966be2981930fb62608f81d5a57edfa6ae5626d1f
7
- data.tar.gz: b1a0dc302400edfe2a499d0299cc913cf85e4f34e29b460b8f5b3564a33b0e9a13c99d37539cc65afee07b4cbcfd7103bb07b4898866ea68dcab2187105ead1a
6
+ metadata.gz: 3c28948fc38d7fccd1b3775f209926eacbe671ddd36432660f336457d0630d8ce921b1600170cb7d56b093c2f805dd39d84230ddc04668f9e3a3d1238d0038dc
7
+ data.tar.gz: 7adba9ab644ef05f683a5a1b5f647e9106b77d997796c0d867d569caeac10d778d2948823f383f3eb7cfe1b5946b5c22a46d1403352f8358c7df1500ffdf291c
@@ -1,5 +1,58 @@
1
1
  # Release History
2
2
 
3
+ ### 1.16.0 / 2019-10-03
4
+
5
+ #### Features
6
+
7
+ * Add Dataset default_encryption
8
+ * Add Dataset#default_encryption
9
+ * Add Dataset#default_encryption=
10
+
11
+ ### 1.15.0 / 2019-09-30
12
+
13
+ #### Features
14
+
15
+ * Add Model encryption
16
+ * Add Model#encryption
17
+ * Add Model#encryption=
18
+ * Add range support for Google Sheets
19
+ * Add External::SheetsSource#range
20
+ * Add External::SheetsSource#range=
21
+ * Support use_avro_logical_types on extract jobs
22
+ * Add ExtractJob#use_avro_logical_types?
23
+ * Add ExtractJob::Updater#use_avro_logical_types=
24
+
25
+ ### 1.14.1 / 2019-09-04
26
+
27
+ #### Documentation
28
+
29
+ * Add note about streaming insert issues
30
+ * Acknowledge tradeoffs when inserting rows soon after
31
+ table metadata has been changed.
32
+ * Add link to BigQuery Troubleshooting guide.
33
+
34
+ ### 1.14.0 / 2019-08-23
35
+
36
+ #### Features
37
+
38
+ * Support overriding of service endpoint
39
+
40
+ #### Performance Improvements
41
+
42
+ * Use MiniMime to detect content types
43
+
44
+ #### Documentation
45
+
46
+ * Update documentation
47
+
48
+ ### 1.13.0 / 2019-07-31
49
+
50
+ * Add Table#require_partition_filter
51
+ * List jobs using min and max created_at
52
+ * Reduce thread usage at startup
53
+ * Allocate threads in pool as needed, not all up front
54
+ * Update documentation links
55
+
3
56
  ### 1.12.0 / 2019-07-10
4
57
 
5
58
  * Add BigQuery Model API
@@ -34,7 +87,7 @@
34
87
  * Add copy and extract methods to Project
35
88
  * Add Project#extract and Project#extract_job
36
89
  * Add Project#copy and Project#copy_job
37
- * Deprecate dryrun param in Table#copy_job, Table#extract_job and
90
+ * Deprecate dryrun param in Table#copy_job, Table#extract_job and
38
91
  Table#load_job
39
92
  * Fix memoization in Dataset#exists? and Table#exists?
40
93
  * Add force param to Dataset#exists? and Table#exists?
data/LOGGING.md CHANGED
@@ -6,7 +6,7 @@ Client](https://github.com/google/google-api-ruby-client/blob/master/README.md#l
6
6
  library. The logger that you set may be a Ruby stdlib
7
7
  [`Logger`](https://ruby-doc.org/stdlib-2.4.0/libdoc/logger/rdoc/Logger.html) as
8
8
  shown below, or a
9
- [`Google::Cloud::Logging::Logger`](https://googleapis.github.io/google-cloud-ruby/docs/google-cloud-logging/latest/Google/Cloud/Logging/Logger)
9
+ [`Google::Cloud::Logging::Logger`](https://googleapis.dev/ruby/google-cloud-logging/latest)
10
10
  that will write logs to [Stackdriver
11
11
  Logging](https://cloud.google.com/logging/).
12
12
 
@@ -87,7 +87,7 @@ advantages over legacy SQL, including:
87
87
  * Complex `JOIN` predicates, including arbitrary expressions
88
88
 
89
89
  For examples that demonstrate some of these features, see [Standard SQL
90
- ghlights](https://cloud.google.com/bigquery/docs/reference/standard-sql/migrating-from-legacy-l#standard_sql_highlights).
90
+ ghlights](https://cloud.google.com/bigquery/docs/reference/standard-sql/migrating-from-legacy-sql#standard_sql_highlights).
91
91
 
92
92
  As shown in this example, standard SQL is the library default:
93
93
 
@@ -135,4 +135,5 @@ Google::Cloud.configure.add_config! :bigquery do |config|
135
135
  config.add_field! :scope, nil, match: [String, Array]
136
136
  config.add_field! :retries, nil, match: Integer
137
137
  config.add_field! :timeout, nil, match: Integer
138
+ config.add_field! :endpoint, nil, match: String
138
139
  end
@@ -51,6 +51,8 @@ module Google
51
51
  # @param [Integer] retries Number of times to retry requests on server
52
52
  # error. The default value is `5`. Optional.
53
53
  # @param [Integer] timeout Default timeout to use in requests. Optional.
54
+ # @param [String] endpoint Override of the endpoint host name. Optional.
55
+ # If the param is nil, uses the default endpoint.
54
56
  # @param [String] project Alias for the `project_id` argument. Deprecated.
55
57
  # @param [String] keyfile Alias for the `credentials` argument.
56
58
  # Deprecated.
@@ -65,26 +67,24 @@ module Google
65
67
  # table = dataset.table "my_table"
66
68
  #
67
69
  def self.new project_id: nil, credentials: nil, scope: nil, retries: nil,
68
- timeout: nil, project: nil, keyfile: nil
69
- project_id ||= (project || default_project_id)
70
+ timeout: nil, endpoint: nil, project: nil, keyfile: nil
70
71
  scope ||= configure.scope
71
72
  retries ||= configure.retries
72
73
  timeout ||= configure.timeout
74
+ endpoint ||= configure.endpoint
73
75
  credentials ||= (keyfile || default_credentials(scope: scope))
74
76
 
75
77
  unless credentials.is_a? Google::Auth::Credentials
76
78
  credentials = Bigquery::Credentials.new credentials, scope: scope
77
79
  end
78
80
 
79
- if credentials.respond_to? :project_id
80
- project_id ||= credentials.project_id
81
- end
82
- project_id = project_id.to_s # Always cast to a string
81
+ project_id = resolve_project_id(project_id || project, credentials)
83
82
  raise ArgumentError, "project_id is missing" if project_id.empty?
84
83
 
85
84
  Bigquery::Project.new(
86
85
  Bigquery::Service.new(
87
- project_id, credentials, retries: retries, timeout: timeout
86
+ project_id, credentials,
87
+ retries: retries, timeout: timeout, host: endpoint
88
88
  )
89
89
  )
90
90
  end
@@ -100,6 +100,8 @@ module Google
100
100
  # the keyfile as a String, the contents of the keyfile as a Hash, or a
101
101
  # Google::Auth::Credentials object. (See {Bigquery::Credentials}) (The
102
102
  # parameter `keyfile` is considered deprecated, but may also be used.)
103
+ # * `endpoint` - (String) Override of the endpoint host name, or `nil`
104
+ # to use the default endpoint.
103
105
  # * `scope` - (String, Array<String>) The OAuth 2.0 scopes controlling
104
106
  # the set of resources and operations that the connection can access.
105
107
  # * `retries` - (Integer) Number of times to retry requests on server
@@ -115,6 +117,16 @@ module Google
115
117
  Google::Cloud.configure.bigquery
116
118
  end
117
119
 
120
+ ##
121
+ # @private Resolve project.
122
+ def self.resolve_project_id given_project, credentials
123
+ project_id = given_project || default_project_id
124
+ if credentials.respond_to? :project_id
125
+ project_id ||= credentials.project_id
126
+ end
127
+ project_id.to_s # Always cast to a string
128
+ end
129
+
118
130
  ##
119
131
  # @private Default project.
120
132
  def self.default_project_id
@@ -335,6 +335,77 @@ module Google
335
335
  patch_gapi! :labels
336
336
  end
337
337
 
338
+ ##
339
+ # The {EncryptionConfiguration} object that represents the default
340
+ # encryption method for all tables and models in the dataset. Once this
341
+ # property is set, all newly-created partitioned tables and models in
342
+ # the dataset will have their encryption set to this value, unless table
343
+ # creation request (or query) overrides it.
344
+ #
345
+ # Present only if this dataset is using custom default encryption.
346
+ #
347
+ # @see https://cloud.google.com/bigquery/docs/customer-managed-encryption
348
+ # Protecting Data with Cloud KMS Keys
349
+ #
350
+ # @return [EncryptionConfiguration, nil] The default encryption
351
+ # configuration.
352
+ #
353
+ # @!group Attributes
354
+ #
355
+ # @example
356
+ # require "google/cloud/bigquery"
357
+ #
358
+ # bigquery = Google::Cloud::Bigquery.new
359
+ # dataset = bigquery.dataset "my_dataset"
360
+ #
361
+ # encrypt_config = dataset.default_encryption
362
+ #
363
+ # @!group Attributes
364
+ #
365
+ def default_encryption
366
+ return nil if reference?
367
+ ensure_full_data!
368
+ return nil if @gapi.default_encryption_configuration.nil?
369
+ EncryptionConfiguration.from_gapi(
370
+ @gapi.default_encryption_configuration
371
+ ).freeze
372
+ end
373
+
374
+ ##
375
+ # Set the {EncryptionConfiguration} object that represents the default
376
+ # encryption method for all tables and models in the dataset. Once this
377
+ # property is set, all newly-created partitioned tables and models in
378
+ # the dataset will have their encryption set to this value, unless table
379
+ # creation request (or query) overrides it.
380
+ #
381
+ # If the dataset is not a full resource representation (see
382
+ # {#resource_full?}), the full representation will be retrieved before
383
+ # the update to comply with ETag-based optimistic concurrency control.
384
+ #
385
+ # @see https://cloud.google.com/bigquery/docs/customer-managed-encryption
386
+ # Protecting Data with Cloud KMS Keys
387
+ #
388
+ # @param [EncryptionConfiguration] value The new encryption config.
389
+ #
390
+ # @example
391
+ # require "google/cloud/bigquery"
392
+ #
393
+ # bigquery = Google::Cloud::Bigquery.new
394
+ # dataset = bigquery.dataset "my_dataset"
395
+ #
396
+ # key_name = "projects/a/locations/b/keyRings/c/cryptoKeys/d"
397
+ # encrypt_config = bigquery.encryption kms_key: key_name
398
+ #
399
+ # dataset.default_encryption = encrypt_config
400
+ #
401
+ # @!group Attributes
402
+ #
403
+ def default_encryption= value
404
+ ensure_full_data!
405
+ @gapi.default_encryption_configuration = value.to_gapi
406
+ patch_gapi! :default_encryption_configuration
407
+ end
408
+
338
409
  ##
339
410
  # Retrieves the access rules for a Dataset. The rules can be updated
340
411
  # when passing a block, see {Dataset::Access} for all the methods
@@ -1953,9 +2024,18 @@ module Google
1953
2024
  # the need to complete a load operation before the data can appear in
1954
2025
  # query results.
1955
2026
  #
2027
+ # Because BigQuery's streaming API is designed for high insertion rates,
2028
+ # modifications to the underlying table metadata are eventually
2029
+ # consistent when interacting with the streaming system. In most cases
2030
+ # metadata changes are propagated within minutes, but during this period
2031
+ # API responses may reflect the inconsistent state of the table.
2032
+ #
1956
2033
  # @see https://cloud.google.com/bigquery/streaming-data-into-bigquery
1957
2034
  # Streaming Data Into BigQuery
1958
2035
  #
2036
+ # @see https://cloud.google.com/bigquery/troubleshooting-errors#metadata-errors-for-streaming-inserts
2037
+ # BigQuery Troubleshooting: Metadata errors for streaming inserts
2038
+ #
1959
2039
  # @param [String] table_id The ID of the destination table.
1960
2040
  # @param [Hash, Array<Hash>] rows A hash object or array of hash objects
1961
2041
  # containing the data. Required.
@@ -2172,7 +2252,7 @@ module Google
2172
2252
  # Load the complete representation of the dataset if it has been
2173
2253
  # only partially loaded by a request to the API list method.
2174
2254
  def ensure_full_data!
2175
- reload! if resource_partial?
2255
+ reload! unless resource_full?
2176
2256
  end
2177
2257
 
2178
2258
  def ensure_job_succeeded! job
@@ -1224,6 +1224,52 @@ module Google
1224
1224
  frozen_check!
1225
1225
  @gapi.google_sheets_options.skip_leading_rows = row_count
1226
1226
  end
1227
+
1228
+ ##
1229
+ # Range of a sheet to query from. Only used when non-empty. Typical
1230
+ # format: `{sheet_name}!{top_left_cell_id}:{bottom_right_cell_id}`.
1231
+ #
1232
+ # @return [String] Range of a sheet to query from.
1233
+ #
1234
+ # @example
1235
+ # require "google/cloud/bigquery"
1236
+ #
1237
+ # bigquery = Google::Cloud::Bigquery.new
1238
+ #
1239
+ # sheets_url = "https://docs.google.com/spreadsheets/d/1234567980"
1240
+ # sheets_table = bigquery.external sheets_url do |sheets|
1241
+ # sheets.range = "sheet1!A1:B20"
1242
+ # end
1243
+ #
1244
+ # sheets_table.range #=> "sheet1!A1:B20"
1245
+ #
1246
+ def range
1247
+ @gapi.google_sheets_options.range
1248
+ end
1249
+
1250
+ ##
1251
+ # Set the range of a sheet to query from. Only used when non-empty.
1252
+ # Typical format:
1253
+ # `{sheet_name}!{top_left_cell_id}:{bottom_right_cell_id}`.
1254
+ #
1255
+ # @param [String] new_range New range of a sheet to query from.
1256
+ #
1257
+ # @example
1258
+ # require "google/cloud/bigquery"
1259
+ #
1260
+ # bigquery = Google::Cloud::Bigquery.new
1261
+ #
1262
+ # sheets_url = "https://docs.google.com/spreadsheets/d/1234567980"
1263
+ # sheets_table = bigquery.external sheets_url do |sheets|
1264
+ # sheets.range = "sheet1!A1:B20"
1265
+ # end
1266
+ #
1267
+ # sheets_table.range #=> "sheet1!A1:B20"
1268
+ #
1269
+ def range= new_range
1270
+ frozen_check!
1271
+ @gapi.google_sheets_options.range = new_range
1272
+ end
1227
1273
  end
1228
1274
 
1229
1275
  ##
@@ -156,6 +156,20 @@ module Google
156
156
  Hash[destinations.zip destinations_file_counts]
157
157
  end
158
158
 
159
+ ##
160
+ # If `#avro?` (`#format` is set to `"AVRO"`), this flag indicates
161
+ # whether to enable extracting applicable column types (such as
162
+ # `TIMESTAMP`) to their corresponding AVRO logical types
163
+ # (`timestamp-micros`), instead of only using their raw types
164
+ # (`avro-long`).
165
+ #
166
+ # @return [Boolean] `true` when applicable column types will use their
167
+ # corresponding AVRO logical types, `false` otherwise.
168
+ #
169
+ def use_avro_logical_types?
170
+ @gapi.configuration.extract.use_avro_logical_types
171
+ end
172
+
159
173
  ##
160
174
  # Yielded to a block to accumulate changes for an API request.
161
175
  class Updater < ExtractJob
@@ -175,11 +189,8 @@ module Google
175
189
  storage_urls = Array(storage_files).map do |url|
176
190
  url.respond_to?(:to_gs_url) ? url.to_gs_url : url
177
191
  end
178
- dest_format = options[:format]
179
- if dest_format.nil?
180
- dest_format = Convert.derive_source_format storage_urls.first
181
- end
182
- req = Google::Apis::BigqueryV2::Job.new(
192
+ options[:format] ||= Convert.derive_source_format storage_urls.first
193
+ job = Google::Apis::BigqueryV2::Job.new(
183
194
  job_reference: job_ref,
184
195
  configuration: Google::Apis::BigqueryV2::JobConfiguration.new(
185
196
  extract: Google::Apis::BigqueryV2::JobConfigurationExtract.new(
@@ -190,12 +201,24 @@ module Google
190
201
  )
191
202
  )
192
203
 
193
- updater = ExtractJob::Updater.new req
204
+ from_job_and_options job, options
205
+ end
206
+
207
+ ##
208
+ # @private Create an Updater from a Job and options hash.
209
+ #
210
+ # @return [Google::Cloud::Bigquery::ExtractJob::Updater] A job
211
+ # configuration object for setting query options.
212
+ def self.from_job_and_options request, options = {}
213
+ updater = ExtractJob::Updater.new request
194
214
  updater.compression = options[:compression]
195
215
  updater.delimiter = options[:delimiter]
196
- updater.format = dest_format
216
+ updater.format = options[:format]
197
217
  updater.header = options[:header]
198
218
  updater.labels = options[:labels] if options[:labels]
219
+ unless options[:use_avro_logical_types].nil?
220
+ updater.use_avro_logical_types = options[:use_avro_logical_types]
221
+ end
199
222
  updater
200
223
  end
201
224
 
@@ -300,6 +323,22 @@ module Google
300
323
  @gapi.configuration.update! labels: value
301
324
  end
302
325
 
326
+ ##
327
+ # Indicate whether to enable extracting applicable column types (such
328
+ # as `TIMESTAMP`) to their corresponding AVRO logical types
329
+ # (`timestamp-micros`), instead of only using their raw types
330
+ # (`avro-long`).
331
+ #
332
+ # Only used when `#format` is set to `"AVRO"` (`#avro?`).
333
+ #
334
+ # @param [Boolean] value Whether applicable column types will use
335
+ # their corresponding AVRO logical types.
336
+ #
337
+ # @!group Attributes
338
+ def use_avro_logical_types= value
339
+ @gapi.configuration.extract.use_avro_logical_types = value
340
+ end
341
+
303
342
  ##
304
343
  # @private Returns the Google API client library version of this job.
305
344
  #
@@ -71,9 +71,9 @@ module Google
71
71
  def next
72
72
  return nil unless next?
73
73
  ensure_service!
74
- options = { all: @hidden, token: token, max: @max, filter: @filter }
75
- gapi = @service.list_jobs options
76
- self.class.from_gapi gapi, @service, @hidden, @max, @filter
74
+ next_options = @options.merge token: token
75
+ next_gapi = @service.list_jobs next_options
76
+ self.class.from_gapi next_gapi, @service, next_options
77
77
  end
78
78
 
79
79
  ##
@@ -141,17 +141,14 @@ module Google
141
141
  ##
142
142
  # @private New Job::List from a Google API Client
143
143
  # Google::Apis::BigqueryV2::JobList object.
144
- def self.from_gapi gapi_list, service, hidden = nil, max = nil,
145
- filter = nil
144
+ def self.from_gapi gapi_list, service, options = {}
146
145
  jobs = List.new(Array(gapi_list.jobs).map do |gapi_object|
147
146
  Job.from_gapi gapi_object, service
148
147
  end)
149
- jobs.instance_variable_set :@token, gapi_list.next_page_token
150
- jobs.instance_variable_set :@etag, gapi_list.etag
151
- jobs.instance_variable_set :@service, service
152
- jobs.instance_variable_set :@hidden, hidden
153
- jobs.instance_variable_set :@max, max
154
- jobs.instance_variable_set :@filter, filter
148
+ jobs.instance_variable_set :@token, gapi_list.next_page_token
149
+ jobs.instance_variable_set :@etag, gapi_list.etag
150
+ jobs.instance_variable_set :@service, service
151
+ jobs.instance_variable_set :@options, options
155
152
  jobs
156
153
  end
157
154
 
@@ -366,6 +366,82 @@ module Google
366
366
  patch_gapi! labels: new_labels
367
367
  end
368
368
 
369
+ ##
370
+ # The {EncryptionConfiguration} object that represents the custom
371
+ # encryption method used to protect this model. If not set,
372
+ # {Dataset#default_encryption} is used.
373
+ #
374
+ # Present only if this model is using custom encryption.
375
+ #
376
+ # @see https://cloud.google.com/bigquery/docs/customer-managed-encryption
377
+ # Protecting Data with Cloud KMS Keys
378
+ #
379
+ # @return [EncryptionConfiguration, nil] The encryption configuration.
380
+ #
381
+ # @!group Attributes
382
+ #
383
+ # @example
384
+ # require "google/cloud/bigquery"
385
+ #
386
+ # bigquery = Google::Cloud::Bigquery.new
387
+ # dataset = bigquery.dataset "my_dataset"
388
+ # model = dataset.model "my_model"
389
+ #
390
+ # encrypt_config = model.encryption
391
+ #
392
+ # @!group Attributes
393
+ #
394
+ def encryption
395
+ return nil if reference?
396
+ return nil if @gapi_json[:encryptionConfiguration].nil?
397
+ # We have to create a gapic object from the hash because that is what
398
+ # EncryptionConfiguration is expecing.
399
+ json_cmek = @gapi_json[:encryptionConfiguration].to_json
400
+ gapi_cmek = \
401
+ Google::Apis::BigqueryV2::EncryptionConfiguration.from_json(
402
+ json_cmek
403
+ )
404
+ EncryptionConfiguration.from_gapi(gapi_cmek).freeze
405
+ end
406
+
407
+ ##
408
+ # Set the {EncryptionConfiguration} object that represents the custom
409
+ # encryption method used to protect this model. If not set,
410
+ # {Dataset#default_encryption} is used.
411
+ #
412
+ # Present only if this model is using custom encryption.
413
+ #
414
+ # If the model is not a full resource representation (see
415
+ # {#resource_full?}), the full representation will be retrieved before
416
+ # the update to comply with ETag-based optimistic concurrency control.
417
+ #
418
+ # @see https://cloud.google.com/bigquery/docs/customer-managed-encryption
419
+ # Protecting Data with Cloud KMS Keys
420
+ #
421
+ # @param [EncryptionConfiguration] value The new encryption config.
422
+ #
423
+ # @example
424
+ # require "google/cloud/bigquery"
425
+ #
426
+ # bigquery = Google::Cloud::Bigquery.new
427
+ # dataset = bigquery.dataset "my_dataset"
428
+ # model = dataset.model "my_model"
429
+ #
430
+ # key_name = "projects/a/locations/b/keyRings/c/cryptoKeys/d"
431
+ # encrypt_config = bigquery.encryption kms_key: key_name
432
+ #
433
+ # model.encryption = encrypt_config
434
+ #
435
+ # @!group Attributes
436
+ #
437
+ def encryption= value
438
+ ensure_full_data!
439
+ # We have to create a hash from the gapic object's JSON because that
440
+ # is what Model is expecing.
441
+ json_cmek = JSON.parse value.to_gapi.to_json, symbolize_names: true
442
+ patch_gapi! encryptionConfiguration: json_cmek
443
+ end
444
+
369
445
  ##
370
446
  # The input feature columns that were used to train this model.
371
447
  #
@@ -1024,11 +1024,17 @@ module Google
1024
1024
  # Retrieves the list of jobs belonging to the project.
1025
1025
  #
1026
1026
  # @param [Boolean] all Whether to display jobs owned by all users in the
1027
- # project. The default is `false`.
1027
+ # project. The default is `false`. Optional.
1028
1028
  # @param [String] token A previously-returned page token representing
1029
- # part of the larger set of results to view.
1030
- # @param [Integer] max Maximum number of jobs to return.
1031
- # @param [String] filter A filter for job state.
1029
+ # part of the larger set of results to view. Optional.
1030
+ # @param [Integer] max Maximum number of jobs to return. Optional.
1031
+ # @param [String] filter A filter for job state. Optional.
1032
+ # @param [Time] min_created_at Min value for {Job#created_at}. When
1033
+ # provided, only jobs created after or at this time are returned.
1034
+ # Optional.
1035
+ # @param [Time] max_created_at Max value for {Job#created_at}. When
1036
+ # provided, only jobs created before or at this time are returned.
1037
+ # Optional.
1032
1038
  #
1033
1039
  # Acceptable values are:
1034
1040
  #
@@ -1059,6 +1065,20 @@ module Google
1059
1065
  # # process job
1060
1066
  # end
1061
1067
  #
1068
+ # @example Retrieve only jobs created within provided times:
1069
+ # require "google/cloud/bigquery"
1070
+ #
1071
+ # bigquery = Google::Cloud::Bigquery.new
1072
+ #
1073
+ # two_days_ago = Time.now - 60*60*24*2
1074
+ # three_days_ago = Time.now - 60*60*24*3
1075
+ #
1076
+ # jobs = bigquery.jobs min_created_at: three_days_ago,
1077
+ # max_created_at: two_days_ago
1078
+ # jobs.each do |job|
1079
+ # # process job
1080
+ # end
1081
+ #
1062
1082
  # @example Retrieve all jobs: (See {Job::List#all})
1063
1083
  # require "google/cloud/bigquery"
1064
1084
  #
@@ -1069,11 +1089,15 @@ module Google
1069
1089
  # # process job
1070
1090
  # end
1071
1091
  #
1072
- def jobs all: nil, token: nil, max: nil, filter: nil
1092
+ def jobs all: nil, token: nil, max: nil, filter: nil,
1093
+ min_created_at: nil, max_created_at: nil
1073
1094
  ensure_service!
1074
- options = { all: all, token: token, max: max, filter: filter }
1095
+ options = {
1096
+ all: all, token: token, max: max, filter: filter,
1097
+ min_created_at: min_created_at, max_created_at: max_created_at
1098
+ }
1075
1099
  gapi = service.list_jobs options
1076
- Job::List.from_gapi gapi, service, all, max, filter
1100
+ Job::List.from_gapi gapi, service, options
1077
1101
  end
1078
1102
 
1079
1103
  ##
@@ -19,7 +19,7 @@ require "google/cloud/errors"
19
19
  require "google/apis/bigquery_v2"
20
20
  require "pathname"
21
21
  require "securerandom"
22
- require "mime/types"
22
+ require "mini_mime"
23
23
  require "date"
24
24
 
25
25
  module Google
@@ -39,15 +39,17 @@ module Google
39
39
  attr_accessor :credentials
40
40
 
41
41
  # @private
42
- attr_reader :retries, :timeout
42
+ attr_reader :retries, :timeout, :host
43
43
 
44
44
  ##
45
45
  # Creates a new Service instance.
46
- def initialize project, credentials, retries: nil, timeout: nil
46
+ def initialize project, credentials,
47
+ retries: nil, timeout: nil, host: nil
47
48
  @project = project
48
49
  @credentials = credentials
49
50
  @retries = retries
50
51
  @timeout = timeout
52
+ @host = host
51
53
  end
52
54
 
53
55
  def service
@@ -65,6 +67,7 @@ module Google
65
67
  service.request_options.header["x-goog-api-client"] = \
66
68
  "gl-ruby/#{RUBY_VERSION} gccl/#{Google::Cloud::Bigquery::VERSION}"
67
69
  service.authorization = @credentials.client
70
+ service.root_url = host if host
68
71
  service
69
72
  end
70
73
  end
@@ -297,11 +300,15 @@ module Google
297
300
  # been granted the READER job role.
298
301
  def list_jobs options = {}
299
302
  # The list operation is considered idempotent
303
+ min_creation_time = Convert.time_to_millis options[:min_created_at]
304
+ max_creation_time = Convert.time_to_millis options[:max_created_at]
300
305
  execute backoff: true do
301
306
  service.list_jobs \
302
307
  @project, all_users: options[:all], max_results: options[:max],
303
308
  page_token: options[:token], projection: "full",
304
- state_filter: options[:filter]
309
+ state_filter: options[:filter],
310
+ min_creation_time: min_creation_time,
311
+ max_creation_time: max_creation_time
305
312
  end
306
313
  end
307
314
 
@@ -476,9 +483,9 @@ module Google
476
483
  end
477
484
 
478
485
  def mime_type_for file
479
- mime_type = MIME::Types.of(Pathname(file).to_path).first.to_s
480
- return nil if mime_type.empty?
481
- mime_type
486
+ mime_type = MiniMime.lookup_by_filename Pathname(file).to_path
487
+ return nil if mime_type.nil?
488
+ mime_type.content_type
482
489
  rescue StandardError
483
490
  nil
484
491
  end
@@ -325,6 +325,52 @@ module Google
325
325
  patch_gapi! :time_partitioning
326
326
  end
327
327
 
328
+ ###
329
+ # Whether queries over this table require a partition filter that can be
330
+ # used for partition elimination to be specified. See [Partitioned
331
+ # Tables](https://cloud.google.com/bigquery/docs/partitioned-tables).
332
+ #
333
+ # @return [Boolean, nil] `true` when a partition filter will be
334
+ # required, `false` otherwise, or `nil` if the object is a reference
335
+ # (see {#reference?}).
336
+ #
337
+ # @!group Attributes
338
+ #
339
+ def require_partition_filter
340
+ return nil if reference?
341
+ ensure_full_data!
342
+ @gapi.require_partition_filter
343
+ end
344
+
345
+ ##
346
+ # Sets whether queries over this table require a partition filter. See
347
+ # [Partitioned
348
+ # Tables](https://cloud.google.com/bigquery/docs/partitioned-tables).
349
+ #
350
+ # If the table is not a full resource representation (see
351
+ # {#resource_full?}), the full representation will be retrieved before
352
+ # the update to comply with ETag-based optimistic concurrency control.
353
+ #
354
+ # @param [Boolean] new_require Whether queries over this table require a
355
+ # partition filter.
356
+ #
357
+ # @example
358
+ # require "google/cloud/bigquery"
359
+ #
360
+ # bigquery = Google::Cloud::Bigquery.new
361
+ # dataset = bigquery.dataset "my_dataset"
362
+ # table = dataset.create_table "my_table" do |table|
363
+ # table.require_partition_filter = true
364
+ # end
365
+ #
366
+ # @!group Attributes
367
+ #
368
+ def require_partition_filter= new_require
369
+ reload! unless resource_full?
370
+ @gapi.require_partition_filter = new_require
371
+ patch_gapi! :require_partition_filter
372
+ end
373
+
328
374
  ###
329
375
  # Checks if the table is clustered.
330
376
  #
@@ -829,8 +875,8 @@ module Google
829
875
 
830
876
  ##
831
877
  # The {EncryptionConfiguration} object that represents the custom
832
- # encryption method used to protect the table. If not set, default
833
- # encryption is used.
878
+ # encryption method used to protect the table. If not set,
879
+ # {Dataset#default_encryption} is used.
834
880
  #
835
881
  # Present only if the table is using custom encryption.
836
882
  #
@@ -851,8 +897,8 @@ module Google
851
897
 
852
898
  ##
853
899
  # Set the {EncryptionConfiguration} object that represents the custom
854
- # encryption method used to protect the table. If not set, default
855
- # encryption is used.
900
+ # encryption method used to protect the table. If not set,
901
+ # {Dataset#default_encryption} is used.
856
902
  #
857
903
  # Present only if the table is using custom encryption.
858
904
  #
@@ -860,7 +906,6 @@ module Google
860
906
  # {#resource_full?}), the full representation will be retrieved before
861
907
  # the update to comply with ETag-based optimistic concurrency control.
862
908
  #
863
- #
864
909
  # @see https://cloud.google.com/bigquery/docs/customer-managed-encryption
865
910
  # Protecting Data with Cloud KMS Keys
866
911
  #
@@ -1926,9 +1971,18 @@ module Google
1926
1971
  # need to complete a load operation before the data can appear in query
1927
1972
  # results.
1928
1973
  #
1974
+ # Because BigQuery's streaming API is designed for high insertion rates,
1975
+ # modifications to the underlying table metadata are eventually
1976
+ # consistent when interacting with the streaming system. In most cases
1977
+ # metadata changes are propagated within minutes, but during this period
1978
+ # API responses may reflect the inconsistent state of the table.
1979
+ #
1929
1980
  # @see https://cloud.google.com/bigquery/streaming-data-into-bigquery
1930
1981
  # Streaming Data Into BigQuery
1931
1982
  #
1983
+ # @see https://cloud.google.com/bigquery/troubleshooting-errors#metadata-errors-for-streaming-inserts
1984
+ # BigQuery Troubleshooting: Metadata errors for streaming inserts
1985
+ #
1932
1986
  # @param [Hash, Array<Hash>] rows A hash object or array of hash objects
1933
1987
  # containing the data. Required.
1934
1988
  # @param [Array<String>] insert_ids A unique ID for each row. BigQuery
@@ -86,7 +86,8 @@ module Google
86
86
 
87
87
  @batch = nil
88
88
 
89
- @thread_pool = Concurrent::FixedThreadPool.new @threads
89
+ @thread_pool = Concurrent::ThreadPoolExecutor.new \
90
+ max_threads: @threads
90
91
 
91
92
  @cond = new_cond
92
93
 
@@ -99,6 +100,19 @@ module Google
99
100
  # collected in batches and inserted together.
100
101
  # See {Google::Cloud::Bigquery::Table#insert_async}.
101
102
  #
103
+ # Because BigQuery's streaming API is designed for high insertion
104
+ # rates, modifications to the underlying table metadata are eventually
105
+ # consistent when interacting with the streaming system. In most cases
106
+ # metadata changes are propagated within minutes, but during this
107
+ # period API responses may reflect the inconsistent state of the
108
+ # table.
109
+ #
110
+ # @see https://cloud.google.com/bigquery/streaming-data-into-bigquery
111
+ # Streaming Data Into BigQuery
112
+ #
113
+ # @see https://cloud.google.com/bigquery/troubleshooting-errors#metadata-errors-for-streaming-inserts
114
+ # BigQuery Troubleshooting: Metadata errors for streaming inserts
115
+ #
102
116
  # @param [Hash, Array<Hash>] rows A hash object or array of hash
103
117
  # objects containing the data.
104
118
  # @param [Array<String>] insert_ids A unique ID for each row. BigQuery
@@ -16,7 +16,7 @@
16
16
  module Google
17
17
  module Cloud
18
18
  module Bigquery
19
- VERSION = "1.12.0".freeze
19
+ VERSION = "1.16.0".freeze
20
20
  end
21
21
  end
22
22
  end
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: 1.12.0
4
+ version: 1.16.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: 2019-07-10 00:00:00.000000000 Z
12
+ date: 2019-10-03 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.23'
34
+ version: '0.31'
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.23'
41
+ version: '0.31'
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: googleauth
44
44
  requirement: !ruby/object:Gem::Requirement
@@ -74,19 +74,19 @@ dependencies:
74
74
  - !ruby/object:Gem::Version
75
75
  version: '1.0'
76
76
  - !ruby/object:Gem::Dependency
77
- name: mime-types
77
+ name: mini_mime
78
78
  requirement: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '3.0'
82
+ version: '1.0'
83
83
  type: :runtime
84
84
  prerelease: false
85
85
  version_requirements: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '3.0'
89
+ version: '1.0'
90
90
  - !ruby/object:Gem::Dependency
91
91
  name: minitest
92
92
  requirement: !ruby/object:Gem::Requirement
@@ -293,7 +293,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
293
293
  - !ruby/object:Gem::Version
294
294
  version: '0'
295
295
  requirements: []
296
- rubygems_version: 3.0.3
296
+ rubygems_version: 3.0.4
297
297
  signing_key:
298
298
  specification_version: 4
299
299
  summary: API Client library for Google BigQuery