From 46d2f26c039023a7fa52bc733633dccc55223cbd Mon Sep 17 00:00:00 2001 From: Stefan Date: Sun, 8 Dec 2024 16:51:33 +0200 Subject: [PATCH 1/3] Placeholder for fork exercise to README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 55574dd..5ace1c5 100644 --- a/README.md +++ b/README.md @@ -47,3 +47,4 @@ Käynnistä ohjelma: python src/index.py ``` + From e3bd043e4316f963aa0bf431ab3f2b8163acc906 Mon Sep 17 00:00:00 2001 From: Stefan Date: Mon, 9 Dec 2024 15:24:45 +0200 Subject: [PATCH 2/3] Consolidate SQL queries into constants for citation operations --- src/repositories/citation_repository.py | 150 +++++++++++++----------- 1 file changed, 83 insertions(+), 67 deletions(-) diff --git a/src/repositories/citation_repository.py b/src/repositories/citation_repository.py index 8576160..d9edb3d 100644 --- a/src/repositories/citation_repository.py +++ b/src/repositories/citation_repository.py @@ -4,15 +4,74 @@ from entities.citation import Citation +GET_CITATIONS_SQL = text(""" + SELECT c.id, c.citation_key, c.citation_type, cf.field_name, cf.field_value + FROM citations c LEFT JOIN citation_fields cf ON c.id = cf.citation_id +""") + +INSERT_CITATION_SQL = text(""" + INSERT INTO citations (citation_type, citation_key) + VALUES (:citation_type, :citation_key) RETURNING id +""") + +INSERT_CITATION_FIELD_SQL = text(""" + INSERT INTO citation_fields (citation_id, field_name, field_value) + VALUES (:citation_id, :field_name, :field_value) +""") + +GET_UNIQUE_FIELD_NAMES_SQL = text(""" + SELECT DISTINCT field_name + FROM citation_fields + WHERE field_name IS NOT NULL + ORDER BY field_name ASC +""") + +GET_ALL_CITATION_KEYS_SQL = text(""" + SELECT c.citation_key + FROM citations c +""") + +GET_CITATION_BY_ID_SQL = text(""" + SELECT c.id, c.citation_key, c.citation_type, cf.field_name, cf.field_value + FROM citations c + LEFT JOIN citation_fields cf ON c.id = cf.citation_id + WHERE c.id = :citation_id +""") + +DELETE_CITATION_FIELDS_SQL = text(""" + DELETE FROM citation_fields WHERE citation_id = :citation_id +""") + +DELETE_CITATION_SQL = text(""" + DELETE FROM citations WHERE id = :citation_id +""") + +REMOVE_CITATION_FIELD_SQL = text(""" + DELETE FROM citation_fields + WHERE citation_id = :citation_id AND field_name = :field_name +""") + +GET_CITATION_FIELD_NAMES_SQL = text(""" + SELECT cf.field_name + FROM citations c LEFT JOIN citation_fields cf ON c.id = cf.citation_id + WHERE c.id = :citation_id +""") + +UPDATE_FIELD_SQL = text(""" + UPDATE citation_fields + SET field_value = :field_value + WHERE citation_id = :citation_id AND field_name = :field_name +""") + +INSERT_FIELD_SQL = text(""" + INSERT INTO citation_fields (citation_id, field_name, field_value) + VALUES (:citation_id, :field_name, :field_value) +""") + + def get_citations() -> list[Citation]: citations_dict = defaultdict(lambda: {"fields": {}}) - - sql = text( - """SELECT c.id, c.citation_key, c.citation_type, cf.field_name, cf.field_value - FROM citations c LEFT JOIN citation_fields cf ON c.id = cf.citation_id - """ - ) - result = db.session.execute(sql) + result = db.session.execute(GET_CITATIONS_SQL) rows = result.fetchall() for row in rows: @@ -37,14 +96,8 @@ def get_citations() -> list[Citation]: def add_citation(citation: Citation): - sql = text( - """ - INSERT INTO citations (citation_type, citation_key) - VALUES (:citation_type, :citation_key) RETURNING id - """ - ) result = db.session.execute( - sql, + INSERT_CITATION_SQL, { "citation_type": citation.citation_type, "citation_key": citation.citation_key, @@ -53,14 +106,8 @@ def add_citation(citation: Citation): citation_id = result.fetchone()[0] for field_name, field_value in citation.fields.items(): - sql = text( - """ - INSERT INTO citation_fields (citation_id, field_name, field_value) - VALUES (:citation_id, :field_name, :field_value) - """ - ) db.session.execute( - sql, + INSERT_CITATION_FIELD_SQL, { "citation_id": citation_id, "field_name": field_name, @@ -76,15 +123,7 @@ def get_citation_by_id(citation_id: int) -> dict: """ Retrieves a single citation by its ID and returns it as a dictionary. """ - sql = text( - """ - SELECT c.id, c.citation_key, c.citation_type, cf.field_name, cf.field_value - FROM citations c - LEFT JOIN citation_fields cf ON c.id = cf.citation_id - WHERE c.id = :citation_id - """ - ) - result = db.session.execute(sql, {"citation_id": citation_id}) + result = db.session.execute(GET_CITATION_BY_ID_SQL, {"citation_id": citation_id}) rows = result.fetchall() if not rows: @@ -112,31 +151,18 @@ def delete_citation_from_db(citation_id: int): """ Deletes a citation and its associated fields from the database. """ - sql_delete_fields = text( - "DELETE FROM citation_fields WHERE citation_id = :citation_id" - ) - sql_delete_citation = text("DELETE FROM citations WHERE id = :citation_id") - - db.session.execute(sql_delete_fields, {"citation_id": citation_id}) - db.session.execute(sql_delete_citation, {"citation_id": citation_id}) + db.session.execute(DELETE_CITATION_FIELDS_SQL, {"citation_id": citation_id}) + db.session.execute(DELETE_CITATION_SQL, {"citation_id": citation_id}) db.session.commit() def remove_citation_field_from_db(citation_id, field_name): - sql = text("""DELETE FROM citation_fields - WHERE citation_id = :citation_id AND field_name = :field_name""") - - db.session.execute(sql, {"citation_id": citation_id, "field_name": field_name}) + db.session.execute(REMOVE_CITATION_FIELD_SQL, {"citation_id": citation_id, "field_name": field_name}) db.session.commit() def get_citation_field_names(citation_id): - sql = text( - """SELECT cf.field_name - FROM citations c LEFT JOIN citation_fields cf ON c.id = cf.citation_id - WHERE c.id = :citation_id""" - ) - result = db.session.execute(sql, {"citation_id": citation_id}) + result = db.session.execute(GET_CITATION_FIELD_NAMES_SQL, {"citation_id": citation_id}) rows = result.fetchall() return {row[0] for row in rows} @@ -145,18 +171,17 @@ def update_citation_in_db(citation_id: int, citation_fields: dict): existing_fields = get_citation_field_names(citation_id) for field_name, field_value in citation_fields.items(): - sql = "" if field_name in existing_fields: - sql = """UPDATE citation_fields - SET field_value = :field_value - WHERE citation_id = :citation_id AND field_name = :field_name""" + db.session.execute( + UPDATE_FIELD_SQL, + {"citation_id": citation_id, "field_name": field_name, "field_value": field_value} + ) existing_fields.remove(field_name) else: - sql = """INSERT INTO citation_fields (citation_id, field_name, field_value) - VALUES (:citation_id, :field_name, :field_value)""" - - db.session.execute(text(sql), {"citation_id": citation_id, "field_name": field_name, - "field_value": field_value}) + db.session.execute( + INSERT_FIELD_SQL, + {"citation_id": citation_id, "field_name": field_name, "field_value": field_value} + ) for field_name in existing_fields: remove_citation_field_from_db(citation_id, field_name) @@ -165,8 +190,7 @@ def update_citation_in_db(citation_id: int, citation_fields: dict): def unique_key(key): - sql = text("SELECT c.citation_key FROM citations c") - result = db.session.execute(sql) + result = db.session.execute(GET_ALL_CITATION_KEYS_SQL) rows = result.fetchall() for existing_key in rows: if key == existing_key[0]: @@ -178,14 +202,6 @@ def get_unique_field_names() -> set: """ Retrieves a set of all unique field names used across all citations. """ - sql = text( - """ - SELECT DISTINCT field_name - FROM citation_fields - WHERE field_name IS NOT NULL - ORDER BY field_name ASC - """ - ) - result = db.session.execute(sql) + result = db.session.execute(GET_UNIQUE_FIELD_NAMES_SQL) rows = result.fetchall() return {row[0] for row in rows} From f6af76912bdd2bd0723f6f61d9ea5a7e4dcf358e Mon Sep 17 00:00:00 2001 From: Roar1ngDuck Date: Tue, 17 Dec 2024 16:23:16 +0200 Subject: [PATCH 3/3] Korjaa citation_repository.py linttaus --- src/repositories/citation_repository.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/repositories/citation_repository.py b/src/repositories/citation_repository.py index d9edb3d..70677d1 100644 --- a/src/repositories/citation_repository.py +++ b/src/repositories/citation_repository.py @@ -157,7 +157,8 @@ def delete_citation_from_db(citation_id: int): def remove_citation_field_from_db(citation_id, field_name): - db.session.execute(REMOVE_CITATION_FIELD_SQL, {"citation_id": citation_id, "field_name": field_name}) + db.session.execute(REMOVE_CITATION_FIELD_SQL, + {"citation_id": citation_id, "field_name": field_name}) db.session.commit() @@ -173,13 +174,13 @@ def update_citation_in_db(citation_id: int, citation_fields: dict): for field_name, field_value in citation_fields.items(): if field_name in existing_fields: db.session.execute( - UPDATE_FIELD_SQL, + UPDATE_FIELD_SQL, {"citation_id": citation_id, "field_name": field_name, "field_value": field_value} ) existing_fields.remove(field_name) else: db.session.execute( - INSERT_FIELD_SQL, + INSERT_FIELD_SQL, {"citation_id": citation_id, "field_name": field_name, "field_value": field_value} )