Coverage for gws-app/gws/plugin/postgres/finder.py: 0%
31 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
1from typing import Optional, cast
3import gws
4import gws.base.database
5import gws.base.model
6import gws.base.search
7import gws.config.util
9gws.ext.new.finder('postgres')
12class Config(gws.base.search.finder.Config):
13 """Database-based search"""
15 dbUid: Optional[str]
16 """database provider uid"""
17 tableName: str
18 """sql table name"""
19 sqlFilter: Optional[str]
20 """extra SQL filter"""
23class Object(gws.base.search.finder.Object):
24 db: gws.DatabaseProvider
25 tableName: str
27 def configure(self):
28 self.tableName = self.cfg('tableName') or self.cfg('_defaultTableName')
29 self.configure_provider()
30 self.configure_models()
31 self.configure_templates()
33 # it's difficult to decide if we support keyword/geometry search,
34 # because different models can have different rules
36 self.supportsKeywordSearch = True
37 self.supportsGeometrySearch = True
38 self.supportsFilterSearch = True
40 def configure_provider(self):
41 return gws.config.util.configure_database_provider_for(self)
43 def configure_models(self):
44 return gws.config.util.configure_models_for(self, with_default=True)
46 def create_model(self, cfg):
47 return self.create_child(
48 gws.ext.object.model,
49 cfg,
50 type=self.extType,
51 sqlFilter=self.cfg('sqlFilter'),
52 _defaultDb=self.db,
53 _defaultTableName=self.tableName
54 )
56 # def _filter_to_sql(self, f: gws.SearchFilter):
57 # if not f:
58 # return
59 #
60 # if f.operator in ('and', 'or'):
61 # w = []
62 # p = []
63 # for sub in f.sub:
64 # where = self._filter_to_sql(sub)
65 # w.append(where[0])
66 # p.extend(where[1:])
67 # wstr = '(' + f' {f.operator} '.join(w) + ')'
68 # return [wstr, *p]
69 #
70 # if f.operator == 'bbox':
71 # return [
72 # f'ST_Intersects(%s::geometry, "{self.table.geometry_column}")',
73 # f.shape.ewkb_hex
74 # ]
75 #
76 # # @TODO must take editDataModel into account
77 #
78 # return [f'{f.name} {f.operator} %s', f.value]