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