feat: add view export functionality and refactor contributions query to use named view

Introduce a new `get_views()` function in db.py that queries the sqlite_schema for user-defined views, and add a loop in dataset.py to export each view's query results as a JSON file. Also create a persistent `contributions_extended_ranked` view to replace the inline subquery in `get_contributions()`, and refactor `get_users()` to use a direct DISTINCT query instead of deduplicating in Python.
This commit is contained in:
2024-11-24 06:38:17 +00:00
parent e5e5dd3aca
commit 7ec7ae8646
12 changed files with 24 additions and 112 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+8 -2
View File
@@ -2,6 +2,7 @@ from drstats import db
import functools
import sys
import pathlib
import json
printr = functools.partial(print, file=sys.stderr)
@@ -35,7 +36,7 @@ def dump():
"```",
)
printr(text)
with pathlib.Path("export/rants-" + user + ".txt").open("w") as f:
with pathlib.Path("export/rants-" + user + ".txt").open("w+") as f:
f.write(user)
f.write(" said ")
f.write(text)
@@ -53,7 +54,7 @@ def dump():
"```",
)
printr(text)
with pathlib.Path("export/posts-" + user + ".txt").open("w") as f:
with pathlib.Path("export/posts-" + user + ".txt").open("w+") as f:
f.write(user)
f.write(" said ")
f.write(text)
@@ -68,3 +69,8 @@ def dump():
printr(line)
print(line)
print("```")
for view in db.get_views():
print(f"export/view-f{view['name']}.json")
with pathlib.Path(f"export/view-f{view['name']}.json").open("w+") as f:
json.dump(view, db.query(view['sql']))
+16 -2
View File
@@ -205,6 +205,9 @@ def get_db():
db.query(
"CREATE VIEW posts_of_user AS SELECT user_username as username, GROUP_CONCAT(body) as text FROM comments"
)
db.query("DROP VIEW IF EXISTS contributions_extended_ranked")
db.query("CREATE VIEW contributions_extended_ranked AS SELECT ROW_NUMBER() OVER (ORDER BY upvote_ratio DESC) as rank, * FROM contributions_extended ORDER BY upvote_ratio DESC")
db.query("CREATE VIEW IF NOT EXISTS views AS SELECT sql, name FROM sqlite_schema WHERE type='view' AND name != 'views';")
return db
@@ -239,10 +242,14 @@ class Db:
self.db = None
def get_views():
with Db() as db:
return list(db.query("SELECT * FROM views;"))
def get_contributions():
with Db() as db:
contributions = db.query(
"SELECT ROW_NUMBER() OVER (ORDER BY upvote_ratio DESC) as rank, * FROM contributions_extended ORDER BY upvote_ratio DESC"
"SELECT * FROM contributions_extended_ranked"
)
return list(contributions)
@@ -252,8 +259,15 @@ def get_upvote_average():
def get_users():
return list(set([user["username"] for user in get_contributions()]))
"""
Retrieve a list of distinct usernames from the contributions table.
Returns:
list: A list of usernames in ascending order.
"""
with Db() as db:
return [user["username"] for user in db.query("SELECT DISTINCT username FROM contributions ORDER BY username")]
def get_user_count():
return len(get_users())