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