1 package de.dlr.shepard.common.search.services;
2
3 import de.dlr.shepard.auth.users.entities.User;
4 import de.dlr.shepard.auth.users.services.UserService;
5 import de.dlr.shepard.common.neo4j.io.BasicEntityIO;
6 import de.dlr.shepard.common.search.daos.SearchDAO;
7 import de.dlr.shepard.common.search.io.ResponseBody;
8 import de.dlr.shepard.common.search.io.ResultTriple;
9 import de.dlr.shepard.common.search.io.SearchBody;
10 import de.dlr.shepard.common.search.io.SearchScope;
11 import de.dlr.shepard.common.search.query.Neo4jQueryBuilder;
12 import de.dlr.shepard.common.util.Constants;
13 import de.dlr.shepard.context.references.basicreference.entities.BasicReference;
14 import jakarta.enterprise.context.RequestScoped;
15 import jakarta.inject.Inject;
16 import java.util.HashSet;
17 import java.util.Set;
18
19 @RequestScoped
20 public class ReferenceSearchService {
21
22 @Inject
23 SearchDAO searchDAO;
24
25 @Inject
26 UserService userService;
27
28 public ResponseBody search(SearchBody searchBody) {
29 User user = userService.getCurrentUser();
30
31 Set<BasicReference> resultsSet = new HashSet<>();
32 SearchScope[] scopes = searchBody.getScopes();
33 String searchBodyQuery = searchBody.getSearchParams().getQuery();
34 for (SearchScope scope : scopes) {
35
36 if (scope.getCollectionId() == null && scope.getDataObjectId() == null) {
37 String selectionQuery = Neo4jQueryBuilder.basicReferenceSelectionQueryWithNeo4jId(
38 searchBodyQuery,
39 user.getUsername()
40 );
41 var res = searchDAO.findReferences(selectionQuery, Constants.REFERENCE_IN_QUERY);
42 resultsSet.addAll(res);
43 }
44
45 else if (scope.getCollectionId() != null && scope.getDataObjectId() == null) {
46 String selectionQuery = Neo4jQueryBuilder.collectionBasicReferenceSelectionQueryWithNeo4jId(
47 searchBodyQuery,
48 scope.getCollectionId(),
49 user.getUsername()
50 );
51 var res = searchDAO.findReferences(selectionQuery, Constants.REFERENCE_IN_QUERY);
52 resultsSet.addAll(res);
53 }
54
55 else if (scope.getCollectionId() != null && scope.getDataObjectId() != null) {
56
57 if (scope.getTraversalRules().length != 0) {
58 for (int j = 0; j < scope.getTraversalRules().length; j++) {
59 String selectionQuery = Neo4jQueryBuilder.collectionDataObjectBasicReferenceSelectionQueryWithNeo4jId(
60 scope,
61 scope.getTraversalRules()[j],
62 searchBodyQuery,
63 user.getUsername()
64 );
65 var res = searchDAO.findReferences(selectionQuery, Constants.REFERENCE_IN_QUERY);
66 resultsSet.addAll(res);
67 }
68 }
69
70 else {
71 String selectionQuery = Neo4jQueryBuilder.collectionDataObjectReferenceSelectionQueryWithNeo4jId(
72 scope,
73 searchBodyQuery,
74 user.getUsername()
75 );
76 var res = searchDAO.findReferences(selectionQuery, Constants.REFERENCE_IN_QUERY);
77 resultsSet.addAll(res);
78 }
79 }
80 }
81 BasicReference[] references = resultsSet.toArray(new BasicReference[0]);
82 ResultTriple[] resultTriples = new ResultTriple[resultsSet.size()];
83 BasicEntityIO[] results = new BasicEntityIO[resultsSet.size()];
84 for (var i = 0; i < resultsSet.size(); i++) {
85 resultTriples[i] = new ResultTriple(
86 references[i].getDataObject().getCollection().getShepardId(),
87 references[i].getDataObject().getShepardId(),
88 references[i].getShepardId()
89 );
90 results[i] = new BasicEntityIO(references[i]);
91 }
92 ResponseBody ret = new ResponseBody(resultTriples, results, searchBody.getSearchParams());
93 return ret;
94 }
95 }