Skip to content

Commit dfdc222

Browse files
authored
Merge pull request #120 from robin900/query-udf
add external_udf_uris support to query()
2 parents d4ccdb9 + a9e37c8 commit dfdc222

File tree

2 files changed

+22
-13
lines changed

2 files changed

+22
-13
lines changed

bigquery/client.py

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ def _insert_job(self, body_object):
276276
body=body_object
277277
).execute()
278278

279-
def query(self, query, max_results=None, timeout=0, dry_run=False, use_legacy_sql=None):
279+
def query(self, query, max_results=None, timeout=0, dry_run=False, use_legacy_sql=None, external_udf_uris=None):
280280
"""Submit a query to BigQuery.
281281
282282
Parameters
@@ -294,6 +294,9 @@ def query(self, query, max_results=None, timeout=0, dry_run=False, use_legacy_sq
294294
message it would if it wasn't a dry run.
295295
use_legacy_sql : bool, optional. Default True.
296296
If False, the query will use BigQuery's standard SQL (https://cloud.google.com/bigquery/sql-reference/)
297+
external_udf_uris : list, optional
298+
Contains external UDF URIs. If given, URIs must be Google Cloud
299+
Storage and have .js extensions.
297300
298301
299302
Returns
@@ -321,6 +324,10 @@ def query(self, query, max_results=None, timeout=0, dry_run=False, use_legacy_sq
321324
if use_legacy_sql is not None:
322325
query_data['useLegacySql'] = use_legacy_sql
323326

327+
if external_udf_uris:
328+
query_data['userDefinedFunctionResources'] = \
329+
[ {'resourceUri': u} for u in external_udf_uris ]
330+
324331
return self._submit_query_job(query_data)
325332

326333
def get_query_schema(self, job_id):
@@ -1048,7 +1055,7 @@ def write_to_table(
10481055
query,
10491056
dataset=None,
10501057
table=None,
1051-
external_udf_uris=[],
1058+
external_udf_uris=None,
10521059
allow_large_results=None,
10531060
use_query_cache=None,
10541061
priority=None,
@@ -1073,7 +1080,7 @@ def write_to_table(
10731080
table : str, optional
10741081
String id of the table
10751082
external_udf_uris : list, optional
1076-
Contains extternal UDF URIs. If given, URIs must be Google Cloud
1083+
Contains external UDF URIs. If given, URIs must be Google Cloud
10771084
Storage and have .js extensions.
10781085
allow_large_results : bool, optional
10791086
Whether or not to allow large results
@@ -1144,13 +1151,9 @@ def write_to_table(
11441151
if write_disposition:
11451152
configuration['writeDisposition'] = write_disposition
11461153

1147-
configuration['userDefinedFunctionResources'] = []
1148-
for external_udf_uri in external_udf_uris:
1149-
configuration['userDefinedFunctionResources'].append(
1150-
{
1151-
"resourceUri": external_udf_uri
1152-
}
1153-
)
1154+
if external_udf_uris:
1155+
configuration['userDefinedFunctionResources'] = \
1156+
[ {'resourceUri': u} for u in external_udf_uris ]
11541157

11551158
body = {
11561159
"configuration": {

bigquery/tests/test_client.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,7 @@ def setUp(self):
259259

260260
self.query = 'foo'
261261
self.project_id = 'project'
262+
self.external_udf_uris = ['gs://bucket/external_udf.js']
262263
self.client = client.BigQueryClient(self.mock_bq_service,
263264
self.project_id)
264265

@@ -276,12 +277,17 @@ def test_query(self):
276277

277278
self.mock_job_collection.query.return_value = mock_query_job
278279

279-
job_id, results = self.client.query(self.query)
280+
job_id, results = self.client.query(self.query, external_udf_uris=self.external_udf_uris)
280281

281282
self.mock_job_collection.query.assert_called_once_with(
282283
projectId=self.project_id,
283-
body={'query': self.query, 'timeoutMs': 0, 'dryRun': False,
284-
'maxResults': None}
284+
body={
285+
'query': self.query,
286+
'userDefinedFunctionResources': [ {'resourceUri': u} for u in self.external_udf_uris ],
287+
'timeoutMs': 0,
288+
'dryRun': False,
289+
'maxResults': None
290+
}
285291
)
286292
self.assertEquals(job_id, 'spiderman')
287293
self.assertEquals(results, [])

0 commit comments

Comments
 (0)