You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by is...@apache.org on 2022/07/08 23:14:10 UTC

[airavata-data-lake] branch master updated: Avoid cartesian products of neo4j queries

This is an automated email from the ASF dual-hosted git repository.

isjarana pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/airavata-data-lake.git


The following commit(s) were added to refs/heads/master by this push:
     new e914f8b  Avoid cartesian products of neo4j queries
     new 15dd692  Merge pull request #119 from isururanawaka/master
e914f8b is described below

commit e914f8b8cefb03369b81ea18d9515c86666b07e0
Author: Isuru Ranawaka <ir...@gmail.com>
AuthorDate: Fri Jul 8 19:13:36 2022 -0400

    Avoid cartesian products of neo4j queries
---
 .../drms/api/handlers/ResourceServiceHandler.java  | 94 ++++++++++------------
 1 file changed, 44 insertions(+), 50 deletions(-)

diff --git a/data-resource-management-service/drms-api/src/main/java/org/apache/airavata/drms/api/handlers/ResourceServiceHandler.java b/data-resource-management-service/drms-api/src/main/java/org/apache/airavata/drms/api/handlers/ResourceServiceHandler.java
index e0e8ca5..b2c0db3 100644
--- a/data-resource-management-service/drms-api/src/main/java/org/apache/airavata/drms/api/handlers/ResourceServiceHandler.java
+++ b/data-resource-management-service/drms-api/src/main/java/org/apache/airavata/drms/api/handlers/ResourceServiceHandler.java
@@ -81,8 +81,8 @@ public class ResourceServiceHandler extends ResourceServiceGrpc.ResourceServiceI
             userProps.put("entityId", resourceId);
 
 
-            String query = " MATCH (u:User),  (r" + type + ") where u.username = $username AND u.tenantId = $tenantId AND " +
-                    " r.entityId = $entityId AND r.tenantId = $tenantId" +
+            String query = " MATCH (u:User) where u.username = $username AND u.tenantId = $tenantId with u  " +
+                    " Match (r:" + type + ") where r.entityId = $entityId AND r.tenantId = $tenantId with u, r" +
                     " OPTIONAL MATCH (g:Group)<-[:MEMBER_OF]-(u) " +
                     " OPTIONAL MATCH (cg:Group)-[:CHILD_OF]->(g)" +
                     " OPTIONAL MATCH (r)-[:CHILD_OF*]->(x:COLLECTION)" +
@@ -194,8 +194,8 @@ public class ResourceServiceHandler extends ResourceServiceGrpc.ResourceServiceI
             exProps.put("tenantId", callUser.getTenantId());
             exProps.put("entityId", exEntity.get().getId());
 
-            String query = " MATCH (u:User),  (r:" + type + ") where u.username = $username AND u.tenantId = $tenantId AND " +
-                    " r.entityId = $entityId AND r.tenantId = $tenantId" +
+            String query = " MATCH (u:User) where u.username = $username AND u.tenantId = $tenantId with u  " +
+                    " Match (r:" + type + ") where r.entityId = $entityId AND r.tenantId = $tenantId with u, r" +
                     " OPTIONAL MATCH (g:Group)<-[:MEMBER_OF]-(u) " +
                     " OPTIONAL MATCH (cg:Group)-[:CHILD_OF]->(g)" +
                     " return case when  exists((u)<-[:SHARED_WITH]-(r)) OR  exists((g)<-[:SHARED_WITH]-(r)) OR   " +
@@ -251,48 +251,42 @@ public class ResourceServiceHandler extends ResourceServiceGrpc.ResourceServiceI
             userProps.put("tenantId", callUser.getTenantId());
             userProps.put("entityId", resourceId);
 
-            String query = " MATCH (u:User),  (r" + type + ") where u.username = $username AND u.tenantId = $tenantId AND " +
-                    " r.entityId = $entityId AND r.tenantId = $tenantId" +
+//            String query = " MATCH (u:User),  (r" + type + ") where u.username = $username AND u.tenantId = $tenantId AND " +
+//                    " r.entityId = $entityId AND r.tenantId = $tenantId" +
+//                    " OPTIONAL MATCH (g:Group)<-[:MEMBER_OF]-(u)" +
+//                    " OPTIONAL MATCH (u)<-[crRel:SHARED_WITH]-(r)<-[:CHILD_OF*]-(cr)" +
+//                    " OPTIONAL MATCH (g)<-[chgrRel:SHARED_WITH]-(r)<-[:CHILD_OF*]-(chgr)" +
+//                    " OPTIONAL MATCH (u)<-[prRelU:SHARED_WITH]-(pr:COLLECTION)<-[:CHILD_OF*]-(r)<-[:CHILD_OF]-(x)" +
+//                    " OPTIONAL MATCH (g)<-[prRelG:SHARED_WITH]-(prg:COLLECTION)<-[:CHILD_OF*]-(r)<-[:CHILD_OF]-(y)" +
+//                    " return distinct  cr,crRel, chgr,chgrRel, x, prRelU,y,prRelG";
+//
+//            if (depth == 1) {
+            String query = " MATCH (u:User) where u.username = $username AND u.tenantId = $tenantId with u  " +
+                    " Match (r:" + type + ") where r.entityId = $entityId AND r.tenantId = $tenantId with u, r" +
                     " OPTIONAL MATCH (g:Group)<-[:MEMBER_OF]-(u)" +
-                    " OPTIONAL MATCH (u)<-[crRel:SHARED_WITH]-(r)<-[:CHILD_OF*]-(cr)" +
-                    " OPTIONAL MATCH (g)<-[chgrRel:SHARED_WITH]-(r)<-[:CHILD_OF*]-(chgr)" +
+                    " OPTIONAL MATCH (u)<-[crRel:SHARED_WITH]-(r)<-[:CHILD_OF]-(cr)" +
+                    " OPTIONAL MATCH (g)<-[chgrRel:SHARED_WITH]-(r)<-[:CHILD_OF]-(chgr)" +
                     " OPTIONAL MATCH (u)<-[prRelU:SHARED_WITH]-(pr:COLLECTION)<-[:CHILD_OF*]-(r)<-[:CHILD_OF]-(x)" +
                     " OPTIONAL MATCH (g)<-[prRelG:SHARED_WITH]-(prg:COLLECTION)<-[:CHILD_OF*]-(r)<-[:CHILD_OF]-(y)" +
                     " return distinct  cr,crRel, chgr,chgrRel, x, prRelU,y,prRelG";
-
-            if (depth == 1) {
-                query = " MATCH (u:User),  (r" + type + ") where u.username = $username AND u.tenantId = $tenantId AND " +
-                        " r.entityId = $entityId AND r.tenantId = $tenantId" +
-                        " OPTIONAL MATCH (g:Group)<-[:MEMBER_OF]-(u)" +
-                        " OPTIONAL MATCH (u)<-[crRel:SHARED_WITH]-(r)<-[:CHILD_OF]-(cr)" +
-                        " OPTIONAL MATCH (g)<-[chgrRel:SHARED_WITH]-(r)<-[:CHILD_OF]-(chgr)" +
-                        " OPTIONAL MATCH (u)<-[prRelU:SHARED_WITH]-(pr:COLLECTION)<-[:CHILD_OF*]-(r)<-[:CHILD_OF]-(x)" +
-                        " OPTIONAL MATCH (g)<-[prRelG:SHARED_WITH]-(prg:COLLECTION)<-[:CHILD_OF*]-(r)<-[:CHILD_OF]-(y)" +
-                        " return distinct  cr,crRel, chgr,chgrRel, x, prRelU,y,prRelG";
-            }
+//            }
 
             logger.debug("Fetch child query {}", query);
 
-            List<Record> records = this.neo4JConnector.searchNodes(userProps, query);
 
-            try {
-                List keyList = new ArrayList();
-                keyList.add("cr:crRel");
-                keyList.add("chgr:chgrRel");
-                keyList.add("chcgr:chcgrRel");
-                keyList.add("x:prRelU");
-                keyList.add("y:prRelG");
-                List<GenericResource> genericResourceList = GenericResourceDeserializer.deserializeList(records, keyList);
-                ChildResourceFetchResponse.Builder builder = ChildResourceFetchResponse.newBuilder();
-                builder.addAllResources(genericResourceList);
-                responseObserver.onNext(builder.build());
-                responseObserver.onCompleted();
+            List<Record> records = this.neo4JConnector.searchNodes(userProps, query);
+            List keyList = new ArrayList();
+            keyList.add("cr:crRel");
+            keyList.add("chgr:chgrRel");
+            keyList.add("chcgr:chcgrRel");
+            keyList.add("x:prRelU");
+            keyList.add("y:prRelG");
+            List<GenericResource> genericResourceList = GenericResourceDeserializer.deserializeList(records, keyList);
+            ChildResourceFetchResponse.Builder builder = ChildResourceFetchResponse.newBuilder();
+            builder.addAllResources(genericResourceList);
+            responseObserver.onNext(builder.build());
+            responseObserver.onCompleted();
 
-            } catch (Exception e) {
-                logger.error("Errored while searching generic child resources; Message: {}", e.getMessage(), e);
-                String msg = "Errored while searching generic child resources" + e.getMessage();
-                responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
-            }
 
         } catch (Exception ex) {
             logger.error("Error occurred while fetching child resource {}", request.getResourceId(), ex);
@@ -361,8 +355,8 @@ public class ResourceServiceHandler extends ResourceServiceGrpc.ResourceServiceI
             exProps.put("tenantId", callUser.getTenantId());
             exProps.put("entityId", exEntity.get().getId());
 
-            String query = " MATCH (u:User),  (r:" + type + ") where u.username = $username AND u.tenantId = $tenantId AND " +
-                    " r.entityId = $entityId AND r.tenantId = $tenantId" +
+            String query = " MATCH (u:User) where u.username = $username AND u.tenantId = $tenantId with u  " +
+                    " Match (r:" + type + ") where r.entityId = $entityId AND r.tenantId = $tenantId with u, r" +
                     " OPTIONAL MATCH (g:Group)<-[:MEMBER_OF]-(u) " +
                     " OPTIONAL MATCH (cg:Group)-[:CHILD_OF]->(g)" +
                     " return case when  exists((u)<-[:SHARED_WITH]-(r)) OR  exists((g)<-[:SHARED_WITH]-(r)) OR   " +
@@ -649,7 +643,7 @@ public class ResourceServiceHandler extends ResourceServiceGrpc.ResourceServiceI
                 if ((value.equals("FILE") || value.equals("COLLECTION"))) {
                     for (String storageId : storageList) {
 
-                        query = " MATCH (u:User) where u.username = $username AND u.tenantId = $tenantId" +
+                        query = " MATCH (u:User) where u.username = $username AND u.tenantId = $tenantId with u" +
                                 " OPTIONAL MATCH (g:Group)<-[:MEMBER_OF]-(u) " +
                                 " OPTIONAL MATCH (u)<-[relRM:SHARED_WITH]-(m)<-[:CHILD_OF*]-(rm:" + value + ")-[:CHILD_OF*]->(s:Storage{entityId:'" + storageId + "'})" +
                                 " , (s:Storage{entityId:'" + storageId + "'})<-[:CHILD_OF*]-(r:" + value + ")-[relR:SHARED_WITH]->(u)" +
@@ -662,7 +656,7 @@ public class ResourceServiceHandler extends ResourceServiceGrpc.ResourceServiceI
                         keyList.add("rmg:relRMG");
                         keyList.add("rg:relRG");
                         if (depth == 1) {
-                            query = " MATCH (u:User) where u.username = $username AND u.tenantId = $tenantId" +
+                            query = " MATCH (u:User) where u.username = $username AND u.tenantId = $tenantId with u" +
                                     " OPTIONAL MATCH (g:Group)<-[:MEMBER_OF]-(u) " +
                                     " OPTIONAL MATCH (s:Storage{entityId:'" + storageId + "'})<-[:CHILD_OF]-(r:" + value + ")-[relR:SHARED_WITH]->(u)" +
                                     " OPTIONAL MATCH (sp:Storage{entityId:'" + storageId + "'})<-[:CHILD_OF]-(rg:" + value + ")-[relRG:SHARED_WITH]->(g)" +
@@ -683,7 +677,7 @@ public class ResourceServiceHandler extends ResourceServiceGrpc.ResourceServiceI
                         allowedResourceList.addAll(genericResourceList);
                     }
                 } else {
-                    query = " MATCH (u:User) where u.username = $username AND u.tenantId = $tenantId" +
+                    query = " MATCH (u:User) where u.username = $username AND u.tenantId = $tenantId with u" +
                             " OPTIONAL MATCH (g:Group)<-[:MEMBER_OF]-(u) " +
                             " OPTIONAL MATCH (u)<-[relRM:SHARED_WITH]-(m)<-[:CHILD_OF*]-(rm:" + value + ")" +
                             " , (r:" + value + ")-[relR:SHARED_WITH]->(u)" +
@@ -696,7 +690,7 @@ public class ResourceServiceHandler extends ResourceServiceGrpc.ResourceServiceI
                     keyList.add("rmg:relRMG");
                     keyList.add("rg:relRG");
                     if (depth == 1) {
-                        query = " MATCH (u:User) where u.username = $username AND u.tenantId = $tenantId" +
+                        query = " MATCH (u:User) where u.username = $username AND u.tenantId = $tenantId with u" +
                                 " OPTIONAL MATCH (g:Group)<-[:MEMBER_OF]-(u) " +
                                 " OPTIONAL MATCH (r:" + value + ")-[relR:SHARED_WITH]->(u)" +
                                 " OPTIONAL MATCH (rg:" + value + ")-[relRG:SHARED_WITH]->(g)" +
@@ -856,7 +850,7 @@ public class ResourceServiceHandler extends ResourceServiceGrpc.ResourceServiceI
                 Map<String, Object> userProps = new HashMap<>();
                 userProps.put("tenantId", callUser.getTenantId());
                 userProps.put("entityId", resourseId);
-                String query = "MATCH  (r" + type + ")  where  r.entityId = $entityId AND r.tenantId = $tenantId" +
+                String query = "MATCH  (r" + type + ")  where  r.entityId = $entityId AND r.tenantId = $tenantId  with r" +
                         " MATCH (r)-[ch:CHILD_OF*1.." + depth + "]->(m) return distinct m";
                 List<Record> records = this.neo4JConnector.searchNodes(userProps, query);
                 if (!records.isEmpty()) {
@@ -884,7 +878,7 @@ public class ResourceServiceHandler extends ResourceServiceGrpc.ResourceServiceI
                     responseObserver.onCompleted();
                 }
             } else {
-                String msg = " Don't have access to fetch resource "+ resourseId;
+                String msg = " Don't have access to fetch resource " + resourseId;
                 responseObserver.onError(Status.PERMISSION_DENIED.withDescription(msg).asRuntimeException());
                 return;
             }
@@ -933,7 +927,7 @@ public class ResourceServiceHandler extends ResourceServiceGrpc.ResourceServiceI
                 message = mergeJSON(oldJSON, message);
             }
             parameters.put("metadata", message);
-            String query = " MATCH (r" + type + ") where r.entityId= $parentResourceId AND r.tenantId= $tenantId " +
+            String query = " MATCH (r" + type + ") where r.entityId= $parentResourceId AND r.tenantId= $tenantId with r" +
                     " MERGE (r)-[:HAS_FULL_METADATA]->(cr:FULL_METADATA_NODE{tenantId: $tenantId}) ON CREATE SET cr.metadata= $metadata " +
                     " ON MATCH SET cr.metadata = $metadata";
             this.neo4JConnector.runTransactionalQuery(parameters, query);
@@ -1003,8 +997,8 @@ public class ResourceServiceHandler extends ResourceServiceGrpc.ResourceServiceI
         userProps.put("tenantId", tenantId);
         userProps.put("entityId", resourceId);
 
-        String query = " MATCH (u:User),  (r) where u.username = $username AND u.tenantId = $tenantId AND " +
-                " r.entityId = $entityId AND r.tenantId = $tenantId" +
+        String query = " MATCH (u:User) where u.username = $username AND u.tenantId = $tenantId with u  " +
+                " Match (r) where r.entityId = $entityId AND r.tenantId = $tenantId with u, r" +
                 " OPTIONAL MATCH (g:Group)<-[:MEMBER_OF]-(u)" +
                 " OPTIONAL MATCH (cg:Group)-[:CHILD_OF*]->(g)" +
                 " OPTIONAL MATCH (l)<-[:CHILD_OF*]-(r)" +
@@ -1028,8 +1022,8 @@ public class ResourceServiceHandler extends ResourceServiceGrpc.ResourceServiceI
         userProps.put("tenantId", tenantId);
         userProps.put("entityId", resourceId);
 
-        String query = " MATCH (u:User),  (r) where u.username = $username AND u.tenantId = $tenantId AND " +
-                " r.entityId = $entityId AND r.tenantId = $tenantId" +
+        String query = " MATCH (u:User) where u.username = $username AND u.tenantId = $tenantId with u  " +
+                " Match (r) where r.entityId = $entityId AND r.tenantId = $tenantId with u, r" +
                 " OPTIONAL MATCH (g:Group)<-[:MEMBER_OF]-(u)" +
                 " OPTIONAL MATCH (cg:Group)-[:CHILD_OF*]->(g)" +
                 " OPTIONAL MATCH (l:" + parentType + ")<-[:CHILD_OF*]-(r)" +