1818
1919package 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+
2233import org .ehrbase .api .definitions .QueryMode ;
2334import org .ehrbase .api .definitions .ServerConfig ;
2435import org .ehrbase .api .exception .BadGatewayException ;
4657import org .springframework .stereotype .Service ;
4758import 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