about summary refs log tree commit diff
diff options
context:
space:
mode:
authorArun Isaac2022-09-28 18:39:54 +0530
committerArun Isaac2022-09-29 16:15:47 +0530
commitb23c36a8c7b66296cf972ac7b3dedfe8d427690c (patch)
treecd81f1621248bd4c2dea45a2ef5ca73a3b713595
parent38a87ff73c64f5e6bbfb6d1aefdad8d6e06a1d46 (diff)
downloadgenenetwork2-b23c36a8c7b66296cf972ac7b3dedfe8d427690c.tar.gz
Replace MonadicDictCursor with generator function.
* wqflask/utility/monads.py (MonadicDictCursor): Delete class.
(sql_query_mdict): New function.
* wqflask/scripts/index.py: Import sql_query_mdict instead of
MonadicDictCursor.
(main): Use sql_query_mdict.
-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)