View Javadoc
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 }