Skip to main content

opensearch_dsl/search/queries/
query_collection.rs

1use super::Query;
2use crate::util::ShouldSkip;
3
4/// A collection of queries
5#[derive(Default, Clone, PartialEq, Deserialize, Serialize)]
6pub struct QueryCollection(Vec<Query>);
7
8impl std::fmt::Debug for QueryCollection {
9    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10        self.0.fmt(f)
11    }
12}
13
14impl IntoIterator for QueryCollection {
15    type IntoIter = std::vec::IntoIter<Self::Item>;
16    type Item = Query;
17
18    fn into_iter(self) -> Self::IntoIter {
19        self.0.into_iter()
20    }
21}
22
23impl ShouldSkip for QueryCollection {
24    fn should_skip(&self) -> bool {
25        self.0.should_skip()
26    }
27}
28
29impl QueryCollection {
30    /// Extends query collection
31    pub fn extend<T>(&mut self, query: T)
32    where
33        T: IntoIterator,
34        T::Item: Into<Query>,
35    {
36        self.0.extend(
37            query
38                .into_iter()
39                .map(Into::into)
40                .filter(ShouldSkip::should_keep),
41        )
42    }
43}
44
45#[cfg(test)]
46mod tests {
47    use super::*;
48
49    #[test]
50    fn adds_query() {
51        let mut queries = QueryCollection::default();
52
53        let query = Query::terms("test", [1]);
54
55        queries.extend(query);
56
57        assert_eq!(queries.0.len(), 1);
58    }
59
60    #[test]
61    fn adds_queries() {
62        let mut queries = QueryCollection::default();
63
64        let query_1 = Query::terms("test", [1]);
65        let query_2 = Query::terms("test", [2]);
66
67        queries.extend([query_1, query_2]);
68
69        assert_eq!(queries.0.len(), 2);
70    }
71
72    #[test]
73    fn skips_queries() {
74        let mut queries = QueryCollection::default();
75
76        let empty_values: [i32; 0] = [];
77
78        let query_1 = Query::terms("test", empty_values).into();
79        let query_2 = Query::from(Query::terms("test", empty_values));
80        let query_3 = Query::Terms(Query::terms("test", empty_values));
81
82        queries.extend([query_1, query_2, query_3]);
83
84        assert!(queries.0.is_empty());
85    }
86
87    #[test]
88    fn skips_query() {
89        let mut queries = QueryCollection::default();
90
91        let empty_values: [i32; 0] = [];
92
93        let query = Query::terms("test", empty_values);
94
95        queries.extend(query);
96
97        assert!(queries.0.is_empty());
98    }
99}