18
18
19
19
package org .ehrbase .service ;
20
20
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
+
22
33
import org .ehrbase .api .definitions .QueryMode ;
23
34
import org .ehrbase .api .definitions .ServerConfig ;
24
35
import org .ehrbase .api .exception .BadGatewayException ;
46
57
import org .springframework .stereotype .Service ;
47
58
import org .springframework .web .client .RestClientException ;
48
59
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 ;
56
61
57
62
@ Service
58
63
@ SuppressWarnings ("unchecked" )
@@ -61,39 +66,47 @@ public class QueryServiceImp extends BaseServiceImp implements QueryService {
61
66
62
67
private final FhirTerminologyServerR4AdaptorImpl tsAdapter ;
63
68
64
- private Map <String , Set <Object >> auditResultMap ;
65
-
66
69
@ Autowired
67
70
public QueryServiceImp (KnowledgeCacheService knowledgeCacheService , DSLContext context , ServerConfig serverConfig , FhirTerminologyServerR4AdaptorImpl tsAdapter ) {
68
71
69
72
super (knowledgeCacheService , context , serverConfig );
70
73
this .tsAdapter = tsAdapter ;
71
74
}
72
75
76
+ private static BiConsumer <Map <?,?>,String > CHECK_NON_NULL = (map , errMsg ) -> { if (map == null ) throw new IllegalArgumentException (errMsg ); };
77
+
73
78
@ 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 ) {
75
80
76
81
switch (queryMode ) {
77
82
case SQL :
78
- return querySql (queryString );
83
+ return querySql (queryString , auditResultMap );
79
84
80
85
case AQL :
81
- return queryAql (queryString , explain );
86
+ return queryAql (
87
+ queryString ,
88
+ explain ,
89
+ () -> new AqlQueryHandler (getDataAccess (), tsAdapter ).process (queryString ),
90
+ auditResultMap );
82
91
83
92
default :
84
93
throw new IllegalArgumentException ("Invalid query mode:" +queryMode );
85
94
}
86
95
}
87
96
88
97
@ 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 ) {
90
99
91
100
switch (queryMode ) {
92
101
case SQL :
93
- return querySql (queryString );
102
+ return querySql (queryString , auditResultMap );
94
103
95
104
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 );
97
110
98
111
default :
99
112
throw new IllegalArgumentException ("Invalid query mode:" +queryMode );
@@ -130,40 +143,27 @@ private QueryResultDto formatResult(AqlResult aqlResult, String queryString, boo
130
143
return dto ;
131
144
}
132
145
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
+ }
164
164
}
165
165
166
- private QueryResultDto querySql (String queryString ) {
166
+ private QueryResultDto querySql (String queryString , Map < String , Set < Object >> auditResultMap ) {
167
167
Map <String , Object > result ;
168
168
try {
169
169
result = I_EntryAccess .queryJSON (getDataAccess (), queryString );
@@ -287,11 +287,6 @@ public QueryDefinitionResultDto deleteStoredQuery(String qualifiedName, String v
287
287
}
288
288
}
289
289
290
- @ Override
291
- public Map <String , Set <Object >> getAuditResultMap () {
292
- return auditResultMap ;
293
- }
294
-
295
290
private QueryDefinitionResultDto mapToQueryDefinitionDto (I_StoredQueryAccess storedQueryAccess ) {
296
291
QueryDefinitionResultDto dto = new QueryDefinitionResultDto ();
297
292
dto .setSaved (storedQueryAccess .getCreationDate ().toInstant ().atZone (ZoneId .systemDefault ()));
@@ -301,6 +296,4 @@ private QueryDefinitionResultDto mapToQueryDefinitionDto(I_StoredQueryAccess sto
301
296
dto .setType (storedQueryAccess .getQueryType ());
302
297
return dto ;
303
298
}
304
-
305
-
306
299
}
0 commit comments