use super::*;
use mongodb_internal_macros::{export_doc, options_doc};
pub struct Autocomplete;
#[options_doc(autocomplete, "into_stage")]
pub fn autocomplete(
path: impl StringOrArray,
query: impl StringOrArray,
) -> SearchOperator<Autocomplete> {
SearchOperator::new(
"autocomplete",
doc! {
"path" : path.to_bson(), "query" : query.to_bson(),
},
)
}
#[export_doc(autocomplete)]
impl SearchOperator<Autocomplete> {
#[allow(missing_docs)]
pub fn token_order(mut self, token_order: TokenOrder) -> Self {
self.spec.insert("tokenOrder", token_order.name());
self
}
#[allow(missing_docs)]
pub fn fuzzy(mut self, fuzzy: Document) -> Self {
self.spec.insert("fuzzy", fuzzy);
self
}
#[allow(missing_docs)]
pub fn score(mut self, score: Document) -> Self {
self.spec.insert("score", score);
self
}
}
pub struct Compound;
#[options_doc(compound, "into_stage")]
pub fn compound() -> SearchOperator<Compound> {
SearchOperator::new("compound", doc! {})
}
#[export_doc(compound)]
impl SearchOperator<Compound> {
#[allow(missing_docs)]
pub fn must(mut self, must: impl IntoIterator<Item = impl SearchOperatorParam>) -> Self {
self.spec.insert(
"must",
must.into_iter().map(|o| o.to_bson()).collect::<Vec<_>>(),
);
self
}
#[allow(missing_docs)]
pub fn must_not(
mut self,
must_not: impl IntoIterator<Item = impl SearchOperatorParam>,
) -> Self {
self.spec.insert(
"mustNot",
must_not
.into_iter()
.map(|o| o.to_bson())
.collect::<Vec<_>>(),
);
self
}
#[allow(missing_docs)]
pub fn should(mut self, should: impl IntoIterator<Item = impl SearchOperatorParam>) -> Self {
self.spec.insert(
"should",
should.into_iter().map(|o| o.to_bson()).collect::<Vec<_>>(),
);
self
}
#[allow(missing_docs)]
pub fn filter(mut self, filter: impl IntoIterator<Item = impl SearchOperatorParam>) -> Self {
self.spec.insert(
"filter",
filter.into_iter().map(|o| o.to_bson()).collect::<Vec<_>>(),
);
self
}
#[allow(missing_docs)]
pub fn minimum_should_match(mut self, minimum_should_match: i32) -> Self {
self.spec.insert("minimumShouldMatch", minimum_should_match);
self
}
#[allow(missing_docs)]
pub fn score(mut self, score: Document) -> Self {
self.spec.insert("score", score);
self
}
}
pub struct EmbeddedDocument;
#[options_doc(embedded_document, "into_stage")]
pub fn embedded_document(
path: impl StringOrArray,
operator: impl SearchOperatorParam,
) -> SearchOperator<EmbeddedDocument> {
SearchOperator::new(
"embeddedDocument",
doc! {
"path" : path.to_bson(), "operator" : operator.to_bson(),
},
)
}
#[export_doc(embedded_document)]
impl SearchOperator<EmbeddedDocument> {
#[allow(missing_docs)]
pub fn score(mut self, score: Document) -> Self {
self.spec.insert("score", score);
self
}
}
pub struct Equals;
#[options_doc(equals, "into_stage")]
pub fn equals(path: impl StringOrArray, value: impl Into<Bson>) -> SearchOperator<Equals> {
SearchOperator::new(
"equals",
doc! {
"path" : path.to_bson(), "value" : value.into(),
},
)
}
#[export_doc(equals)]
impl SearchOperator<Equals> {
#[allow(missing_docs)]
pub fn score(mut self, score: Document) -> Self {
self.spec.insert("score", score);
self
}
}
pub struct Exists;
#[options_doc(exists, "into_stage")]
pub fn exists(path: impl StringOrArray) -> SearchOperator<Exists> {
SearchOperator::new(
"exists",
doc! {
"path" : path.to_bson(),
},
)
}
#[export_doc(exists)]
impl SearchOperator<Exists> {
#[allow(missing_docs)]
pub fn score(mut self, score: Document) -> Self {
self.spec.insert("score", score);
self
}
}
pub struct Facet;
#[options_doc(facet, "into_stage")]
pub fn facet(facets: Document) -> SearchOperator<Facet> {
SearchOperator::new(
"facet",
doc! {
"facets" : facets,
},
)
}
#[export_doc(facet)]
impl SearchOperator<Facet> {
#[allow(missing_docs)]
pub fn operator(mut self, operator: impl SearchOperatorParam) -> Self {
self.spec.insert("operator", operator.to_bson());
self
}
}
pub struct GeoShape;
#[options_doc(geo_shape, "into_stage")]
pub fn geo_shape(
path: impl StringOrArray,
relation: Relation,
geometry: Document,
) -> SearchOperator<GeoShape> {
SearchOperator::new(
"geoShape",
doc! {
"path" : path.to_bson(), "relation" : relation.name(), "geometry" : geometry,
},
)
}
#[export_doc(geo_shape)]
impl SearchOperator<GeoShape> {
#[allow(missing_docs)]
pub fn score(mut self, score: Document) -> Self {
self.spec.insert("score", score);
self
}
}
pub struct GeoWithin;
#[options_doc(geo_within, "into_stage")]
pub fn geo_within(path: impl StringOrArray) -> SearchOperator<GeoWithin> {
SearchOperator::new(
"geoWithin",
doc! {
"path" : path.to_bson(),
},
)
}
#[export_doc(geo_within)]
impl SearchOperator<GeoWithin> {
#[allow(missing_docs)]
pub fn geo_box(mut self, geo_box: Document) -> Self {
self.spec.insert("box", geo_box);
self
}
#[allow(missing_docs)]
pub fn circle(mut self, circle: Document) -> Self {
self.spec.insert("circle", circle);
self
}
#[allow(missing_docs)]
pub fn geometry(mut self, geometry: Document) -> Self {
self.spec.insert("geometry", geometry);
self
}
#[allow(missing_docs)]
pub fn score(mut self, score: Document) -> Self {
self.spec.insert("score", score);
self
}
}
pub struct SearchIn;
#[options_doc(search_in, "into_stage")]
pub fn search_in(path: impl StringOrArray, value: impl Into<Bson>) -> SearchOperator<SearchIn> {
SearchOperator::new(
"in",
doc! {
"path" : path.to_bson(), "value" : value.into(),
},
)
}
#[export_doc(search_in)]
impl SearchOperator<SearchIn> {
#[allow(missing_docs)]
pub fn score(mut self, score: Document) -> Self {
self.spec.insert("score", score);
self
}
}
pub struct MoreLikeThis;
#[options_doc(more_like_this, "into_stage")]
pub fn more_like_this(like: impl DocumentOrArray) -> SearchOperator<MoreLikeThis> {
SearchOperator::new(
"moreLikeThis",
doc! {
"like" : like.to_bson(),
},
)
}
#[export_doc(more_like_this)]
impl SearchOperator<MoreLikeThis> {
#[allow(missing_docs)]
pub fn score(mut self, score: Document) -> Self {
self.spec.insert("score", score);
self
}
}
pub struct Near;
#[options_doc(near, "into_stage")]
pub fn near(
path: impl StringOrArray,
origin: impl NearOrigin,
pivot: impl BsonNumber,
) -> SearchOperator<Near> {
SearchOperator::new(
"near",
doc! {
"path" : path.to_bson(), "origin" : origin.to_bson(), "pivot" : pivot
.to_bson(),
},
)
}
#[export_doc(near)]
impl SearchOperator<Near> {
#[allow(missing_docs)]
pub fn score(mut self, score: Document) -> Self {
self.spec.insert("score", score);
self
}
}
pub struct Phrase;
#[options_doc(phrase, "into_stage")]
pub fn phrase(path: impl StringOrArray, query: impl StringOrArray) -> SearchOperator<Phrase> {
SearchOperator::new(
"phrase",
doc! {
"path" : path.to_bson(), "query" : query.to_bson(),
},
)
}
#[export_doc(phrase)]
impl SearchOperator<Phrase> {
#[allow(missing_docs)]
pub fn slop(mut self, slop: i32) -> Self {
self.spec.insert("slop", slop);
self
}
#[allow(missing_docs)]
pub fn synonyms(mut self, synonyms: impl AsRef<str>) -> Self {
self.spec.insert("synonyms", synonyms.as_ref());
self
}
#[allow(missing_docs)]
pub fn score(mut self, score: Document) -> Self {
self.spec.insert("score", score);
self
}
}
pub struct QueryString;
#[options_doc(query_string, "into_stage")]
pub fn query_string(
default_path: impl StringOrArray,
query: impl AsRef<str>,
) -> SearchOperator<QueryString> {
SearchOperator::new(
"queryString",
doc! {
"defaultPath" : default_path.to_bson(), "query" : query.as_ref(),
},
)
}
#[export_doc(query_string)]
impl SearchOperator<QueryString> {}
pub struct Range;
#[options_doc(range, "into_stage")]
pub fn range(path: impl StringOrArray) -> SearchOperator<Range> {
SearchOperator::new(
"range",
doc! {
"path" : path.to_bson(),
},
)
}
#[export_doc(range)]
impl SearchOperator<Range> {
#[allow(missing_docs)]
pub fn gt(mut self, gt: impl RangeValue) -> Self {
self.spec.insert("gt", gt.to_bson());
self
}
#[allow(missing_docs)]
pub fn gte(mut self, gte: impl RangeValue) -> Self {
self.spec.insert("gte", gte.to_bson());
self
}
#[allow(missing_docs)]
pub fn lt(mut self, lt: impl RangeValue) -> Self {
self.spec.insert("lt", lt.to_bson());
self
}
#[allow(missing_docs)]
pub fn lte(mut self, lte: impl RangeValue) -> Self {
self.spec.insert("lte", lte.to_bson());
self
}
#[allow(missing_docs)]
pub fn score(mut self, score: Document) -> Self {
self.spec.insert("score", score);
self
}
}
pub struct Regex;
#[options_doc(regex, "into_stage")]
pub fn regex(path: impl StringOrArray, query: impl AsRef<str>) -> SearchOperator<Regex> {
SearchOperator::new(
"regex",
doc! {
"path" : path.to_bson(), "query" : query.as_ref(),
},
)
}
#[export_doc(regex)]
impl SearchOperator<Regex> {
#[allow(missing_docs)]
pub fn allow_analyzed_field(mut self, allow_analyzed_field: bool) -> Self {
self.spec.insert("allowAnalyzedField", allow_analyzed_field);
self
}
#[allow(missing_docs)]
pub fn score(mut self, score: Document) -> Self {
self.spec.insert("score", score);
self
}
}
pub struct Text;
#[options_doc(text, "into_stage")]
pub fn text(path: impl StringOrArray, query: impl StringOrArray) -> SearchOperator<Text> {
SearchOperator::new(
"text",
doc! {
"path" : path.to_bson(), "query" : query.to_bson(),
},
)
}
#[export_doc(text)]
impl SearchOperator<Text> {
#[allow(missing_docs)]
pub fn fuzzy(mut self, fuzzy: Document) -> Self {
self.spec.insert("fuzzy", fuzzy);
self
}
#[allow(missing_docs)]
pub fn match_criteria(mut self, match_criteria: MatchCriteria) -> Self {
self.spec.insert("matchCriteria", match_criteria.name());
self
}
#[allow(missing_docs)]
pub fn synonyms(mut self, synonyms: impl AsRef<str>) -> Self {
self.spec.insert("synonyms", synonyms.as_ref());
self
}
#[allow(missing_docs)]
pub fn score(mut self, score: Document) -> Self {
self.spec.insert("score", score);
self
}
}
pub struct Wildcard;
#[options_doc(wildcard, "into_stage")]
pub fn wildcard(path: impl StringOrArray, query: impl AsRef<str>) -> SearchOperator<Wildcard> {
SearchOperator::new(
"wildcard",
doc! {
"path" : path.to_bson(), "query" : query.as_ref(),
},
)
}
#[export_doc(wildcard)]
impl SearchOperator<Wildcard> {
#[allow(missing_docs)]
pub fn allow_analyzed_field(mut self, allow_analyzed_field: bool) -> Self {
self.spec.insert("allowAnalyzedField", allow_analyzed_field);
self
}
#[allow(missing_docs)]
pub fn score(mut self, score: Document) -> Self {
self.spec.insert("score", score);
self
}
}