From d744438a175fc0558a2b8beda573c4ad7e110f59 Mon Sep 17 00:00:00 2001 From: yanghua Date: Tue, 28 Oct 2025 17:42:22 +0800 Subject: [PATCH 1/2] refactor(python): remove explain_plan api from sql --- python/python/lance/dataset.py | 18 ------------------ python/python/tests/test_dataset.py | 5 +++++ python/src/dataset.rs | 1 - rust/lance/src/dataset/sql.rs | 2 ++ 4 files changed, 7 insertions(+), 19 deletions(-) diff --git a/python/python/lance/dataset.py b/python/python/lance/dataset.py index c182b56c95d..08116488996 100644 --- a/python/python/lance/dataset.py +++ b/python/python/lance/dataset.py @@ -3575,24 +3575,6 @@ def to_stream_reader(self) -> pa.RecordBatchReader: """ return self._query.to_stream_reader() - def explain_plan(self, verbose: bool = False, analyze: bool = False) -> str: - """ - Explain the query plan. - - Parameters - ---------- - verbose: bool, default False - If True, print the verbose plan. - analyze: bool, default False - If True, analyze the query and print the statistics. - - Returns - ------- - str - The query plan. - """ - return self._query.explain_plan(verbose, analyze) - class SqlQueryBuilder: """ diff --git a/python/python/tests/test_dataset.py b/python/python/tests/test_dataset.py index 624ba05c433..e8ee50294b1 100644 --- a/python/python/tests/test_dataset.py +++ b/python/python/tests/test_dataset.py @@ -4043,6 +4043,11 @@ def test_dataset_sql(tmp_path: Path): expected = pa.table({"id": [2, 3], "value": ["b", "c"]}) assert pa.Table.from_batches(result) == expected + # Validate explain_plan() returns readable plan text and contains recognizable markers + plan_text = query.explain_plan() + assert isinstance(plan_text, str) and len(plan_text) > 0 + assert any(tok in plan_text for tok in ["ProjectionExec", "LanceRead", "logical_plan", "Plan with Metrics"]) + stream_result = ( ds.sql("SELECT value FROM test WHERE id = 1") .table_name("test") diff --git a/python/src/dataset.rs b/python/src/dataset.rs index 72a3b58d459..48f6fcb90ca 100644 --- a/python/src/dataset.rs +++ b/python/src/dataset.rs @@ -2620,7 +2620,6 @@ impl SqlQuery { Box::new(LanceReader::from_stream(dataset_stream)); Python::with_gil(|py| reader.into_pyarrow(py)) } -} #[pyclass(name = "SqlQueryBuilder", module = "_lib", subclass)] #[derive(Clone)] diff --git a/rust/lance/src/dataset/sql.rs b/rust/lance/src/dataset/sql.rs index 4c58375619e..a93baa3bbf0 100644 --- a/rust/lance/src/dataset/sql.rs +++ b/rust/lance/src/dataset/sql.rs @@ -7,6 +7,8 @@ use arrow_array::RecordBatch; use datafusion::dataframe::DataFrame; use datafusion::execution::SendableRecordBatchStream; use datafusion::prelude::SessionContext; +use datafusion::physical_plan::display::DisplayableExecutionPlan; +use lance_datafusion::exec::{analyze_plan, LanceExecutionOptions}; use futures::TryStreamExt; use std::sync::Arc; From 6df524d8d986e0757fb75b86ac763158c7b54413 Mon Sep 17 00:00:00 2001 From: yanghua Date: Tue, 28 Oct 2025 19:32:37 +0800 Subject: [PATCH 2/2] minor fix --- python/python/tests/test_dataset.py | 5 ----- python/src/dataset.rs | 1 + rust/lance/src/dataset/sql.rs | 2 -- 3 files changed, 1 insertion(+), 7 deletions(-) diff --git a/python/python/tests/test_dataset.py b/python/python/tests/test_dataset.py index e8ee50294b1..624ba05c433 100644 --- a/python/python/tests/test_dataset.py +++ b/python/python/tests/test_dataset.py @@ -4043,11 +4043,6 @@ def test_dataset_sql(tmp_path: Path): expected = pa.table({"id": [2, 3], "value": ["b", "c"]}) assert pa.Table.from_batches(result) == expected - # Validate explain_plan() returns readable plan text and contains recognizable markers - plan_text = query.explain_plan() - assert isinstance(plan_text, str) and len(plan_text) > 0 - assert any(tok in plan_text for tok in ["ProjectionExec", "LanceRead", "logical_plan", "Plan with Metrics"]) - stream_result = ( ds.sql("SELECT value FROM test WHERE id = 1") .table_name("test") diff --git a/python/src/dataset.rs b/python/src/dataset.rs index 48f6fcb90ca..72a3b58d459 100644 --- a/python/src/dataset.rs +++ b/python/src/dataset.rs @@ -2620,6 +2620,7 @@ impl SqlQuery { Box::new(LanceReader::from_stream(dataset_stream)); Python::with_gil(|py| reader.into_pyarrow(py)) } +} #[pyclass(name = "SqlQueryBuilder", module = "_lib", subclass)] #[derive(Clone)] diff --git a/rust/lance/src/dataset/sql.rs b/rust/lance/src/dataset/sql.rs index a93baa3bbf0..4c58375619e 100644 --- a/rust/lance/src/dataset/sql.rs +++ b/rust/lance/src/dataset/sql.rs @@ -7,8 +7,6 @@ use arrow_array::RecordBatch; use datafusion::dataframe::DataFrame; use datafusion::execution::SendableRecordBatchStream; use datafusion::prelude::SessionContext; -use datafusion::physical_plan::display::DisplayableExecutionPlan; -use lance_datafusion::exec::{analyze_plan, LanceExecutionOptions}; use futures::TryStreamExt; use std::sync::Arc;