From 60b75134f76bfa2040d5f3ed1512a437cde7d8f4 Mon Sep 17 00:00:00 2001 From: Marcel Gansfusz Date: Thu, 20 Feb 2025 01:09:23 +0100 Subject: [PATCH] added search APIs --- app/__pycache__/main.cpython-313.pyc | Bin 6844 -> 11634 bytes app/main.py | 114 +++++++++++++++++++++++++++ 2 files changed, 114 insertions(+) diff --git a/app/__pycache__/main.cpython-313.pyc b/app/__pycache__/main.cpython-313.pyc index 3070ab36f8063d05cbbe3e02595a21b84445c6da..e86ac030a3d4c79277a9b9300e2484a08d6368b0 100644 GIT binary patch literal 11634 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 List[Dict[str, str]]: + res = [] + cur = db.cursor(dictionary=True) + if await is_LVID(searchterm): + cur.execute( + "SELECT lvid,lvname FROM LVAs WHERE lvid LIKE ?", (searchterm + "%",) + ) + res = cur.fetchall() + else: + cur.execute( + "SELECT lvid,lvname FROM LVAs WHERE lvname LIKE ?", + ("%" + searchterm + "%",), + ) + res = cur.fetchall() + if searchlim == 0: + return res + else: + return res[:searchlim] + + +@app.get("/search/prof") +async def search_profs( + searchterm: str = "", lvid: str = "", searchlim: int = 10 +) -> List[Dict[str, str | int]]: + res = [] + cur = db.cursor(dictionary=True) + if lvid != "": + cur.execute("SELECT id FROM LVAs WHERE LVId=?", (lvid,)) + lid = cur.fetchall()[0]["id"] + cur.execute( + "SELECT Profs.id,Profs.name FROM Profs LEFT JOIN LPLink ON Profs.id=LPLink.pid WHERE name like ? AND lid=?", + ("%" + searchterm + "%", lid), + ) + res = cur.fetchall() + cur.execute( + "SELECT Profs.id,Profs.name FROM Profs LEFT JOIN LPLink ON Profs.id=LPLink.pid WHERE name NOT like ? AND lid=?", + ("%" + searchterm + "%", lid), + ) + zw = cur.fetchall() + if searchterm != "": + cur.execute( + "SELECT id,name FROM Profs WHERE name LIKE ?", ("%" + searchterm + "%",) + ) + res += cur.fetchall() + res = remove_duplicates(res + zw) + if searchlim == 0: + return res + else: + return res[:searchlim] + + +@app.get( + "/search/subcat" +) # NOT FULLY TESTED DUE TO INCOMPLETE DATABASE DUE TO INACCEPTABLE FOLDERSTRUCTURE +async def search_subcats( + searchterm: str = "", + lvid: str = "", + pid: int | None = None, + cat: int | None = None, + searchlim: int = 10, +) -> List[Dict[str, str | int]]: + res = [] + rest = [] + cur = db.cursor(dictionary=True) + if not (lvid == "" or pid is None or cat is None): # Rest is available + cur.execute("SELECT id FROM LVAs WHERE LVId=?", (lvid,)) + lid = cur.fetchall()[0]["id"] + cur.execute( + "SELECT id,name FROM SubCats WHERE lid=? AND pid=? AND cat=?", + (lid, pid, cat), + ) + rest = cur.fetchall() + if searchterm != "": # searchterm is available + if not (lvid == "" or pid is None or cat is None): + cur.execute( + "SELECT id,name FROM SubCats WHERE lid=? AND pid=? AND cat=? AND name LIKE ?", + (lid, pid, cat, "%" + searchterm + "%"), + ) + res = cur.fetchall() + cur.execute( + "SELECT id,name FROM SubCats WHERE name LIKE ?", ("%" + searchterm + "%",) + ) + res += cur.fetchall() + res = remove_duplicates(res + rest) + if searchlim == 0: + return res + else: + return res[:searchlim] + + # @app.post("/files/") # async def create_file(file: Annotated[bytes, File()]): # return {"filesize": len(file)} @@ -165,6 +258,27 @@ def censor_pdf( print("CENSORING DONE") +async def is_LVID(term: str) -> bool: + if re.match(r"[a-zA-Z0-9]{3}\.[a-zA-Z0-9]*", term): + return True + if term.isdigit(): + return True + return False + + +def remove_duplicates( + results: List[Dict[str, str | int]], +) -> List[Dict[str, str | int]]: + ids = [] + res = [] + for result in results: + if result["id"] in ids: + continue + ids.append(result["id"]) + res.append(result) + return res + + # async def get_submittion(request: Request): # reqJson = await request.form() # print(reqJson)