Skip to content

Commit 1695acb

Browse files
committed
update the method of using PandasBatches.total_rows
1 parent cefa4ce commit 1695acb

File tree

2 files changed

+29
-13
lines changed

2 files changed

+29
-13
lines changed

bigframes/display/anywidget.py

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,14 @@
1717
from importlib import resources
1818
import functools
1919
import math
20-
from typing import Any, Dict, Iterator, List, Optional, Type
20+
import typing
21+
from typing import Any, cast, Dict, Iterator, List, Optional, Type
2122
import uuid
2223

2324
import pandas as pd
2425

2526
import bigframes
27+
import bigframes.core.blocks
2628
import bigframes.display.html
2729

2830
# anywidget and traitlets are optional dependencies. We don't want the import of this
@@ -69,21 +71,24 @@ def __init__(self, dataframe: bigframes.dataframe.DataFrame):
6971
self._table_id = str(uuid.uuid4())
7072
self._all_data_loaded = False
7173
self._batch_iter: Optional[Iterator[pd.DataFrame]] = None
74+
self._batches: Optional[bigframes.core.blocks.PandasBatches] = None
7275
self._cached_batches: List[pd.DataFrame] = []
7376

7477
# Respect display options for initial page size
7578
initial_page_size = bigframes.options.display.max_rows
7679

7780
try:
7881
# Fetches initial data batches and row count for display.
79-
# `to_pandas_batches` provides an iterable of pandas DataFrames
80-
# and eagerly retrieves the total row count
81-
self._batches = dataframe.to_pandas_batches(
82+
batches = dataframe.to_pandas_batches(
8283
page_size=initial_page_size,
8384
)
85+
self._batches = cast(bigframes.core.blocks.PandasBatches, batches)
8486

85-
# Access the total_rows property directly
86-
self.row_count = self._batches.total_rows or 0
87+
# Use total_rows if available, otherwise default to 0.
88+
if self._batches:
89+
self.row_count = self._batches.total_rows or 0
90+
else:
91+
self.row_count = 0
8792
self.page_size = initial_page_size
8893

8994
# Generates the initial HTML table content
@@ -92,7 +97,7 @@ def __init__(self, dataframe: bigframes.dataframe.DataFrame):
9297
except Exception:
9398
self.row_count = 0
9499
self.page_size = initial_page_size
95-
self._batches = iter([])
100+
self._batches = None
96101
self.table_html = ""
97102

98103
@functools.cached_property
@@ -176,7 +181,10 @@ def _get_next_batch(self) -> bool:
176181
def _batch_iterator(self) -> Iterator[pd.DataFrame]:
177182
"""Lazily initializes and returns the batch iterator."""
178183
if self._batch_iter is None:
179-
self._batch_iter = iter(self._batches)
184+
if self._batches is None:
185+
self._batch_iter = iter([])
186+
else:
187+
self._batch_iter = iter(self._batches)
180188
return self._batch_iter
181189

182190
@property
@@ -188,7 +196,8 @@ def _cached_data(self) -> pd.DataFrame:
188196

189197
def _reset_batches_for_new_page_size(self):
190198
"""Reset the batch iterator when page size changes."""
191-
self._batches = self._dataframe.to_pandas_batches(page_size=self.page_size)
199+
batches = self._dataframe.to_pandas_batches(page_size=self.page_size)
200+
self._batches = typing.cast(bigframes.core.blocks.PandasBatches, batches)
192201
self._cached_batches = []
193202
self._batch_iter = None
194203
self._all_data_loaded = False

tests/system/small/test_anywidget.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -476,14 +476,21 @@ def test_widget_row_count_should_be_immutable_after_creation(
476476
assert widget.row_count == initial_row_count
477477

478478

479+
class FaultyIterator:
480+
def __iter__(self):
481+
return self
482+
483+
def __next__(self):
484+
raise ValueError("Simulated read error")
485+
486+
479487
@pytest.mark.parametrize(
480488
"total_rows_param, arrow_batches_param",
481489
[
482-
# Corresponds to mock_execute_total_rows_is_none
490+
# Case 1: total_rows is None, which should be handled gracefully.
483491
(None, []),
484-
# Corresponds to mock_execute_batches_are_invalid (assuming empty list
485-
# for invalid batches for now)
486-
(100, []),
492+
# Case 2: Batches are invalid and will raise an error during iteration.
493+
(100, FaultyIterator()),
487494
],
488495
ids=[
489496
"when_total_rows_is_None",

0 commit comments

Comments
 (0)