1 package de.dlr.shepard.common.search.daos; 2 3 import de.dlr.shepard.auth.users.entities.User; 4 import de.dlr.shepard.auth.users.entities.UserGroup; 5 import de.dlr.shepard.common.neo4j.NeoConnector; 6 import de.dlr.shepard.common.neo4j.entities.BasicContainer; 7 import de.dlr.shepard.common.util.CypherQueryHelper; 8 import de.dlr.shepard.common.util.CypherQueryHelper.Neighborhood; 9 import de.dlr.shepard.common.util.PaginationHelper; 10 import de.dlr.shepard.context.collection.entities.Collection; 11 import de.dlr.shepard.context.collection.entities.DataObject; 12 import de.dlr.shepard.context.references.basicreference.entities.BasicReference; 13 import jakarta.enterprise.context.RequestScoped; 14 import java.util.ArrayList; 15 import java.util.Collections; 16 import java.util.List; 17 import java.util.stream.StreamSupport; 18 import org.neo4j.ogm.session.Session; 19 20 @RequestScoped 21 public class SearchDAO { 22 23 protected Session session = null; 24 25 public SearchDAO() { 26 session = NeoConnector.getInstance().getNeo4jSession(); 27 } 28 29 public List<Collection> findCollections( 30 String selectionQuery, 31 PaginationHelper pagination, 32 String collectionVariable 33 ) { 34 String query = selectionQuery + emitCollectionReturnPart(collectionVariable, pagination); 35 Iterable<Collection> collections = session.query(Collection.class, query, Collections.emptyMap()); 36 var ret = StreamSupport.stream(collections.spliterator(), false).toList(); 37 return ret; 38 } 39 40 public List<Collection> findCollections(String query) { 41 Iterable<Collection> collections = session.query(Collection.class, query, Collections.emptyMap()); 42 var ret = StreamSupport.stream(collections.spliterator(), false).toList(); 43 return ret; 44 } 45 46 public Integer getCollectionTotalCount(String selectionQuery, String collectionVariable) { 47 String query = String.format("%s RETURN COUNT(%s)", selectionQuery, collectionVariable); 48 Iterable<Integer> collectionTotalCountIterable = session.query(Integer.class, query, Collections.emptyMap()); 49 return collectionTotalCountIterable.iterator().next(); 50 } 51 52 public List<DataObject> findDataObjects(String selectionQuery, String dataObjectVariable) { 53 String query = selectionQuery + emitDataObjectReturnPart(dataObjectVariable); 54 Iterable<DataObject> collections = session.query(DataObject.class, query, Collections.emptyMap()); 55 var ret = StreamSupport.stream(collections.spliterator(), false).toList(); 56 return ret; 57 } 58 59 public List<BasicReference> findReferences(String selectionQuery, String referenceVariable) { 60 String query = selectionQuery + emitReferencesReturnPart(referenceVariable); 61 Iterable<BasicReference> collections = session.query(BasicReference.class, query, Collections.emptyMap()); 62 var ret = StreamSupport.stream(collections.spliterator(), false).toList(); 63 return ret; 64 } 65 66 public List<BasicContainer> findContainers( 67 String selectionQuery, 68 PaginationHelper pagination, 69 String containerVariable 70 ) { 71 String query = selectionQuery + emitContainerReturnPart(containerVariable, pagination); 72 Iterable<BasicContainer> basicContainers = session.query(BasicContainer.class, query, Collections.emptyMap()); 73 List<BasicContainer> ret = new ArrayList<>(); 74 basicContainers.forEach(ret::add); 75 return ret; 76 } 77 78 public Integer getContainerTotalCount(String selectionQuery, String containerVariable) { 79 String query = selectionQuery + emitTotalCountReturnPart(containerVariable); 80 Iterable<Integer> containerTotalCountIterable = session.query(Integer.class, query, Collections.emptyMap()); 81 return containerTotalCountIterable.iterator().next(); 82 } 83 84 public List<User> findUsers(String selectionQuery, String userVariable) { 85 String query = selectionQuery + emitUserReturnPart(userVariable); 86 Iterable<User> users = session.query(User.class, query, Collections.emptyMap()); 87 List<User> ret = new ArrayList<>(); 88 users.forEach(ret::add); 89 return ret; 90 } 91 92 public List<UserGroup> findUserGroups(String selectionQuery, String userGroupVariable) { 93 String query = selectionQuery + emitUserGroupReturnPart(userGroupVariable); 94 Iterable<UserGroup> userGroups = session.query(UserGroup.class, query, Collections.emptyMap()); 95 List<UserGroup> ret = new ArrayList<>(); 96 userGroups.forEach(ret::add); 97 return ret; 98 } 99 100 private String emitTotalCountReturnPart(String containerVariable) { 101 return ( 102 " WITH " + 103 containerVariable + 104 " " + 105 CypherQueryHelper.getReturnCountPart(containerVariable, Neighborhood.ESSENTIAL) 106 ); 107 } 108 109 private String emitContainerReturnPart(String containerVariable, PaginationHelper pagination) { 110 return ( 111 " WITH " + 112 containerVariable + 113 " " + 114 CypherQueryHelper.getReturnPart(containerVariable, Neighborhood.ESSENTIAL, pagination) 115 ); 116 } 117 118 private String emitCollectionReturnPart(String collectionVariable, PaginationHelper pagination) { 119 return ( 120 (pagination != null ? " " + CypherQueryHelper.getPaginationPart(pagination) : "") + 121 " WITH " + 122 collectionVariable + 123 " " + 124 CypherQueryHelper.getReturnPart(collectionVariable, Neighborhood.ESSENTIAL) 125 ); 126 } 127 128 private String emitDataObjectReturnPart(String dataObjectVariable) { 129 return String.format( 130 " WITH %s MATCH path=(c:Collection)-[]->(%s)-[]->(u:User) RETURN %s, nodes(path), relationships(path)", 131 dataObjectVariable, 132 dataObjectVariable, 133 dataObjectVariable 134 ); 135 } 136 137 private String emitReferencesReturnPart(String referenceVariable) { 138 return String.format( 139 " WITH %s MATCH path=(c:Collection)-[]->(d:DataObject)-[]->(%s)-[]->(u:User) RETURN %s, nodes(path), relationships(path)", 140 referenceVariable, 141 referenceVariable, 142 referenceVariable 143 ); 144 } 145 146 private String emitUserReturnPart(String userVariable) { 147 return String.format( 148 " WITH %s MATCH path=(%s:User)<-[:belongs_to|subscribed_by*0..1]-(n) RETURN %s, nodes(path), relationships(path)", 149 userVariable, 150 userVariable, 151 userVariable 152 ); 153 } 154 155 private String emitUserGroupReturnPart(String userGroupVariable) { 156 return String.format( 157 " WITH %s MATCH path=(%s:UserGroup)<-[:belongs_to|subscribed_by*0..1]-(n) RETURN %s, nodes(path), relationships(path)", 158 userGroupVariable, 159 userGroupVariable, 160 userGroupVariable 161 ); 162 } 163 }