1 package de.dlr.shepard.context.version.daos;
2
3 import de.dlr.shepard.common.neo4j.daos.GenericDAO;
4 import de.dlr.shepard.common.util.CypherQueryHelper;
5 import java.util.HashMap;
6 import java.util.List;
7 import java.util.Map;
8 import java.util.UUID;
9 import java.util.stream.Collectors;
10 import java.util.stream.StreamSupport;
11
12 public abstract class VersionableEntityDAO<T> extends GenericDAO<T> {
13
14 protected VersionableEntityDAO() {
15 super();
16 }
17
18 public T findByShepardId(Long shepardId) {
19 List<T> list = findByShepardIds(List.of(shepardId), false);
20 return list.isEmpty() ? null : list.get(0);
21 }
22
23 public T findByShepardId(Long shepardId, boolean light) {
24 List<T> list = findByShepardIds(List.of(shepardId), light);
25 return list.isEmpty() ? null : list.get(0);
26 }
27
28 public T findByShepardId(Long shepardId, UUID versionUID) {
29 return findByShepardId(shepardId, versionUID, false);
30 }
31
32 public T findByShepardId(Long shepardId, UUID versionUID, boolean light) {
33 Map<String, Object> paramsMap = new HashMap<>();
34 var returnPart = light ? CypherQueryHelper.getReturnPartLight("o") : CypherQueryHelper.getReturnPart("o");
35 String versionPart = "";
36 if (versionUID != null) versionPart = CypherQueryHelper.getVersionPart("v", versionUID);
37 else versionPart = CypherQueryHelper.getVersionHeadPart("v");
38 String query = String.format(
39 "MATCH (o:%s {deleted: FALSE})-[:has_version]->(v:Version) WHERE %s AND %s WITH o ",
40 getEntityType().getSimpleName(),
41 CypherQueryHelper.getShepardIdPart("o", shepardId),
42 versionPart
43 );
44 query += returnPart;
45 Iterable<T> result = findByQuery(query, paramsMap);
46 if (!result.iterator().hasNext()) return null;
47 return result.iterator().next();
48 }
49
50 public List<T> findByShepardIds(List<Long> shepardIds) {
51 return findByShepardIds(shepardIds, false);
52 }
53
54 private List<T> findByShepardIds(List<Long> shepardIds, boolean light) {
55 Map<String, Object> paramsMap = new HashMap<>();
56 var returnPart = light ? CypherQueryHelper.getReturnPartLight("o") : CypherQueryHelper.getReturnPart("o");
57
58 String query = String.format(
59 "MATCH (o:%s {deleted: FALSE})-[:has_version]->(v:Version) WHERE %s AND %s WITH o ",
60 getEntityType().getSimpleName(),
61 CypherQueryHelper.getShepardIdsPart("o", shepardIds),
62 CypherQueryHelper.getVersionHeadPart("v")
63 );
64 query += returnPart;
65 Iterable<T> result = findByQuery(query, paramsMap);
66 return StreamSupport.stream(result.spliterator(), false).collect(Collectors.toList());
67 }
68
69 @Override
70 public abstract Class<T> getEntityType();
71 }