Skip to content

Commit 6119779

Browse files
authored
Merge pull request #2901 from tswast/arrays
Fix array handling in parameterized queries
2 parents d158cc7 + 1c9087d commit 6119779

File tree

3 files changed

+70
-14
lines changed

3 files changed

+70
-14
lines changed

bigquery/google/cloud/bigquery/_helpers.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -483,8 +483,11 @@ def from_api_repr(cls, resource):
483483
:returns: instance
484484
"""
485485
name = resource.get('name')
486-
array_type = resource['parameterType']['arrayType']
487-
values = resource['parameterValue']['arrayValues']
486+
array_type = resource['parameterType']['arrayType']['type']
487+
values = [
488+
value['value']
489+
for value
490+
in resource['parameterValue']['arrayValues']]
488491
converted = [
489492
_CELLDATA_FROM_JSON[array_type](value, None) for value in values]
490493
return cls(name, array_type, converted)
@@ -502,10 +505,12 @@ def to_api_repr(self):
502505
resource = {
503506
'parameterType': {
504507
'type': 'ARRAY',
505-
'arrayType': self.array_type,
508+
'arrayType': {
509+
'type': self.array_type,
510+
},
506511
},
507512
'parameterValue': {
508-
'arrayValues': values,
513+
'arrayValues': [{'value': value} for value in values],
509514
},
510515
}
511516
if self.name is not None:

bigquery/unit_tests/test__helpers.py

Lines changed: 53 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1067,10 +1067,20 @@ def test_from_api_repr_w_name(self):
10671067
RESOURCE = {
10681068
'name': 'foo',
10691069
'parameterType': {
1070-
'arrayType': 'INT64',
1070+
'type': 'ARRAY',
1071+
'arrayType': {
1072+
'type': 'INT64',
1073+
},
10711074
},
10721075
'parameterValue': {
1073-
'arrayValues': ['1', '2'],
1076+
'arrayValues': [
1077+
{
1078+
'value': '1',
1079+
},
1080+
{
1081+
'value': '2'
1082+
},
1083+
],
10741084
},
10751085
}
10761086
klass = self._get_target_class()
@@ -1083,10 +1093,19 @@ def test_from_api_repr_wo_name(self):
10831093
RESOURCE = {
10841094
'parameterType': {
10851095
'type': 'ARRAY',
1086-
'arrayType': 'INT64',
1096+
'arrayType': {
1097+
'type': 'INT64',
1098+
},
10871099
},
10881100
'parameterValue': {
1089-
'arrayValues': ['1', '2'],
1101+
'arrayValues': [
1102+
{
1103+
'value': '1',
1104+
},
1105+
{
1106+
'value': '2'
1107+
},
1108+
],
10901109
},
10911110
}
10921111
klass = self._get_target_class()
@@ -1100,10 +1119,19 @@ def test_to_api_repr_w_name(self):
11001119
'name': 'foo',
11011120
'parameterType': {
11021121
'type': 'ARRAY',
1103-
'arrayType': 'INT64',
1122+
'arrayType': {
1123+
'type': 'INT64',
1124+
},
11041125
},
11051126
'parameterValue': {
1106-
'arrayValues': ['1', '2'],
1127+
'arrayValues': [
1128+
{
1129+
'value': '1',
1130+
},
1131+
{
1132+
'value': '2'
1133+
},
1134+
],
11071135
},
11081136
}
11091137
param = self._make_one(name='foo', array_type='INT64', values=[1, 2])
@@ -1113,10 +1141,19 @@ def test_to_api_repr_wo_name(self):
11131141
EXPECTED = {
11141142
'parameterType': {
11151143
'type': 'ARRAY',
1116-
'arrayType': 'INT64',
1144+
'arrayType': {
1145+
'type': 'INT64',
1146+
},
11171147
},
11181148
'parameterValue': {
1119-
'arrayValues': ['1', '2'],
1149+
'arrayValues': [
1150+
{
1151+
'value': '1',
1152+
},
1153+
{
1154+
'value': '2'
1155+
},
1156+
],
11201157
},
11211158
}
11221159
klass = self._get_target_class()
@@ -1127,10 +1164,16 @@ def test_to_api_repr_w_unknown_type(self):
11271164
EXPECTED = {
11281165
'parameterType': {
11291166
'type': 'ARRAY',
1130-
'arrayType': 'UNKNOWN',
1167+
'arrayType': {
1168+
'type': 'UNKNOWN',
1169+
},
11311170
},
11321171
'parameterValue': {
1133-
'arrayValues': ['unknown'],
1172+
'arrayValues': [
1173+
{
1174+
'value': 'unknown',
1175+
}
1176+
],
11341177
},
11351178
}
11361179
klass = self._get_target_class()

system_tests/bigquery.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,7 @@ def _job_done(instance):
482482
def test_sync_query_w_standard_sql_types(self):
483483
import datetime
484484
from google.cloud._helpers import UTC
485+
from google.cloud.bigquery._helpers import ArrayQueryParameter
485486
from google.cloud.bigquery._helpers import ScalarQueryParameter
486487
from google.cloud.bigquery._helpers import StructQueryParameter
487488
naive = datetime.datetime(2016, 12, 5, 12, 41, 9)
@@ -495,6 +496,8 @@ def test_sync_query_w_standard_sql_types(self):
495496
answer = 42
496497
answer_param = ScalarQueryParameter(
497498
name='answer', type_='INT64', value=answer)
499+
array_param = ArrayQueryParameter(
500+
name='array_param', array_type='INT64', values=[1, 2])
498501
struct_param = StructQueryParameter(
499502
'hitchhiker', question_param, answer_param)
500503
EXAMPLES = [
@@ -570,6 +573,11 @@ def test_sync_query_w_standard_sql_types(self):
570573
'expected': zoned,
571574
'query_parameters': [zoned_param],
572575
},
576+
{
577+
'sql': 'SELECT @array_param',
578+
'expected': [1, 2],
579+
'query_parameters': [array_param],
580+
},
573581
{
574582
'sql': 'SELECT (@hitchhiker.question, @hitchhiker.answer)',
575583
'expected': ({'_field_1': question, '_field_2': answer}),

0 commit comments

Comments
 (0)