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