1313# limitations under the License.
1414
1515"""Shared helper functions for formatting jobs related info."""
16- # TODO(orrbradford): cleanup up typings and documenttion in this file
16+
17+ from __future__ import annotations
1718
1819import datetime
1920import random
20- from typing import Any , Optional , Type , Union
21+ from typing import Any , Callable , Optional , Type , Union
2122
2223import bigframes_vendored .constants as constants
2324import google .api_core .exceptions as api_core_exceptions
2425import google .cloud .bigquery as bigquery
26+ import google .cloud .bigquery ._job_helpers
2527import humanize
2628import IPython
2729import IPython .display as display
@@ -124,6 +126,7 @@ def wait_for_query_job(
124126 max_results : Optional [int ] = None ,
125127 page_size : Optional [int ] = None ,
126128 progress_bar : Optional [str ] = None ,
129+ callback : Callable = lambda _ : None ,
127130) -> bigquery .table .RowIterator :
128131 """Return query results. Displays a progress bar while the query is running
129132 Args:
@@ -141,35 +144,67 @@ def wait_for_query_job(
141144 if progress_bar == "auto" :
142145 progress_bar = "notebook" if in_ipython () else "terminal"
143146
144- try :
145- if progress_bar == "notebook" :
146- display_id = str (random .random ())
147- loading_bar = display .HTML (get_query_job_loading_html (query_job ))
148- display .display (loading_bar , display_id = display_id )
149- query_result = query_job .result (
150- max_results = max_results , page_size = page_size
151- )
152- query_job .reload ()
147+ if progress_bar == "notebook" :
148+ loading_bar = display .HTML (get_query_job_loading_html (query_job ))
149+ display_id = str (random .random ())
150+ display .display (loading_bar , display_id = display_id )
151+
152+ def extended_callback (event ):
153+ callback (event )
153154 display .update_display (
154155 display .HTML (get_query_job_loading_html (query_job )),
155156 display_id = display_id ,
156157 )
157- elif progress_bar == "terminal" :
158- initial_loading_bar = get_query_job_loading_string (query_job )
159- print (initial_loading_bar )
160- query_result = query_job .result (
161- max_results = max_results , page_size = page_size
162- )
163- query_job .reload ()
158+
159+ elif progress_bar == "terminal" :
160+ initial_loading_bar = get_query_job_loading_string (query_job )
161+ print (initial_loading_bar )
162+
163+ def extended_callback (event ):
164+ callback (event )
165+
164166 if initial_loading_bar != get_query_job_loading_string (query_job ):
165167 print (get_query_job_loading_string (query_job ))
166- else :
167- # No progress bar.
168- query_result = query_job .result (
169- max_results = max_results , page_size = page_size
168+
169+ else :
170+ extended_callback = callback
171+
172+ try :
173+ extended_callback (
174+ # DONOTSUBMIT: we should create our own events.
175+ google .cloud .bigquery ._job_helpers .QueryReceivedEvent (
176+ billing_project = query_job .project ,
177+ location = query_job .location ,
178+ job_id = query_job .job_id ,
179+ statement_type = query_job .statement_type ,
180+ state = query_job .state ,
181+ query_plan = query_job .query_plan ,
182+ created = query_job .created ,
183+ started = query_job .started ,
184+ ended = query_job .ended ,
170185 )
171- query_job .reload ()
172- return query_result
186+ )
187+ query_results = query_job .result (
188+ page_size = page_size ,
189+ max_results = max_results ,
190+ )
191+ extended_callback (
192+ # DONOTSUBMIT: we should create our own events.
193+ google .cloud .bigquery ._job_helpers .QueryFinishedEvent (
194+ billing_project = query_job .project ,
195+ location = query_results .location ,
196+ query_id = query_results .query_id ,
197+ job_id = query_results .job_id ,
198+ total_rows = query_results .total_rows ,
199+ total_bytes_processed = query_results .total_bytes_processed ,
200+ slot_millis = query_results .slot_millis ,
201+ destination = query_job .destination ,
202+ created = query_job .created ,
203+ started = query_job .started ,
204+ ended = query_job .ended ,
205+ )
206+ )
207+ return query_results
173208 except api_core_exceptions .RetryError as exc :
174209 add_feedback_link (exc )
175210 raise
0 commit comments