about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--gn3/case_attributes.py50
1 files changed, 48 insertions, 2 deletions
diff --git a/gn3/case_attributes.py b/gn3/case_attributes.py
index 590052a..47e6611 100644
--- a/gn3/case_attributes.py
+++ b/gn3/case_attributes.py
@@ -1,4 +1,6 @@
 """Implement case-attribute manipulations."""
+from functools import reduce
+
 from MySQLdb.cursors import DictCursor
 from flask import jsonify, Response, Blueprint, current_app
 
@@ -6,8 +8,8 @@ from gn3.db_utils import database_connection
 
 caseattr = Blueprint("case-attribute", __name__)
 
-@caseattr.route("/<int:inbredset_id>", methods=["GET"])
-def inbredset_case_attributes(inbredset_id: int) -> Response:
+@caseattr.route("/<int:inbredset_id>/names", methods=["GET"])
+def inbredset_case_attribute_names(inbredset_id: int) -> Response:
     """Retrieve ALL case-attributes for a specific InbredSet group."""
     with (database_connection(current_app.config["SQL_URI"]) as conn,
           conn.cursor(cursorclass=DictCursor) as cursor):
@@ -15,3 +17,47 @@ def inbredset_case_attributes(inbredset_id: int) -> Response:
             "SELECT * FROM CaseAttribute WHERE InbredSetId=%(inbredset_id)s",
             {"inbredset_id": inbredset_id})
         return jsonify(tuple(dict(row) for row in cursor.fetchall()))
+
+def __by_strain__(accumulator, item):
+    attr = {item["CaseAttributeName"]: item["CaseAttributeValue"]}
+    strain_name = item["StrainName"]
+    if bool(accumulator.get(strain_name)):
+        return {
+            **accumulator,
+            strain_name: {
+                **accumulator[strain_name],
+                "case-attributes": {
+                    **accumulator[strain_name]["case-attributes"],
+                    **attr
+                }
+            }
+        }
+    return {
+        strain_name: {
+            **{
+                key: value for key,value in item.items()
+                if key in ("StrainName", "StrainName2", "Symbol", "Alias")
+            },
+            "case-attributes": attr
+        }
+    }
+
+@caseattr.route("/<int:inbredset_id>/values")
+def inbredset_case_attribute_values(inbredset_id: int) -> Response:
+    """Retrieve the group's (InbredSet's) case-attribute values."""
+    with (database_connection(current_app.config["SQL_URI"]) as conn,
+          conn.cursor(cursorclass=DictCursor) as cursor):
+        cursor.execute(
+            "SELECT ca.Name AS CaseAttributeName, "
+            "caxrn.Value AS CaseAttributeValue, s.Name AS StrainName, "
+            "s.Name2 AS StrainName2, s.Symbol, s.Alias "
+            "FROM CaseAttribute AS ca "
+            "INNER JOIN CaseAttributeXRefNew AS caxrn "
+            "ON ca.CaseAttributeId=caxrn.CaseAttributeId "
+            "INNER JOIN Strain AS s "
+            "ON caxrn.StrainId=s.Id "
+            "WHERE ca.InbredSetId=%(inbredset_id)s "
+            "ORDER BY StrainName",
+            {"inbredset_id": inbredset_id})
+        return jsonify(tuple(
+            reduce(__by_strain__, cursor.fetchall(), {}).values()))