View Javadoc
1   package de.dlr.shepard.context.references.basicreference.daos;
2   
3   import de.dlr.shepard.common.util.CypherQueryHelper;
4   import de.dlr.shepard.common.util.QueryParamHelper;
5   import de.dlr.shepard.context.references.basicreference.entities.BasicReference;
6   import de.dlr.shepard.context.version.daos.VersionableEntityDAO;
7   import jakarta.enterprise.context.RequestScoped;
8   import java.util.ArrayList;
9   import java.util.Collections;
10  import java.util.HashMap;
11  import java.util.List;
12  import java.util.Map;
13  import java.util.stream.StreamSupport;
14  
15  @RequestScoped
16  public class BasicReferenceDAO extends VersionableEntityDAO<BasicReference> {
17  
18    @Override
19    public Class<BasicReference> getEntityType() {
20      return BasicReference.class;
21    }
22  
23    /**
24     * Searches the database for references.
25     *
26     * @param dataObjectId identifies the dataObject
27     * @param params       encapsulates possible parameters
28     * @return a List of references
29     */
30    public List<BasicReference> findByDataObjectNeo4jId(long dataObjectId, QueryParamHelper params) {
31      String query;
32      Map<String, Object> paramsMap = new HashMap<>();
33      paramsMap.put("name", params.getName());
34      if (params.hasPagination()) {
35        paramsMap.put("offset", params.getPagination().getOffset());
36        paramsMap.put("size", params.getPagination().getSize());
37      }
38      query = String.format(
39        "MATCH (d:DataObject)-[hr:has_reference]->%s WHERE ID(d)=%d WITH r",
40        CypherQueryHelper.getObjectPart("r", "BasicReference", params.hasName()),
41        dataObjectId
42      );
43      if (params.hasOrderByAttribute()) {
44        query += " " + CypherQueryHelper.getOrderByPart("r", params.getOrderByAttribute(), params.getOrderDesc());
45      }
46      if (params.hasPagination()) {
47        query += " " + CypherQueryHelper.getPaginationPart();
48      }
49      query += " " + CypherQueryHelper.getReturnPart("r");
50      var result = new ArrayList<BasicReference>();
51      for (var ref : findByQuery(query, paramsMap)) {
52        if (matchDataObject(ref, dataObjectId) && matchName(ref, params.getName())) {
53          result.add(ref);
54        }
55      }
56      return result;
57    }
58  
59    /**
60     * Searches the database for references.
61     *
62     * @param dataObjectShepardId identifies the dataObject
63     * @param params              encapsulates possible parameters
64     * @return a List of references
65     */
66    public List<BasicReference> findByDataObjectShepardId(long dataObjectShepardId, QueryParamHelper params) {
67      String query;
68      Map<String, Object> paramsMap = new HashMap<>();
69      paramsMap.put("name", params.getName());
70      if (params.hasPagination()) {
71        paramsMap.put("offset", params.getPagination().getOffset());
72        paramsMap.put("size", params.getPagination().getSize());
73      }
74      query = String.format(
75        "MATCH (d:DataObject)-[hr:has_reference]->%s WHERE d.shepardId=%d WITH br",
76        CypherQueryHelper.getObjectPart("br", "BasicReference", params.hasName()),
77        dataObjectShepardId
78      );
79      if (params.hasOrderByAttribute()) {
80        query += " " + CypherQueryHelper.getOrderByPart("br", params.getOrderByAttribute(), params.getOrderDesc());
81      }
82      if (params.hasPagination()) {
83        query += " " + CypherQueryHelper.getPaginationPart();
84      }
85      query += " " + CypherQueryHelper.getReturnPart("br");
86      var result = new ArrayList<BasicReference>();
87      for (var ref : findByQuery(query, paramsMap)) {
88        if (matchDataObjectByShepardId(ref, dataObjectShepardId) && matchName(ref, params.getName())) {
89          result.add(ref);
90        }
91      }
92      return result;
93    }
94  
95    private boolean matchDataObject(BasicReference ref, long dataObjectId) {
96      return ref.getDataObject() != null && ref.getDataObject().getId().equals(dataObjectId);
97    }
98  
99    private boolean matchDataObjectByShepardId(BasicReference ref, long dataObjectShepardId) {
100     return ref.getDataObject() != null && ref.getDataObject().getShepardId().equals(dataObjectShepardId);
101   }
102 
103   private boolean matchName(BasicReference ref, String name) {
104     return name == null || ref.getName().equalsIgnoreCase(name);
105   }
106 
107   public List<BasicReference> getBasicReferencesByQuery(String query) {
108     var queryResult = findByQuery(query, Collections.emptyMap());
109     List<BasicReference> ret = StreamSupport.stream(queryResult.spliterator(), false).toList();
110     return ret;
111   }
112 }