1+ from sqlalchemy import select , case , literal_column , func
2+ from sqlalchemy .sql import exists , and_ , not_
3+ from sqlalchemy .orm import aliased
4+ from geoalchemy2 import functions as geofunc
15from sqlalchemy .ext .asyncio import AsyncSession
2- from sqlmodel import select
36from app .models .tree import StreetTreeRegister
47
58async def get_tree_by_id (session : AsyncSession , tree_id : int ):
@@ -10,3 +13,64 @@ async def get_tree_by_id(session: AsyncSession, tree_id: int):
1013 row = result .scalars ().first ()
1114
1215 return row
16+
17+ async def get_tree_by_species (session : AsyncSession ):
18+ # Alias for subquery
19+ gef = aliased (StreetTreeRegister )
20+
21+ stmt = (
22+ select (
23+ StreetTreeRegister .id ,
24+ StreetTreeRegister .tree_number ,
25+ StreetTreeRegister .street ,
26+ StreetTreeRegister .species ,
27+ StreetTreeRegister .type ,
28+ func .round (
29+ func .ST_X (func .ST_Transform (StreetTreeRegister .geom , 4326 )).cast ('numeric' ),
30+ 6
31+ ).label ("lon" ),
32+ func .round (
33+ func .ST_Y (func .ST_Transform (StreetTreeRegister .geom , 4326 )).cast ('numeric' ),
34+ 6
35+ ).label ("lat" ),
36+ case (
37+ (
38+ StreetTreeRegister .species .ilike ("%Tilia%" ), 1 ,
39+ ),
40+ (
41+ StreetTreeRegister .species .ilike ("%Acer%" ), 2 ,
42+ ),
43+ (
44+ StreetTreeRegister .species .ilike ("%Quercus%" ), 3 ,
45+ ),
46+ (
47+ StreetTreeRegister .species .ilike ("%Fagus%" ), 4 ,
48+ ),
49+ (
50+ StreetTreeRegister .species .ilike ("%Betula%" ), 5 ,
51+ ),
52+ (
53+ StreetTreeRegister .species .ilike ("%Carpinus%" ), 6 ,
54+ ),
55+ else_ = 0 ,
56+ ).label ("species_index" )
57+ )
58+ .where (
59+ StreetTreeRegister .type == 'bestand' ,
60+ not_ (
61+ exists ()
62+ .where (
63+ and_ (
64+ gef .type == 'gefaellt' ,
65+ gef .tree_number == StreetTreeRegister .tree_number ,
66+ gef .street == StreetTreeRegister .street ,
67+ )
68+ )
69+ )
70+ )
71+ .order_by (StreetTreeRegister .species )
72+ )
73+
74+ result = await session .execute (stmt )
75+
76+ return result .scalars ().all ()
0 commit comments