From 5369469e54916b8a3dfb2de020c5c395f8f5a3ee Mon Sep 17 00:00:00 2001
From: Albert Feghaly <albert.feghaly@umontreal.ca>
Date: Tue, 21 Jun 2022 23:55:57 -0400
Subject: [PATCH] Option to specify multiple key-value pairs with GraphQL

---
 portal/graphql_schema.py | 32 +++++++++++++++++++++++++++++++-
 1 file changed, 31 insertions(+), 1 deletion(-)

diff --git a/portal/graphql_schema.py b/portal/graphql_schema.py
index 48685dd..1a23437 100644
--- a/portal/graphql_schema.py
+++ b/portal/graphql_schema.py
@@ -39,7 +39,15 @@ class UserType(DjangoObjectType):
 class Query(graphene.ObjectType):
     datafile = graphene.Field(DataFileType, id=graphene.String(), dbid=graphene.Int())
     dataset = graphene.Field(DataSetType, id=graphene.String(), dbid=graphene.Int())
-    datafiles = graphene.List(DataFileType, key=graphene.String(), value=graphene.String(), dataset=graphene.String())
+    datafiles = graphene.List(
+            DataFileType,
+            key=graphene.String(),
+            value=graphene.String(),
+            key_values=graphene.JSONString(),
+            keys=graphene.JSONString(),
+            values=graphene.JSONString(),
+            dataset=graphene.String()
+            )
     datasets = graphene.List(DataSetType)
 
     def resolve_datafile(self, info, **kwargs):
@@ -65,10 +73,23 @@ class Query(graphene.ObjectType):
     def resolve_datafiles(self, info, **kwargs):
         # qs = DataFile.objects.accessible_to_profile(self.request.user.profile)
         qs = DataFile.objects
+
         key = kwargs.get('key', None)
         value = kwargs.get('value', None)
+        key_values = kwargs.get('key_values', None)
+        keys = kwargs.get('keys', None)
+        values = kwargs.get('values', None)
         dataset = kwargs.get('dataset', None)
 
+        if type(key_values) is not dict:
+            key_values = {}
+
+        if type(keys) is not list:
+            keys = []
+
+        if type(values) is not list:
+            values = []
+
         if key and value:
             qs = qs.filter(annotations__contains={key: value})
         elif key:
@@ -76,6 +97,15 @@ class Query(graphene.ObjectType):
         elif value:
             qs = qs.filter(annotations__values__icontains=value)
 
+        for k, v in key_values.items():
+            qs = qs.filter(annotations__contains={k: v})
+
+        for k in keys:
+            qs = qs.filter(annotations__has_key=k)
+
+        for v in values:
+            qs = qs.filter(annotations__values__icontains=v)
+
         if dataset:
             qs = qs.filter(datasets__iric_data_id=dataset)
 
-- 
GitLab