View Javadoc
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        // no CollectionId and no DataObjectId given
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        // CollectionId given but no DataObjectId
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        // CollectionId and DataObjectId given
55        else if (scope.getCollectionId() != null && scope.getDataObjectId() != null) {
56          // search according to TraversalRules
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          // no TraversalRules given
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  }