diff --git a/Cargo.lock b/Cargo.lock
index 9e8f82587e0..3f9fd960fc9 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -5046,9 +5046,9 @@ dependencies = [
[[package]]
name = "lance-namespace-reqwest-client"
-version = "0.11.0"
+version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a030196da1c994b63a96a4f0bf5b0cfa459fe6dadc9e962320246ca328da22a"
+checksum = "1d06b1fbb5d41f93bc652b61e2872af92e8a6c5f6b4ce8839a8ecfa05365d359"
dependencies = [
"reqwest 0.12.28",
"serde",
diff --git a/Cargo.toml b/Cargo.toml
index 8fe49615165..5c87a61b288 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -73,7 +73,7 @@ lance-io = { version = "=12.0.0-beta.5", path = "./rust/lance-io", default-featu
lance-linalg = { version = "=12.0.0-beta.5", path = "./rust/lance-linalg" }
lance-namespace = { version = "=12.0.0-beta.5", path = "./rust/lance-namespace" }
lance-namespace-impls = { version = "=12.0.0-beta.5", path = "./rust/lance-namespace-impls" }
-lance-namespace-reqwest-client = "0.11.0"
+lance-namespace-reqwest-client = "0.11.1"
lance-select = { version = "=12.0.0-beta.5", path = "./rust/lance-select" }
lance-tokenizer = { version = "=12.0.0-beta.5", path = "./rust/lance-tokenizer" }
lance-table = { version = "=12.0.0-beta.5", path = "./rust/lance-table" }
diff --git a/java/lance-jni/Cargo.lock b/java/lance-jni/Cargo.lock
index fd19722c1c5..56cd32cdc6f 100644
--- a/java/lance-jni/Cargo.lock
+++ b/java/lance-jni/Cargo.lock
@@ -4187,9 +4187,9 @@ dependencies = [
[[package]]
name = "lance-namespace-reqwest-client"
-version = "0.11.0"
+version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a030196da1c994b63a96a4f0bf5b0cfa459fe6dadc9e962320246ca328da22a"
+checksum = "1d06b1fbb5d41f93bc652b61e2872af92e8a6c5f6b4ce8839a8ecfa05365d359"
dependencies = [
"reqwest 0.12.28",
"serde",
diff --git a/java/pom.xml b/java/pom.xml
index 796d2d14031..87a72244c4f 100644
--- a/java/pom.xml
+++ b/java/pom.xml
@@ -111,12 +111,12 @@
org.lance
lance-namespace-core
- 0.7.7
+ 0.11.1
org.lance
lance-namespace-apache-client
- 0.7.7
+ 0.11.1
com.fasterxml.jackson.core
diff --git a/java/src/main/java/org/lance/namespace/DirectoryNamespace.java b/java/src/main/java/org/lance/namespace/DirectoryNamespace.java
index d26bbff9135..e9e8618c763 100644
--- a/java/src/main/java/org/lance/namespace/DirectoryNamespace.java
+++ b/java/src/main/java/org/lance/namespace/DirectoryNamespace.java
@@ -26,6 +26,7 @@
import org.lance.namespace.model.BatchDeleteTableVersionsRequest;
import org.lance.namespace.model.BatchDeleteTableVersionsResponse;
import org.lance.namespace.model.CountTableRowsRequest;
+import org.lance.namespace.model.CountTableRowsResponse;
import org.lance.namespace.model.CreateMaterializedViewRequest;
import org.lance.namespace.model.CreateMaterializedViewResponse;
import org.lance.namespace.model.CreateNamespaceRequest;
@@ -83,7 +84,9 @@
import org.lance.namespace.model.MergeInsertIntoTableRequest;
import org.lance.namespace.model.MergeInsertIntoTableResponse;
import org.lance.namespace.model.NamespaceExistsRequest;
+import org.lance.namespace.model.NamespaceExistsResponse;
import org.lance.namespace.model.QueryTableRequest;
+import org.lance.namespace.model.QueryTableResponse;
import org.lance.namespace.model.RegisterTableRequest;
import org.lance.namespace.model.RegisterTableResponse;
import org.lance.namespace.model.RenameTableRequest;
@@ -91,6 +94,7 @@
import org.lance.namespace.model.RestoreTableRequest;
import org.lance.namespace.model.RestoreTableResponse;
import org.lance.namespace.model.TableExistsRequest;
+import org.lance.namespace.model.TableExistsResponse;
import org.lance.namespace.model.UpdateTableRequest;
import org.lance.namespace.model.UpdateTableResponse;
import org.lance.namespace.model.UpdateTableSchemaMetadataRequest;
@@ -101,6 +105,7 @@
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.apache.arrow.memory.BufferAllocator;
import java.io.Closeable;
@@ -239,6 +244,7 @@ public class DirectoryNamespace implements LanceNamespace, Closeable {
private static ObjectMapper createObjectMapper() {
ObjectMapper mapper = new ObjectMapper();
+ mapper.registerModule(new JavaTimeModule());
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return mapper;
}
@@ -329,10 +335,11 @@ public DropNamespaceResponse dropNamespace(DropNamespaceRequest request) {
}
@Override
- public void namespaceExists(NamespaceExistsRequest request) {
+ public NamespaceExistsResponse namespaceExists(NamespaceExistsRequest request) {
ensureInitialized();
String requestJson = toJson(request);
namespaceExistsNative(nativeDirectoryNamespaceHandle, requestJson);
+ return new NamespaceExistsResponse();
}
@Override
@@ -360,10 +367,11 @@ public RegisterTableResponse registerTable(RegisterTableRequest request) {
}
@Override
- public void tableExists(TableExistsRequest request) {
+ public TableExistsResponse tableExists(TableExistsRequest request) {
ensureInitialized();
String requestJson = toJson(request);
tableExistsNative(nativeDirectoryNamespaceHandle, requestJson);
+ return new TableExistsResponse();
}
@Override
@@ -383,10 +391,11 @@ public DeregisterTableResponse deregisterTable(DeregisterTableRequest request) {
}
@Override
- public Long countTableRows(CountTableRowsRequest request) {
+ public CountTableRowsResponse countTableRows(CountTableRowsRequest request) {
ensureInitialized();
String requestJson = toJson(request);
- return countTableRowsNative(nativeDirectoryNamespaceHandle, requestJson);
+ Long count = countTableRowsNative(nativeDirectoryNamespaceHandle, requestJson);
+ return new CountTableRowsResponse().count(count);
}
@Override
@@ -451,10 +460,11 @@ public DeleteFromTableResponse deleteFromTable(DeleteFromTableRequest request) {
}
@Override
- public byte[] queryTable(QueryTableRequest request) {
+ public QueryTableResponse queryTable(QueryTableRequest request) {
ensureInitialized();
String requestJson = toJson(request);
- return queryTableNative(nativeDirectoryNamespaceHandle, requestJson);
+ byte[] data = queryTableNative(nativeDirectoryNamespaceHandle, requestJson);
+ return new QueryTableResponse().data(data);
}
@Override
diff --git a/java/src/main/java/org/lance/namespace/RestNamespace.java b/java/src/main/java/org/lance/namespace/RestNamespace.java
index 9cbbc588660..c477c5470ef 100644
--- a/java/src/main/java/org/lance/namespace/RestNamespace.java
+++ b/java/src/main/java/org/lance/namespace/RestNamespace.java
@@ -26,6 +26,7 @@
import org.lance.namespace.model.BatchDeleteTableVersionsRequest;
import org.lance.namespace.model.BatchDeleteTableVersionsResponse;
import org.lance.namespace.model.CountTableRowsRequest;
+import org.lance.namespace.model.CountTableRowsResponse;
import org.lance.namespace.model.CreateMaterializedViewRequest;
import org.lance.namespace.model.CreateMaterializedViewResponse;
import org.lance.namespace.model.CreateNamespaceRequest;
@@ -83,7 +84,9 @@
import org.lance.namespace.model.MergeInsertIntoTableRequest;
import org.lance.namespace.model.MergeInsertIntoTableResponse;
import org.lance.namespace.model.NamespaceExistsRequest;
+import org.lance.namespace.model.NamespaceExistsResponse;
import org.lance.namespace.model.QueryTableRequest;
+import org.lance.namespace.model.QueryTableResponse;
import org.lance.namespace.model.RegisterTableRequest;
import org.lance.namespace.model.RegisterTableResponse;
import org.lance.namespace.model.RenameTableRequest;
@@ -91,6 +94,7 @@
import org.lance.namespace.model.RestoreTableRequest;
import org.lance.namespace.model.RestoreTableResponse;
import org.lance.namespace.model.TableExistsRequest;
+import org.lance.namespace.model.TableExistsResponse;
import org.lance.namespace.model.UpdateTableRequest;
import org.lance.namespace.model.UpdateTableResponse;
import org.lance.namespace.model.UpdateTableSchemaMetadataRequest;
@@ -100,6 +104,7 @@
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.apache.arrow.memory.BufferAllocator;
import java.io.Closeable;
@@ -149,7 +154,8 @@ public class RestNamespace implements LanceNamespace, Closeable {
JniLoader.ensureLoaded();
}
- private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+ private static final ObjectMapper OBJECT_MAPPER =
+ new ObjectMapper().registerModule(new JavaTimeModule());
private long nativeRestNamespaceHandle;
private BufferAllocator allocator;
@@ -241,10 +247,11 @@ public DropNamespaceResponse dropNamespace(DropNamespaceRequest request) {
}
@Override
- public void namespaceExists(NamespaceExistsRequest request) {
+ public NamespaceExistsResponse namespaceExists(NamespaceExistsRequest request) {
ensureInitialized();
String requestJson = toJson(request);
namespaceExistsNative(nativeRestNamespaceHandle, requestJson);
+ return new NamespaceExistsResponse();
}
@Override
@@ -272,10 +279,11 @@ public RegisterTableResponse registerTable(RegisterTableRequest request) {
}
@Override
- public void tableExists(TableExistsRequest request) {
+ public TableExistsResponse tableExists(TableExistsRequest request) {
ensureInitialized();
String requestJson = toJson(request);
tableExistsNative(nativeRestNamespaceHandle, requestJson);
+ return new TableExistsResponse();
}
@Override
@@ -295,10 +303,11 @@ public DeregisterTableResponse deregisterTable(DeregisterTableRequest request) {
}
@Override
- public Long countTableRows(CountTableRowsRequest request) {
+ public CountTableRowsResponse countTableRows(CountTableRowsRequest request) {
ensureInitialized();
String requestJson = toJson(request);
- return countTableRowsNative(nativeRestNamespaceHandle, requestJson);
+ Long count = countTableRowsNative(nativeRestNamespaceHandle, requestJson);
+ return new CountTableRowsResponse().count(count);
}
@Override
@@ -362,10 +371,11 @@ public DeleteFromTableResponse deleteFromTable(DeleteFromTableRequest request) {
}
@Override
- public byte[] queryTable(QueryTableRequest request) {
+ public QueryTableResponse queryTable(QueryTableRequest request) {
ensureInitialized();
String requestJson = toJson(request);
- return queryTableNative(nativeRestNamespaceHandle, requestJson);
+ byte[] data = queryTableNative(nativeRestNamespaceHandle, requestJson);
+ return new QueryTableResponse().data(data);
}
@Override
diff --git a/java/src/test/java/org/lance/namespace/CustomNamespace.java b/java/src/test/java/org/lance/namespace/CustomNamespace.java
index e12489936b2..1d353756695 100644
--- a/java/src/test/java/org/lance/namespace/CustomNamespace.java
+++ b/java/src/test/java/org/lance/namespace/CustomNamespace.java
@@ -29,6 +29,7 @@
import org.lance.namespace.model.BatchDeleteTableVersionsRequest;
import org.lance.namespace.model.BatchDeleteTableVersionsResponse;
import org.lance.namespace.model.CountTableRowsRequest;
+import org.lance.namespace.model.CountTableRowsResponse;
import org.lance.namespace.model.CreateNamespaceRequest;
import org.lance.namespace.model.CreateNamespaceResponse;
import org.lance.namespace.model.CreateTableIndexRequest;
@@ -84,7 +85,9 @@
import org.lance.namespace.model.MergeInsertIntoTableRequest;
import org.lance.namespace.model.MergeInsertIntoTableResponse;
import org.lance.namespace.model.NamespaceExistsRequest;
+import org.lance.namespace.model.NamespaceExistsResponse;
import org.lance.namespace.model.QueryTableRequest;
+import org.lance.namespace.model.QueryTableResponse;
import org.lance.namespace.model.RegisterTableRequest;
import org.lance.namespace.model.RegisterTableResponse;
import org.lance.namespace.model.RenameTableRequest;
@@ -92,6 +95,7 @@
import org.lance.namespace.model.RestoreTableRequest;
import org.lance.namespace.model.RestoreTableResponse;
import org.lance.namespace.model.TableExistsRequest;
+import org.lance.namespace.model.TableExistsResponse;
import org.lance.namespace.model.UpdateTableRequest;
import org.lance.namespace.model.UpdateTableResponse;
import org.lance.namespace.model.UpdateTableSchemaMetadataRequest;
@@ -174,8 +178,8 @@ public DropNamespaceResponse dropNamespace(DropNamespaceRequest request) {
}
@Override
- public void namespaceExists(NamespaceExistsRequest request) {
- inner.namespaceExists(request);
+ public NamespaceExistsResponse namespaceExists(NamespaceExistsRequest request) {
+ return inner.namespaceExists(request);
}
// Table operations
@@ -196,8 +200,8 @@ public RegisterTableResponse registerTable(RegisterTableRequest request) {
}
@Override
- public void tableExists(TableExistsRequest request) {
- inner.tableExists(request);
+ public TableExistsResponse tableExists(TableExistsRequest request) {
+ return inner.tableExists(request);
}
@Override
@@ -211,7 +215,7 @@ public DeregisterTableResponse deregisterTable(DeregisterTableRequest request) {
}
@Override
- public Long countTableRows(CountTableRowsRequest request) {
+ public CountTableRowsResponse countTableRows(CountTableRowsRequest request) {
return inner.countTableRows(request);
}
@@ -250,7 +254,7 @@ public DeleteFromTableResponse deleteFromTable(DeleteFromTableRequest request) {
}
@Override
- public byte[] queryTable(QueryTableRequest request) {
+ public QueryTableResponse queryTable(QueryTableRequest request) {
return inner.queryTable(request);
}
diff --git a/java/src/test/java/org/lance/namespace/DirectoryNamespaceTest.java b/java/src/test/java/org/lance/namespace/DirectoryNamespaceTest.java
index c622bac9fcd..9a15063029c 100644
--- a/java/src/test/java/org/lance/namespace/DirectoryNamespaceTest.java
+++ b/java/src/test/java/org/lance/namespace/DirectoryNamespaceTest.java
@@ -1161,7 +1161,7 @@ void testCountTableRows() throws Exception {
// Count rows
CountTableRowsRequest countReq =
new CountTableRowsRequest().id(Arrays.asList("workspace", "test_table"));
- long count = namespaceClient.countTableRows(countReq);
+ long count = namespaceClient.countTableRows(countReq).getCount();
assertEquals(3, count);
}
@@ -1183,7 +1183,7 @@ void testCountTableRowsWithFilter() throws Exception {
new CountTableRowsRequest()
.id(Arrays.asList("workspace", "test_table"))
.predicate("age > 28");
- long count = namespaceClient.countTableRows(countReq);
+ long count = namespaceClient.countTableRows(countReq).getCount();
assertEquals(2, count); // Alice (30) and Charlie (35)
}
@@ -1210,7 +1210,7 @@ void testInsertIntoTable() throws Exception {
// Verify row count increased
CountTableRowsRequest countReq =
new CountTableRowsRequest().id(Arrays.asList("workspace", "test_table"));
- long count = namespaceClient.countTableRows(countReq);
+ long count = namespaceClient.countTableRows(countReq).getCount();
assertEquals(6, count);
}
@@ -1233,7 +1233,7 @@ void testQueryTable() throws Exception {
.id(Arrays.asList("workspace", "test_table"))
.k(10)
.vector(new QueryTableRequestVector());
- byte[] resultBytes = namespaceClient.queryTable(queryReq);
+ byte[] resultBytes = namespaceClient.queryTable(queryReq).getData();
assertNotNull(resultBytes);
assertTrue(resultBytes.length > 0);
}
diff --git a/python/Cargo.lock b/python/Cargo.lock
index a1a9492e26e..642f33d72eb 100644
--- a/python/Cargo.lock
+++ b/python/Cargo.lock
@@ -4492,9 +4492,9 @@ dependencies = [
[[package]]
name = "lance-namespace-reqwest-client"
-version = "0.11.0"
+version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a030196da1c994b63a96a4f0bf5b0cfa459fe6dadc9e962320246ca328da22a"
+checksum = "1d06b1fbb5d41f93bc652b61e2872af92e8a6c5f6b4ce8839a8ecfa05365d359"
dependencies = [
"reqwest 0.12.28",
"serde",
diff --git a/python/pyproject.toml b/python/pyproject.toml
index 91ea123b33f..f6972e03af5 100644
--- a/python/pyproject.toml
+++ b/python/pyproject.toml
@@ -1,7 +1,7 @@
[project]
name = "pylance"
dynamic = ["version"]
-dependencies = ["pyarrow>=14", "numpy>=1.22", "lance-namespace>=0.8.5,<0.9"]
+dependencies = ["pyarrow>=14", "numpy>=1.22", "lance-namespace>=0.11.1,<0.12"]
description = "python wrapper for Lance columnar format"
authors = [{ name = "Lance Devs", email = "dev@lance.org" }]
license = { file = "LICENSE" }
diff --git a/python/python/lance/namespace.py b/python/python/lance/namespace.py
index 6df5b9aa4bc..23c6b88cb3c 100644
--- a/python/python/lance/namespace.py
+++ b/python/python/lance/namespace.py
@@ -28,6 +28,7 @@
AlterTransactionResponse,
AnalyzeTableQueryPlanRequest,
CountTableRowsRequest,
+ CountTableRowsResponse,
CreateMaterializedViewRequest,
CreateMaterializedViewResponse,
CreateNamespaceRequest,
@@ -87,6 +88,8 @@
MergeInsertIntoTableRequest,
MergeInsertIntoTableResponse,
NamespaceExistsRequest,
+ NamespaceExistsResponse,
+ QueryTableResponse,
RefreshMaterializedViewRequest,
RefreshMaterializedViewResponse,
RegisterTableRequest,
@@ -96,6 +99,7 @@
RestoreTableRequest,
RestoreTableResponse,
TableExistsRequest,
+ TableExistsResponse,
UpdateTableRequest,
UpdateTableResponse,
UpdateTableSchemaMetadataRequest,
@@ -413,8 +417,11 @@ def drop_namespace(self, request: DropNamespaceRequest) -> DropNamespaceResponse
response_dict = self._inner.drop_namespace(request.model_dump())
return DropNamespaceResponse.from_dict(response_dict)
- def namespace_exists(self, request: NamespaceExistsRequest) -> None:
+ def namespace_exists(
+ self, request: NamespaceExistsRequest
+ ) -> NamespaceExistsResponse:
self._inner.namespace_exists(request.model_dump())
+ return NamespaceExistsResponse()
# Table operations
@@ -430,8 +437,9 @@ def register_table(self, request: RegisterTableRequest) -> RegisterTableResponse
response_dict = self._inner.register_table(request.model_dump())
return RegisterTableResponse.from_dict(response_dict)
- def table_exists(self, request: TableExistsRequest) -> None:
+ def table_exists(self, request: TableExistsRequest) -> TableExistsResponse:
self._inner.table_exists(request.model_dump())
+ return TableExistsResponse()
def drop_table(self, request: DropTableRequest) -> DropTableResponse:
response_dict = self._inner.drop_table(request.model_dump())
@@ -523,7 +531,9 @@ def batch_delete_table_versions(self, request: dict) -> dict:
# Data manipulation operations
- def count_table_rows(self, request: CountTableRowsRequest) -> int:
+ def count_table_rows(
+ self, request: CountTableRowsRequest
+ ) -> CountTableRowsResponse:
"""Count the number of rows in a table, optionally filtered by a predicate.
Parameters
@@ -533,10 +543,11 @@ def count_table_rows(self, request: CountTableRowsRequest) -> int:
Returns
-------
- int
- The number of rows matching the criteria
+ CountTableRowsResponse
+ Response whose ``count`` is the number of rows matching the criteria
"""
- return self._inner.count_table_rows(request.model_dump())
+ count = self._inner.count_table_rows(request.model_dump())
+ return CountTableRowsResponse(count=count)
def insert_into_table(
self, request: InsertIntoTableRequest, request_data: bytes
@@ -616,7 +627,7 @@ def delete_from_table(
response_dict = self._inner.delete_from_table(request.model_dump())
return DeleteFromTableResponse.from_dict(response_dict)
- def query_table(self, request) -> bytes:
+ def query_table(self, request) -> QueryTableResponse:
"""Query a table and return results as Arrow IPC.
Parameters
@@ -627,12 +638,13 @@ def query_table(self, request) -> bytes:
Returns
-------
- bytes
- Arrow IPC file format containing the query results
+ QueryTableResponse
+ Response whose ``data`` is the query results in Arrow IPC file format
"""
if hasattr(request, "model_dump"):
request = request.model_dump()
- return self._inner.query_table(request)
+ data = self._inner.query_table(request)
+ return QueryTableResponse(data=data)
# Index operations
@@ -1004,8 +1016,11 @@ def drop_namespace(self, request: DropNamespaceRequest) -> DropNamespaceResponse
response_dict = self._inner.drop_namespace(request.model_dump())
return DropNamespaceResponse.from_dict(response_dict)
- def namespace_exists(self, request: NamespaceExistsRequest) -> None:
+ def namespace_exists(
+ self, request: NamespaceExistsRequest
+ ) -> NamespaceExistsResponse:
self._inner.namespace_exists(request.model_dump())
+ return NamespaceExistsResponse()
# Table operations
@@ -1021,8 +1036,9 @@ def register_table(self, request: RegisterTableRequest) -> RegisterTableResponse
response_dict = self._inner.register_table(request.model_dump())
return RegisterTableResponse.from_dict(response_dict)
- def table_exists(self, request: TableExistsRequest) -> None:
+ def table_exists(self, request: TableExistsRequest) -> TableExistsResponse:
self._inner.table_exists(request.model_dump())
+ return TableExistsResponse()
def drop_table(self, request: DropTableRequest) -> DropTableResponse:
response_dict = self._inner.drop_table(request.model_dump())
@@ -1114,7 +1130,9 @@ def batch_delete_table_versions(self, request: dict) -> dict:
# Data manipulation operations
- def count_table_rows(self, request: CountTableRowsRequest) -> int:
+ def count_table_rows(
+ self, request: CountTableRowsRequest
+ ) -> CountTableRowsResponse:
"""Count the number of rows in a table, optionally filtered by a predicate.
Parameters
@@ -1124,10 +1142,11 @@ def count_table_rows(self, request: CountTableRowsRequest) -> int:
Returns
-------
- int
- The number of rows matching the criteria
+ CountTableRowsResponse
+ Response whose ``count`` is the number of rows matching the criteria
"""
- return self._inner.count_table_rows(request.model_dump())
+ count = self._inner.count_table_rows(request.model_dump())
+ return CountTableRowsResponse(count=count)
def insert_into_table(
self, request: InsertIntoTableRequest, request_data: bytes
@@ -1207,7 +1226,7 @@ def delete_from_table(
response_dict = self._inner.delete_from_table(request.model_dump())
return DeleteFromTableResponse.from_dict(response_dict)
- def query_table(self, request) -> bytes:
+ def query_table(self, request) -> QueryTableResponse:
"""Query a table and return results as Arrow IPC.
Parameters
@@ -1218,12 +1237,13 @@ def query_table(self, request) -> bytes:
Returns
-------
- bytes
- Arrow IPC file format containing the query results
+ QueryTableResponse
+ Response whose ``data`` is the query results in Arrow IPC file format
"""
if hasattr(request, "model_dump"):
request = request.model_dump()
- return self._inner.query_table(request)
+ data = self._inner.query_table(request)
+ return QueryTableResponse(data=data)
# Index operations
diff --git a/python/python/tests/compat/test_venv_manager.py b/python/python/tests/compat/test_venv_manager.py
index 57f8b94910a..18a576bf088 100644
--- a/python/python/tests/compat/test_venv_manager.py
+++ b/python/python/tests/compat/test_venv_manager.py
@@ -18,6 +18,9 @@
("6.0.0", "lance-namespace>=0.7.2,<0.8"),
("7.2.0b5", "lance-namespace>=0.8.0,<0.9"),
("7.2.0", "lance-namespace>=0.8.0,<0.9"),
+ ("12.0.0b5", "lance-namespace>=0.8.0,<0.9"),
+ ("12.0.0b6", "lance-namespace>=0.11.1,<0.12"),
+ ("12.0.0", "lance-namespace>=0.11.1,<0.12"),
],
)
def test_lance_namespace_dependency(version: str, expected: str):
diff --git a/python/python/tests/compat/venv_manager.py b/python/python/tests/compat/venv_manager.py
index 04e00d7af00..6b1e3b85e2d 100644
--- a/python/python/tests/compat/venv_manager.py
+++ b/python/python/tests/compat/venv_manager.py
@@ -76,9 +76,14 @@ def _pip_install(python: Union[str, Path], args: list[str]) -> None:
NAMESPACE_0_6_DEPENDENCY = "lance-namespace<0.7"
NAMESPACE_0_7_DEPENDENCY = "lance-namespace>=0.7.2,<0.8"
NAMESPACE_0_8_DEPENDENCY = "lance-namespace>=0.8.0,<0.9"
+NAMESPACE_0_11_DEPENDENCY = "lance-namespace>=0.11.1,<0.12"
def _lance_namespace_dependency(pylance_version: str) -> str:
+ # 12.0.0b5 is the last release published while pylance still pinned
+ # lance-namespace <0.9; releases cut after that carry the 0.11 range.
+ if Version(pylance_version) > Version("12.0.0b5"):
+ return NAMESPACE_0_11_DEPENDENCY
if Version(pylance_version) >= Version("7.2.0b5"):
return NAMESPACE_0_8_DEPENDENCY
if Version(pylance_version) >= Version("6.0.0b0"):
diff --git a/python/python/tests/test_namespace_dir.py b/python/python/tests/test_namespace_dir.py
index fa1bc93b422..72b89ffdcf2 100644
--- a/python/python/tests/test_namespace_dir.py
+++ b/python/python/tests/test_namespace_dir.py
@@ -27,6 +27,7 @@
from lance.namespace import LanceNamespace
from lance_namespace import (
CountTableRowsRequest,
+ CountTableRowsResponse,
CreateNamespaceRequest,
CreateNamespaceResponse,
CreateTableBranchRequest,
@@ -67,10 +68,13 @@
ListTableVersionsRequest,
ListTableVersionsResponse,
NamespaceExistsRequest,
+ NamespaceExistsResponse,
QueryTableRequest,
+ QueryTableResponse,
RegisterTableRequest,
RegisterTableResponse,
TableExistsRequest,
+ TableExistsResponse,
connect,
)
from lance_namespace.errors import (
@@ -107,7 +111,9 @@ def describe_namespace(
) -> DescribeNamespaceResponse:
return self._inner.describe_namespace(request)
- def namespace_exists(self, request: NamespaceExistsRequest) -> None:
+ def namespace_exists(
+ self, request: NamespaceExistsRequest
+ ) -> NamespaceExistsResponse:
return self._inner.namespace_exists(request)
def drop_namespace(self, request: DropNamespaceRequest) -> DropNamespaceResponse:
@@ -127,7 +133,7 @@ def declare_table(self, request: DeclareTableRequest) -> DeclareTableResponse:
def describe_table(self, request: DescribeTableRequest) -> DescribeTableResponse:
return self._inner.describe_table(request)
- def table_exists(self, request: TableExistsRequest) -> None:
+ def table_exists(self, request: TableExistsRequest) -> TableExistsResponse:
return self._inner.table_exists(request)
def drop_table(self, request: DropTableRequest) -> DropTableResponse:
@@ -184,7 +190,9 @@ def list_table_indices(
) -> ListTableIndicesResponse:
return self._inner.list_table_indices(request)
- def count_table_rows(self, request: CountTableRowsRequest) -> int:
+ def count_table_rows(
+ self, request: CountTableRowsRequest
+ ) -> CountTableRowsResponse:
return self._inner.count_table_rows(request)
def insert_into_table(
@@ -192,7 +200,7 @@ def insert_into_table(
) -> InsertIntoTableResponse:
return self._inner.insert_into_table(request, request_data)
- def query_table(self, request) -> bytes:
+ def query_table(self, request) -> QueryTableResponse:
# Accept both QueryTableRequest and dict, like DirectoryNamespace does
if hasattr(request, "model_dump"):
request = request.model_dump()
@@ -1416,7 +1424,7 @@ def test_count_table_rows(self, temp_ns_client):
# Count rows
count_req = CountTableRowsRequest(id=["workspace", "test_table"])
- count = temp_ns_client.count_table_rows(count_req)
+ count = temp_ns_client.count_table_rows(count_req).count
assert count == 3
def test_count_table_rows_with_filter(self, temp_ns_client):
@@ -1434,7 +1442,7 @@ def test_count_table_rows_with_filter(self, temp_ns_client):
count_req = CountTableRowsRequest(
id=["workspace", "test_table"], predicate="age > 28"
)
- count = temp_ns_client.count_table_rows(count_req)
+ count = temp_ns_client.count_table_rows(count_req).count
assert count == 2 # Alice (30) and Charlie (35)
def test_insert_into_table(self, temp_ns_client):
@@ -1464,7 +1472,7 @@ def test_insert_into_table(self, temp_ns_client):
# Verify row count increased
count_req = CountTableRowsRequest(id=["workspace", "test_table"])
- count = temp_ns_client.count_table_rows(count_req)
+ count = temp_ns_client.count_table_rows(count_req).count
assert count == 5
def test_query_table(self, temp_ns_client):
@@ -1480,7 +1488,7 @@ def test_query_table(self, temp_ns_client):
# Query table with empty vector (for non-vector queries)
query_req = QueryTableRequest(id=["workspace", "test_table"], k=10, vector={})
- result_bytes = temp_ns_client.query_table(query_req)
+ result_bytes = temp_ns_client.query_table(query_req).data
assert result_bytes is not None
assert len(result_bytes) > 0
@@ -1506,7 +1514,7 @@ def test_query_table_with_filter(self, temp_ns_client):
query_req = QueryTableRequest(
id=["workspace", "test_table"], filter="age >= 30", k=10, vector={}
)
- result_bytes = temp_ns_client.query_table(query_req)
+ result_bytes = temp_ns_client.query_table(query_req).data
reader = pa.ipc.open_file(pa.BufferReader(result_bytes))
result_table = reader.read_all()
assert result_table.num_rows == 2 # Alice and Charlie
diff --git a/python/python/tests/test_namespace_integration.py b/python/python/tests/test_namespace_integration.py
index fc08370d247..ea2c8f08c4d 100644
--- a/python/python/tests/test_namespace_integration.py
+++ b/python/python/tests/test_namespace_integration.py
@@ -56,9 +56,11 @@
ListTableVersionsRequest,
ListTableVersionsResponse,
NamespaceExistsRequest,
+ NamespaceExistsResponse,
RegisterTableRequest,
RegisterTableResponse,
TableExistsRequest,
+ TableExistsResponse,
)
@@ -86,7 +88,9 @@ def describe_namespace(
) -> DescribeNamespaceResponse:
return self._inner.describe_namespace(request)
- def namespace_exists(self, request: NamespaceExistsRequest) -> None:
+ def namespace_exists(
+ self, request: NamespaceExistsRequest
+ ) -> NamespaceExistsResponse:
return self._inner.namespace_exists(request)
def drop_namespace(self, request: DropNamespaceRequest) -> DropNamespaceResponse:
@@ -106,7 +110,7 @@ def declare_table(self, request: DeclareTableRequest) -> DeclareTableResponse:
def describe_table(self, request: DescribeTableRequest) -> DescribeTableResponse:
return self._inner.describe_table(request)
- def table_exists(self, request: TableExistsRequest) -> None:
+ def table_exists(self, request: TableExistsRequest) -> TableExistsResponse:
return self._inner.table_exists(request)
def drop_table(self, request: DropTableRequest) -> DropTableResponse:
diff --git a/python/uv.lock b/python/uv.lock
index 366ea8915ab..e50986d9b2c 100644
--- a/python/uv.lock
+++ b/python/uv.lock
@@ -1055,19 +1055,19 @@ wheels = [
[[package]]
name = "lance-namespace"
-version = "0.8.6"
+version = "0.11.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "lance-namespace-urllib3-client" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/af/12/f7ab93b29be3edbf5fc3610714bf2d06088e7f4524bfb38dfd6852458b08/lance_namespace-0.8.6.tar.gz", hash = "sha256:18232e721c8188145f4ec9389cc2dfbeeabf54a619d94885ea1b3375bee9f4af", size = 11529, upload-time = "2026-06-12T17:36:41.651Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/bf/93/da5f7fcac690db9b282a3439ed9e34960c147619a0d6e1f4eb8cd240e7a5/lance_namespace-0.11.1.tar.gz", hash = "sha256:f67cfbbe0647b7cb42f23b673e7edf8a75b7d8a047265a916492f8d247ee1bc2", size = 11631, upload-time = "2026-08-18T17:40:06.294Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/a0/1b/5b1668ee2dc8910965f390640359112a31157092fcf8e000b89c79b58708/lance_namespace-0.8.6-py3-none-any.whl", hash = "sha256:571eae34f9aad70e5b05020416c2860889b9ec82993ccd0eb015e7b39c3ea309", size = 13383, upload-time = "2026-06-12T17:36:43.456Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/bc/601f2b3cc4cfa0070d858a33223bc823fffdd7981a25c45984a5216ca952/lance_namespace-0.11.1-py3-none-any.whl", hash = "sha256:07643fce9a42ad4d58cc8bf91e3f592bc7f4cbd8d0ad5233223506debf67551c", size = 13507, upload-time = "2026-08-18T17:40:03.561Z" },
]
[[package]]
name = "lance-namespace-urllib3-client"
-version = "0.8.6"
+version = "0.11.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "pydantic" },
@@ -1075,9 +1075,9 @@ dependencies = [
{ name = "typing-extensions" },
{ name = "urllib3" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/c7/80/fb224b4a89c1c1638cde949cb6cce6c3aca7759effbfea46a3d9c3960b21/lance_namespace_urllib3_client-0.8.6.tar.gz", hash = "sha256:b6fb1d306e74a7576e5309919020be744527de484a63dbf5eed10f8b368548df", size = 228772, upload-time = "2026-06-12T17:36:42.609Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/e4/c5/2bdd0ff98b469894c8a73be809d26ffdad5402517b0e5f9e758026cba29e/lance_namespace_urllib3_client-0.11.1.tar.gz", hash = "sha256:145a9e9424d7597487249b5b95ee274423bf2910e1a9160b6a07b676b61ea46a", size = 237345, upload-time = "2026-08-18T17:40:07.308Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/c5/90/1e27de15cd1b16785a1c7312beb0a59e75c8344a815f600f58173a565bd1/lance_namespace_urllib3_client-0.8.6-py3-none-any.whl", hash = "sha256:9d78249c3fb15aa3d15d668f78f04a275af3d08d800a7027492f37996ac4968b", size = 369950, upload-time = "2026-06-12T17:36:40.438Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/2a/eaaefd55d1190291207049fedc6b3eb22b506e57d6de91bae46bbaaa9c60/lance_namespace_urllib3_client-0.11.1-py3-none-any.whl", hash = "sha256:36537f529294da6d884ba0fe783704483f0a75463497c7705fd083a4d0257990", size = 406311, upload-time = "2026-08-18T17:40:04.842Z" },
]
[[package]]
@@ -2472,7 +2472,7 @@ requires-dist = [
{ name = "duckdb", marker = "extra == 'tests'", specifier = ">=1.5.0,<1.6.0" },
{ name = "geoarrow-rust-core", marker = "extra == 'geo'" },
{ name = "geoarrow-rust-io", marker = "extra == 'geo'" },
- { name = "lance-namespace", specifier = ">=0.8.5,<0.9" },
+ { name = "lance-namespace", specifier = ">=0.11.1,<0.12" },
{ name = "ml-dtypes", marker = "extra == 'tests'" },
{ name = "numpy", specifier = ">=1.22" },
{ name = "opentelemetry-api", marker = "extra == 'otel'" },