Fix error checking

This commit is contained in:
ManyTheFish 2023-12-14 11:21:25 +01:00 committed by Louis Dureuil
parent 93dcbf598d
commit f3f3944469
No known key found for this signature in database
4 changed files with 35 additions and 9 deletions

View File

@ -463,7 +463,7 @@ impl fmt::Display for deserr_codes::InvalidSearchSemanticRatio {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!( write!(
f, f,
"the value of `semanticRatio` is invalid, expected a value between `0.0` and `1.0`." "the value of `semanticRatio` is invalid, expected a float between `0.0` and `1.0`."
) )
} }
} }

View File

@ -78,7 +78,28 @@ pub struct SearchQueryGet {
#[deserr(default, error = DeserrQueryParamError<InvalidEmbedder>)] #[deserr(default, error = DeserrQueryParamError<InvalidEmbedder>)]
pub hybrid_embedder: Option<String>, pub hybrid_embedder: Option<String>,
#[deserr(default, error = DeserrQueryParamError<InvalidSearchSemanticRatio>)] #[deserr(default, error = DeserrQueryParamError<InvalidSearchSemanticRatio>)]
pub hybrid_semantic_ratio: Option<SemanticRatio>, pub hybrid_semantic_ratio: Option<SemanticRatioGet>,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, deserr::Deserr)]
#[deserr(try_from(String) = TryFrom::try_from -> InvalidSearchSemanticRatio)]
pub struct SemanticRatioGet(SemanticRatio);
impl std::convert::TryFrom<String> for SemanticRatioGet {
type Error = InvalidSearchSemanticRatio;
fn try_from(s: String) -> Result<Self, Self::Error> {
let f: f32 = s.parse().map_err(|_| InvalidSearchSemanticRatio)?;
Ok(SemanticRatioGet(SemanticRatio::try_from(f)?))
}
}
impl std::ops::Deref for SemanticRatioGet {
type Target = SemanticRatio;
fn deref(&self) -> &Self::Target {
&self.0
}
} }
impl From<SearchQueryGet> for SearchQuery { impl From<SearchQueryGet> for SearchQuery {
@ -93,13 +114,15 @@ impl From<SearchQueryGet> for SearchQuery {
let hybrid = match (other.hybrid_embedder, other.hybrid_semantic_ratio) { let hybrid = match (other.hybrid_embedder, other.hybrid_semantic_ratio) {
(None, None) => None, (None, None) => None,
(None, Some(semantic_ratio)) => Some(HybridQuery { semantic_ratio, embedder: None }), (None, Some(semantic_ratio)) => {
Some(HybridQuery { semantic_ratio: *semantic_ratio, embedder: None })
}
(Some(embedder), None) => Some(HybridQuery { (Some(embedder), None) => Some(HybridQuery {
semantic_ratio: DEFAULT_SEMANTIC_RATIO(), semantic_ratio: DEFAULT_SEMANTIC_RATIO(),
embedder: Some(embedder), embedder: Some(embedder),
}), }),
(Some(embedder), Some(semantic_ratio)) => { (Some(embedder), Some(semantic_ratio)) => {
Some(HybridQuery { semantic_ratio, embedder: Some(embedder) }) Some(HybridQuery { semantic_ratio: *semantic_ratio, embedder: Some(embedder) })
} }
}; };

View File

@ -100,6 +100,7 @@ pub struct HybridQuery {
#[derive(Debug, Clone, Copy, Default, PartialEq, Deserr)] #[derive(Debug, Clone, Copy, Default, PartialEq, Deserr)]
#[deserr(try_from(f32) = TryFrom::try_from -> InvalidSearchSemanticRatio)] #[deserr(try_from(f32) = TryFrom::try_from -> InvalidSearchSemanticRatio)]
pub struct SemanticRatio(f32); pub struct SemanticRatio(f32);
impl std::convert::TryFrom<f32> for SemanticRatio { impl std::convert::TryFrom<f32> for SemanticRatio {
type Error = InvalidSearchSemanticRatio; type Error = InvalidSearchSemanticRatio;
@ -383,7 +384,9 @@ fn prepare_search<'t>(
} }
if let Some(ref query) = query.q { if let Some(ref query) = query.q {
// if !matches!(query.hybrid, query.) {
search.query(query); search.query(query);
// }
} }
if let Some(ref searchable) = query.attributes_to_search_on { if let Some(ref searchable) = query.attributes_to_search_on {

View File

@ -68,7 +68,7 @@ async fn simple_search() {
) )
.await; .await;
snapshot!(code, @"200 OK"); snapshot!(code, @"200 OK");
snapshot!(response["hits"], @r###"[{"title":"Captain Marvel","desc":"a Shazam ersatz","id":"3","_vectors":{"default":[2.0,3.0]},"_semanticScore":0.99029034},{"title":"Captain Planet","desc":"He's not part of the Marvel Cinematic Universe","id":"2","_vectors":{"default":[1.0,2.0]},"_semanticScore":0.97434163},{"title":"Shazam!","desc":"a Captain Marvel ersatz","id":"1","_vectors":{"default":[1.0,3.0]},"_semanticScore":0.9472136}]"###); snapshot!(response["hits"], @r###"[{"title":"Captain Planet","desc":"He's not part of the Marvel Cinematic Universe","id":"2","_vectors":{"default":[1.0,2.0]},"_semanticScore":0.97434163},{"title":"Captain Marvel","desc":"a Shazam ersatz","id":"3","_vectors":{"default":[2.0,3.0]},"_semanticScore":0.99029034},{"title":"Shazam!","desc":"a Captain Marvel ersatz","id":"1","_vectors":{"default":[1.0,3.0]},"_semanticScore":0.9472136}]"###);
let (response, code) = index let (response, code) = index
.search_post( .search_post(
@ -92,7 +92,7 @@ async fn invalid_semantic_ratio() {
snapshot!(code, @"400 Bad Request"); snapshot!(code, @"400 Bad Request");
snapshot!(response, @r###" snapshot!(response, @r###"
{ {
"message": "Invalid value at `.hybrid.semanticRatio`: the value of `semanticRatio` is invalid, expected a value between `0.0` and `1.0`.", "message": "Invalid value at `.hybrid.semanticRatio`: the value of `semanticRatio` is invalid, expected a float between `0.0` and `1.0`.",
"code": "invalid_search_semantic_ratio", "code": "invalid_search_semantic_ratio",
"type": "invalid_request", "type": "invalid_request",
"link": "https://docs.meilisearch.com/errors#invalid_search_semantic_ratio" "link": "https://docs.meilisearch.com/errors#invalid_search_semantic_ratio"
@ -107,7 +107,7 @@ async fn invalid_semantic_ratio() {
snapshot!(code, @"400 Bad Request"); snapshot!(code, @"400 Bad Request");
snapshot!(response, @r###" snapshot!(response, @r###"
{ {
"message": "Invalid value at `.hybrid.semanticRatio`: the value of `semanticRatio` is invalid, expected a value between `0.0` and `1.0`.", "message": "Invalid value at `.hybrid.semanticRatio`: the value of `semanticRatio` is invalid, expected a float between `0.0` and `1.0`.",
"code": "invalid_search_semantic_ratio", "code": "invalid_search_semantic_ratio",
"type": "invalid_request", "type": "invalid_request",
"link": "https://docs.meilisearch.com/errors#invalid_search_semantic_ratio" "link": "https://docs.meilisearch.com/errors#invalid_search_semantic_ratio"
@ -125,7 +125,7 @@ async fn invalid_semantic_ratio() {
snapshot!(code, @"400 Bad Request"); snapshot!(code, @"400 Bad Request");
snapshot!(response, @r###" snapshot!(response, @r###"
{ {
"message": "Invalid value type for parameter `hybridSemanticRatio`: expected a string, but found a string: `1.2`", "message": "Invalid value in parameter `hybridSemanticRatio`: the value of `semanticRatio` is invalid, expected a float between `0.0` and `1.0`.",
"code": "invalid_search_semantic_ratio", "code": "invalid_search_semantic_ratio",
"type": "invalid_request", "type": "invalid_request",
"link": "https://docs.meilisearch.com/errors#invalid_search_semantic_ratio" "link": "https://docs.meilisearch.com/errors#invalid_search_semantic_ratio"
@ -143,7 +143,7 @@ async fn invalid_semantic_ratio() {
snapshot!(code, @"400 Bad Request"); snapshot!(code, @"400 Bad Request");
snapshot!(response, @r###" snapshot!(response, @r###"
{ {
"message": "Invalid value type for parameter `hybridSemanticRatio`: expected a string, but found a string: `-0.2`", "message": "Invalid value in parameter `hybridSemanticRatio`: the value of `semanticRatio` is invalid, expected a float between `0.0` and `1.0`.",
"code": "invalid_search_semantic_ratio", "code": "invalid_search_semantic_ratio",
"type": "invalid_request", "type": "invalid_request",
"link": "https://docs.meilisearch.com/errors#invalid_search_semantic_ratio" "link": "https://docs.meilisearch.com/errors#invalid_search_semantic_ratio"