View Javadoc
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  }