feat: add explain plan remote api (#2263)

Add explain plan remote api
This commit is contained in:
LuQQiu
2025-03-26 11:22:40 -07:00
committed by GitHub
parent 79fa745130
commit 698f329598
7 changed files with 235 additions and 138 deletions

View File

@@ -94,6 +94,7 @@ class Query:
def nearest_to(self, query_vec: pa.Array) -> VectorQuery: ...
def nearest_to_text(self, query: dict) -> FTSQuery: ...
async def execute(self, max_batch_length: Optional[int]) -> RecordBatchStream: ...
async def explain_plan(self, verbose: Optional[bool]) -> str: ...
def to_query_request(self) -> PyQueryRequest: ...
class FTSQuery:
@@ -108,7 +109,6 @@ class FTSQuery:
def add_query_vector(self, query_vec: pa.Array) -> None: ...
def nearest_to(self, query_vec: pa.Array) -> HybridQuery: ...
async def execute(self, max_batch_length: Optional[int]) -> RecordBatchStream: ...
async def explain_plan(self) -> str: ...
def to_query_request(self) -> PyQueryRequest: ...
class VectorQuery:

View File

@@ -657,7 +657,7 @@ class LanceQueryBuilder(ABC):
-------
plan : str
""" # noqa: E501
return self._table._explain_plan(self.to_query_object())
return self._table._explain_plan(self.to_query_object(), verbose=verbose)
def vector(self, vector: Union[np.ndarray, list]) -> Self:
"""Set the vector to search for.

View File

@@ -365,6 +365,9 @@ class RemoteTable(Table):
return pa.RecordBatchReader.from_batches(async_iter.schema, iter_sync())
def _explain_plan(self, query: Query, verbose: Optional[bool] = False) -> str:
return LOOP.run(self._table._explain_plan(query, verbose))
def merge_insert(self, on: Union[str, Iterable[str]]) -> LanceMergeInsertBuilder:
"""Returns a [`LanceMergeInsertBuilder`][lancedb.merge.LanceMergeInsertBuilder]
that can be used to create a "merge insert" operation.

View File

@@ -1007,6 +1007,9 @@ class Table(ABC):
self, query: Query, batch_size: Optional[int] = None
) -> pa.RecordBatchReader: ...
@abstractmethod
def _explain_plan(self, query: Query, verbose: Optional[bool] = False) -> str: ...
@abstractmethod
def _do_merge(
self,
@@ -2292,8 +2295,8 @@ class LanceTable(Table):
return pa.RecordBatchReader.from_batches(async_iter.schema, iter_sync())
def _explain_plan(self, query: Query) -> str:
return LOOP.run(self._table._explain_plan(query))
def _explain_plan(self, query: Query, verbose: Optional[bool] = False) -> str:
return LOOP.run(self._table._explain_plan(query, verbose))
def _do_merge(
self,
@@ -3358,10 +3361,10 @@ class AsyncTable:
return await async_query.to_batches(max_batch_length=batch_size)
async def _explain_plan(self, query: Query) -> str:
async def _explain_plan(self, query: Query, verbose: Optional[bool]) -> str:
# This method is used by the sync table
async_query = self._sync_query_to_async(query)
return await async_query.explain_plan()
return await async_query.explain_plan(verbose)
async def _do_merge(
self,

View File

@@ -271,7 +271,7 @@ impl Query {
})
}
fn explain_plan(self_: PyRef<'_, Self>, verbose: bool) -> PyResult<Bound<'_, PyAny>> {
pub fn explain_plan(self_: PyRef<'_, Self>, verbose: bool) -> PyResult<Bound<'_, PyAny>> {
let inner = self_.inner.clone();
future_into_py(self_.py(), async move {
inner
@@ -470,7 +470,7 @@ impl VectorQuery {
})
}
fn explain_plan(self_: PyRef<'_, Self>, verbose: bool) -> PyResult<Bound<'_, PyAny>> {
pub fn explain_plan(self_: PyRef<'_, Self>, verbose: bool) -> PyResult<Bound<'_, PyAny>> {
let inner = self_.inner.clone();
future_into_py(self_.py(), async move {
inner