Skip to content

Commit 3cec096

Browse files
committed
fix(duckdb): support materializing enum types to pyarrow
1 parent bb9a84f commit 3cec096

File tree

2 files changed

+24
-10
lines changed

2 files changed

+24
-10
lines changed

ibis/backends/duckdb/__init__.py

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1417,13 +1417,24 @@ def to_pyarrow(
14171417
params: Mapping[ir.Scalar, Any] | None = None,
14181418
limit: int | str | None = None,
14191419
**kwargs: Any,
1420+
) -> pa.Table | pa.Array | pa.Scalar:
1421+
pa_table = self._to_pyarrow_table(expr, params=params, limit=limit, **kwargs)
1422+
return expr.__pyarrow_result__(pa_table)
1423+
1424+
def _to_pyarrow_table(
1425+
self,
1426+
expr: ir.Expr,
1427+
/,
1428+
*,
1429+
params: Mapping[ir.Scalar, Any] | None = None,
1430+
limit: int | str | None = None,
1431+
**kwargs: Any,
14201432
) -> pa.Table:
14211433
from ibis.backends.duckdb.converter import DuckDBPyArrowData
14221434

1423-
table = self._to_duckdb_relation(
1424-
expr, params=params, limit=limit, **kwargs
1425-
).arrow()
1426-
return expr.__pyarrow_result__(table, data_mapper=DuckDBPyArrowData)
1435+
rel = self._to_duckdb_relation(expr, params=params, limit=limit, **kwargs)
1436+
pa_table = rel.arrow()
1437+
return DuckDBPyArrowData.convert_table(pa_table, expr.as_table().schema())
14271438

14281439
def execute(
14291440
self,
@@ -1441,9 +1452,7 @@ def execute(
14411452

14421453
from ibis.backends.duckdb.converter import DuckDBPandasData
14431454

1444-
rel = self._to_duckdb_relation(expr, params=params, limit=limit, **kwargs)
1445-
table = rel.arrow()
1446-
1455+
pa_table = self._to_pyarrow_table(expr, params=params, limit=limit, **kwargs)
14471456
df = pd.DataFrame(
14481457
{
14491458
name: (
@@ -1457,11 +1466,10 @@ def execute(
14571466
)
14581467
else col.to_pandas()
14591468
)
1460-
for name, col in zip(table.column_names, table.columns)
1469+
for name, col in zip(pa_table.column_names, pa_table.columns)
14611470
}
14621471
)
1463-
df = DuckDBPandasData.convert_table(df, expr.as_table().schema())
1464-
return expr.__pandas_result__(df)
1472+
return expr.__pandas_result__(df, data_mapper=DuckDBPandasData)
14651473

14661474
@util.experimental
14671475
def to_torch(

ibis/backends/duckdb/tests/test_datatypes.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,3 +174,9 @@ def test_null_scalar(con, lit, monkeypatch):
174174
│ NULL │
175175
└──────┘"""
176176
assert result == expected
177+
178+
179+
def test_enum():
180+
con = ibis.duckdb.connect()
181+
con.raw_sql("CREATE TABLE t (e ENUM('a', 'b')); INSERT INTO t VALUES ('a'), ('b');")
182+
assert con.table("t").e.to_pandas().tolist() == ["a", "b"]

0 commit comments

Comments
 (0)