diff options
Diffstat (limited to 'backend/data/genLinkedImgs.py')
| -rwxr-xr-x | backend/data/genLinkedImgs.py | 55 |
1 files changed, 48 insertions, 7 deletions
diff --git a/backend/data/genLinkedImgs.py b/backend/data/genLinkedImgs.py index 5f49ffc..d32196e 100755 --- a/backend/data/genLinkedImgs.py +++ b/backend/data/genLinkedImgs.py @@ -1,6 +1,6 @@ #!/usr/bin/python3 -import sys +import sys, re import sqlite3 usageInfo = f"usage: {sys.argv[0]}\n" @@ -11,11 +11,14 @@ if len(sys.argv) > 1: sys.exit(1) dbFile = "data.db" +compoundNameRegex = re.compile(r"\[(.+) \+ (.+)]") +upPropagateCompoundImgs = False # Open db dbCon = sqlite3.connect(dbFile) dbCur = dbCon.cursor() -dbCur.execute("CREATE TABLE linked_imgs (name TEXT PRIMARY KEY, eol_id INT)") +dbCur.execute("CREATE TABLE linked_imgs (name TEXT PRIMARY KEY, eol_id INT, eol_id2 INT)") + # The eol_id2 column is used to provide the second part of a compound-image # Get nodes with images print("Getting nodes with images") resolvedNodes = {} # Will map node names to eol IDs with a usable image @@ -28,7 +31,8 @@ print("Got {} nodes".format(len(resolvedNodes))) # Iterate through resolved nodes, resolving ancestors where able print("Resolving ancestor nodes") nodesToResolve = {} -processedNodes = set() +processedNodes = {} +parentToChosenTips = {} iterNum = 0 while len(resolvedNodes) > 0: iterNum += 1 @@ -36,7 +40,7 @@ while len(resolvedNodes) > 0: print("At iteration {}".format(iterNum)) # Get next node (nodeName, eolId) = resolvedNodes.popitem() - processedNodes.add(nodeName) + processedNodes[nodeName] = eolId # Traverse upwards, resolving ancestors if able while True: # Get parent @@ -56,9 +60,10 @@ while len(resolvedNodes) > 0: # Check if highest-tips child if (childObjs[0]["name"] == nodeName): # Resolve parent, and continue from it - dbCur.execute("INSERT INTO linked_imgs VALUES (?, ?)", (parent, eolId)) + dbCur.execute("INSERT INTO linked_imgs VALUES (?, ?, ?)", (parent, eolId, None)) del nodesToResolve[parent] - processedNodes.add(parent) + processedNodes[parent] = eolId + parentToChosenTips[parent] = childObjs[0]["tips"] nodeName = parent continue else: @@ -71,8 +76,44 @@ while len(resolvedNodes) > 0: for (name, childObjs) in nodesToResolve.items(): childObj = next(c for c in childObjs if c["eolId"] != None) resolvedNodes[name] = childObj["eolId"] - dbCur.execute("INSERT INTO linked_imgs VALUES (?, ?)", (name, childObj["eolId"])) + parentToChosenTips[name] = childObj["tips"] + dbCur.execute("INSERT INTO linked_imgs VALUES (?, ?, ?)", (name, childObj["eolId"], None)) nodesToResolve.clear() +# Iterate through processed nodes with compound names +print("Replacing images for compound-name nodes") +iterNum = 0 +for nodeName in processedNodes.keys(): + iterNum += 1 + if iterNum % 1e3 == 0: + print("At iteration {}".format(iterNum)) + # + match = compoundNameRegex.fullmatch(nodeName) + if match != None: + # Replace associated image with subname images + (subName1, subName2) = match.group(1,2) + eolIdPair = [0, 0] + if subName1 in processedNodes: + eolIdPair[0] = processedNodes[subName1] + if subName2 in processedNodes: + eolIdPair[1] = processedNodes[subName2] + dbCur.execute("UPDATE linked_imgs SET eol_id = ?, eol_id2 = ? WHERE name = ?", + (eolIdPair[0], eolIdPair[1], nodeName,)) + if upPropagateCompoundImgs: + # Repeat operation for parents, where needed + while True: + # Get parent + row = dbCur.execute("SELECT node FROM edges WHERE child = ?", (nodeName,)).fetchone() + if row != None: + parent = row[0] + # Check num tips + (numTips,) = dbCur.execute("SELECT tips from nodes WHERE name = ?", (nodeName,)).fetchone() + if parent in parentToChosenTips and parentToChosenTips[parent] <= numTips: + # Replace associated image + dbCur.execute("UPDATE linked_imgs SET eol_id = ?, eol_id2 = ? WHERE name = ?", + (eolIdPair[0], eolIdPair[1], parent)) + nodeName = parent + continue + break # Close db dbCon.commit() dbCon.close() |
