@@ -90,7 +90,7 @@ def __init__(self, db_path):
9090 self .cursor .row_factory = TraitsDB .row_factory
9191
9292 init_path_table_query = """
93- CREATE TABLE IF NOT EXISTS path (
93+ CREATE TABLE IF NOT EXISTS _paths (
9494 id INTEGER PRIMARY KEY AUTOINCREMENT,
9595 path text NOT NULL UNIQUE
9696 );
@@ -99,9 +99,29 @@ def __init__(self, db_path):
9999
100100 init_path_index_query = """
101101 CREATE INDEX IF NOT EXISTS idx_path_path
102- ON path (path);
102+ ON _paths (path);
103103 """
104104 self .execute (init_path_index_query )
105+
106+ init_traits_table_query = """
107+ CREATE TABLE IF NOT EXISTS _traits (
108+ id INTEGER PRIMARY KEY AUTOINCREMENT,
109+ trait text NOT NULL UNIQUE
110+ );
111+ """
112+ self .execute (init_traits_table_query )
113+
114+ init_traits_paths_table_query = """
115+ CREATE TABLE IF NOT EXISTS _traits_paths (
116+ trait INTEGER,
117+ path INTEGER,
118+ FOREIGN KEY(trait) REFERENCES _traits(id),
119+ FOREIGN KEY(path) REFERENCES path(id),
120+ UNIQUE(trait, path)
121+ );
122+ """
123+ self .execute (init_traits_paths_table_query )
124+
105125 self .update_traits ()
106126
107127 # pylint: disable=R1710
@@ -159,13 +179,13 @@ def put_path_id(self, path):
159179 :param path: path to put to the data base
160180 :returns: the id of that path
161181 """
162- get_row_query = f"SELECT id FROM path WHERE path = '{ path } ' LIMIT 1;"
182+ get_row_query = f"SELECT id FROM _paths WHERE path = '{ path } ' LIMIT 1;"
163183 res = self .execute (get_row_query ).fetchone ()
164184 if res :
165185 return res ["id" ]
166186 # create
167- self .put ("path " , path = path )
168- path_id = self .get ("path " , path = path , cols = "id" )["id" ]
187+ self .put ("_paths " , path = path )
188+ path_id = self .get ("_paths " , path = path , cols = "id" )["id" ]
169189 return path_id
170190
171191 @staticmethod
@@ -234,23 +254,23 @@ def put_data_view(self):
234254 if self .traits :
235255 join_query = " " .join (
236256 [
237- f"LEFT JOIN [{ x } ] ON [{ x } ].path = path .id \n "
257+ f"LEFT JOIN [{ x } ] ON [{ x } ].path = _paths .id \n "
238258 for x in self .traits
239259 if x != "path"
240260 ]
241261 )
242262
243263 create_view_query = f"""
244264 CREATE VIEW data AS
245- SELECT path .path, [{ '], [' .join (self .traits )} ]
246- FROM path
265+ SELECT _paths .path, [{ '], [' .join (self .traits )} ]
266+ FROM _paths
247267 { join_query } ;
248268 """
249269 else :
250270 create_view_query = """
251271 CREATE VIEW data AS
252- SELECT path .path
253- FROM path ;
272+ SELECT _paths .path
273+ FROM _paths ;
254274 """
255275 self .execute (create_view_query )
256276
@@ -259,14 +279,15 @@ def update_traits(self):
259279 Get all traits from the database
260280 """
261281 get_traits_query = """
262- SELECT name
263- FROM sqlite_master
264- WHERE type='table'
265- AND name NOT LIKE 'sqlite_%'
266- AND name != 'path'
267- ORDER BY name;
282+ SELECT trait
283+ FROM _traits
284+ ORDER BY trait;
268285 """
269- traits = self .execute (get_traits_query ).fetchall ()
286+ traits = self .execute (get_traits_query )
287+ if traits is not None :
288+ traits = traits .fetchall ()
289+ else :
290+ traits = []
270291 self .traits = [list (x .values ())[0 ] for x in traits ]
271292 self .put_data_view ()
272293
@@ -295,6 +316,7 @@ def create_trait_table(self, trait_name, value_type):
295316 );
296317 """
297318 self .execute (add_table_query )
319+ self .put ("_traits" , trait = trait_name )
298320 self .update_traits ()
299321
300322 def put_trait (self , path_id , trait_name , value , update = True ):
@@ -307,6 +329,8 @@ def put_trait(self, path_id, trait_name, value, update=True):
307329 :param value: trait value
308330 """
309331 kwargs = {"path" : path_id , trait_name : value }
332+ trait_id = self .get ("_traits" , trait = trait_name )["id" ]
333+ self .put ("_traits_paths" , trait = trait_id , path = path_id )
310334 self .put (trait_name , condition = f"path = { path_id } " , update = update , ** kwargs )
311335
312336 def add_pathpair (self , pair : PathPair ):
0 commit comments