1use crate::httpx::request::OnBehalfOfInfo;
20use crate::retry::RetryStrategy;
21use crate::searchx;
22use crate::searchx::facets::Facet;
23use crate::searchx::queries::Query;
24use crate::searchx::query_options::{Control, Highlight, KnnOperator, KnnQuery};
25use crate::searchx::sort::Sort;
26use std::collections::HashMap;
27use std::sync::Arc;
28
29#[derive(Debug, Clone)]
30#[non_exhaustive]
31pub struct SearchOptions {
32 pub collections: Option<Vec<String>>,
33 pub control: Option<Control>,
34 pub explain: Option<bool>,
35 pub facets: Option<HashMap<String, Facet>>,
36 pub fields: Option<Vec<String>>,
37 pub from: Option<u32>,
38 pub highlight: Option<Highlight>,
39 pub include_locations: Option<bool>,
40 pub query: Option<Query>,
41 pub score: Option<String>,
42 pub search_after: Option<Vec<String>>,
43 pub search_before: Option<Vec<String>>,
44 pub show_request: Option<bool>,
45 pub size: Option<u32>,
46 pub sort: Option<Vec<Sort>>,
47 pub knn: Option<Vec<KnnQuery>>,
48 pub knn_operator: Option<KnnOperator>,
49
50 pub raw: Option<HashMap<String, serde_json::Value>>,
51
52 pub index_name: String,
53 pub scope_name: Option<String>,
54 pub bucket_name: Option<String>,
55
56 pub on_behalf_of: Option<OnBehalfOfInfo>,
57
58 pub endpoint: Option<String>,
59 pub retry_strategy: Option<Arc<dyn RetryStrategy>>,
60}
61
62impl SearchOptions {
63 pub fn new(index_name: impl Into<String>) -> Self {
64 Self {
65 collections: None,
66 control: None,
67 explain: None,
68 facets: None,
69 fields: None,
70 from: None,
71 highlight: None,
72 include_locations: None,
73 query: None,
74 score: None,
75 search_after: None,
76 search_before: None,
77 show_request: None,
78 size: None,
79 sort: None,
80 knn: None,
81 knn_operator: None,
82 raw: None,
83 index_name: index_name.into(),
84 scope_name: None,
85 bucket_name: None,
86 on_behalf_of: None,
87 endpoint: None,
88 retry_strategy: None,
89 }
90 }
91
92 pub fn collections(mut self, collections: impl Into<Option<Vec<String>>>) -> Self {
93 self.collections = collections.into();
94 self
95 }
96
97 pub fn control(mut self, control: impl Into<Option<Control>>) -> Self {
98 self.control = control.into();
99 self
100 }
101
102 pub fn explain(mut self, explain: impl Into<Option<bool>>) -> Self {
103 self.explain = explain.into();
104 self
105 }
106
107 pub fn facets(mut self, facets: impl Into<Option<HashMap<String, Facet>>>) -> Self {
108 self.facets = facets.into();
109 self
110 }
111
112 pub fn fields(mut self, fields: impl Into<Option<Vec<String>>>) -> Self {
113 self.fields = fields.into();
114 self
115 }
116
117 pub fn from(mut self, from: impl Into<Option<u32>>) -> Self {
118 self.from = from.into();
119 self
120 }
121
122 pub fn highlight(mut self, highlight: impl Into<Option<Highlight>>) -> Self {
123 self.highlight = highlight.into();
124 self
125 }
126
127 pub fn include_locations(mut self, include_locations: impl Into<Option<bool>>) -> Self {
128 self.include_locations = include_locations.into();
129 self
130 }
131
132 pub fn query(mut self, query: impl Into<Option<Query>>) -> Self {
133 self.query = query.into();
134 self
135 }
136
137 pub fn score(mut self, score: impl Into<Option<String>>) -> Self {
138 self.score = score.into();
139 self
140 }
141
142 pub fn search_after(mut self, search_after: impl Into<Option<Vec<String>>>) -> Self {
143 self.search_after = search_after.into();
144 self
145 }
146
147 pub fn search_before(mut self, search_before: impl Into<Option<Vec<String>>>) -> Self {
148 self.search_before = search_before.into();
149 self
150 }
151
152 pub fn show_request(mut self, show_request: impl Into<Option<bool>>) -> Self {
153 self.show_request = show_request.into();
154 self
155 }
156
157 pub fn size(mut self, size: impl Into<Option<u32>>) -> Self {
158 self.size = size.into();
159 self
160 }
161
162 pub fn sort(mut self, sort: impl Into<Option<Vec<Sort>>>) -> Self {
163 self.sort = sort.into();
164 self
165 }
166
167 pub fn knn(mut self, knn: impl Into<Option<Vec<KnnQuery>>>) -> Self {
168 self.knn = knn.into();
169 self
170 }
171
172 pub fn knn_operator(mut self, knn_operator: impl Into<Option<KnnOperator>>) -> Self {
173 self.knn_operator = knn_operator.into();
174 self
175 }
176
177 pub fn raw(mut self, raw: impl Into<Option<HashMap<String, serde_json::Value>>>) -> Self {
178 self.raw = raw.into();
179 self
180 }
181
182 pub fn scope_name(mut self, scope_name: impl Into<Option<String>>) -> Self {
183 self.scope_name = scope_name.into();
184 self
185 }
186
187 pub fn bucket_name(mut self, bucket_name: impl Into<Option<String>>) -> Self {
188 self.bucket_name = bucket_name.into();
189 self
190 }
191
192 pub fn on_behalf_of(mut self, on_behalf_of: impl Into<Option<OnBehalfOfInfo>>) -> Self {
193 self.on_behalf_of = on_behalf_of.into();
194 self
195 }
196
197 pub fn retry_strategy(
198 mut self,
199 retry_strategy: impl Into<Option<Arc<dyn RetryStrategy>>>,
200 ) -> Self {
201 self.retry_strategy = retry_strategy.into();
202 self
203 }
204
205 pub fn endpoint(mut self, endpoint: impl Into<Option<String>>) -> Self {
206 self.endpoint = endpoint.into();
207 self
208 }
209}
210
211impl From<SearchOptions> for searchx::query_options::QueryOptions {
212 fn from(opts: SearchOptions) -> Self {
213 searchx::query_options::QueryOptions {
214 collections: opts.collections,
215 control: opts.control,
216 explain: opts.explain,
217 facets: opts.facets,
218 fields: opts.fields,
219 from: opts.from,
220 highlight: opts.highlight,
221 include_locations: opts.include_locations,
222 query: opts.query,
223 score: opts.score,
224 search_after: opts.search_after,
225 search_before: opts.search_before,
226 show_request: opts.show_request,
227 size: opts.size,
228 sort: opts.sort,
229 knn: opts.knn,
230 knn_operator: opts.knn_operator,
231 raw: opts.raw,
232 index_name: opts.index_name,
233 scope_name: opts.scope_name,
234 bucket_name: opts.bucket_name,
235 on_behalf_of: opts.on_behalf_of,
236 }
237 }
238}