Skip to content

Commit 505037c

Browse files
committed
feat: add determinism level for javascript UDFs
1 parent 1de05f6 commit 505037c

File tree

3 files changed

+48
-1
lines changed

3 files changed

+48
-1
lines changed

google/cloud/bigquery/routine.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ class Routine(object):
5050
"return_type": "returnType",
5151
"type_": "routineType",
5252
"description": "description",
53+
"determinism_level": "determinismLevel",
5354
}
5455

5556
def __init__(self, routine_ref, **kwargs):
@@ -253,6 +254,17 @@ def description(self):
253254
def description(self, value):
254255
self._properties[self._PROPERTY_TO_API_FIELD["description"]] = value
255256

257+
@property
258+
def determinism_level(self):
259+
"""Optional[str]: (experimental) The determinism level of the JavaScript UDF
260+
if defined.
261+
"""
262+
return self._properties.get(self._PROPERTY_TO_API_FIELD["determinism_level"])
263+
264+
@determinism_level.setter
265+
def determinism_level(self, value):
266+
self._properties[self._PROPERTY_TO_API_FIELD["determinism_level"]] = value
267+
256268
@classmethod
257269
def from_api_repr(cls, resource):
258270
"""Factory: construct a routine given its API representation.

tests/system/test_client.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2682,6 +2682,7 @@ def test_create_routine(self):
26822682
)
26832683
]
26842684
routine.body = "return maxValue(arr)"
2685+
routine.determinism_level = "DETERMINISTIC"
26852686
query_string = "SELECT `{}`([-100.0, 3.14, 100.0, 42.0]) as max_value;".format(
26862687
str(routine.reference)
26872688
)

tests/unit/routine/test_routine.py

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ def test_ctor_w_properties(target_class):
7373
)
7474
type_ = "SCALAR_FUNCTION"
7575
description = "A routine description."
76+
determinism_level = "NOT_DETERMINISTIC"
7677

7778
actual_routine = target_class(
7879
routine_id,
@@ -82,6 +83,7 @@ def test_ctor_w_properties(target_class):
8283
return_type=return_type,
8384
type_=type_,
8485
description=description,
86+
determinism_level=determinism_level,
8587
)
8688

8789
ref = RoutineReference.from_string(routine_id)
@@ -92,6 +94,7 @@ def test_ctor_w_properties(target_class):
9294
assert actual_routine.return_type == return_type
9395
assert actual_routine.type_ == type_
9496
assert actual_routine.description == description
97+
assert actual_routine.determinism_level == "NOT_DETERMINISTIC"
9598

9699

97100
def test_from_api_repr(target_class):
@@ -120,6 +123,7 @@ def test_from_api_repr(target_class):
120123
"routineType": "SCALAR_FUNCTION",
121124
"someNewField": "someValue",
122125
"description": "A routine description.",
126+
"determinismLevel": "DETERMINISTIC",
123127
}
124128
actual_routine = target_class.from_api_repr(resource)
125129

@@ -152,6 +156,7 @@ def test_from_api_repr(target_class):
152156
assert actual_routine.type_ == "SCALAR_FUNCTION"
153157
assert actual_routine._properties["someNewField"] == "someValue"
154158
assert actual_routine.description == "A routine description."
159+
assert actual_routine.determinism_level == "DETERMINISTIC"
155160

156161

157162
def test_from_api_repr_w_minimal_resource(target_class):
@@ -177,6 +182,7 @@ def test_from_api_repr_w_minimal_resource(target_class):
177182
assert actual_routine.return_type is None
178183
assert actual_routine.type_ is None
179184
assert actual_routine.description is None
185+
assert actual_routine.determinism_level is None
180186

181187

182188
def test_from_api_repr_w_unknown_fields(target_class):
@@ -208,6 +214,7 @@ def test_from_api_repr_w_unknown_fields(target_class):
208214
"returnType": {"typeKind": "INT64"},
209215
"routineType": "SCALAR_FUNCTION",
210216
"description": "A routine description.",
217+
"determinismLevel": "DETERMINISM_LEVEL_UNSPECIFIED",
211218
},
212219
["arguments"],
213220
{"arguments": [{"name": "x", "dataType": {"typeKind": "INT64"}}]},
@@ -220,6 +227,7 @@ def test_from_api_repr_w_unknown_fields(target_class):
220227
"returnType": {"typeKind": "INT64"},
221228
"routineType": "SCALAR_FUNCTION",
222229
"description": "A routine description.",
230+
"determinismLevel": "DETERMINISM_LEVEL_UNSPECIFIED",
223231
},
224232
["body"],
225233
{"definitionBody": "x * 3"},
@@ -232,6 +240,7 @@ def test_from_api_repr_w_unknown_fields(target_class):
232240
"returnType": {"typeKind": "INT64"},
233241
"routineType": "SCALAR_FUNCTION",
234242
"description": "A routine description.",
243+
"determinismLevel": "DETERMINISM_LEVEL_UNSPECIFIED",
235244
},
236245
["language"],
237246
{"language": "SQL"},
@@ -244,6 +253,7 @@ def test_from_api_repr_w_unknown_fields(target_class):
244253
"returnType": {"typeKind": "INT64"},
245254
"routineType": "SCALAR_FUNCTION",
246255
"description": "A routine description.",
256+
"determinismLevel": "DETERMINISM_LEVEL_UNSPECIFIED",
247257
},
248258
["return_type"],
249259
{"returnType": {"typeKind": "INT64"}},
@@ -256,6 +266,7 @@ def test_from_api_repr_w_unknown_fields(target_class):
256266
"returnType": {"typeKind": "INT64"},
257267
"routineType": "SCALAR_FUNCTION",
258268
"description": "A routine description.",
269+
"determinismLevel": "DETERMINISM_LEVEL_UNSPECIFIED",
259270
},
260271
["type_"],
261272
{"routineType": "SCALAR_FUNCTION"},
@@ -268,20 +279,43 @@ def test_from_api_repr_w_unknown_fields(target_class):
268279
"returnType": {"typeKind": "INT64"},
269280
"routineType": "SCALAR_FUNCTION",
270281
"description": "A routine description.",
282+
"determinismLevel": "DETERMINISM_LEVEL_UNSPECIFIED",
271283
},
272284
["description"],
273285
{"description": "A routine description."},
274286
),
287+
(
288+
{
289+
"arguments": [{"name": "x", "dataType": {"typeKind": "INT64"}}],
290+
"definitionBody": "x * 3",
291+
"language": "SQL",
292+
"returnType": {"typeKind": "INT64"},
293+
"routineType": "SCALAR_FUNCTION",
294+
"description": "A routine description.",
295+
"determinismLevel": "DETERMINISM_LEVEL_UNSPECIFIED",
296+
},
297+
["determinism_level"],
298+
{"determinismLevel": "DETERMINISM_LEVEL_UNSPECIFIED"},
299+
),
275300
(
276301
{},
277-
["arguments", "language", "body", "type_", "return_type", "description"],
302+
[
303+
"arguments",
304+
"language",
305+
"body",
306+
"type_",
307+
"return_type",
308+
"description",
309+
"determinism_level",
310+
],
278311
{
279312
"arguments": None,
280313
"definitionBody": None,
281314
"language": None,
282315
"returnType": None,
283316
"routineType": None,
284317
"description": None,
318+
"determinismLevel": None,
285319
},
286320
),
287321
(

0 commit comments

Comments
 (0)