Loren commited on
Commit
3458af5
·
verified ·
1 Parent(s): 77055fb

Update app/database.py

Browse files
Files changed (1) hide show
  1. app/database.py +76 -76
app/database.py CHANGED
@@ -1,77 +1,77 @@
1
- import os
2
- from typing import List, Dict
3
- import duckdb
4
- from huggingface_hub import hf_hub_download
5
-
6
- # Initialisations
7
- REPO_ID = "Loren/articles_db"
8
- cache_dir = "/tmp"
9
- os.makedirs(cache_dir, exist_ok=True)
10
-
11
- # Téléchargement des fichiers Parquet depuis Hugging Face
12
- articles_parquet = hf_hub_download(
13
- repo_id=REPO_ID,
14
- filename="articles.parquet",
15
- repo_type="dataset",
16
- cache_dir=cache_dir)
17
- tags_parquet = hf_hub_download(
18
- repo_id=REPO_ID,
19
- filename="tags.parquet",
20
- repo_type="dataset",
21
- cache_dir=cache_dir)
22
- tag_article_parquet = hf_hub_download(
23
- repo_id=REPO_ID,
24
- filename="tag_article.parquet",
25
- repo_type="dataset",
26
- cache_dir=cache_dir)
27
-
28
- # Connexion DuckDB en mémoire
29
- con = duckdb.connect()
30
-
31
- # Créer des tables DuckDB directement à partir des fichiers Parquet
32
- con.execute(f"CREATE VIEW articles AS SELECT * FROM parquet_scan('{articles_parquet}')")
33
- con.execute(f"CREATE VIEW tags AS SELECT * FROM parquet_scan('{tags_parquet}')")
34
- con.execute(f"CREATE VIEW tag_article AS SELECT * FROM parquet_scan('{tag_article_parquet}')")
35
-
36
- # Fonctions d'accès aux données
37
-
38
- def fetch_tags() -> List[str]:
39
- """
40
- Récupère la liste de tous les tags disponibles dans la base de données.
41
-
42
- Returns:
43
- List[str]: Une liste de chaînes de caractères correspondant aux noms des tags, triés par ordre alphabétique.
44
- """
45
- query = "SELECT tag_name FROM tags ORDER BY tag_name"
46
- result = con.execute(query).fetchall()
47
- return [row[0] for row in result]
48
-
49
- def fetch_articles_by_tags(tags: List[str]) -> List[Dict]:
50
- """
51
- Récupère les articles associés à un ou plusieurs tags.
52
-
53
- Args:
54
- tags (List[str]): Une liste de noms de tags pour filtrer les articles.
55
-
56
- Returns:
57
- List[Dict]: Une liste de dictionnaires, chacun représentant un article avec les clés:
58
- - 'article_id': ID de l'article
59
- - 'article_title': Titre de l'article
60
- - 'article_url': URL de l'article
61
-
62
- Notes:
63
- - Si la liste `tags` est vide, la fonction retourne une liste vide.
64
- - Les résultats incluent uniquement les articles correspondant à au moins un des tags fournis.
65
- """
66
- if not tags:
67
- return []
68
-
69
- placeholders = ",".join(["?"] * len(tags))
70
- query = f"""SELECT distinct a.article_id, a.article_title, a.article_url
71
- FROM tags t, tag_article ta, articles a
72
- WHERE t.tag_id = ta.tag_id
73
- AND ta.article_id = a.article_id
74
- AND t.tag_name IN ({placeholders})
75
- """
76
- result = con.execute(query, tags).fetchdf()
77
  return result.to_dict(orient="records")
 
1
+ import os
2
+ from typing import List, Dict
3
+ import duckdb
4
+ from huggingface_hub import hf_hub_download
5
+
6
+ # Initialisations
7
+ REPO_ID = "Loren/articles_database"
8
+ cache_dir = "/tmp"
9
+ os.makedirs(cache_dir, exist_ok=True)
10
+
11
+ # Téléchargement des fichiers Parquet depuis Hugging Face
12
+ articles_parquet = hf_hub_download(
13
+ repo_id=REPO_ID,
14
+ filename="articles.parquet",
15
+ repo_type="dataset",
16
+ cache_dir=cache_dir)
17
+ tags_parquet = hf_hub_download(
18
+ repo_id=REPO_ID,
19
+ filename="tags.parquet",
20
+ repo_type="dataset",
21
+ cache_dir=cache_dir)
22
+ tag_article_parquet = hf_hub_download(
23
+ repo_id=REPO_ID,
24
+ filename="tag_article.parquet",
25
+ repo_type="dataset",
26
+ cache_dir=cache_dir)
27
+
28
+ # Connexion DuckDB en mémoire
29
+ con = duckdb.connect()
30
+
31
+ # Créer des tables DuckDB directement à partir des fichiers Parquet
32
+ con.execute(f"CREATE VIEW articles AS SELECT * FROM parquet_scan('{articles_parquet}')")
33
+ con.execute(f"CREATE VIEW tags AS SELECT * FROM parquet_scan('{tags_parquet}')")
34
+ con.execute(f"CREATE VIEW tag_article AS SELECT * FROM parquet_scan('{tag_article_parquet}')")
35
+
36
+ # Fonctions d'accès aux données
37
+
38
+ def fetch_tags() -> List[str]:
39
+ """
40
+ Récupère la liste de tous les tags disponibles dans la base de données.
41
+
42
+ Returns:
43
+ List[str]: Une liste de chaînes de caractères correspondant aux noms des tags, triés par ordre alphabétique.
44
+ """
45
+ query = "SELECT tag_name FROM tags ORDER BY tag_name"
46
+ result = con.execute(query).fetchall()
47
+ return [row[0] for row in result]
48
+
49
+ def fetch_articles_by_tags(tags: List[str]) -> List[Dict]:
50
+ """
51
+ Récupère les articles associés à un ou plusieurs tags.
52
+
53
+ Args:
54
+ tags (List[str]): Une liste de noms de tags pour filtrer les articles.
55
+
56
+ Returns:
57
+ List[Dict]: Une liste de dictionnaires, chacun représentant un article avec les clés:
58
+ - 'article_id': ID de l'article
59
+ - 'article_title': Titre de l'article
60
+ - 'article_url': URL de l'article
61
+
62
+ Notes:
63
+ - Si la liste `tags` est vide, la fonction retourne une liste vide.
64
+ - Les résultats incluent uniquement les articles correspondant à au moins un des tags fournis.
65
+ """
66
+ if not tags:
67
+ return []
68
+
69
+ placeholders = ",".join(["?"] * len(tags))
70
+ query = f"""SELECT distinct a.article_id, a.article_title, a.article_url
71
+ FROM tags t, tag_article ta, articles a
72
+ WHERE t.tag_id = ta.tag_id
73
+ AND ta.article_id = a.article_id
74
+ AND t.tag_name IN ({placeholders})
75
+ """
76
+ result = con.execute(query, tags).fetchdf()
77
  return result.to_dict(orient="records")