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
2628
2729# anywidget and traitlets are optional dependencies. We don't want the import of this
2830# module to fail if they aren't installed, though. Instead, we try to limit the surface that
@@ -68,21 +70,24 @@ def __init__(self, dataframe: bigframes.dataframe.DataFrame):
6870 self ._table_id = str (uuid .uuid4 ())
6971 self ._all_data_loaded = False
7072 self ._batch_iter : Optional [Iterator [pd .DataFrame ]] = None
73+ self ._batches : Optional [bigframes .core .blocks .PandasBatches ] = None
7174 self ._cached_batches : List [pd .DataFrame ] = []
7275
7376 # Respect display options for initial page size
7477 initial_page_size = bigframes .options .display .max_rows
7578
7679 try :
7780 # Fetches initial data batches and row count for display.
78- # `to_pandas_batches` provides an iterable of pandas DataFrames
79- # and eagerly retrieves the total row count
80- self ._batches = dataframe .to_pandas_batches (
81+ batches = dataframe .to_pandas_batches (
8182 page_size = initial_page_size ,
8283 )
84+ self ._batches = cast (bigframes .core .blocks .PandasBatches , batches )
8385
84- # Access the total_rows property directly
85- self .row_count = self ._batches .total_rows or 0
86+ # Use total_rows if available, otherwise default to 0.
87+ if self ._batches :
88+ self .row_count = self ._batches .total_rows or 0
89+ else :
90+ self .row_count = 0
8691 self .page_size = initial_page_size
8792
8893 # Generates the initial HTML table content
@@ -91,7 +96,7 @@ def __init__(self, dataframe: bigframes.dataframe.DataFrame):
9196 except Exception :
9297 self .row_count = 0
9398 self .page_size = initial_page_size
94- self ._batches = iter ([])
99+ self ._batches = None
95100 self .table_html = ""
96101
97102 @functools .cached_property
@@ -175,7 +180,10 @@ def _get_next_batch(self) -> bool:
175180 def _batch_iterator (self ) -> Iterator [pd .DataFrame ]:
176181 """Lazily initializes and returns the batch iterator."""
177182 if self ._batch_iter is None :
178- self ._batch_iter = iter (self ._batches )
183+ if self ._batches is None :
184+ self ._batch_iter = iter ([])
185+ else :
186+ self ._batch_iter = iter (self ._batches )
179187 return self ._batch_iter
180188
181189 @property
@@ -187,7 +195,8 @@ def _cached_data(self) -> pd.DataFrame:
187195
188196 def _reset_batches_for_new_page_size (self ):
189197 """Reset the batch iterator when page size changes."""
190- self ._batches = self ._dataframe .to_pandas_batches (page_size = self .page_size )
198+ batches = self ._dataframe .to_pandas_batches (page_size = self .page_size )
199+ self ._batches = typing .cast (bigframes .core .blocks .PandasBatches , batches )
191200 self ._cached_batches = []
192201 self ._batch_iter = None
193202 self ._all_data_loaded = False
0 commit comments