Skip to content

Commit 38529ed

Browse files
committed
fix: resolve deferred mode display & thread execution reviews
1 parent a3dd2f6 commit 38529ed

5 files changed

Lines changed: 32 additions & 12 deletions

File tree

packages/bigframes/bigframes/display/anywidget.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818

1919
import dataclasses
2020
import functools
21+
import logging
22+
23+
logger = logging.getLogger(__name__)
2124
import math
2225
import threading
2326
import uuid
@@ -157,25 +160,31 @@ def _on_start_execution(self, change: dict[str, Any]):
157160

158161
def run_execution():
159162
try:
163+
self._error_message = None
160164
if self.is_deferred_mode:
161-
self.is_deferred_mode = False
162165
if self._deferred_dataframe is not None:
163166
result = self._deferred_dataframe.execute()
164167
if isinstance(result, bigframes.series.Series):
165168
df = result.to_frame()
166-
else:
169+
elif isinstance(result, bigframes.dataframe.DataFrame):
167170
df = result
171+
else:
172+
raise TypeError(
173+
f"Unexpected result type: {type(result)}"
174+
)
168175
self._dataframe, _ = df._process_display_df()
169176
self._initialize_from_dataframe()
177+
self.is_deferred_mode = False
170178
elif self._dataframe is not None:
171179
self._dataframe, _ = self._dataframe._process_display_df()
172180
self._initialize_from_dataframe()
181+
self.is_deferred_mode = False
173182
elif not self.is_deferred_mode and self._dataframe is not None:
174183
self._initial_load()
175184
except Exception as e:
185+
logger.warning(f"Error in background execution: {e}")
176186
self._error_message = str(e)
177187
finally:
178-
self.is_deferred_mode = False
179188
self.start_execution = False
180189

181190
self._execution_thread = threading.Thread(target=run_execution, daemon=True)

packages/bigframes/bigframes/display/html.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,8 +245,14 @@ def get_anywidget_bundle(
245245
else:
246246
df = obj
247247

248-
widget = display.TableWidget(df, dry_run_info=dry_run_info)
249-
display_df, _ = df._process_display_df()
248+
from bigframes.session import deferred
249+
250+
if not isinstance(df, deferred.DeferredBigQueryDataFrame) and bigframes.options.display.repr_mode != "deferred":
251+
display_df, _ = df._process_display_df()
252+
else:
253+
display_df = df
254+
255+
widget = display.TableWidget(display_df, dry_run_info=dry_run_info)
250256
widget_repr_result = widget._repr_mimebundle_(include=include, exclude=exclude)
251257

252258
if isinstance(widget_repr_result, tuple):

packages/bigframes/bigframes/display/table_widget_angular/src/app/app.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -495,18 +495,20 @@ export class App {
495495
const _html = this.state.tableHtml();
496496
const _sort = this.state.sortContext();
497497
const _orderable = this.state.orderableColumns();
498-
const deferred = this.isDeferredMode();
499-
500-
if (deferred) {
501-
this.isHeightInitialized = false;
502-
}
498+
this.isHeightInitialized = false;
503499

504500
// Schedule DOM post-processing once the innerHTML render completes
505501
setTimeout(() => {
506502
this.applySortIndicators();
507503
this.lockInitialHeight();
508504
}, 0);
509505
});
506+
507+
effect(() => {
508+
if (!this.state.startExecution()) {
509+
this.isLoading.set(false);
510+
}
511+
});
510512
}
511513

512514
ngOnInit() {

packages/bigframes/mypy.ini

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,6 @@ ignore_missing_imports = True
4444

4545
[mypy-anywidget]
4646
ignore_missing_imports = True
47+
48+
[mypy-bigframes_vendored.*]
49+
ignore_errors = True

packages/bigframes/tests/unit/display/test_anywidget.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ def __init__(self):
286286
pass
287287

288288
df = mock.MagicMock(spec=MockDeferredBigQueryDataFrame)
289-
df.__class__ = DeferredBigQueryDataFrame
289+
df.__class__ = DeferredBigQueryDataFrame # type: ignore[assignment]
290290
yield df
291291

292292

@@ -458,5 +458,5 @@ def test_deferred_mode_execution_error(mock_deferred_df):
458458
if thread is not None:
459459
thread.join(timeout=5)
460460

461-
assert widget.is_deferred_mode is False
461+
assert widget.is_deferred_mode is True
462462
assert widget._error_message == "Query Failed"

0 commit comments

Comments
 (0)