Skip to content

Commit d8d6852

Browse files
committed
refactor(api)!: execute and to_pandas methods now require expr as positional-only
1 parent 298bf73 commit d8d6852

File tree

13 files changed

+176
-45
lines changed

13 files changed

+176
-45
lines changed

ibis/backends/__init__.py

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ def _import_pyarrow():
106106
def to_pandas(
107107
self,
108108
expr: ir.Expr,
109+
/,
109110
*,
110111
params: Mapping[ir.Scalar, Any] | None = None,
111112
limit: int | str | None = None,
@@ -1169,8 +1170,29 @@ def compile(
11691170
"""Compile an expression."""
11701171
return self.compiler.to_sql(expr, params=params)
11711172

1172-
def execute(self, expr: ir.Expr) -> Any:
1173-
"""Execute an expression."""
1173+
def execute(
1174+
self,
1175+
expr: ir.Expr,
1176+
/,
1177+
*,
1178+
params: Mapping[ir.Scalar, Any] | None = None,
1179+
limit: int | str | None = None,
1180+
**kwargs: Any,
1181+
) -> pd.DataFrame | pd.Series | Any:
1182+
"""Execute an Ibis expression and return a pandas `DataFrame`, `Series`, or scalar.
1183+
1184+
Parameters
1185+
----------
1186+
expr
1187+
Ibis expression to execute.
1188+
params
1189+
Mapping of scalar parameter expressions to value.
1190+
limit
1191+
An integer to effect a specific row limit. A value of `None` means
1192+
no limit. The default is in `ibis/config.py`.
1193+
kwargs
1194+
Keyword arguments
1195+
"""
11741196

11751197
@abc.abstractmethod
11761198
def create_table(

ibis/backends/bigquery/__init__.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -807,7 +807,15 @@ def to_pyarrow_batches(
807807
(_postprocess_arrow(b, colnames) for b in batch_iter),
808808
)
809809

810-
def execute(self, expr, params=None, limit="default", **kwargs):
810+
def execute(
811+
self,
812+
expr: ir.Expr,
813+
/,
814+
*,
815+
params: Mapping[ir.Scalar, Any] | None = None,
816+
limit: int | str | None = None,
817+
**kwargs: Any,
818+
) -> pd.DataFrame | pd.Series | Any:
811819
"""Compile and execute the given Ibis expression.
812820
813821
Compile and execute Ibis expression using this backend client

ibis/backends/clickhouse/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,8 @@ def batcher(
399399
def execute(
400400
self,
401401
expr: ir.Expr,
402+
/,
403+
*,
402404
limit: str | None = "default",
403405
params: Mapping[ir.Scalar, Any] | None = None,
404406
external_tables: Mapping[str, pd.DataFrame] | None = None,

ibis/backends/datafusion/__init__.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -540,8 +540,18 @@ def to_pyarrow(self, expr: ir.Expr, **kwargs: Any) -> pa.Table:
540540
arrow_table = batch_reader.read_all()
541541
return expr.__pyarrow_result__(arrow_table)
542542

543-
def execute(self, expr: ir.Expr, **kwargs: Any):
544-
batch_reader = self.to_pyarrow_batches(expr, **kwargs)
543+
def execute(
544+
self,
545+
expr: ir.Expr,
546+
/,
547+
*,
548+
params: Mapping[ir.Scalar, Any] | None = None,
549+
limit: int | str | None = None,
550+
**kwargs: Any,
551+
) -> pd.DataFrame | pd.Series | Any:
552+
batch_reader = self.to_pyarrow_batches(
553+
expr, params=params, limit=limit, **kwargs
554+
)
545555
return expr.__pandas_result__(
546556
batch_reader.read_pandas(timestamp_as_object=True)
547557
)

ibis/backends/duckdb/__init__.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1318,15 +1318,19 @@ def to_pyarrow(
13181318
def execute(
13191319
self,
13201320
expr: ir.Expr,
1321-
params: Mapping | None = None,
1322-
limit: str | None = "default",
1323-
**_: Any,
1324-
) -> Any:
1321+
/,
1322+
*,
1323+
params: Mapping[ir.Scalar, Any] | None = None,
1324+
limit: int | str | None = None,
1325+
**kwargs: Any,
1326+
) -> pd.DataFrame | pd.Series | Any:
13251327
"""Execute an expression."""
13261328
import pandas as pd
13271329
import pyarrow.types as pat
13281330

1329-
table = self._to_duckdb_relation(expr, params=params, limit=limit).arrow()
1331+
table = self._to_duckdb_relation(
1332+
expr, params=params, limit=limit, **kwargs
1333+
).arrow()
13301334

13311335
df = pd.DataFrame(
13321336
{

ibis/backends/flink/__init__.py

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -386,11 +386,32 @@ def _register_in_memory_table(self, op: ops.InMemoryTable) -> None:
386386
def _finalize_memtable(self, name: str) -> None:
387387
self.drop_view(name, temp=True, force=True)
388388

389-
def execute(self, expr: ir.Expr, **kwargs: Any) -> Any:
390-
"""Execute an expression."""
389+
def execute(
390+
self,
391+
expr: ir.Expr,
392+
/,
393+
*,
394+
params: Mapping[ir.Scalar, Any] | None = None,
395+
limit: int | str | None = None,
396+
**kwargs: Any,
397+
) -> pd.DataFrame | pd.Series | Any:
398+
"""Execute an Ibis expression and return a pandas `DataFrame`, `Series`, or scalar.
399+
400+
Parameters
401+
----------
402+
expr
403+
Ibis expression to execute.
404+
params
405+
Mapping of scalar parameter expressions to value.
406+
limit
407+
An integer to effect a specific row limit. A value of `None` means
408+
no limit. The default is in `ibis/config.py`.
409+
kwargs
410+
Keyword arguments
411+
"""
391412
self._run_pre_execute_hooks(expr)
392413

393-
sql = self.compile(expr.as_table(), **kwargs)
414+
sql = self.compile(expr.as_table(), params=params, **kwargs)
394415
df = self._table_env.sql_query(sql).to_pandas()
395416

396417
return expr.__pandas_result__(df)

ibis/backends/mysql/__init__.py

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -368,13 +368,32 @@ def list_tables(
368368
return self._filter_with_like(map(itemgetter(0), out), like)
369369

370370
def execute(
371-
self, expr: ir.Expr, limit: str | None = "default", **kwargs: Any
372-
) -> Any:
373-
"""Execute an expression."""
371+
self,
372+
expr: ir.Expr,
373+
/,
374+
*,
375+
params: Mapping[ir.Scalar, Any] | None = None,
376+
limit: int | str | None = None,
377+
**kwargs: Any,
378+
) -> pd.DataFrame | pd.Series | Any:
379+
"""Execute an Ibis expression and return a pandas `DataFrame`, `Series`, or scalar.
380+
381+
Parameters
382+
----------
383+
expr
384+
Ibis expression to execute.
385+
params
386+
Mapping of scalar parameter expressions to value.
387+
limit
388+
An integer to effect a specific row limit. A value of `None` means
389+
no limit. The default is in `ibis/config.py`.
390+
kwargs
391+
Keyword arguments
392+
"""
374393

375394
self._run_pre_execute_hooks(expr)
376395
table = expr.as_table()
377-
sql = self.compile(table, limit=limit, **kwargs)
396+
sql = self.compile(table, limit=limit, params=params, **kwargs)
378397

379398
schema = table.schema()
380399

ibis/backends/polars/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,8 @@ def _to_dataframe(
450450
def execute(
451451
self,
452452
expr: ir.Expr,
453+
/,
454+
*,
453455
params: Mapping[ir.Expr, object] | None = None,
454456
limit: int | None = None,
455457
streaming: bool = False,

ibis/backends/pyspark/__init__.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -459,10 +459,12 @@ def raw_sql(self, query: str | sg.Expression, **kwargs: Any) -> Any:
459459
def execute(
460460
self,
461461
expr: ir.Expr,
462-
params: Mapping | None = None,
463-
limit: str | None = "default",
462+
/,
463+
*,
464+
params: Mapping[ir.Scalar, Any] | None = None,
465+
limit: int | str | None = None,
464466
**kwargs: Any,
465-
) -> Any:
467+
) -> pd.DataFrame | pd.Series | Any:
466468
"""Execute an expression."""
467469

468470
self._run_pre_execute_hooks(expr)

ibis/backends/sql/__init__.py

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -212,12 +212,31 @@ def drop_view(
212212
def execute(
213213
self,
214214
expr: ir.Expr,
215-
params: Mapping | None = None,
216-
limit: str | None = "default",
215+
/,
216+
*,
217+
params: Mapping[ir.Scalar, Any] | None = None,
218+
limit: int | str | None = None,
217219
**kwargs: Any,
218-
) -> Any:
219-
"""Execute an expression."""
220+
) -> pd.DataFrame | pd.Series | Any:
221+
"""Execute an Ibis expression and return a pandas `DataFrame`, `Series`, or scalar.
222+
223+
Parameters
224+
----------
225+
expr
226+
Ibis expression to execute.
227+
params
228+
Mapping of scalar parameter expressions to value.
229+
limit
230+
An integer to effect a specific row limit. A value of `None` means
231+
no limit. The default is in `ibis/config.py`.
232+
kwargs
233+
Keyword arguments
220234
235+
Returns
236+
-------
237+
DataFrame | Series | scalar
238+
The result of the expression execution.
239+
"""
221240
self._run_pre_execute_hooks(expr)
222241
table = expr.as_table()
223242
sql = self.compile(table, params=params, limit=limit, **kwargs)

ibis/expr/types/core.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -399,10 +399,11 @@ def get_backend(self) -> BaseBackend:
399399

400400
def execute(
401401
self,
402+
*,
402403
limit: int | str | None = "default",
403404
params: Mapping[ir.Value, Any] | None = None,
404405
**kwargs: Any,
405-
):
406+
) -> pd.DataFrame | pd.Series | Any:
406407
"""Execute an expression against its backend if one exists.
407408
408409
Parameters

ibis/expr/types/generic.py

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
if TYPE_CHECKING:
2020
import datetime
2121
import uuid
22+
from collections.abc import Mapping
2223

2324
import pandas as pd
2425
import polars as pl
@@ -1330,29 +1331,31 @@ def desc(self, nulls_first: bool = False) -> ir.Value:
13301331
"""
13311332
return ops.SortKey(self, ascending=False, nulls_first=nulls_first).to_expr()
13321333

1333-
def to_pandas(self, **kwargs) -> pd.Series:
1334-
"""Convert an expression to a pandas or scalar object.
1334+
def to_pandas(
1335+
self,
1336+
*,
1337+
params: Mapping[ir.Scalar, Any] | None = None,
1338+
limit: int | str | None = None,
1339+
**kwargs: Any,
1340+
) -> pd.Series | Any:
1341+
"""Convert a table expression to a pandas DataFrame.
13351342
13361343
Parameters
13371344
----------
1345+
params
1346+
Mapping of scalar parameter expressions to value.
1347+
limit
1348+
An integer to effect a specific row limit. A value of `None` means
1349+
no limit. The default is in `ibis/config.py`.
13381350
kwargs
1339-
Same as keyword arguments to [`execute`](#ibis.expr.types.core.Expr.execute)
1351+
Keyword arguments
13401352
1341-
Examples
1342-
--------
1343-
>>> import ibis
1344-
>>> ibis.options.interactive = True
1345-
>>> t = ibis.examples.penguins.fetch()
1346-
>>> t.to_pandas(limit=5)
1347-
species island bill_length_mm ... body_mass_g sex year
1348-
0 Adelie Torgersen 39.1 ... 3750.0 male 2007
1349-
1 Adelie Torgersen 39.5 ... 3800.0 female 2007
1350-
2 Adelie Torgersen 40.3 ... 3250.0 female 2007
1351-
3 Adelie Torgersen NaN ... NaN None 2007
1352-
4 Adelie Torgersen 36.7 ... 3450.0 female 2007
1353-
[5 rows x 8 columns]
1353+
Returns
1354+
-------
1355+
DataFrame
1356+
The result of executing the expression as a pandas DataFrame
13541357
"""
1355-
return self.execute(**kwargs)
1358+
return self.execute(params=params, limit=limit, **kwargs)
13561359

13571360

13581361
@public

ibis/expr/types/relations.py

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3580,15 +3580,33 @@ def sql(self, query: str, dialect: str | None = None) -> ir.Table:
35803580
node = ops.SQLStringView(child=self.op(), query=query, schema=schema)
35813581
return node.to_expr()
35823582

3583-
def to_pandas(self, **kwargs) -> pd.DataFrame:
3583+
def to_pandas(
3584+
self,
3585+
*,
3586+
params: Mapping[ir.Scalar, Any] | None = None,
3587+
limit: int | str | None = None,
3588+
**kwargs: Any,
3589+
) -> pd.DataFrame:
35843590
"""Convert a table expression to a pandas DataFrame.
35853591
35863592
Parameters
35873593
----------
3594+
expr
3595+
Ibis expression to execute.
3596+
params
3597+
Mapping of scalar parameter expressions to value.
3598+
limit
3599+
An integer to effect a specific row limit. A value of `None` means
3600+
no limit. The default is in `ibis/config.py`.
35883601
kwargs
3589-
Same as keyword arguments to [`execute`](./expression-generic.qmd#ibis.expr.types.core.Expr.execute)
3602+
Keyword arguments
3603+
3604+
Returns
3605+
-------
3606+
DataFrame
3607+
The result of executing the expression as a pandas DataFrame
35903608
"""
3591-
return self.execute(**kwargs)
3609+
return self.execute(params=params, limit=limit, **kwargs)
35923610

35933611
def cache(self) -> Table:
35943612
"""Cache the provided expression.

0 commit comments

Comments
 (0)