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

1from typing import Optional, cast 

2 

3import gws 

4import gws.base.database 

5import gws.base.model 

6import gws.base.search 

7import gws.config.util 

8 

9gws.ext.new.finder('postgres') 

10 

11 

12class Config(gws.base.search.finder.Config): 

13 """Database-based search""" 

14 

15 dbUid: Optional[str] 

16 """database provider uid""" 

17 tableName: str 

18 """sql table name""" 

19 sqlFilter: Optional[str] 

20 """extra SQL filter""" 

21 

22 

23class Object(gws.base.search.finder.Object): 

24 db: gws.DatabaseProvider 

25 tableName: str 

26 

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() 

32 

33 # it's difficult to decide if we support keyword/geometry search, 

34 # because different models can have different rules 

35 

36 self.supportsKeywordSearch = True 

37 self.supportsGeometrySearch = True 

38 self.supportsFilterSearch = True 

39 

40 def configure_provider(self): 

41 return gws.config.util.configure_database_provider_for(self) 

42 

43 def configure_models(self): 

44 return gws.config.util.configure_models_for(self, with_default=True) 

45 

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 ) 

55 

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]