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.SearchConstants;
13 import de.dlr.shepard.common.util.TraversalRules;
14 import de.dlr.shepard.context.collection.entities.DataObject;
15 import jakarta.enterprise.context.RequestScoped;
16 import jakarta.inject.Inject;
17 import java.util.HashSet;
18 import java.util.Set;
19
20 @RequestScoped
21 public class DataObjectSearchService {
22
23 @Inject
24 SearchDAO searchDAO;
25
26 @Inject
27 UserService userService;
28
29 public ResponseBody search(SearchBody searchBody) {
30 User user = userService.getCurrentUser();
31
32 Set<DataObject> resultsSet = new HashSet<>();
33 SearchScope[] scopes = searchBody.getScopes();
34 String searchBodyQuery = searchBody.getSearchParams().getQuery();
35 for (SearchScope scope : scopes) {
36
37 if (scope.getCollectionId() == null && scope.getDataObjectId() == null) {
38 String selectionQuery = Neo4jQueryBuilder.dataObjectSelectionQueryWithNeo4jId(
39 searchBodyQuery,
40 user.getUsername()
41 );
42 var res = searchDAO.findDataObjects(selectionQuery, SearchConstants.DATAOBJECT_IN_QUERY);
43 resultsSet.addAll(res);
44 }
45
46 else if (scope.getCollectionId() != null && scope.getDataObjectId() == null) {
47 String selectionQuery = Neo4jQueryBuilder.collectionDataObjectSelectionQueryWithNeo4jId(
48 scope.getCollectionId(),
49 searchBodyQuery,
50 user.getUsername()
51 );
52 var res = searchDAO.findDataObjects(selectionQuery, SearchConstants.DATAOBJECT_IN_QUERY);
53 resultsSet.addAll(res);
54 }
55
56 else if (scope.getCollectionId() != null && scope.getDataObjectId() != null) {
57
58 if (scope.getTraversalRules().length != 0) {
59 for (TraversalRules traversalRules : scope.getTraversalRules()) {
60 String selectionQuery = Neo4jQueryBuilder.collectionDataObjectDataObjectSelectionQueryWithNeo4jId(
61 scope,
62 traversalRules,
63 searchBodyQuery,
64 user.getUsername()
65 );
66 var res = searchDAO.findDataObjects(selectionQuery, SearchConstants.DATAOBJECT_IN_QUERY);
67 resultsSet.addAll(res);
68 }
69 } else {
70
71 String selectionQuery = Neo4jQueryBuilder.collectionDataObjectDataObjectSelectionQueryWithNeo4jId(
72 scope,
73 searchBodyQuery,
74 user.getUsername()
75 );
76 var res = searchDAO.findDataObjects(selectionQuery, SearchConstants.DATAOBJECT_IN_QUERY);
77 resultsSet.addAll(res);
78 }
79 }
80 }
81 DataObject[] dataObjects = resultsSet.toArray(new DataObject[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(dataObjects[i].getCollection().getShepardId(), dataObjects[i].getShepardId());
86 results[i] = new BasicEntityIO(dataObjects[i]);
87 }
88 ResponseBody ret = new ResponseBody(resultTriples, results, searchBody.getSearchParams());
89 return ret;
90 }
91 }