Coverage for gws-app/gws/base/search/manager.py: 0%
45 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-17 01:37 +0200
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-17 01:37 +0200
1"""Search manager."""
3from typing import Optional
5import gws
8class Object(gws.SearchManager):
9 def run_search(self, search, user):
10 results: list[gws.SearchResult] = []
12 if search.layers:
13 for layer in search.layers:
14 for finder in layer.finders:
15 self._run(search, user, finder, layer, results)
16 if len(results) > search.limit:
17 return results[:search.limit]
19 if search.project:
20 for finder in search.project.finders:
21 self._run(search, user, finder, None, results)
22 if len(results) > search.limit:
23 return results[:search.limit]
25 for finder in self.root.app.finders:
26 self._run(search, user, finder, None, results)
27 if len(results) > search.limit:
28 return results[:search.limit]
30 return results
32 def _run(
33 self,
34 search: gws.SearchQuery,
35 user: gws.User,
36 finder: gws.Finder,
37 layer: Optional[gws.Layer],
38 results,
39 ):
40 gws.log.debug(f'SEARCH_BEGIN: {finder=} {layer=}')
42 if not user.can_use(finder):
43 gws.log.debug('SEARCH_END: no access')
44 return
46 if not finder.can_run(search, user):
47 gws.log.debug(f'SEARCH_END: cannot run')
48 return
50 try:
51 features: list[gws.Feature] = finder.run(search, user, layer) or []
52 except:
53 gws.log.exception('SEARCH_FAILED')
54 return
56 for feature in features:
57 if finder.title:
58 feature.category = finder.title
59 elif not feature.category and layer and layer.title:
60 feature.category = layer.title
62 if search.bounds:
63 feature.transform_to(search.bounds.crs)
65 results.append(gws.SearchResult(feature=feature, layer=layer, finder=finder))
66 if len(results) > search.limit:
67 break
69 gws.log.debug(f'SEARCH_END, found={len(features)}')