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 }