Skip to content

Commit f23ecbc

Browse files
committed
Merge remote-tracking branch 'origin/develop' into develop
2 parents e7995a0 + ce303f8 commit f23ecbc

File tree

4 files changed

+71
-74
lines changed

4 files changed

+71
-74
lines changed

api/src/main/java/org/ehrbase/api/service/QueryService.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ public interface QueryService extends BaseService {
3535
* @param explain
3636
* @return
3737
*/
38-
QueryResultDto query(String queryString, QueryMode queryMode, boolean explain);
38+
QueryResultDto query(String queryString, QueryMode queryMode, boolean explain, Map<String, Set<Object>> auditResultMap);
3939

40-
QueryResultDto query(String queryString, Map<String, Object> parameters, QueryMode queryMode, boolean explain);
40+
QueryResultDto query(String queryString, Map<String, Object> parameters, QueryMode queryMode, boolean explain, Map<String, Set<Object>> auditResultMap);
4141

4242
//=== DEFINITION: manage stored queries
4343
List<QueryDefinitionResultDto> retrieveStoredQueries(String fullyQualifiedName);
@@ -50,7 +50,4 @@ public interface QueryService extends BaseService {
5050
QueryDefinitionResultDto updateStoredQuery(String qualifiedName, String version, String queryString);
5151

5252
QueryDefinitionResultDto deleteStoredQuery(String qualifiedName, String version);
53-
54-
//the audit variables
55-
Map<String, Set<Object>> getAuditResultMap();
5653
}

rest-ehr-scape/src/main/java/org/ehrbase/rest/ehrscape/controller/QueryController.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@
1818

1919
package org.ehrbase.rest.ehrscape.controller;
2020

21+
import java.util.HashMap;
22+
import java.util.Map;
23+
import java.util.Objects;
24+
import java.util.Set;
25+
import java.util.regex.Matcher;
26+
import java.util.regex.Pattern;
27+
2128
import org.ehrbase.api.definitions.QueryMode;
2229
import org.ehrbase.api.exception.InvalidApiParameterException;
2330
import org.ehrbase.api.service.QueryService;
@@ -26,13 +33,11 @@
2633
import org.springframework.beans.factory.annotation.Autowired;
2734
import org.springframework.http.MediaType;
2835
import org.springframework.http.ResponseEntity;
29-
import org.springframework.web.bind.annotation.*;
30-
31-
import java.util.HashMap;
32-
import java.util.Map;
33-
import java.util.Objects;
34-
import java.util.regex.Matcher;
35-
import java.util.regex.Pattern;
36+
import org.springframework.web.bind.annotation.PostMapping;
37+
import org.springframework.web.bind.annotation.RequestBody;
38+
import org.springframework.web.bind.annotation.RequestMapping;
39+
import org.springframework.web.bind.annotation.RequestParam;
40+
import org.springframework.web.bind.annotation.RestController;
3641

3742
@RestController
3843
@RequestMapping(path = "/rest/ecis/v1/query", produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE})
@@ -62,7 +67,7 @@ public ResponseEntity<QueryResponseData> query(@RequestParam(value = "explain",
6267
} else {
6368
throw new InvalidApiParameterException("No query parameter supplied");
6469
}
65-
QueryResponseData responseData = new QueryResponseData(queryService.query(queryString, queryMode, explain));
70+
QueryResponseData responseData = new QueryResponseData(queryService.query(queryString, queryMode, explain, new HashMap<String, Set<Object>>()));
6671
responseData.setAction(Action.EXECUTE);
6772
return ResponseEntity.ok(responseData);
6873
}

rest-openehr/src/main/java/org/ehrbase/rest/openehr/OpenehrQueryController.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -235,17 +235,18 @@ private QueryResponseData executeQuery(String aql, Map<String, Object> parameter
235235
HttpServletRequest request) {
236236
QueryResponseData queryResponseData;
237237

238+
Map<String, Set<Object>> auditResultMap = new HashMap<>();
239+
238240
//get the query and pass it to the service
239241
if (parameters != null && !parameters.isEmpty()) {
240242
queryResponseData = new QueryResponseData(
241-
queryService.query(aql, parameters, QueryMode.AQL, false));
243+
queryService.query(aql, parameters, QueryMode.AQL, false, auditResultMap));
242244
} else {
243245
queryResponseData = new QueryResponseData(
244-
queryService.query(aql, QueryMode.AQL, false));
246+
queryService.query(aql, QueryMode.AQL, false, auditResultMap));
245247
}
246248

247249
// Enriches request attributes with EhrId(s) for later audit processing
248-
Map<String, Set<Object>> auditResultMap = queryService.getAuditResultMap();
249250
request.setAttribute(OpenEhrAuditInterceptor.EHR_ID_ATTRIBUTE,
250251
auditResultMap.get(EHR_ID_VALUE));
251252

@@ -298,17 +299,18 @@ private QueryResponseData invoke(String query, Map<String, Object> queryParamete
298299
HttpServletRequest request) {
299300
QueryResponseData queryResponseData;
300301

302+
Map<String, Set<Object>> auditResultMap = new HashMap<>();
303+
301304
if (queryParameter != null && !queryParameter.isEmpty()) {
302305
Map<String, Object> parameters = new HashMap<>(queryParameter);
303306
queryResponseData = new QueryResponseData(
304-
queryService.query(query, parameters, QueryMode.AQL, false));
307+
queryService.query(query, parameters, QueryMode.AQL, false, auditResultMap));
305308
} else {
306309
queryResponseData = new QueryResponseData(
307-
queryService.query(query, QueryMode.AQL, false));
310+
queryService.query(query, QueryMode.AQL, false, auditResultMap));
308311
}
309312

310313
// Enriches request attributes with EhrId(s) for later audit processing
311-
Map<String, Set<Object>> auditResultMap = queryService.getAuditResultMap();
312314
request.setAttribute(OpenEhrAuditInterceptor.EHR_ID_ATTRIBUTE,
313315
auditResultMap.get(EHR_ID_VALUE));
314316

service/src/main/java/org/ehrbase/service/QueryServiceImp.java

Lines changed: 48 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,18 @@
1818

1919
package org.ehrbase.service;
2020

21-
import com.google.gson.JsonElement;
21+
import static java.lang.String.format;
22+
23+
import java.sql.Timestamp;
24+
import java.time.Instant;
25+
import java.time.ZoneId;
26+
import java.util.ArrayList;
27+
import java.util.List;
28+
import java.util.Map;
29+
import java.util.Set;
30+
import java.util.function.BiConsumer;
31+
import java.util.function.Supplier;
32+
2233
import org.ehrbase.api.definitions.QueryMode;
2334
import org.ehrbase.api.definitions.ServerConfig;
2435
import org.ehrbase.api.exception.BadGatewayException;
@@ -46,13 +57,7 @@
4657
import org.springframework.stereotype.Service;
4758
import org.springframework.web.client.RestClientException;
4859

49-
import java.sql.Timestamp;
50-
import java.time.Instant;
51-
import java.time.ZoneId;
52-
import java.util.ArrayList;
53-
import java.util.List;
54-
import java.util.Map;
55-
import java.util.Set;
60+
import com.google.gson.JsonElement;
5661

5762
@Service
5863
@SuppressWarnings("unchecked")
@@ -61,39 +66,47 @@ public class QueryServiceImp extends BaseServiceImp implements QueryService {
6166

6267
private final FhirTerminologyServerR4AdaptorImpl tsAdapter;
6368

64-
private Map<String, Set<Object>> auditResultMap;
65-
6669
@Autowired
6770
public QueryServiceImp(KnowledgeCacheService knowledgeCacheService, DSLContext context, ServerConfig serverConfig, FhirTerminologyServerR4AdaptorImpl tsAdapter) {
6871

6972
super(knowledgeCacheService, context, serverConfig);
7073
this.tsAdapter = tsAdapter;
7174
}
7275

76+
private static BiConsumer<Map<?,?>,String> CHECK_NON_NULL = (map, errMsg) -> { if(map == null) throw new IllegalArgumentException(errMsg); };
77+
7378
@Override
74-
public QueryResultDto query(String queryString, QueryMode queryMode, boolean explain) {
79+
public QueryResultDto query(String queryString, QueryMode queryMode, boolean explain, Map<String, Set<Object>> auditResultMap) {
7580

7681
switch (queryMode) {
7782
case SQL:
78-
return querySql(queryString);
83+
return querySql(queryString, auditResultMap);
7984

8085
case AQL:
81-
return queryAql(queryString, explain);
86+
return queryAql(
87+
queryString,
88+
explain,
89+
() -> new AqlQueryHandler(getDataAccess(), tsAdapter).process(queryString),
90+
auditResultMap);
8291

8392
default:
8493
throw new IllegalArgumentException("Invalid query mode:"+queryMode);
8594
}
8695
}
8796

8897
@Override
89-
public QueryResultDto query(String queryString, Map<String, Object> parameters, QueryMode queryMode, boolean explain) {
98+
public QueryResultDto query(String queryString, Map<String, Object> parameters, QueryMode queryMode, boolean explain, Map<String, Set<Object>> auditResultMap) {
9099

91100
switch (queryMode) {
92101
case SQL:
93-
return querySql(queryString);
102+
return querySql(queryString, auditResultMap);
94103

95104
case AQL:
96-
return queryAql(queryString, parameters, explain);
105+
return queryAql(
106+
queryString,
107+
explain,
108+
() -> new AqlQueryHandler(getDataAccess(), tsAdapter).process(queryString, parameters),
109+
auditResultMap);
97110

98111
default:
99112
throw new IllegalArgumentException("Invalid query mode:"+queryMode);
@@ -130,40 +143,27 @@ private QueryResultDto formatResult(AqlResult aqlResult, String queryString, boo
130143
return dto;
131144
}
132145

133-
private QueryResultDto queryAql(String queryString, boolean explain) {
134-
try {
135-
136-
AqlQueryHandler queryHandler = new AqlQueryHandler(getDataAccess(), tsAdapter);
137-
AqlResult aqlResult = queryHandler.process(queryString);
138-
auditResultMap = aqlResult.getAuditResultMap();
139-
return formatResult(aqlResult, queryString, explain);
140-
} catch (DataAccessException dae){
141-
throw new GeneralRequestProcessingException("Data Access Error:"+dae.getCause().getMessage());
142-
} catch (IllegalArgumentException iae){
143-
throw new IllegalArgumentException(iae.getMessage());
144-
} catch (Exception e){
145-
throw new IllegalArgumentException("Could not process query, reason:" + e);
146-
}
147-
}
148-
149-
private QueryResultDto queryAql(String queryString, Map<String, Object> parameters, boolean explain) {
150-
try {
151-
AqlQueryHandler queryHandler = new AqlQueryHandler(getDataAccess(), tsAdapter);
152-
AqlResult aqlResult = queryHandler.process(queryString, parameters);
153-
auditResultMap = aqlResult.getAuditResultMap();
154-
return formatResult(aqlResult, queryString, explain);
155-
} catch(RestClientException rce) {
156-
throw new BadGatewayException("Bad gateway exception: "+rce.getCause().getMessage());
157-
} catch (DataAccessException dae){
158-
throw new GeneralRequestProcessingException("Data Access Error: "+dae.getCause().getMessage());
159-
} catch (IllegalArgumentException iae){
160-
throw new IllegalArgumentException(iae.getMessage());
161-
} catch (Exception e){
162-
throw new IllegalArgumentException("Could not retrieve stored query, reason: " + e);
163-
}
146+
private static final String ERR_MAP_NON_NULL = "Arg[%s] must not be null";
147+
148+
149+
private QueryResultDto queryAql(String queryString, boolean explain, Supplier<AqlResult> resultSupplier, Map<String, Set<Object>> auditResultMap) {
150+
CHECK_NON_NULL.accept(auditResultMap, format(ERR_MAP_NON_NULL, "auditResultMap"));
151+
try {
152+
AqlResult aqlResult = resultSupplier.get();
153+
auditResultMap.putAll(aqlResult.getAuditResultMap());
154+
return formatResult(aqlResult, queryString, explain);
155+
} catch(RestClientException rce) {
156+
throw new BadGatewayException("Bad gateway exception: "+rce.getCause().getMessage());
157+
} catch (DataAccessException dae){
158+
throw new GeneralRequestProcessingException("Data Access Error: "+dae.getCause().getMessage());
159+
} catch (IllegalArgumentException iae){
160+
throw new IllegalArgumentException(iae.getMessage());
161+
} catch (Exception e){
162+
throw new IllegalArgumentException("Could not process query/stored-query, reason: " + e);
163+
}
164164
}
165165

166-
private QueryResultDto querySql(String queryString) {
166+
private QueryResultDto querySql(String queryString, Map<String, Set<Object>> auditResultMap) {
167167
Map<String, Object> result;
168168
try {
169169
result = I_EntryAccess.queryJSON(getDataAccess(), queryString);
@@ -287,11 +287,6 @@ public QueryDefinitionResultDto deleteStoredQuery(String qualifiedName, String v
287287
}
288288
}
289289

290-
@Override
291-
public Map<String, Set<Object>> getAuditResultMap() {
292-
return auditResultMap;
293-
}
294-
295290
private QueryDefinitionResultDto mapToQueryDefinitionDto(I_StoredQueryAccess storedQueryAccess) {
296291
QueryDefinitionResultDto dto = new QueryDefinitionResultDto();
297292
dto.setSaved(storedQueryAccess.getCreationDate().toInstant().atZone(ZoneId.systemDefault()));
@@ -301,6 +296,4 @@ private QueryDefinitionResultDto mapToQueryDefinitionDto(I_StoredQueryAccess sto
301296
dto.setType(storedQueryAccess.getQueryType());
302297
return dto;
303298
}
304-
305-
306299
}

0 commit comments

Comments
 (0)