Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitedd3328

Browse files
authored
feat: add determinism level for javascript UDFs (#522)
* feat: add determinism level for javascript UDFs* Add enum-like class for routine determinism level
1 parent3e9430f commitedd3328

File tree

7 files changed

+102
-1
lines changed

7 files changed

+102
-1
lines changed

‎docs/reference.rst‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ Routine
110110
..autosummary::
111111
:toctree: generated
112112

113+
routine.DeterminismLevel
113114
routine.Routine
114115
routine.RoutineArgument
115116
routine.RoutineReference

‎google/cloud/bigquery/__init__.py‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
fromgoogle.cloud.bigquery.queryimportStructQueryParameter
7171
fromgoogle.cloud.bigquery.queryimportUDFResource
7272
fromgoogle.cloud.bigquery.retryimportDEFAULT_RETRY
73+
fromgoogle.cloud.bigquery.routineimportDeterminismLevel
7374
fromgoogle.cloud.bigquery.routineimportRoutine
7475
fromgoogle.cloud.bigquery.routineimportRoutineArgument
7576
fromgoogle.cloud.bigquery.routineimportRoutineReference
@@ -134,6 +135,7 @@
134135
"Compression",
135136
"CreateDisposition",
136137
"DestinationFormat",
138+
"DeterminismLevel",
137139
"ExternalSourceFormat",
138140
"Encoding",
139141
"QueryPriority",

‎google/cloud/bigquery/enums.py‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,3 +234,20 @@ class WriteDisposition(object):
234234
WRITE_EMPTY="WRITE_EMPTY"
235235
"""If the table already exists and contains data, a 'duplicate' error is
236236
returned in the job result."""
237+
238+
239+
classDeterminismLevel:
240+
"""Specifies determinism level for JavaScript user-defined functions (UDFs).
241+
242+
https://cloud.google.com/bigquery/docs/reference/rest/v2/routines#DeterminismLevel
243+
"""
244+
245+
DETERMINISM_LEVEL_UNSPECIFIED="DETERMINISM_LEVEL_UNSPECIFIED"
246+
"""The determinism of the UDF is unspecified."""
247+
248+
DETERMINISTIC="DETERMINISTIC"
249+
"""The UDF is deterministic, meaning that 2 function calls with the same inputs
250+
always produce the same result, even across 2 query runs."""
251+
252+
NOT_DETERMINISTIC="NOT_DETERMINISTIC"
253+
"""The UDF is not deterministic."""
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# Copyright 2021 Google LLC
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
15+
"""User-Defined Routines."""
16+
17+
18+
fromgoogle.cloud.bigquery.enumsimportDeterminismLevel
19+
fromgoogle.cloud.bigquery.routine.routineimportRoutine
20+
fromgoogle.cloud.bigquery.routine.routineimportRoutineArgument
21+
fromgoogle.cloud.bigquery.routine.routineimportRoutineReference
22+
23+
24+
__all__= (
25+
"DeterminismLevel",
26+
"Routine",
27+
"RoutineArgument",
28+
"RoutineReference",
29+
)
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
defdescription(self,value):
254255
self._properties[self._PROPERTY_TO_API_FIELD["description"]]=value
255256

257+
@property
258+
defdeterminism_level(self):
259+
"""Optional[str]: (experimental) The determinism level of the JavaScript UDF
260+
if defined.
261+
"""
262+
returnself._properties.get(self._PROPERTY_TO_API_FIELD["determinism_level"])
263+
264+
@determinism_level.setter
265+
defdeterminism_level(self,value):
266+
self._properties[self._PROPERTY_TO_API_FIELD["determinism_level"]]=value
267+
256268
@classmethod
257269
deffrom_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=bigquery.DeterminismLevel.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: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
importpytest
1919

2020
importgoogle.cloud._helpers
21+
fromgoogle.cloudimportbigquery
2122
fromgoogle.cloudimportbigquery_v2
2223

2324

@@ -73,6 +74,7 @@ def test_ctor_w_properties(target_class):
7374
)
7475
type_="SCALAR_FUNCTION"
7576
description="A routine description."
77+
determinism_level=bigquery.DeterminismLevel.NOT_DETERMINISTIC
7678

7779
actual_routine=target_class(
7880
routine_id,
@@ -82,6 +84,7 @@ def test_ctor_w_properties(target_class):
8284
return_type=return_type,
8385
type_=type_,
8486
description=description,
87+
determinism_level=determinism_level,
8588
)
8689

8790
ref=RoutineReference.from_string(routine_id)
@@ -92,6 +95,9 @@ def test_ctor_w_properties(target_class):
9295
assertactual_routine.return_type==return_type
9396
assertactual_routine.type_==type_
9497
assertactual_routine.description==description
98+
assert (
99+
actual_routine.determinism_level==bigquery.DeterminismLevel.NOT_DETERMINISTIC
100+
)
95101

96102

97103
deftest_from_api_repr(target_class):
@@ -120,6 +126,7 @@ def test_from_api_repr(target_class):
120126
"routineType":"SCALAR_FUNCTION",
121127
"someNewField":"someValue",
122128
"description":"A routine description.",
129+
"determinismLevel":bigquery.DeterminismLevel.DETERMINISTIC,
123130
}
124131
actual_routine=target_class.from_api_repr(resource)
125132

@@ -152,6 +159,7 @@ def test_from_api_repr(target_class):
152159
assertactual_routine.type_=="SCALAR_FUNCTION"
153160
assertactual_routine._properties["someNewField"]=="someValue"
154161
assertactual_routine.description=="A routine description."
162+
assertactual_routine.determinism_level=="DETERMINISTIC"
155163

156164

157165
deftest_from_api_repr_w_minimal_resource(target_class):
@@ -177,6 +185,7 @@ def test_from_api_repr_w_minimal_resource(target_class):
177185
assertactual_routine.return_typeisNone
178186
assertactual_routine.type_isNone
179187
assertactual_routine.descriptionisNone
188+
assertactual_routine.determinism_levelisNone
180189

181190

182191
deftest_from_api_repr_w_unknown_fields(target_class):
@@ -208,6 +217,7 @@ def test_from_api_repr_w_unknown_fields(target_class):
208217
"returnType": {"typeKind":"INT64"},
209218
"routineType":"SCALAR_FUNCTION",
210219
"description":"A routine description.",
220+
"determinismLevel":bigquery.DeterminismLevel.DETERMINISM_LEVEL_UNSPECIFIED,
211221
},
212222
["arguments"],
213223
{"arguments": [{"name":"x","dataType": {"typeKind":"INT64"}}]},
@@ -220,6 +230,7 @@ def test_from_api_repr_w_unknown_fields(target_class):
220230
"returnType": {"typeKind":"INT64"},
221231
"routineType":"SCALAR_FUNCTION",
222232
"description":"A routine description.",
233+
"determinismLevel":bigquery.DeterminismLevel.DETERMINISM_LEVEL_UNSPECIFIED,
223234
},
224235
["body"],
225236
{"definitionBody":"x * 3"},
@@ -232,6 +243,7 @@ def test_from_api_repr_w_unknown_fields(target_class):
232243
"returnType": {"typeKind":"INT64"},
233244
"routineType":"SCALAR_FUNCTION",
234245
"description":"A routine description.",
246+
"determinismLevel":bigquery.DeterminismLevel.DETERMINISM_LEVEL_UNSPECIFIED,
235247
},
236248
["language"],
237249
{"language":"SQL"},
@@ -244,6 +256,7 @@ def test_from_api_repr_w_unknown_fields(target_class):
244256
"returnType": {"typeKind":"INT64"},
245257
"routineType":"SCALAR_FUNCTION",
246258
"description":"A routine description.",
259+
"determinismLevel":bigquery.DeterminismLevel.DETERMINISM_LEVEL_UNSPECIFIED,
247260
},
248261
["return_type"],
249262
{"returnType": {"typeKind":"INT64"}},
@@ -256,6 +269,7 @@ def test_from_api_repr_w_unknown_fields(target_class):
256269
"returnType": {"typeKind":"INT64"},
257270
"routineType":"SCALAR_FUNCTION",
258271
"description":"A routine description.",
272+
"determinismLevel":bigquery.DeterminismLevel.DETERMINISM_LEVEL_UNSPECIFIED,
259273
},
260274
["type_"],
261275
{"routineType":"SCALAR_FUNCTION"},
@@ -268,20 +282,45 @@ def test_from_api_repr_w_unknown_fields(target_class):
268282
"returnType": {"typeKind":"INT64"},
269283
"routineType":"SCALAR_FUNCTION",
270284
"description":"A routine description.",
285+
"determinismLevel":bigquery.DeterminismLevel.DETERMINISM_LEVEL_UNSPECIFIED,
271286
},
272287
["description"],
273288
{"description":"A routine description."},
274289
),
290+
(
291+
{
292+
"arguments": [{"name":"x","dataType": {"typeKind":"INT64"}}],
293+
"definitionBody":"x * 3",
294+
"language":"SQL",
295+
"returnType": {"typeKind":"INT64"},
296+
"routineType":"SCALAR_FUNCTION",
297+
"description":"A routine description.",
298+
"determinismLevel":bigquery.DeterminismLevel.DETERMINISM_LEVEL_UNSPECIFIED,
299+
},
300+
["determinism_level"],
301+
{
302+
"determinismLevel":bigquery.DeterminismLevel.DETERMINISM_LEVEL_UNSPECIFIED
303+
},
304+
),
275305
(
276306
{},
277-
["arguments","language","body","type_","return_type","description"],
307+
[
308+
"arguments",
309+
"language",
310+
"body",
311+
"type_",
312+
"return_type",
313+
"description",
314+
"determinism_level",
315+
],
278316
{
279317
"arguments":None,
280318
"definitionBody":None,
281319
"language":None,
282320
"returnType":None,
283321
"routineType":None,
284322
"description":None,
323+
"determinismLevel":None,
285324
},
286325
),
287326
(

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp