Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,3 +47,4 @@ Käynnistä ohjelma:
python src/index.py
```


151 changes: 84 additions & 67 deletions src/repositories/citation_repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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,
Expand All @@ -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,
Expand All @@ -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:
Expand Down Expand Up @@ -112,31 +151,19 @@ 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}

Expand All @@ -145,18 +172,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)
Expand All @@ -165,8 +191,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]:
Expand All @@ -178,14 +203,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}
Loading