1717from importlib import resources
1818import functools
1919import 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
2122import uuid
2223
2324import pandas as pd
2425
2526import bigframes
27+ import bigframes .core .blocks
2628import 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
0 commit comments