google-cloud-bigquery 0.23.0 → 0.24.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/google/cloud/bigquery.rb +33 -32
- data/lib/google/cloud/bigquery/convert.rb +258 -0
- data/lib/google/cloud/bigquery/data.rb +20 -44
- data/lib/google/cloud/bigquery/dataset.rb +49 -65
- data/lib/google/cloud/bigquery/project.rb +42 -44
- data/lib/google/cloud/bigquery/query_data.rb +9 -8
- data/lib/google/cloud/bigquery/schema.rb +151 -179
- data/lib/google/cloud/bigquery/schema/field.rb +498 -0
- data/lib/google/cloud/bigquery/service.rb +11 -105
- data/lib/google/cloud/bigquery/table.rb +130 -6
- data/lib/google/cloud/bigquery/time.rb +2 -2
- data/lib/google/cloud/bigquery/version.rb +1 -1
- data/lib/google/cloud/bigquery/view.rb +36 -7
- metadata +11 -9
@@ -14,6 +14,7 @@
|
|
14
14
|
|
15
15
|
|
16
16
|
require "google/cloud/bigquery/version"
|
17
|
+
require "google/cloud/bigquery/convert"
|
17
18
|
require "google/cloud/errors"
|
18
19
|
require "google/apis/bigquery_v2"
|
19
20
|
require "pathname"
|
@@ -171,8 +172,7 @@ module Google
|
|
171
172
|
def insert_tabledata dataset_id, table_id, rows, options = {}
|
172
173
|
insert_rows = Array(rows).map do |row|
|
173
174
|
Google::Apis::BigqueryV2::InsertAllTableDataRequest::Row.new(
|
174
|
-
insert_id: Digest::MD5.base64digest(row.
|
175
|
-
# Hash[row.map{|(k,v)| [k.to_s,v]}] for Hash<String,Object>
|
175
|
+
insert_id: Digest::MD5.base64digest(row.to_json),
|
176
176
|
json: row
|
177
177
|
)
|
178
178
|
end
|
@@ -401,8 +401,9 @@ module Google
|
|
401
401
|
allow_large_results: options[:large_results],
|
402
402
|
flatten_results: options[:flatten],
|
403
403
|
default_dataset: default_dataset,
|
404
|
-
use_legacy_sql: resolve_legacy_sql(
|
405
|
-
|
404
|
+
use_legacy_sql: Convert.resolve_legacy_sql(
|
405
|
+
options[:standard_sql], options[:legacy_sql])
|
406
|
+
|
406
407
|
)
|
407
408
|
)
|
408
409
|
)
|
@@ -412,13 +413,13 @@ module Google
|
|
412
413
|
req.configuration.query.use_legacy_sql = false
|
413
414
|
req.configuration.query.parameter_mode = "POSITIONAL"
|
414
415
|
req.configuration.query.query_parameters = options[:params].map do |param|
|
415
|
-
to_query_param param
|
416
|
+
Convert.to_query_param param
|
416
417
|
end
|
417
418
|
elsif Hash === options[:params]
|
418
419
|
req.configuration.query.use_legacy_sql = false
|
419
420
|
req.configuration.query.parameter_mode = "NAMED"
|
420
421
|
req.configuration.query.query_parameters = options[:params].map do |name, param|
|
421
|
-
to_query_param(param).tap do |named_param|
|
422
|
+
Convert.to_query_param(param).tap do |named_param|
|
422
423
|
named_param.name = String name
|
423
424
|
end
|
424
425
|
end
|
@@ -440,8 +441,8 @@ module Google
|
|
440
441
|
timeout_ms: options[:timeout],
|
441
442
|
dry_run: options[:dryrun],
|
442
443
|
use_query_cache: options[:cache],
|
443
|
-
use_legacy_sql: resolve_legacy_sql(
|
444
|
-
|
444
|
+
use_legacy_sql: Convert.resolve_legacy_sql(
|
445
|
+
options[:standard_sql], options[:legacy_sql])
|
445
446
|
)
|
446
447
|
|
447
448
|
if options[:params]
|
@@ -449,13 +450,13 @@ module Google
|
|
449
450
|
req.use_legacy_sql = false
|
450
451
|
req.parameter_mode = "POSITIONAL"
|
451
452
|
req.query_parameters = options[:params].map do |param|
|
452
|
-
to_query_param param
|
453
|
+
Convert.to_query_param param
|
453
454
|
end
|
454
455
|
elsif Hash === options[:params]
|
455
456
|
req.use_legacy_sql = false
|
456
457
|
req.parameter_mode = "NAMED"
|
457
458
|
req.query_parameters = options[:params].map do |name, param|
|
458
|
-
to_query_param(param).tap do |named_param|
|
459
|
+
Convert.to_query_param(param).tap do |named_param|
|
459
460
|
named_param.name = String name
|
460
461
|
end
|
461
462
|
end
|
@@ -467,103 +468,8 @@ module Google
|
|
467
468
|
req
|
468
469
|
end
|
469
470
|
|
470
|
-
def to_query_param value
|
471
|
-
if TrueClass === value
|
472
|
-
return API::QueryParameter.new(
|
473
|
-
parameter_type: API::QueryParameterType.new(type: "BOOL"),
|
474
|
-
parameter_value: API::QueryParameterValue.new(value: true)
|
475
|
-
)
|
476
|
-
elsif FalseClass === value
|
477
|
-
return API::QueryParameter.new(
|
478
|
-
parameter_type: API::QueryParameterType.new(type: "BOOL"),
|
479
|
-
parameter_value: API::QueryParameterValue.new(value: false)
|
480
|
-
)
|
481
|
-
elsif Integer === value
|
482
|
-
return API::QueryParameter.new(
|
483
|
-
parameter_type: API::QueryParameterType.new(type: "INT64"),
|
484
|
-
parameter_value: API::QueryParameterValue.new(value: value)
|
485
|
-
)
|
486
|
-
elsif Float === value
|
487
|
-
return API::QueryParameter.new(
|
488
|
-
parameter_type: API::QueryParameterType.new(type: "FLOAT64"),
|
489
|
-
parameter_value: API::QueryParameterValue.new(value: value)
|
490
|
-
)
|
491
|
-
elsif String === value
|
492
|
-
return API::QueryParameter.new(
|
493
|
-
parameter_type: API::QueryParameterType.new(type: "STRING"),
|
494
|
-
parameter_value: API::QueryParameterValue.new(value: value)
|
495
|
-
)
|
496
|
-
elsif DateTime === value
|
497
|
-
return API::QueryParameter.new(
|
498
|
-
parameter_type: API::QueryParameterType.new(type: "DATETIME"),
|
499
|
-
parameter_value: API::QueryParameterValue.new(
|
500
|
-
value: value.strftime("%Y-%m-%d %H:%M:%S.%6N"))
|
501
|
-
)
|
502
|
-
elsif Date === value
|
503
|
-
return API::QueryParameter.new(
|
504
|
-
parameter_type: API::QueryParameterType.new(type: "DATE"),
|
505
|
-
parameter_value: API::QueryParameterValue.new(value: value.to_s)
|
506
|
-
)
|
507
|
-
elsif ::Time === value
|
508
|
-
return API::QueryParameter.new(
|
509
|
-
parameter_type: API::QueryParameterType.new(type: "TIMESTAMP"),
|
510
|
-
parameter_value: API::QueryParameterValue.new(
|
511
|
-
value: value.strftime("%Y-%m-%d %H:%M:%S.%6N%:z"))
|
512
|
-
)
|
513
|
-
elsif Bigquery::Time === value
|
514
|
-
return API::QueryParameter.new(
|
515
|
-
parameter_type: API::QueryParameterType.new(type: "TIME"),
|
516
|
-
parameter_value: API::QueryParameterValue.new(value: value.value)
|
517
|
-
)
|
518
|
-
elsif value.respond_to?(:read) && value.respond_to?(:rewind)
|
519
|
-
value.rewind
|
520
|
-
return API::QueryParameter.new(
|
521
|
-
parameter_type: API::QueryParameterType.new(type: "BYTES"),
|
522
|
-
parameter_value: API::QueryParameterValue.new(
|
523
|
-
value: value.read.force_encoding("ASCII-8BIT"))
|
524
|
-
)
|
525
|
-
elsif Array === value
|
526
|
-
array_params = value.map { |param| to_query_param param }
|
527
|
-
return API::QueryParameter.new(
|
528
|
-
parameter_type: API::QueryParameterType.new(
|
529
|
-
type: "ARRAY",
|
530
|
-
array_type: array_params.first.parameter_type
|
531
|
-
),
|
532
|
-
parameter_value: API::QueryParameterValue.new(
|
533
|
-
array_values: array_params.map(&:parameter_value)
|
534
|
-
)
|
535
|
-
)
|
536
|
-
elsif Hash === value
|
537
|
-
struct_pairs = value.map do |name, param|
|
538
|
-
struct_param = to_query_param param
|
539
|
-
[API::QueryParameterType::StructType.new(
|
540
|
-
name: String(name),
|
541
|
-
type: struct_param.parameter_type
|
542
|
-
), struct_param.parameter_value]
|
543
|
-
end
|
544
|
-
|
545
|
-
return API::QueryParameter.new(
|
546
|
-
parameter_type: API::QueryParameterType.new(
|
547
|
-
type: "STRUCT",
|
548
|
-
struct_types: struct_pairs.map(&:first)
|
549
|
-
),
|
550
|
-
parameter_value: API::QueryParameterValue.new(
|
551
|
-
struct_values: struct_pairs.map(&:last)
|
552
|
-
)
|
553
|
-
)
|
554
|
-
else
|
555
|
-
fail "A query parameter of type #{value.class} is not supported."
|
556
|
-
end
|
557
|
-
v
|
558
|
-
end
|
559
|
-
|
560
471
|
# rubocop:enable all
|
561
472
|
|
562
|
-
def resolve_legacy_sql legacy_sql, standard_sql
|
563
|
-
return legacy_sql unless legacy_sql.nil?
|
564
|
-
return !standard_sql unless standard_sql.nil?
|
565
|
-
end
|
566
|
-
|
567
473
|
##
|
568
474
|
# Job description for copy job
|
569
475
|
def copy_table_config source, target, options = {}
|
@@ -120,7 +120,7 @@ module Google
|
|
120
120
|
|
121
121
|
##
|
122
122
|
# The combined Project ID, Dataset ID, and Table ID for this table, in
|
123
|
-
# the format specified by the [Query
|
123
|
+
# the format specified by the [Legacy SQL Query
|
124
124
|
# Reference](https://cloud.google.com/bigquery/query-reference#from):
|
125
125
|
# `project_name:datasetId.tableId`. To use this value in queries see
|
126
126
|
# {#query_id}.
|
@@ -137,6 +137,15 @@ module Google
|
|
137
137
|
# Reference](https://cloud.google.com/bigquery/query-reference#from).
|
138
138
|
# Useful in queries.
|
139
139
|
#
|
140
|
+
# @param [Boolean] standard_sql Specifies whether to use BigQuery's
|
141
|
+
# [standard
|
142
|
+
# SQL](https://cloud.google.com/bigquery/docs/reference/standard-sql/)
|
143
|
+
# dialect. Optional. The default value is true.
|
144
|
+
# @param [Boolean] legacy_sql Specifies whether to use BigQuery's
|
145
|
+
# [legacy
|
146
|
+
# SQL](https://cloud.google.com/bigquery/docs/reference/legacy-sql)
|
147
|
+
# dialect. Optional. The default value is false.
|
148
|
+
#
|
140
149
|
# @example
|
141
150
|
# require "google/cloud/bigquery"
|
142
151
|
#
|
@@ -148,8 +157,12 @@ module Google
|
|
148
157
|
#
|
149
158
|
# @!group Attributes
|
150
159
|
#
|
151
|
-
def query_id
|
152
|
-
|
160
|
+
def query_id standard_sql: nil, legacy_sql: nil
|
161
|
+
if Convert.resolve_legacy_sql standard_sql, legacy_sql
|
162
|
+
"[#{id}]"
|
163
|
+
else
|
164
|
+
"`#{project_id}.#{dataset_id}.#{table_id}`"
|
165
|
+
end
|
153
166
|
end
|
154
167
|
|
155
168
|
##
|
@@ -354,7 +367,6 @@ module Google
|
|
354
367
|
schema_builder = Schema.from_gapi empty_schema
|
355
368
|
end
|
356
369
|
yield schema_builder
|
357
|
-
schema_builder.check_for_mutated_schema!
|
358
370
|
if schema_builder.changed?
|
359
371
|
@gapi.schema = schema_builder.to_gapi
|
360
372
|
patch_gapi! :schema
|
@@ -378,7 +390,7 @@ module Google
|
|
378
390
|
# @!group Attributes
|
379
391
|
#
|
380
392
|
def headers
|
381
|
-
|
393
|
+
schema.headers
|
382
394
|
end
|
383
395
|
|
384
396
|
##
|
@@ -713,6 +725,7 @@ module Google
|
|
713
725
|
#
|
714
726
|
def insert rows, skip_invalid: nil, ignore_unknown: nil
|
715
727
|
rows = [rows] if rows.is_a? Hash
|
728
|
+
rows = Convert.to_json_rows rows
|
716
729
|
ensure_service!
|
717
730
|
options = { skip_invalid: skip_invalid,
|
718
731
|
ignore_unknown: ignore_unknown }
|
@@ -1019,6 +1032,34 @@ module Google
|
|
1019
1032
|
schema.boolean name, description: description, mode: mode
|
1020
1033
|
end
|
1021
1034
|
|
1035
|
+
##
|
1036
|
+
# Adds a bytes field to the schema.
|
1037
|
+
#
|
1038
|
+
# See {Schema#bytes}.
|
1039
|
+
#
|
1040
|
+
# @param [String] name The field name. The name must contain only
|
1041
|
+
# letters (a-z, A-Z), numbers (0-9), or underscores (_), and must
|
1042
|
+
# start with a letter or underscore. The maximum length is 128
|
1043
|
+
# characters.
|
1044
|
+
# @param [String] description A description of the field.
|
1045
|
+
# @param [Symbol] mode The field's mode. The possible values are
|
1046
|
+
# `:nullable`, `:required`, and `:repeated`. The default value is
|
1047
|
+
# `:nullable`.
|
1048
|
+
#
|
1049
|
+
# @example
|
1050
|
+
# require "google/cloud/bigquery"
|
1051
|
+
#
|
1052
|
+
# bigquery = Google::Cloud::Bigquery.new
|
1053
|
+
# dataset = bigquery.dataset "my_dataset"
|
1054
|
+
# table = dataset.create_table "my_table" do |schema|
|
1055
|
+
# schema.bytes "avatar", mode: :required
|
1056
|
+
# end
|
1057
|
+
#
|
1058
|
+
# @!group Schema
|
1059
|
+
def bytes name, description: nil, mode: :nullable
|
1060
|
+
schema.bytes name, description: description, mode: mode
|
1061
|
+
end
|
1062
|
+
|
1022
1063
|
##
|
1023
1064
|
# Adds a timestamp field to the schema.
|
1024
1065
|
#
|
@@ -1047,6 +1088,90 @@ module Google
|
|
1047
1088
|
schema.timestamp name, description: description, mode: mode
|
1048
1089
|
end
|
1049
1090
|
|
1091
|
+
##
|
1092
|
+
# Adds a time field to the schema.
|
1093
|
+
#
|
1094
|
+
# See {Schema#time}.
|
1095
|
+
#
|
1096
|
+
# @param [String] name The field name. The name must contain only
|
1097
|
+
# letters (a-z, A-Z), numbers (0-9), or underscores (_), and must
|
1098
|
+
# start with a letter or underscore. The maximum length is 128
|
1099
|
+
# characters.
|
1100
|
+
# @param [String] description A description of the field.
|
1101
|
+
# @param [Symbol] mode The field's mode. The possible values are
|
1102
|
+
# `:nullable`, `:required`, and `:repeated`. The default value is
|
1103
|
+
# `:nullable`.
|
1104
|
+
#
|
1105
|
+
# @example
|
1106
|
+
# require "google/cloud/bigquery"
|
1107
|
+
#
|
1108
|
+
# bigquery = Google::Cloud::Bigquery.new
|
1109
|
+
# dataset = bigquery.dataset "my_dataset"
|
1110
|
+
# table = dataset.create_table "my_table" do |schema|
|
1111
|
+
# schema.time "duration", mode: :required
|
1112
|
+
# end
|
1113
|
+
#
|
1114
|
+
# @!group Schema
|
1115
|
+
def time name, description: nil, mode: :nullable
|
1116
|
+
schema.time name, description: description, mode: mode
|
1117
|
+
end
|
1118
|
+
|
1119
|
+
##
|
1120
|
+
# Adds a datetime field to the schema.
|
1121
|
+
#
|
1122
|
+
# See {Schema#datetime}.
|
1123
|
+
#
|
1124
|
+
# @param [String] name The field name. The name must contain only
|
1125
|
+
# letters (a-z, A-Z), numbers (0-9), or underscores (_), and must
|
1126
|
+
# start with a letter or underscore. The maximum length is 128
|
1127
|
+
# characters.
|
1128
|
+
# @param [String] description A description of the field.
|
1129
|
+
# @param [Symbol] mode The field's mode. The possible values are
|
1130
|
+
# `:nullable`, `:required`, and `:repeated`. The default value is
|
1131
|
+
# `:nullable`.
|
1132
|
+
#
|
1133
|
+
# @example
|
1134
|
+
# require "google/cloud/bigquery"
|
1135
|
+
#
|
1136
|
+
# bigquery = Google::Cloud::Bigquery.new
|
1137
|
+
# dataset = bigquery.dataset "my_dataset"
|
1138
|
+
# table = dataset.create_table "my_table" do |schema|
|
1139
|
+
# schema.datetime "target_end", mode: :required
|
1140
|
+
# end
|
1141
|
+
#
|
1142
|
+
# @!group Schema
|
1143
|
+
def datetime name, description: nil, mode: :nullable
|
1144
|
+
schema.datetime name, description: description, mode: mode
|
1145
|
+
end
|
1146
|
+
|
1147
|
+
##
|
1148
|
+
# Adds a date field to the schema.
|
1149
|
+
#
|
1150
|
+
# See {Schema#date}.
|
1151
|
+
#
|
1152
|
+
# @param [String] name The field name. The name must contain only
|
1153
|
+
# letters (a-z, A-Z), numbers (0-9), or underscores (_), and must
|
1154
|
+
# start with a letter or underscore. The maximum length is 128
|
1155
|
+
# characters.
|
1156
|
+
# @param [String] description A description of the field.
|
1157
|
+
# @param [Symbol] mode The field's mode. The possible values are
|
1158
|
+
# `:nullable`, `:required`, and `:repeated`. The default value is
|
1159
|
+
# `:nullable`.
|
1160
|
+
#
|
1161
|
+
# @example
|
1162
|
+
# require "google/cloud/bigquery"
|
1163
|
+
#
|
1164
|
+
# bigquery = Google::Cloud::Bigquery.new
|
1165
|
+
# dataset = bigquery.dataset "my_dataset"
|
1166
|
+
# table = dataset.create_table "my_table" do |schema|
|
1167
|
+
# schema.date "birthday", mode: :required
|
1168
|
+
# end
|
1169
|
+
#
|
1170
|
+
# @!group Schema
|
1171
|
+
def date name, description: nil, mode: :nullable
|
1172
|
+
schema.date name, description: description, mode: mode
|
1173
|
+
end
|
1174
|
+
|
1050
1175
|
##
|
1051
1176
|
# Adds a record field to the schema. A block must be passed describing
|
1052
1177
|
# the nested fields of the record. For more information about nested
|
@@ -1089,7 +1214,6 @@ module Google
|
|
1089
1214
|
# Make sure any access changes are saved
|
1090
1215
|
def check_for_mutated_schema!
|
1091
1216
|
return if @schema.nil?
|
1092
|
-
@schema.check_for_mutated_schema!
|
1093
1217
|
return unless @schema.changed?
|
1094
1218
|
@gapi.schema = @schema.to_gapi
|
1095
1219
|
patch_gapi! :schema
|
@@ -30,7 +30,7 @@ module Google
|
|
30
30
|
#
|
31
31
|
# fourpm = Google::Cloud::Bigquery::Time.new "16:00:00"
|
32
32
|
# data = bigquery.query "SELECT name " \
|
33
|
-
# "FROM
|
33
|
+
# "FROM `my_proj.my_data.my_table`" \
|
34
34
|
# "WHERE time_of_date = @time",
|
35
35
|
# params: { time: fourpm }
|
36
36
|
#
|
@@ -45,7 +45,7 @@ module Google
|
|
45
45
|
#
|
46
46
|
# precise_time = Google::Cloud::Bigquery::Time.new "16:35:15.376541"
|
47
47
|
# data = bigquery.query "SELECT name " \
|
48
|
-
# "FROM
|
48
|
+
# "FROM `my_proj.my_data.my_table`" \
|
49
49
|
# "WHERE time_of_date >= @time",
|
50
50
|
# params: { time: precise_time }
|
51
51
|
#
|
@@ -40,7 +40,7 @@ module Google
|
|
40
40
|
# bigquery = Google::Cloud::Bigquery.new
|
41
41
|
# dataset = bigquery.dataset "my_dataset"
|
42
42
|
# view = dataset.create_view "my_view",
|
43
|
-
# "SELECT name, age FROM
|
43
|
+
# "SELECT name, age FROM proj.dataset.users"
|
44
44
|
#
|
45
45
|
class View
|
46
46
|
##
|
@@ -98,7 +98,7 @@ module Google
|
|
98
98
|
|
99
99
|
##
|
100
100
|
# The combined Project ID, Dataset ID, and Table ID for this table, in
|
101
|
-
# the format specified by the [Query
|
101
|
+
# the format specified by the [Legacy SQL Query
|
102
102
|
# Reference](https://cloud.google.com/bigquery/query-reference#from):
|
103
103
|
# `project_name:datasetId.tableId`. To use this value in queries see
|
104
104
|
# {#query_id}.
|
@@ -115,6 +115,15 @@ module Google
|
|
115
115
|
# Reference](https://cloud.google.com/bigquery/query-reference#from).
|
116
116
|
# Useful in queries.
|
117
117
|
#
|
118
|
+
# @param [Boolean] standard_sql Specifies whether to use BigQuery's
|
119
|
+
# [standard
|
120
|
+
# SQL](https://cloud.google.com/bigquery/docs/reference/standard-sql/)
|
121
|
+
# dialect. Optional. The default value is true.
|
122
|
+
# @param [Boolean] legacy_sql Specifies whether to use BigQuery's
|
123
|
+
# [legacy
|
124
|
+
# SQL](https://cloud.google.com/bigquery/docs/reference/legacy-sql)
|
125
|
+
# dialect. Optional. The default value is false.
|
126
|
+
#
|
118
127
|
# @example
|
119
128
|
# require "google/cloud/bigquery"
|
120
129
|
#
|
@@ -126,8 +135,12 @@ module Google
|
|
126
135
|
#
|
127
136
|
# @!group Attributes
|
128
137
|
#
|
129
|
-
def query_id
|
130
|
-
|
138
|
+
def query_id standard_sql: nil, legacy_sql: nil
|
139
|
+
if Convert.resolve_legacy_sql standard_sql, legacy_sql
|
140
|
+
"[#{id}]"
|
141
|
+
else
|
142
|
+
"`#{project_id}.#{dataset_id}.#{table_id}`"
|
143
|
+
end
|
131
144
|
end
|
132
145
|
|
133
146
|
##
|
@@ -287,7 +300,7 @@ module Google
|
|
287
300
|
# @!group Attributes
|
288
301
|
#
|
289
302
|
def headers
|
290
|
-
|
303
|
+
schema.headers
|
291
304
|
end
|
292
305
|
|
293
306
|
##
|
@@ -306,6 +319,14 @@ module Google
|
|
306
319
|
# Reference
|
307
320
|
#
|
308
321
|
# @param [String] new_query The query that defines the view.
|
322
|
+
# @param [Boolean] standard_sql Specifies whether to use BigQuery's
|
323
|
+
# [standard
|
324
|
+
# SQL](https://cloud.google.com/bigquery/docs/reference/standard-sql/)
|
325
|
+
# dialect. Optional. The default value is true.
|
326
|
+
# @param [Boolean] legacy_sql Specifies whether to use BigQuery's
|
327
|
+
# [legacy
|
328
|
+
# SQL](https://cloud.google.com/bigquery/docs/reference/legacy-sql)
|
329
|
+
# dialect. Optional. The default value is false.
|
309
330
|
#
|
310
331
|
# @example
|
311
332
|
# require "google/cloud/bigquery"
|
@@ -315,13 +336,15 @@ module Google
|
|
315
336
|
# view = dataset.table "my_view"
|
316
337
|
#
|
317
338
|
# view.query = "SELECT first_name FROM " \
|
318
|
-
# "
|
339
|
+
# "`my_project.my_dataset.my_table`"
|
319
340
|
#
|
320
341
|
# @!group Lifecycle
|
321
342
|
#
|
322
|
-
def query= new_query
|
343
|
+
def query= new_query, standard_sql: nil, legacy_sql: nil
|
323
344
|
@gapi.view ||= Google::Apis::BigqueryV2::ViewDefinition.new
|
324
345
|
@gapi.view.update! query: new_query
|
346
|
+
@gapi.view.update! use_legacy_sql: \
|
347
|
+
Convert.resolve_legacy_sql(standard_sql, legacy_sql)
|
325
348
|
patch_view_gapi! :query
|
326
349
|
end
|
327
350
|
|
@@ -426,6 +449,12 @@ module Google
|
|
426
449
|
fail "Must have active connection" unless service
|
427
450
|
end
|
428
451
|
|
452
|
+
def resolve_legacy_sql legacy_sql, standard_sql
|
453
|
+
return legacy_sql unless legacy_sql.nil?
|
454
|
+
return !standard_sql unless standard_sql.nil?
|
455
|
+
false
|
456
|
+
end
|
457
|
+
|
429
458
|
def patch_gapi! *attributes
|
430
459
|
return if attributes.empty?
|
431
460
|
patch_args = Hash[attributes.map do |attr|
|