Hello LanceDB team, while developing using `lancedb` as a library I encountered a typing problem affecting IDE hints and completions during development. --- ## Current Situation Currently, the abstract base class `lancedb.query:LanceQueryBuilder` uses method chaining to build up the search parameters, where the methods have `LanceQueryBuilder` as a return type hint. This leads to two issues: 1. Implementing subclasses of `LanceQueryBuilder` need to override methods to modify the return type hint, even when they don't need to change its implementation, just to ensure adequate IDE hints and completions. 2. When using method chaining the first method directly inherited from the abstract `LanceQueryBuilder` causes the inferred type to switch back to `LanceQueryBuilder`. So even when the type starts from `lancdb.table:LanceTable.search(query_type="vector", ...)` and therefor correctly is inferred as `LanceVectorQueryBuilder`, after calling e.g. `LanceVectorQueryBuilder.limit(...)` it is seen as the abstract `LanceQueryBuilder` from that point on. ### Example of current situation  ## Proposed changes I propose to change the return type hints of the corresponding methods (including classmethod `create()`) in the abstract base class `LanceQueryBuilder` from `LanceQueryBuilder` to `Self`. `Self` is already imported in the module: ```py if sys.version_info >= (3, 11): from typing import Self else: from typing_extensions import Self ``` ### Further possible changes Additionally, the implementing subclasses could also change the return type hints to `Self` to potentially allow for further inheritance easily. > [!NOTE] > **However this is not part of this pull request as of writing.** ### Example after proposed changes  --- Best regards Martin
LanceDB is an open-source database for vector-search built with persistent storage, which greatly simplifies retrieval, filtering and management of embeddings.
The key features of LanceDB include:
-
Production-scale vector search with no servers to manage.
-
Store, query and filter vectors, metadata and multi-modal data (text, images, videos, point clouds, and more).
-
Support for vector similarity search, full-text search and SQL.
-
Native Python and Javascript/Typescript support.
-
Zero-copy, automatic versioning, manage versions of your data without needing extra infrastructure.
-
GPU support in building vector index(*).
-
Ecosystem integrations with LangChain 🦜️🔗, LlamaIndex 🦙, Apache-Arrow, Pandas, Polars, DuckDB and more on the way.
LanceDB's core is written in Rust 🦀 and is built using Lance, an open-source columnar format designed for performant ML workloads.
Quick Start
Javascript
npm install @lancedb/lancedb
import * as lancedb from "@lancedb/lancedb";
const db = await lancedb.connect("data/sample-lancedb");
const table = await db.createTable("vectors", [
{ id: 1, vector: [0.1, 0.2], item: "foo", price: 10 },
{ id: 2, vector: [1.1, 1.2], item: "bar", price: 50 },
], {mode: 'overwrite'});
const query = table.vectorSearch([0.1, 0.3]).limit(2);
const results = await query.toArray();
// You can also search for rows by specific criteria without involving a vector search.
const rowsByCriteria = await table.query().where("price >= 10").toArray();
Python
pip install lancedb
import lancedb
uri = "data/sample-lancedb"
db = lancedb.connect(uri)
table = db.create_table("my_table",
data=[{"vector": [3.1, 4.1], "item": "foo", "price": 10.0},
{"vector": [5.9, 26.5], "item": "bar", "price": 20.0}])
result = table.search([100, 100]).limit(2).to_pandas()