attribute_search_engine/query.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
/// Query is a recursive datatype that describes a
/// query to a search index or engine.
///
/// The query only takes strings as parameters. It is up to the
/// search index to parse this string into the expected type.
///
/// # Example
/// ```
/// use attribute_search_engine::Query;
///
/// let q = Query::Exclude(
/// Box::new(Query::And(vec![
/// Query::Or(vec![
/// Query::InRange("a".into(), "32".into(), "128".into()),
/// Query::Prefix("b".into(), "hello".into()),
/// ]),
/// Query::Minimum("c".into(), "42".into()),
/// ])),
/// vec![
/// Query::Exact("b".into(), "hello world".into()),
/// ],
/// );
/// ```
#[derive(Debug, PartialEq)]
pub enum Query {
/// Only matches if the attribute has exactly the value as the query.
Exact(String, String),
/// Matches if the attribute starts with the value of the query.
Prefix(String, String),
/// Matches if the attribute is in the range of the two query values.
/// First is minimum, seconds is maximum, both inclusive.
InRange(String, String, String),
/// Matches if the attribute is NOT in the range of the two query values.
/// First is the start of the range, seconds is the end. A value that is
/// equal to the start or the end is considered in range and will not be
/// returned.
OutRange(String, String, String),
/// Matches if the attribute is at least as high/big as the query value.
Minimum(String, String),
/// Matches if the attribute is at most as high/big as the query value.
Maximum(String, String),
/// Matches if at least one of the subqueries matches.
Or(Vec<Query>),
/// Only matches if all subqueries match.
And(Vec<Query>),
/// Removed all matches from the first query that appear in at least
/// on of the matches of the query vector.
Exclude(Box<Query>, Vec<Query>),
}