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.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, Constants.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, Constants.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, Constants.DATAOBJECT_IN_QUERY);
67 resultsSet.addAll(res);
68 }
69 }
70
71 else {
72 String selectionQuery = Neo4jQueryBuilder.collectionDataObjectDataObjectSelectionQueryWithNeo4jId(
73 scope,
74 searchBodyQuery,
75 user.getUsername()
76 );
77 var res = searchDAO.findDataObjects(selectionQuery, Constants.DATAOBJECT_IN_QUERY);
78 resultsSet.addAll(res);
79 }
80 }
81 }
82 DataObject[] dataObjects = resultsSet.toArray(new DataObject[0]);
83 ResultTriple[] resultTriples = new ResultTriple[resultsSet.size()];
84 BasicEntityIO[] results = new BasicEntityIO[resultsSet.size()];
85 for (var i = 0; i < resultsSet.size(); i++) {
86 resultTriples[i] = new ResultTriple(dataObjects[i].getCollection().getShepardId(), dataObjects[i].getShepardId());
87 results[i] = new BasicEntityIO(dataObjects[i]);
88 }
89 ResponseBody ret = new ResponseBody(resultTriples, results, searchBody.getSearchParams());
90 return ret;
91 }
92 }