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