move search logic out of search route

This commit is contained in:
mpostma 2020-05-28 19:35:34 +02:00
parent 35605c9f57
commit 8cd224899c

View File

@ -8,7 +8,7 @@ use serde::Deserialize;
use serde_json::Value;
use crate::error::{Error, FacetCountError, ResponseError};
use crate::helpers::meilisearch::IndexSearchExt;
use crate::helpers::meilisearch::{IndexSearchExt, SearchResult};
use crate::helpers::Authentication;
use crate::routes::IndexParam;
use crate::Data;
@ -36,16 +36,12 @@ struct SearchQuery {
facets_distribution: Option<String>,
}
#[get("/indexes/{index_uid}/search", wrap = "Authentication::Public")]
async fn search_with_url_query(
data: web::Data<Data>,
path: web::Path<IndexParam>,
params: web::Query<SearchQuery>,
) -> Result<HttpResponse, ResponseError> {
impl SearchQuery {
fn search(&self, index_uid: &str, data: web::Data<Data>) -> Result<SearchResult, ResponseError> {
let index = data
.db
.open_index(&path.index_uid)
.ok_or(Error::index_not_found(&path.index_uid))?;
.open_index(index_uid)
.ok_or(Error::index_not_found(index_uid))?;
let reader = data.db.main_read_txn()?;
let schema = index
@ -53,18 +49,18 @@ async fn search_with_url_query(
.schema(&reader)?
.ok_or(Error::internal("Impossible to retrieve the schema"))?;
let mut search_builder = index.new_search(params.q.clone());
let mut search_builder = index.new_search(self.q.clone());
if let Some(offset) = params.offset {
if let Some(offset) = self.offset {
search_builder.offset(offset);
}
if let Some(limit) = params.limit {
if let Some(limit) = self.limit {
search_builder.limit(limit);
}
let available_attributes = schema.displayed_name();
let mut restricted_attributes: HashSet<&str>;
match &params.attributes_to_retrieve {
match &self.attributes_to_retrieve {
Some(attributes_to_retrieve) => {
let attributes_to_retrieve: HashSet<&str> = attributes_to_retrieve.split(',').collect();
if attributes_to_retrieve.contains("*") {
@ -86,12 +82,12 @@ async fn search_with_url_query(
}
}
if let Some(ref facet_filters) = params.facet_filters {
if let Some(ref facet_filters) = self.facet_filters {
let attrs = index.main.attributes_for_faceting(&reader)?.unwrap_or_default();
search_builder.add_facet_filters(FacetFilter::from_str(facet_filters, &schema, &attrs)?);
}
if let Some(facets) = &params.facets_distribution {
if let Some(facets) = &self.facets_distribution {
match index.main.attributes_for_faceting(&reader)? {
Some(ref attrs) => {
let field_ids = prepare_facet_list(&facets, &schema, attrs)?;
@ -101,8 +97,8 @@ async fn search_with_url_query(
}
}
if let Some(attributes_to_crop) = &params.attributes_to_crop {
let default_length = params.crop_length.unwrap_or(200);
if let Some(attributes_to_crop) = &self.attributes_to_crop {
let default_length = self.crop_length.unwrap_or(200);
let mut final_attributes: HashMap<String, usize> = HashMap::new();
for attribute in attributes_to_crop.split(',') {
@ -129,7 +125,7 @@ async fn search_with_url_query(
search_builder.attributes_to_crop(final_attributes);
}
if let Some(attributes_to_highlight) = &params.attributes_to_highlight {
if let Some(attributes_to_highlight) = &self.attributes_to_highlight {
let mut final_attributes: HashSet<String> = HashSet::new();
for attribute in attributes_to_highlight.split(',') {
if attribute == "*" {
@ -148,17 +144,26 @@ async fn search_with_url_query(
search_builder.attributes_to_highlight(final_attributes);
}
if let Some(filters) = &params.filters {
if let Some(filters) = &self.filters {
search_builder.filters(filters.to_string());
}
if let Some(matches) = params.matches {
if let Some(matches) = self.matches {
if matches {
search_builder.get_matches();
}
}
let search_result = search_builder.search(&reader)?;
search_builder.search(&reader)
}
}
#[get("/indexes/{index_uid}/search", wrap = "Authentication::Public")]
async fn search_with_url_query(
data: web::Data<Data>,
path: web::Path<IndexParam>,
params: web::Query<SearchQuery>,
) -> Result<HttpResponse, ResponseError> {
let search_result = params.search(&path.index_uid, data)?;
Ok(HttpResponse::Ok().json(search_result))
}