mirror of
https://github.com/meilisearch/meilisearch.git
synced 2024-11-26 12:05:05 +08:00
Use serde-cs::CS with StarOr to reduce the logic duplication
This commit is contained in:
parent
10d3b367dc
commit
64b5b2e1f8
@ -8,11 +8,13 @@ use meilisearch_lib::index::{
|
|||||||
};
|
};
|
||||||
use meilisearch_lib::MeiliSearch;
|
use meilisearch_lib::MeiliSearch;
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
|
use serde_cs::vec::CS;
|
||||||
use serde_json::Value;
|
use serde_json::Value;
|
||||||
|
|
||||||
use crate::analytics::{Analytics, SearchAggregator};
|
use crate::analytics::{Analytics, SearchAggregator};
|
||||||
use crate::extractors::authentication::{policies::*, GuardedData};
|
use crate::extractors::authentication::{policies::*, GuardedData};
|
||||||
use crate::extractors::sequential_extractor::SeqHandler;
|
use crate::extractors::sequential_extractor::SeqHandler;
|
||||||
|
use crate::routes::{fold_star_or, StarOr};
|
||||||
|
|
||||||
pub fn configure(cfg: &mut web::ServiceConfig) {
|
pub fn configure(cfg: &mut web::ServiceConfig) {
|
||||||
cfg.service(
|
cfg.service(
|
||||||
@ -28,16 +30,16 @@ pub struct SearchQueryGet {
|
|||||||
q: Option<String>,
|
q: Option<String>,
|
||||||
offset: Option<usize>,
|
offset: Option<usize>,
|
||||||
limit: Option<usize>,
|
limit: Option<usize>,
|
||||||
attributes_to_retrieve: Option<String>,
|
attributes_to_retrieve: Option<CS<StarOr<String>>>,
|
||||||
attributes_to_crop: Option<String>,
|
attributes_to_crop: Option<CS<StarOr<String>>>,
|
||||||
#[serde(default = "DEFAULT_CROP_LENGTH")]
|
#[serde(default = "DEFAULT_CROP_LENGTH")]
|
||||||
crop_length: usize,
|
crop_length: usize,
|
||||||
attributes_to_highlight: Option<String>,
|
attributes_to_highlight: Option<CS<StarOr<String>>>,
|
||||||
filter: Option<String>,
|
filter: Option<String>,
|
||||||
sort: Option<String>,
|
sort: Option<String>,
|
||||||
#[serde(default = "Default::default")]
|
#[serde(default = "Default::default")]
|
||||||
show_matches_position: bool,
|
show_matches_position: bool,
|
||||||
facets: Option<String>,
|
facets: Option<CS<StarOr<String>>>,
|
||||||
#[serde(default = "DEFAULT_HIGHLIGHT_PRE_TAG")]
|
#[serde(default = "DEFAULT_HIGHLIGHT_PRE_TAG")]
|
||||||
highlight_pre_tag: String,
|
highlight_pre_tag: String,
|
||||||
#[serde(default = "DEFAULT_HIGHLIGHT_POST_TAG")]
|
#[serde(default = "DEFAULT_HIGHLIGHT_POST_TAG")]
|
||||||
@ -50,19 +52,20 @@ impl From<SearchQueryGet> for SearchQuery {
|
|||||||
fn from(other: SearchQueryGet) -> Self {
|
fn from(other: SearchQueryGet) -> Self {
|
||||||
let attributes_to_retrieve = other
|
let attributes_to_retrieve = other
|
||||||
.attributes_to_retrieve
|
.attributes_to_retrieve
|
||||||
.map(|attrs| attrs.split(',').map(String::from).collect());
|
.map(CS::into_inner)
|
||||||
|
.and_then(fold_star_or);
|
||||||
|
|
||||||
let attributes_to_crop = other
|
let attributes_to_crop = other
|
||||||
.attributes_to_crop
|
.attributes_to_crop
|
||||||
.map(|attrs| attrs.split(',').map(String::from).collect());
|
.map(CS::into_inner)
|
||||||
|
.and_then(fold_star_or);
|
||||||
|
|
||||||
let attributes_to_highlight = other
|
let attributes_to_highlight = other
|
||||||
.attributes_to_highlight
|
.attributes_to_highlight
|
||||||
.map(|attrs| attrs.split(',').map(String::from).collect());
|
.map(CS::into_inner)
|
||||||
|
.and_then(fold_star_or);
|
||||||
|
|
||||||
let facets = other
|
let facets = other.facets.map(CS::into_inner).and_then(fold_star_or);
|
||||||
.facets
|
|
||||||
.map(|attrs| attrs.split(',').map(String::from).collect());
|
|
||||||
|
|
||||||
let filter = match other.filter {
|
let filter = match other.filter {
|
||||||
Some(f) => match serde_json::from_str(&f) {
|
Some(f) => match serde_json::from_str(&f) {
|
||||||
|
@ -49,7 +49,10 @@ impl<T: FromStr> FromStr for StarOr<T> {
|
|||||||
|
|
||||||
/// Extracts the raw values from the `StarOr` types and
|
/// Extracts the raw values from the `StarOr` types and
|
||||||
/// return None if a `StarOr::Star` is encountered.
|
/// return None if a `StarOr::Star` is encountered.
|
||||||
pub fn fold_star_or<T>(content: impl IntoIterator<Item = StarOr<T>>) -> Option<Vec<T>> {
|
pub fn fold_star_or<T, O>(content: impl IntoIterator<Item = StarOr<T>>) -> Option<O>
|
||||||
|
where
|
||||||
|
O: FromIterator<T>,
|
||||||
|
{
|
||||||
content
|
content
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|value| match value {
|
.map(|value| match value {
|
||||||
|
@ -81,9 +81,9 @@ async fn get_tasks(
|
|||||||
|
|
||||||
// We first transform a potential indexUid=* into a "not specified indexUid filter"
|
// We first transform a potential indexUid=* into a "not specified indexUid filter"
|
||||||
// for every one of the filters: type, status, and indexUid.
|
// for every one of the filters: type, status, and indexUid.
|
||||||
let type_ = type_.map(CS::into_inner).and_then(fold_star_or);
|
let type_: Option<Vec<_>> = type_.map(CS::into_inner).and_then(fold_star_or);
|
||||||
let status = status.map(CS::into_inner).and_then(fold_star_or);
|
let status: Option<Vec<_>> = status.map(CS::into_inner).and_then(fold_star_or);
|
||||||
let index_uid = index_uid.map(CS::into_inner).and_then(fold_star_or);
|
let index_uid: Option<Vec<_>> = index_uid.map(CS::into_inner).and_then(fold_star_or);
|
||||||
|
|
||||||
// Then we filter on potential indexes and make sure that the search filter
|
// Then we filter on potential indexes and make sure that the search filter
|
||||||
// restrictions are also applied.
|
// restrictions are also applied.
|
||||||
|
Loading…
Reference in New Issue
Block a user