Skip to content

Commit 6f34ba1

Browse files
committed
feat: update DataFrame view methods and deprecate old API
1 parent 2604477 commit 6f34ba1

4 files changed

Lines changed: 38 additions & 10 deletions

File tree

docs/source/user-guide/io/table_provider.rst

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ Once you have this library available, you can construct a
5151
:py:class:`~datafusion.catalog.Table` in Python and register it with the
5252
``SessionContext``. Tables can be created either from the PyCapsule exposed by
5353
your Rust provider or from an existing :py:class:`~datafusion.dataframe.DataFrame`
54-
view.
54+
view created via ``df.into_view()`` (or the alias ``Table.from_dataframe(df)``).
5555

5656
.. code-block:: python
5757
@@ -63,10 +63,13 @@ view.
6363
table_from_capsule = Table.from_capsule(provider)
6464
6565
df = ctx.from_pydict({"a": [1]})
66-
table_from_view = Table.from_view(df)
66+
provider_from_view = df.into_view()
6767
6868
ctx.register_table("capsule_table", table_from_capsule)
69-
ctx.register_table("view_table", table_from_view)
69+
ctx.register_table("view_table", provider_from_view)
7070
7171
ctx.table("capsule_table").show()
7272
ctx.table("view_table").show()
73+
74+
``Table.from_dataframe(df)`` is available as an alias for ``df.into_view()``,
75+
but the latter is the preferred API.

python/datafusion/dataframe.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,13 @@ def __init__(self, df: DataFrameInternal) -> None:
309309
self.df = df
310310

311311
def into_view(self) -> TableProviderInternal:
312-
"""Convert ``DataFrame`` into a ``TableProvider`` view for registration."""
312+
"""Convert ``DataFrame`` into a ``TableProvider`` view for registration.
313+
314+
This is the preferred way to obtain a view for
315+
:py:meth:`~datafusion.context.SessionContext.register_table`.
316+
``TableProvider.from_dataframe`` calls this method under the hood,
317+
and the older ``TableProvider.from_view`` helper is deprecated.
318+
"""
313319
return self.df.into_view()
314320

315321
def __getitem__(self, key: str | list[str]) -> DataFrame:

src/dataframe.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ impl PyDataFrame {
268268
}
269269
}
270270

271-
pub(crate) fn into_view_provider(&self) -> Arc<dyn TableProvider + Send> {
271+
pub(crate) fn to_view_provider(&self) -> Arc<dyn TableProvider + Send> {
272272
self.df.as_ref().clone().into_view()
273273
}
274274

@@ -409,7 +409,7 @@ impl PyDataFrame {
409409
// Call the underlying Rust DataFrame::into_view method.
410410
// Note that the Rust method consumes self; here we clone the inner Arc<DataFrame>
411411
// so that we don’t invalidate this PyDataFrame.
412-
let table_provider = self.into_view_provider();
412+
let table_provider = self.to_view_provider();
413413
Ok(PyTableProvider::new(table_provider))
414414
}
415415

src/table.rs

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ use std::sync::Arc;
2020

2121
use datafusion::datasource::TableProvider;
2222
use datafusion_ffi::table_provider::{FFI_TableProvider, ForeignTableProvider};
23+
use pyo3::exceptions::PyDeprecationWarning;
2324
use pyo3::prelude::*;
2425
use pyo3::types::PyCapsule;
2526

@@ -53,21 +54,39 @@ impl PyTableProvider {
5354
#[staticmethod]
5455
pub fn from_capsule(capsule: Bound<'_, PyAny>) -> PyResult<Self> {
5556
let capsule = capsule.downcast::<PyCapsule>().map_err(py_datafusion_err)?;
56-
validate_pycapsule(&capsule, "datafusion_table_provider")?;
57+
validate_pycapsule(capsule, "datafusion_table_provider")?;
5758

5859
let provider = unsafe { capsule.reference::<FFI_TableProvider>() };
5960
let provider: ForeignTableProvider = provider.into();
6061

6162
Ok(Self::new(Arc::new(provider)))
6263
}
6364

64-
/// Create a `TableProvider` from a DataFrame by converting it into a view
65+
/// Create a `TableProvider` from a `DataFrame`.
66+
///
67+
/// This method simply delegates to `DataFrame.into_view`.
6568
#[staticmethod]
66-
pub fn from_view(df: &PyDataFrame) -> PyDataFusionResult<Self> {
67-
let table_provider = df.into_view_provider();
69+
pub fn from_dataframe(df: &PyDataFrame) -> PyDataFusionResult<Self> {
70+
let table_provider = df.to_view_provider();
6871
Ok(Self::new(table_provider))
6972
}
7073

74+
/// Create a `TableProvider` from a `DataFrame` by converting it into a view.
75+
///
76+
/// Deprecated: prefer `DataFrame.into_view` or
77+
/// `TableProvider.from_dataframe` instead.
78+
#[staticmethod]
79+
pub fn from_view(py: Python<'_>, df: &PyDataFrame) -> PyDataFusionResult<Self> {
80+
py.import("warnings")?.call_method1(
81+
"warn",
82+
(
83+
"PyTableProvider.from_view() is deprecated; use DataFrame.into_view() or TableProvider.from_dataframe() instead.",
84+
py.get_type::<PyDeprecationWarning>(),
85+
),
86+
)?;
87+
Self::from_dataframe(df)
88+
}
89+
7190
fn __datafusion_table_provider__<'py>(
7291
&self,
7392
py: Python<'py>,

0 commit comments

Comments
 (0)