Skip to main content

agdb/query/
query_ids.rs

1use crate::QueryId;
2use crate::QueryResult;
3use crate::SearchQuery;
4
5/// List of database ids used in queries. It
6/// can either represent a list of [`QueryId`]s
7/// or a search query. Search query allows query
8/// nesting and sourcing the ids dynamically for
9/// another query most commonly with the
10/// select queries.
11#[derive(Debug, Clone, PartialEq)]
12#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
13#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
14#[cfg_attr(feature = "derive", derive(agdb::DbSerialize))]
15#[cfg_attr(feature = "api", derive(agdb::TypeDefImpl))]
16pub enum QueryIds {
17    /// List of [`QueryId`]s
18    Ids(Vec<QueryId>),
19
20    /// Search query
21    Search(SearchQuery),
22}
23
24impl QueryIds {
25    pub(crate) fn get_ids(self) -> Vec<QueryId> {
26        match self {
27            QueryIds::Ids(ids) => ids,
28            QueryIds::Search(_) => vec![],
29        }
30    }
31}
32
33impl<T: Into<QueryId>> From<Vec<T>> for QueryIds {
34    fn from(value: Vec<T>) -> Self {
35        QueryIds::Ids(value.into_iter().map(|v| v.into()).collect())
36    }
37}
38
39impl<T: Into<QueryId> + Clone> From<&Vec<T>> for QueryIds {
40    fn from(value: &Vec<T>) -> Self {
41        QueryIds::Ids(value.iter().map(|v| v.clone().into()).collect())
42    }
43}
44
45impl<T: Into<QueryId> + Clone> From<&[T]> for QueryIds {
46    fn from(value: &[T]) -> Self {
47        QueryIds::Ids(value.iter().map(|v| v.clone().into()).collect())
48    }
49}
50
51impl<T: Into<QueryId> + Clone, const N: usize> From<[T; N]> for QueryIds {
52    fn from(value: [T; N]) -> Self {
53        QueryIds::Ids(value.into_iter().map(|v| v.into()).collect())
54    }
55}
56
57impl<T: Into<QueryId>> From<T> for QueryIds {
58    fn from(value: T) -> Self {
59        QueryIds::Ids(vec![value.into()])
60    }
61}
62
63impl From<QueryResult> for QueryIds {
64    fn from(value: QueryResult) -> Self {
65        Self::from(&value)
66    }
67}
68
69impl From<&QueryResult> for QueryIds {
70    fn from(value: &QueryResult) -> Self {
71        QueryIds::Ids(value.elements.iter().map(|e| QueryId::from(e.id)).collect())
72    }
73}
74
75impl From<SearchQuery> for QueryIds {
76    fn from(query: SearchQuery) -> Self {
77        QueryIds::Search(query)
78    }
79}
80
81#[cfg(test)]
82mod tests {
83    use super::*;
84    use crate::DbId;
85    use crate::query::search_query::SearchQueryAlgorithm;
86
87    #[test]
88    #[allow(clippy::redundant_clone)]
89    fn derived_from_clone() {
90        let left = QueryIds::Ids(vec![QueryId::from(0)]);
91        let right = left.clone();
92        assert_eq!(left, right);
93    }
94
95    #[test]
96    fn derived_from_partial_eq() {
97        assert_eq!(
98            QueryIds::Ids(vec![QueryId::from(0)]),
99            QueryIds::Ids(vec![QueryId::from(0)])
100        );
101    }
102
103    #[test]
104    fn derived_from_debug() {
105        let _ = format!("{:?}", QueryIds::Ids(vec![QueryId::from(0)]));
106    }
107
108    #[test]
109    fn get_ids_from_search() {
110        let ids = QueryIds::Search(SearchQuery {
111            algorithm: SearchQueryAlgorithm::BreadthFirst,
112            origin: QueryId::Id(DbId(0)),
113            destination: QueryId::Id(DbId(0)),
114            limit: 0,
115            offset: 0,
116            order_by: vec![],
117            conditions: vec![],
118        })
119        .get_ids();
120
121        assert_eq!(ids, vec![]);
122    }
123
124    #[test]
125    fn into_ids() {
126        let _ids = QueryIds::from(vec![QueryId::from(0)]);
127        let _ids = QueryIds::from(vec![0]);
128        let _ids = QueryIds::from(vec!["alias"]);
129        let _ids = QueryIds::from(vec![DbId(0)]);
130        let _ids = QueryIds::from(&vec![QueryId::from(0)]);
131        let _ids = QueryIds::from(&vec![0]);
132        let _ids = QueryIds::from(&vec!["alias"]);
133        let _ids = QueryIds::from(&vec![DbId(0)]);
134        let _ids = QueryIds::from([QueryId::from(0)].as_slice());
135        let _ids = QueryIds::from([0].as_slice());
136        let _ids = QueryIds::from(["alias"].as_slice());
137        let _ids = QueryIds::from([DbId(0)].as_slice());
138        let _ids = QueryIds::from([QueryId::from(0)]);
139        let _ids = QueryIds::from([0]);
140        let _ids = QueryIds::from(["alias"]);
141        let _ids = QueryIds::from([DbId(0)]);
142        let _ids = QueryIds::from(0);
143        let _ids = QueryIds::from("alias");
144        let _ids = QueryIds::from("alias".to_string());
145        let _ids = QueryIds::from(&"alias".to_string());
146        let _ids = QueryIds::from(DbId(0));
147    }
148}