Add tests

This commit is contained in:
Mubelotix
2025-07-08 10:01:35 +02:00
parent 4d8d34cc93
commit 40e7284d70
3 changed files with 164 additions and 1 deletions

View File

@ -731,3 +731,165 @@ async fn test_filterable_attributes_priority() {
) )
.await; .await;
} }
#[actix_rt::test]
async fn test_vector_filter() {
let index = crate::vector::shared_index_for_fragments().await;
let (value, _code) = index.search_post(json!({
"filter": "_vectors EXISTS",
"attributesToRetrieve": ["id"]
})).await;
snapshot!(value, @r#"
{
"hits": [
{
"id": 0
},
{
"id": 1
},
{
"id": 2
},
{
"id": 3
}
],
"query": "",
"processingTimeMs": "[duration]",
"limit": 20,
"offset": 0,
"estimatedTotalHits": 4
}
"#);
let (value, _code) = index.search_post(json!({
"filter": "_vectors.other EXISTS",
"attributesToRetrieve": ["id"]
})).await;
snapshot!(value, @r#"
{
"hits": [],
"query": "",
"processingTimeMs": "[duration]",
"limit": 20,
"offset": 0,
"estimatedTotalHits": 0
}
"#);
// This one is counterintuitive, but it is the same as the previous one.
// It's because userProvided is interpreted as an embedder name
let (value, _code) = index.search_post(json!({
"filter": "_vectors.userProvided EXISTS",
"attributesToRetrieve": ["id"]
})).await;
snapshot!(value, @r#"
{
"hits": [],
"query": "",
"processingTimeMs": "[duration]",
"limit": 20,
"offset": 0,
"estimatedTotalHits": 0
}
"#);
let (value, _code) = index.search_post(json!({
"filter": "_vectors.rest EXISTS",
"attributesToRetrieve": ["id"]
})).await;
snapshot!(value, @r#"
{
"hits": [
{
"id": 0
},
{
"id": 1
},
{
"id": 2
},
{
"id": 3
}
],
"query": "",
"processingTimeMs": "[duration]",
"limit": 20,
"offset": 0,
"estimatedTotalHits": 4
}
"#);
let (value, _code) = index.search_post(json!({
"filter": "_vectors.rest.userProvided EXISTS",
"attributesToRetrieve": ["id"]
})).await;
snapshot!(value, @r#"
{
"hits": [
{
"id": 1
}
],
"query": "",
"processingTimeMs": "[duration]",
"limit": 20,
"offset": 0,
"estimatedTotalHits": 1
}
"#);
let (value, _code) = index.search_post(json!({
"filter": "_vectors.rest.fragments.withBreed EXISTS",
"attributesToRetrieve": ["id"]
})).await;
snapshot!(value, @r#"
{
"hits": [
{
"id": 2
},
{
"id": 3
}
],
"query": "",
"processingTimeMs": "[duration]",
"limit": 20,
"offset": 0,
"estimatedTotalHits": 2
}
"#);
let (value, _code) = index.search_post(json!({
"filter": "_vectors.rest.fragments.basic EXISTS",
"attributesToRetrieve": ["id"]
})).await;
snapshot!(value, @r#"
{
"hits": [
{
"id": 0
},
{
"id": 1
},
{
"id": 2
},
{
"id": 3
}
],
"query": "",
"processingTimeMs": "[duration]",
"limit": 20,
"offset": 0,
"estimatedTotalHits": 4
}
"#);
}

View File

@ -10,7 +10,7 @@ use crate::common::{Owned, Shared};
use crate::json; use crate::json;
use crate::vector::{GetAllDocumentsOptions, Server}; use crate::vector::{GetAllDocumentsOptions, Server};
async fn shared_index_for_fragments() -> Index<'static, Shared> { pub async fn shared_index_for_fragments() -> Index<'static, Shared> {
static INDEX: OnceCell<(Server<Shared>, String)> = OnceCell::const_new(); static INDEX: OnceCell<(Server<Shared>, String)> = OnceCell::const_new();
let (server, uid) = INDEX let (server, uid) = INDEX
.get_or_init(|| async { .get_or_init(|| async {

View File

@ -14,6 +14,7 @@ use meilisearch::option::MaxThreads;
use crate::common::index::Index; use crate::common::index::Index;
use crate::common::{default_settings, GetAllDocumentsOptions, Server}; use crate::common::{default_settings, GetAllDocumentsOptions, Server};
use crate::json; use crate::json;
pub use fragments::shared_index_for_fragments;
async fn get_server_vector() -> Server { async fn get_server_vector() -> Server {
Server::new().await Server::new().await