feat: add tag export functionality

This commit is contained in:
thomasabishop 2025-01-17 13:56:50 +00:00
parent 81a59122e8
commit 2209fbeb54
5 changed files with 42 additions and 12 deletions

Binary file not shown.

View file

@ -6,14 +6,17 @@ from services.database_service import DatabaseService
from services.graph_service import GraphService from services.graph_service import GraphService
from services.parse_file_service import ParseFileService from services.parse_file_service import ParseFileService
from services.table_service import TableService from services.table_service import TableService
from services.tag_service import TagService
database_service = DatabaseService("eolas") database_service = DatabaseService("eolas")
database_connection = database_service.connect() database_connection = database_service.connect()
table_service = TableService(database_connection) table_service = TableService(database_connection)
parse_file_service = ParseFileService(EOLAS_DIRECTORY) parse_file_service = ParseFileService(EOLAS_DIRECTORY)
graph_service = GraphService(database_connection) graph_service = GraphService(database_connection)
tag_service = TagService(database_connection)
controller = Controller( controller = Controller(
database_service, table_service, parse_file_service, graph_service database_service, table_service, parse_file_service, graph_service, tag_service
) )
@ -34,8 +37,8 @@ def main():
if args.command == "generate-graph": if args.command == "generate-graph":
controller.execute("graph") controller.execute("graph")
# if args.command == "export-tags": if args.command == "export-tags":
# controller.export_tags() controller.execute("tags")
if __name__ == "__main__": if __name__ == "__main__":

View file

@ -8,13 +8,13 @@ class Controller:
table_service, table_service,
parse_file_service, parse_file_service,
graph_service, graph_service,
# tag_service, tag_service,
): ):
self.database_service = database_service self.database_service = database_service
self.table_service = table_service self.table_service = table_service
self.parse_file_service = parse_file_service self.parse_file_service = parse_file_service
self.graph_service = graph_service self.graph_service = graph_service
# self.tag_service = tag_service self.tag_service = tag_service
def execute(self, operation): def execute(self, operation):
try: try:
@ -23,6 +23,8 @@ class Controller:
return self.__populate_database() return self.__populate_database()
case "graph": case "graph":
return self.__generate_graph() return self.__generate_graph()
case "tags":
return self.__export_tags()
except Exception as e: except Exception as e:
raise Exception(colored(f"ERROR {e}", "red")) raise Exception(colored(f"ERROR {e}", "red"))
finally: finally:
@ -35,3 +37,6 @@ class Controller:
def __generate_graph(self): def __generate_graph(self):
self.graph_service.generate_graph() self.graph_service.generate_graph()
def __export_tags(self):
self.tag_service.export_tags()

View file

@ -1,8 +1,10 @@
import json import json
from constants import GRAPH_OUTPUT_DIRECTORY
from services.sqlite_service import SqliteService from constants import GRAPH_OUTPUT_DIRECTORY
from models.graph_node import IGraphNode
from models.graph_edge import IGraphEdge from models.graph_edge import IGraphEdge
from models.graph_node import IGraphNode
from services.sqlite_service import SqliteService
class GraphService(SqliteService): class GraphService(SqliteService):
error_message_stub = "Could not retrieve contents of table:" error_message_stub = "Could not retrieve contents of table:"
@ -20,7 +22,7 @@ class GraphService(SqliteService):
"SELECT title FROM entries", "SELECT title FROM entries",
error_message=f"{self.error_message_stub} entries", error_message=f"{self.error_message_stub} entries",
) )
entries = [IGraphNode(id=entry[0], type="entry") for entry in entries] entries = [IGraphNode(id=entry[0], type="entry") for entry in entries]
return tags + entries return tags + entries
@ -29,16 +31,18 @@ class GraphService(SqliteService):
"SELECT * FROM entries_tags", "SELECT * FROM entries_tags",
error_message=f"{self.error_message_stub} entries_tags", error_message=f"{self.error_message_stub} entries_tags",
) )
tags = [IGraphEdge(source=f"#{tag[1]}", target=tag[0]) for tag in tags] tags = [IGraphEdge(source=f"#{tag[1]}", target=tag[0]) for tag in tags]
backlinks = self._query( backlinks = self._query(
"SELECT * FROM backlinks", "SELECT * FROM backlinks",
error_message=f"{self.error_message_stub} backlinks", error_message=f"{self.error_message_stub} backlinks",
) )
backlinks = [IGraphEdge(source=f"{backlink[0]}", target = backlink[1]) for backlink in backlinks]
backlinks = [
IGraphEdge(source=f"{backlink[0]}", target=backlink[1])
for backlink in backlinks
]
return tags + backlinks return tags + backlinks

View file

@ -0,0 +1,18 @@
from services.sqlite_service import SqliteService
class TagService(SqliteService):
def __init__(self, db_connection):
super().__init__(db_connection)
def __retrieve_entries_for_tag(self, tag):
entries = self._query("SELECT * FROM entries_tags WHERE tag_name = ?", (tag,))
return sorted([entry[0] for entry in entries])
def export_tags(self):
tags = self._query("SELECT * FROM tags")
tags = sorted([tag[0] for tag in tags])
tag_dict = {}
for tag in tags:
tag_dict[tag] = self.__retrieve_entries_for_tag(tag)
return tag_dict