aboutsummaryrefslogtreecommitdiff
path: root/backend/server.py
diff options
context:
space:
mode:
authorTerry Truong <terry06890@gmail.com>2022-05-12 00:10:12 +1000
committerTerry Truong <terry06890@gmail.com>2022-05-12 00:10:12 +1000
commite1ef2bf3387769de4edc4a7ec1a6d38c5a21c5e7 (patch)
treed2a8ee2f6e36cbbc723de774965c9a001b746b0d /backend/server.py
parent4872ce9c22cc3c7024075f66409efdaf8860e9b8 (diff)
Add reduced-tree data generation+serving+querying+setting
Add genReducedTreeData.py, which generates a reduced_nodes table. Adjust server to serve that data for queries with a tree=reduced query param. Adjust client to query for that data depending on a useReducedTree variable. Add a SettingsPane setting to change that useReducedTree variable.
Diffstat (limited to 'backend/server.py')
-rwxr-xr-xbackend/server.py36
1 files changed, 23 insertions, 13 deletions
diff --git a/backend/server.py b/backend/server.py
index 9c9764b..374fb53 100755
--- a/backend/server.py
+++ b/backend/server.py
@@ -14,6 +14,7 @@ SEARCH_SUGG_LIMIT = 5
usageInfo = f"usage: {sys.argv[0]}\n"
usageInfo += "Starts a server that listens for GET requests to http://" + hostname + ":" + str(port) + ".\n"
usageInfo += "Responds to path+query /data/type1?name=name1 with JSON data.\n"
+usageInfo += "An additional query parameter tree=reduced is usable to get reduced-tree data\n"
usageInfo += "\n"
usageInfo += "If type1 is 'node': Responds with map from names to objects representing node name1 and it's children.\n"
usageInfo += "If type1 is 'chain': Like 'node', but gets nodes from name1 up to the root, and their direct children.\n"
@@ -25,12 +26,13 @@ if len(sys.argv) > 1:
# Connect to db, and load spellfix extension
dbCon = sqlite3.connect(dbFile)
# Some functions
-def lookupNodes(names):
+def lookupNodes(names, useReducedTree):
nodeObjs = {}
cur = dbCon.cursor()
# Get node info
- query = "SELECT name, children, parent, tips, p_support FROM nodes WHERE" \
- " name IN ({})".format(",".join(["?"] * len(names)))
+ nodesTable = "nodes" if not useReducedTree else "reduced_nodes"
+ query = "SELECT name, children, parent, tips, p_support FROM {} WHERE" \
+ " name IN ({})".format(nodesTable, ",".join(["?"] * len(names)))
namesForImgs = []
firstSubnames = {}
secondSubnames = {}
@@ -89,13 +91,19 @@ def getNodeImg(name):
if os.path.exists(imgDir + filename):
return filename
return None
-def lookupName(name):
+def lookupName(name, useReducedTree):
cur = dbCon.cursor()
results = []
hasMore = False
- for row in cur.execute(
- "SELECT DISTINCT name, alt_name FROM names WHERE alt_name LIKE ? ORDER BY length(alt_name) LIMIT ?",
- (name + "%", SEARCH_SUGG_LIMIT)):
+ query = None
+ if not useReducedTree:
+ query = "SELECT DISTINCT name, alt_name FROM names" \
+ " WHERE alt_name LIKE ? ORDER BY length(alt_name) LIMIT ?"
+ else:
+ query = "SELECT DISTINCT names.name, alt_name FROM" \
+ " names INNER JOIN reduced_nodes ON names.name = reduced_nodes.name" \
+ " WHERE alt_name LIKE ? ORDER BY length(alt_name) LIMIT ?"
+ for row in cur.execute(query, (name + "%", SEARCH_SUGG_LIMIT)):
results.append({"name": row[0], "altName": row[1]})
if len(results) > SEARCH_SUGG_LIMIT:
hasMore = True
@@ -124,15 +132,17 @@ class DbServer(BaseHTTPRequestHandler):
queryDict = urllib.parse.parse_qs(urlParts.query)
# Check first element of path
match = re.match(r"/([^/]+)/(.+)", path)
- if match != None and match.group(1) == "data" and "name" in queryDict:
+ if match != None and match.group(1) == "data" and "name" in queryDict and \
+ ("tree" not in queryDict or queryDict["tree"][0] == "reduced"):
reqType = match.group(2)
name = queryDict["name"][0]
+ useReducedTree = "tree" in queryDict
# Check query string
if reqType == "node":
- nodeObjs = lookupNodes([name])
+ nodeObjs = lookupNodes([name], useReducedTree)
if len(nodeObjs) > 0:
nodeObj = nodeObjs[name]
- childNodeObjs = lookupNodes(nodeObj["children"])
+ childNodeObjs = lookupNodes(nodeObj["children"], useReducedTree)
childNodeObjs[name] = nodeObj
self.respondJson(childNodeObjs)
return
@@ -141,7 +151,7 @@ class DbServer(BaseHTTPRequestHandler):
ranOnce = False
while True:
# Get node
- nodeObjs = lookupNodes([name])
+ nodeObjs = lookupNodes([name], useReducedTree)
if len(nodeObjs) == 0:
if not ranOnce:
self.respondJson(results)
@@ -158,7 +168,7 @@ class DbServer(BaseHTTPRequestHandler):
for childName in nodeObj["children"]:
if childName not in results:
childNamesToAdd.append(childName)
- childNodeObjs = lookupNodes(childNamesToAdd)
+ childNodeObjs = lookupNodes(childNamesToAdd, useReducedTree)
results.update(childNodeObjs)
# Check if root
if nodeObj["parent"] == None:
@@ -167,7 +177,7 @@ class DbServer(BaseHTTPRequestHandler):
else:
name = nodeObj["parent"]
elif reqType == "search":
- self.respondJson(lookupName(name))
+ self.respondJson(lookupName(name, useReducedTree))
return
elif reqType == "info":
self.respondJson(lookupNodeInfo(name))