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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy