1use crate::QueryId;
2use crate::QueryResult;
3use crate::SearchQuery;
4
5#[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 Ids(Vec<QueryId>),
19
20 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}