1use crate::{
6 benchmarks::{new_store, BenchmarkWithInput},
7 geoname::{Geoname, GeonameType},
8 SuggestStore,
9};
10
11pub struct GeonameBenchmark {
12 args: FetchGeonamesArgs,
13 should_match: bool,
14}
15
16#[derive(Clone, Debug)]
17pub struct FetchGeonamesArgs {
18 query: &'static str,
19 match_name_prefix: bool,
20 filter: Option<Vec<Geoname>>,
21}
22
23pub struct IterationInput {
24 fetch_args: FetchGeonamesArgs,
25 should_match_message: String,
26}
27
28impl BenchmarkWithInput for GeonameBenchmark {
29 type GlobalInput = SuggestStore;
30 type IterationInput = IterationInput;
31
32 fn global_input(&self) -> Self::GlobalInput {
33 new_store()
34 }
35
36 fn iteration_input(&self) -> Self::IterationInput {
37 let fetch_args = self.args.clone();
38 let should_match_message = format!("should_match for fetch: {:?}", fetch_args);
40 IterationInput {
41 fetch_args,
42 should_match_message,
43 }
44 }
45
46 fn benchmarked_code(&self, store: &Self::GlobalInput, i_input: Self::IterationInput) {
47 let matches = store
48 .fetch_geonames(
49 i_input.fetch_args.query,
50 i_input.fetch_args.match_name_prefix,
51 i_input.fetch_args.filter,
52 )
53 .unwrap_or_else(|e| panic!("Error fetching geonames: {e}"));
54
55 assert_eq!(
58 !matches.is_empty(),
59 self.should_match,
60 "{}",
61 i_input.should_match_message,
62 );
63 }
64}
65
66pub fn all_benchmarks() -> Vec<(&'static str, GeonameBenchmark)> {
67 let ny_state = Geoname {
68 geoname_id: 5128638,
69 geoname_type: GeonameType::AdminDivision { level: 1 },
70 name: "New York".to_string(),
71 feature_class: "A".to_string(),
72 feature_code: "ADM1".to_string(),
73 country_code: "US".to_string(),
74 admin_division_codes: [(1, "NY".to_string())].into(),
75 population: 19274244,
76 latitude: "43.00035".to_string(),
77 longitude: "-75.4999".to_string(),
78 };
79
80 vec![
81 (
83 "geoname-fetch-no-match-1",
84 GeonameBenchmark {
85 args: FetchGeonamesArgs {
86 query: "nomatch",
87 match_name_prefix: false,
88 filter: None,
89 },
90 should_match: false,
91 }
92 ),
93 (
94 "geoname-fetch-no-match-2",
95 GeonameBenchmark {
96 args: FetchGeonamesArgs {
97 query: "no match",
98 match_name_prefix: false,
99 filter: None,
100 },
101 should_match: false,
102 }
103 ),
104 (
105 "geoname-fetch-no-match-3",
106 GeonameBenchmark {
107 args: FetchGeonamesArgs {
108 query: "no match either",
109 match_name_prefix: false,
110 filter: None,
111 },
112 should_match: false,
113 }
114 ),
115 (
116 "geoname-fetch-no-match-long",
117 GeonameBenchmark {
118 args: FetchGeonamesArgs {
119 query: "this is a very long string that does not match anything in the geonames database but it sure is very long",
120 match_name_prefix: false,
121 filter: None,
122 },
123 should_match: false,
124 }
125 ),
126
127 (
129 "geoname-fetch-no-match-1-prefix",
130 GeonameBenchmark {
131 args: FetchGeonamesArgs {
132 query: "nomatch",
133 match_name_prefix: true,
134 filter: None,
135 },
136 should_match: false,
137 }
138 ),
139 (
140 "geoname-fetch-no-match-2-prefix",
141 GeonameBenchmark {
142 args: FetchGeonamesArgs {
143 query: "no match",
144 match_name_prefix: true,
145 filter: None,
146 },
147 should_match: false,
148 }
149 ),
150 (
151 "geoname-fetch-no-match-3-prefix",
152 GeonameBenchmark {
153 args: FetchGeonamesArgs {
154 query: "no match either",
155 match_name_prefix: true,
156 filter: None,
157 },
158 should_match: false,
159 }
160 ),
161 (
162 "geoname-fetch-no-match-long-prefix",
163 GeonameBenchmark {
164 args: FetchGeonamesArgs {
165 query: "this is a very long string that does not match anything in the geonames database but it sure is very long",
166 match_name_prefix: true,
167 filter: None,
168 },
169 should_match: false,
170 }
171 ),
172
173 (
175 "geoname-fetch-abbr-ny",
176 GeonameBenchmark {
177 args: FetchGeonamesArgs {
178 query: "ny",
179 match_name_prefix: false,
180 filter: None,
181 },
182 should_match: true,
183 }
184 ),
185 (
186 "geoname-fetch-abbr-nyc",
187 GeonameBenchmark {
188 args: FetchGeonamesArgs {
189 query: "nyc",
190 match_name_prefix: false,
191 filter: None,
192 },
193 should_match: true,
194 }
195 ),
196 (
197 "geoname-fetch-abbr-ca",
198 GeonameBenchmark {
199 args: FetchGeonamesArgs {
200 query: "ca",
201 match_name_prefix: false,
202 filter: None,
203 },
204 should_match: true,
205 }
206 ),
207 (
208 "geoname-fetch-airport-pdx",
209 GeonameBenchmark {
210 args: FetchGeonamesArgs {
211 query: "pdx",
212 match_name_prefix: false,
213 filter: None,
214 },
215 should_match: true,
216 }
217 ),
218 (
219 "geoname-fetch-airport-roc",
220 GeonameBenchmark {
221 args: FetchGeonamesArgs {
222 query: "roc",
223 match_name_prefix: false,
224 filter: None,
225 },
226 should_match: true,
227 }
228 ),
229
230 (
232 "geoname-fetch-abbr-prefix-ny",
233 GeonameBenchmark {
234 args: FetchGeonamesArgs {
235 query: "ny",
236 match_name_prefix: true,
237 filter: None,
238 },
239 should_match: true,
240 }
241 ),
242 (
243 "geoname-fetch-abbr-prefix-nyc",
244 GeonameBenchmark {
245 args: FetchGeonamesArgs {
246 query: "nyc",
247 match_name_prefix: true,
248 filter: None,
249 },
250 should_match: true,
251 }
252 ),
253 (
254 "geoname-fetch-abbr-prefix-ca",
255 GeonameBenchmark {
256 args: FetchGeonamesArgs {
257 query: "ca",
258 match_name_prefix: true,
259 filter: None,
260 },
261 should_match: true,
262 }
263 ),
264 (
265 "geoname-fetch-airport-prefix-pdx",
266 GeonameBenchmark {
267 args: FetchGeonamesArgs {
268 query: "pdx",
269 match_name_prefix: true,
270 filter: None,
271 },
272 should_match: true,
273 }
274 ),
275 (
276 "geoname-fetch-airport-prefix-roc",
277 GeonameBenchmark {
278 args: FetchGeonamesArgs {
279 query: "roc",
280 match_name_prefix: true,
281 filter: None,
282 },
283 should_match: true,
284 }
285 ),
286
287 (
289 "geoname-fetch-name-new-york",
290 GeonameBenchmark {
291 args: FetchGeonamesArgs {
292 query: "new york",
293 match_name_prefix: false,
294 filter: None,
295 },
296 should_match: true,
297 }
298 ),
299 (
300 "geoname-fetch-name-rochester",
301 GeonameBenchmark {
302 args: FetchGeonamesArgs {
303 query: "rochester",
304 match_name_prefix: false,
305 filter: None,
306 },
307 should_match: true,
308 }
309 ),
310
311 (
313 "geoname-fetch-name-prefix-new-york",
314 GeonameBenchmark {
315 args: FetchGeonamesArgs {
316 query: "new york",
317 match_name_prefix: true,
318 filter: None,
319 },
320 should_match: true,
321 }
322 ),
323 (
324 "geoname-fetch-name-prefix-rochester",
325 GeonameBenchmark {
326 args: FetchGeonamesArgs {
327 query: "rochester",
328 match_name_prefix: true,
329 filter: None,
330 },
331 should_match: true,
332 }
333 ),
334
335 (
337 "geoname-fetch-filter-ny",
338 GeonameBenchmark {
339 args: FetchGeonamesArgs {
340 query: "ny",
341 match_name_prefix: false,
342 filter: Some(vec![ny_state.clone()]),
343 },
344 should_match: true,
345 }
346 ),
347 ]
348}