@@ -75,15 +75,16 @@ def __init__(self, dataframe: bigframes.dataframe.DataFrame):
7575 # Initialize data fetching attributes.
7676 self ._batches = dataframe .to_pandas_batches (page_size = initial_page_size )
7777
78- # set traitlets properties that trigger observers
79- self .page_size = initial_page_size
80-
8178 # len(dataframe) is expensive, since it will trigger a
8279 # SELECT COUNT(*) query. It is a must have however.
8380 # TODO(b/428238610): Start iterating over the result of `to_pandas_batches()`
8481 # before we get here so that the count might already be cached.
8582 self .row_count = len (dataframe )
8683
84+ # set traitlets properties that trigger observers
85+ self .page_size = initial_page_size
86+ self ._reset_batches_for_new_page_size ()
87+
8788 # get the initial page
8889 self ._set_table_html ()
8990
@@ -187,19 +188,21 @@ def _reset_batches_for_new_page_size(self):
187188
188189 def _set_table_html (self ):
189190 """Sets the current html data based on the current page and page size."""
190- start = self .page * self .page_size
191- end = start + self .page_size
192-
193- # fetch more data if the requested page is outside our cache
194- cached_data = self ._cached_data
195- while len (cached_data ) < end and not self ._all_data_loaded :
196- if self ._get_next_batch ():
197- cached_data = self ._cached_data
198- else :
199- break
200-
201- # Get the data for the current page
202- page_data = cached_data .iloc [start :end ]
191+ # For empty dataframe, render empty table with headers.
192+ if self .row_count == 0 :
193+ page_data = self ._cached_data
194+ else :
195+ start = self .page * self .page_size
196+ end = start + self .page_size
197+
198+ # fetch more data if the requested page is outside our cache
199+ cached_data = self ._cached_data
200+ while len (cached_data ) < end and not self ._all_data_loaded :
201+ if self ._get_next_batch ():
202+ cached_data = self ._cached_data
203+ else :
204+ break
205+ page_data = cached_data .iloc [start :end ]
203206
204207 # Generate HTML table
205208 self .table_html = bigframes .display .html .render_html (
@@ -218,8 +221,5 @@ def _page_size_changed(self, _change: Dict[str, Any]):
218221 # Reset the page to 0 when page size changes to avoid invalid page states
219222 self .page = 0
220223
221- # Reset batches to use new page size for future data fetching
222- self ._reset_batches_for_new_page_size ()
223-
224224 # Update the table display
225225 self ._set_table_html ()
0 commit comments