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
25
26
27
28
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
61
62
63
64
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 }