Skip to content

Commit 03bb7ca

Browse files
committed
Add tables _traits and _traits_paths
1 parent deb0702 commit 03bb7ca

File tree

1 file changed

+41
-17
lines changed

1 file changed

+41
-17
lines changed

pathtraits/db.py

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)