2
2
from yaml import safe_dump , safe_load
3
3
4
4
from constraint import Constraint , Trigger
5
+ from feature_group import FeatureGroup
5
6
from tabor_layer import TaborLayer
6
7
from consts import VERSION
7
8
8
9
9
10
class TaborFile (object ):
11
+ # TODO: Use hashmaps!
12
+ groups : list [FeatureGroup ] = []
10
13
layers : list [TaborLayer ] = []
11
14
12
15
def __init__ (self , path : str , psql_data : dict | None = None ) -> None :
@@ -31,7 +34,14 @@ def __init__(self, path: str, psql_data: dict | None = None) -> None:
31
34
except KeyError :
32
35
pass
33
36
34
- self .add_layer (layer ["name" ], layer ["schema" ], geometry , layer ["owner" ], layer ["fields" ], constraints )
37
+
38
+ group = ""
39
+ try :
40
+ group = layer ["group" ]
41
+ except KeyError :
42
+ pass
43
+
44
+ self .add_layer (layer ["name" ], layer ["schema" ], geometry , layer ["owner" ], layer ["fields" ], constraints , group )
35
45
36
46
except FileNotFoundError :
37
47
raise Exception (f"Failed to read .tabor file at { self .path } , does that path exist?" )
@@ -51,24 +61,43 @@ def __init__(self, path: str, psql_data: dict | None = None) -> None:
51
61
except KeyError :
52
62
pass
53
63
54
- self .add_layer (table .split ("." )[1 ], table .split ("." )[0 ], geom , values ["owner" ], values ["fields" ], derived_constraints )
64
+ derived_group = None
65
+ try :
66
+ derived_group = values ["group" ]
67
+ except KeyError :
68
+ pass
69
+ self .add_layer (table .split ("." )[1 ], table .split ("." )[0 ], geom , values ["owner" ], values ["fields" ], derived_constraints , derived_group )
55
70
56
71
57
- def add_layer (self , name : str , schema : str , geometry : str | None , owner : str , fields : dict , constraints : list [dict ]) -> TaborLayer :
58
- self .layers .append (TaborLayer (name , schema , geometry , owner , fields , constraints ))
72
+ def add_layer (self , name : str , schema : str , geometry : str | None , owner : str , fields : dict , constraints : list [dict ], group : str | None ) -> TaborLayer :
73
+ layer = TaborLayer (name , schema , geometry , owner , fields , constraints , group )
74
+ if group :
75
+ feature_group = self .add_or_get_group (group )
76
+ feature_group .add_layer (layer )
77
+ self .layers .append (layer )
59
78
return self .layers [len (self .layers ) - 1 ]
60
79
61
80
81
+ def add_or_get_group (self , name : str ) -> FeatureGroup :
82
+ for group in self .groups :
83
+ if group .name == name :
84
+ return group
85
+
86
+ self .groups .append (FeatureGroup (name ))
87
+ return self .groups [len (self .groups ) - 1 ]
88
+
89
+
62
90
def to_psql (self ) -> dict :
63
91
result = {}
92
+ result ["layers" ] = {}
64
93
for layer in self .layers :
65
- result [layer .name ] = {}
94
+ result ["layers" ][ layer .name ] = {}
66
95
fields = []
67
96
for field in layer .fields :
68
97
fields .append (field .as_psql ())
69
98
70
- if layer .get_pk_field ():
71
- pk_query = f""", PRIMARY KEY ({ layer .get_pk_field ()} )"""
99
+ if layer .get_pk_field ()[ 0 ] :
100
+ pk_query = f""", PRIMARY KEY ({ layer .get_pk_field ()[ 0 ] } )"""
72
101
else :
73
102
pk_query = ""
74
103
@@ -77,15 +106,21 @@ def to_psql(self) -> dict:
77
106
else :
78
107
geom_query = ""
79
108
80
- result [layer .name ]["schema" ] = f"""CREATE TABLE IF NOT EXISTS "{ layer .schema } "."{ layer .name } " ({ ", " .join (fields )} { geom_query } { pk_query } );"""
81
- result [layer .name ]["owner" ] = f"""ALTER TABLE "{ layer .schema } "."{ layer .name } " OWNER TO { layer .owner } ;"""
109
+ result ["layers" ][ layer .name ]["schema" ] = f"""CREATE TABLE IF NOT EXISTS "{ layer .schema } "."{ layer .name } " ({ ", " .join (fields )} { geom_query } { pk_query } );"""
110
+ result ["layers" ][ layer .name ]["owner" ] = f"""ALTER TABLE "{ layer .schema } "."{ layer .name } " OWNER TO { layer .owner } ;"""
82
111
83
- result [layer .name ]["constraints" ] = []
112
+ result ["layers" ][ layer .name ]["constraints" ] = []
84
113
for constraint in layer .constraints :
85
- result [layer .name ]["constraints" ].append (str (constraint ))
114
+ result ["layers" ][ layer .name ]["constraints" ].append (str (constraint ))
86
115
87
116
if layer .geometry :
88
- result [layer .name ]["geometry" ] = f"""ALTER TABLE "{ layer .schema } "."{ layer .name } " ALTER COLUMN geom TYPE Geometry({ layer .derive_geometry_type ()} );"""
117
+ result ["layers" ][layer .name ]["geometry" ] = f"""ALTER TABLE "{ layer .schema } "."{ layer .name } " ALTER COLUMN geom TYPE Geometry({ layer .derive_geometry_type ()} );"""
118
+
119
+ result ["groups" ] = {}
120
+ for group in self .groups :
121
+ result ["groups" ][group .name ] = {}
122
+ result ["groups" ][group .name ]["schema" ] = str (group )
123
+ result ["groups" ][group .name ]["owner" ] = f"""ALTER TABLE "{ group .schema } "."{ group .name } " OWNER TO { group .owner } ;"""
89
124
90
125
return result
91
126
0 commit comments