Skip to content

Commit e694f0e

Browse files
cpsievertclaude
andcommitted
refactor(pkg-py): inline duckdb result conversion calls
Remove duckdb_result_to_polars and duckdb_result_to_pandas functions as thin abstractions that don't add value. Inline the .pl() and .df() calls directly in PolarsLazySource. Co-Authored-By: Claude Opus 4.5 <[email protected]>
1 parent 03e4e11 commit e694f0e

File tree

3 files changed

+4
-66
lines changed

3 files changed

+4
-66
lines changed

pkg-py/src/querychat/_datasource.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@
1010
from sqlalchemy.sql import sqltypes
1111

1212
from ._df_compat import (
13-
duckdb_result_to_pandas,
14-
duckdb_result_to_polars,
1513
read_sql_pandas,
1614
read_sql_polars,
1715
read_sql_pyarrow,
@@ -320,9 +318,9 @@ def execute_query(self, query: str) -> IntoDataFrameT:
320318
check_query(query)
321319
result = self._conn.execute(query)
322320
if self._df_lib == "polars":
323-
return duckdb_result_to_polars(result)
321+
return result.pl()
324322
else:
325-
return duckdb_result_to_pandas(result)
323+
return result.df()
326324

327325
def test_query(
328326
self, query: str, *, require_all_columns: bool = False
@@ -352,10 +350,7 @@ def test_query(
352350
"""
353351
check_query(query)
354352
result = self._conn.execute(f"{query} LIMIT 1")
355-
if self._df_lib == "polars":
356-
native_result = duckdb_result_to_polars(result)
357-
else:
358-
native_result = duckdb_result_to_pandas(result)
353+
native_result = result.pl() if self._df_lib == "polars" else result.df()
359354

360355
if require_all_columns:
361356
result_columns = set(native_result.columns)

pkg-py/src/querychat/_df_compat.py

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import narwhals.stable.v1 as nw
1010

1111
if TYPE_CHECKING:
12-
import duckdb
1312
from sqlalchemy.engine import Connection
1413
from sqlalchemy.sql.elements import TextClause
1514

@@ -57,20 +56,6 @@ def read_sql_pyarrow(query: TextClause, conn: Connection):
5756
return pl.read_database(query, connection=conn).to_arrow()
5857

5958

60-
def duckdb_result_to_polars(
61-
result: duckdb.DuckDBPyRelation | duckdb.DuckDBPyConnection,
62-
):
63-
"""Convert DuckDB result to native polars DataFrame."""
64-
return result.pl()
65-
66-
67-
def duckdb_result_to_pandas(
68-
result: duckdb.DuckDBPyRelation | duckdb.DuckDBPyConnection,
69-
):
70-
"""Convert DuckDB result to native pandas DataFrame."""
71-
return result.df()
72-
73-
7459
def read_csv(path: str) -> nw.DataFrame:
7560
try:
7661
import polars as pl # pyright: ignore[reportMissingImports]

pkg-py/tests/test_df_compat.py

Lines changed: 1 addition & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,9 @@
44
import tempfile
55
from pathlib import Path
66

7-
import duckdb
87
import narwhals.stable.v1 as nw
98
import pytest
10-
from querychat._df_compat import duckdb_result_to_polars, read_csv
9+
from querychat._df_compat import read_csv
1110

1211
# Check if polars and pyarrow are available (both needed for DuckDB + polars)
1312
try:
@@ -60,47 +59,6 @@ def test_read_csv_data_integrity(self, gzip_csv_file):
6059
assert names == ["Alice", "Bob", "Charlie"]
6160

6261

63-
@pytest.mark.skipif(
64-
not HAS_POLARS_WITH_PYARROW, reason="polars or pyarrow not installed"
65-
)
66-
class TestDuckdbResultToPolars:
67-
"""Tests for the duckdb_result_to_polars function."""
68-
69-
@pytest.fixture
70-
def duckdb_conn(self):
71-
"""Create a DuckDB connection with test data."""
72-
conn = duckdb.connect(":memory:")
73-
conn.execute("CREATE TABLE test (id INTEGER, name VARCHAR, value DOUBLE)")
74-
conn.execute("INSERT INTO test VALUES (1, 'Alice', 10.5)")
75-
conn.execute("INSERT INTO test VALUES (2, 'Bob', 20.5)")
76-
yield conn
77-
conn.close()
78-
79-
def test_duckdb_result_returns_polars_dataframe(self, duckdb_conn):
80-
"""Test that duckdb_result_to_polars returns a polars DataFrame."""
81-
result = duckdb_conn.execute("SELECT * FROM test")
82-
df = duckdb_result_to_polars(result)
83-
assert isinstance(df, pl.DataFrame)
84-
85-
def test_duckdb_result_has_correct_data(self, duckdb_conn):
86-
"""Test that duckdb_result_to_polars preserves data correctly."""
87-
result = duckdb_conn.execute("SELECT * FROM test ORDER BY id")
88-
df = duckdb_result_to_polars(result)
89-
90-
assert df.shape == (2, 3)
91-
assert list(df.columns) == ["id", "name", "value"]
92-
assert df["id"].to_list() == [1, 2]
93-
assert df["name"].to_list() == ["Alice", "Bob"]
94-
95-
def test_duckdb_result_empty_query(self, duckdb_conn):
96-
"""Test handling of empty query results."""
97-
result = duckdb_conn.execute("SELECT * FROM test WHERE id > 100")
98-
df = duckdb_result_to_polars(result)
99-
100-
assert isinstance(df, pl.DataFrame)
101-
assert df.shape == (0, 3)
102-
103-
10462
@pytest.mark.skipif(
10563
not HAS_POLARS_WITH_PYARROW, reason="polars or pyarrow not installed"
10664
)

0 commit comments

Comments
 (0)