from collections import deque from cfg import config from db_util import get_page_id def prepare_dijkstra(connection): cursor = connection.cursor() cursor.execute('''INSERT OR IGNORE INTO dijkstra_helper(page) SELECT destination FROM links ''') cursor.execute('''INSERT OR IGNORE INTO dijkstra_helper(page) SELECT source FROM links ''') if(config["use_sqlite"]): cursor.execute("UPDATE dijkstra_helper SET value=1e1000") else: cursor.execute("UPDATE dijkstra_helper SET value=2147483647") connection.commit() def dijkstra_one(page, value, connection): cursor = connection.cursor() if(isinstance(title, tuple)): # Idk why this happens. title = title[0] cursor.execute('''SELECT page FROM dijkstra_helper LEFT JOIN links ON links.destination=dijkstra_helper.page WHERE links.source=:page AND dijkstra_helper.value>:value''', {"pate": page, "value": value + 1}) # This is the list of nodes that have to be updated result = cursor.fetchall() cursor.execute('''UPDATE dijkstra_helper SET value=:value WHERE name IN ( SELECT destination FROM links WHERE source=:page) AND dijkstra_helper.value>:value''', {"value": value + 1, "page": page}) connection.commit() return result def recursive_dijkstra(titles, value, connection): if(not titles): return todos = deque() for title in titles: todos.extend(dijkstra_one(title, value, connection)) recursive_dijkstra(todos, value + 1, connection) def dijkstra(title, connection): page = get_page_id(title, connection) cursor = connection.cursor() cursor.execute("UPDATE dijkstra_helper SET value=0 WHERE name=%s", (page,)) todos = dijkstra_one(page, 1, connection) recursive_dijkstra(todos, 2, connection)