aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--wqflask/scripts/index.py16
-rw-r--r--wqflask/utility/monads.py26
2 files changed, 14 insertions, 28 deletions
diff --git a/wqflask/scripts/index.py b/wqflask/scripts/index.py
index c871db43..37736951 100644
--- a/wqflask/scripts/index.py
+++ b/wqflask/scripts/index.py
@@ -9,7 +9,7 @@ from functools import partial
import json
import xapian
-from utility.monads import MonadicDictCursor
+from utility.monads import sql_query_mdict
from wqflask.database import database_connection, xapian_writable_database
@@ -39,8 +39,8 @@ def main():
# database.
# pylint: disable=invalid-name
with xapian_writable_database() as db:
- with database_connection() as conn, conn.cursor(MonadicDictCursor) as cursor:
- cursor.execute("""
+ with database_connection() as conn:
+ for trait in sql_query_mdict(conn, """
SELECT ProbeSet.Name AS name,
ProbeSet.Symbol AS symbol,
ProbeSet.description AS description,
@@ -70,8 +70,7 @@ def main():
INNER JOIN ProbeSet ON ProbeSet.Id = ProbeSetXRef.ProbeSetId
LEFT JOIN Geno ON ProbeSetXRef.Locus = Geno.Name AND Geno.SpeciesId = Species.Id
WHERE ProbeSetFreeze.confidentiality < 1 AND ProbeSetFreeze.public > 0
- """)
- for trait in cursor.fetchall():
+ """):
doc = xapian.Document()
termgenerator.set_document(doc)
@@ -87,8 +86,8 @@ def main():
doc.set_data(json.dumps(trait.data))
write_document(db, trait["name"].bind(lambda name: f"Q{name}"), "gene", doc)
- with database_connection() as conn, conn.cursor(MonadicDictCursor) as cursor:
- cursor.execute("""
+ with database_connection() as conn:
+ for i, trait in enumerate(sql_query_mdict(conn, """
SELECT Species.Name AS species,
InbredSet.Name AS `group`,
PublishFreeze.Name AS dataset,
@@ -116,8 +115,7 @@ def main():
INNER JOIN Phenotype ON PublishXRef.PhenotypeId = Phenotype.Id
INNER JOIN Publication ON PublishXRef.PublicationId = Publication.Id
LEFT JOIN Geno ON PublishXRef.Locus = Geno.Name AND Geno.SpeciesId = Species.Id
- """)
- for i, trait in enumerate(cursor.fetchall()):
+ """)):
doc = xapian.Document()
termgenerator.set_document(doc)
diff --git a/wqflask/utility/monads.py b/wqflask/utility/monads.py
index 3360fad2..2d708261 100644
--- a/wqflask/utility/monads.py
+++ b/wqflask/utility/monads.py
@@ -105,22 +105,10 @@ class MonadicDict(UserDict):
except KeyError:
pass
-class MonadicDictCursor(DictCursor):
- """Monadic version of MySQLdb.cursors.DictCursor.
-
- Monadic version of MySQLdb.cursors.DictCursor that returns a
- MonadicDict instead of the built-in dictionary.
-
- Execute a SQL query and retrieve results as MonadicDict
- objects. Each row object in the following code is a MonadicDict.
- >>> with conn.cursor(MonadicDictCursor) as cursor:
- ... cursor.execute("SELECT foo FROM bar")
- ... for row in cursor.fetchall():
- ... print(row)
- """
- def fetchone(self):
- return Just(MonadicDict(row)) if (row := super().fetchone()) else Nothing
- def fetchmany(self, size=None):
- return [MonadicDict(row) for row in super().fetchmany(size=size)]
- def fetchall(self):
- return [MonadicDict(row) for row in super().fetchall()]
+
+def sql_query_mdict(conn, query):
+ """Execute SQL query and return a generator of MonadicDict objects."""
+ with conn.cursor(DictCursor) as cursor:
+ cursor.execute(query)
+ while (row := cursor.fetchone()):
+ yield MonadicDict(row)