@@ -183,10 +183,52 @@ protected SqlQueryData buildQuery() throws Exception {
183183 return queryData ;
184184 }
185185
186+ /**
187+ * Appends values like ({@code ('Patient/<resource_id>', 'Patient/<resource_id>' ...)}) to the queryString
188+ */
189+ private void executeIncludeSubQuery (StringBuilder queryString , InclusionParameter includeParm ,
190+ List <Object > bindVariables ) throws Exception {
191+ StringBuilder subQueryString = new StringBuilder ();
192+ // SELECT P1.STR_VALUE FROM OBSERVATION_STR_VALUES P1 WHERE
193+ subQueryString .append ("SELECT P1.STR_VALUE FROM " ).append (this .resourceType .getSimpleName ()).append ("_STR_VALUES P1 WHERE " );
194+ // P1.PARAMETER_NAME_ID=xx AND
195+ subQueryString .append ("P1.PARAMETER_NAME_ID=" ).append (this .getParameterNameId (includeParm .getSearchParameter ())).append (" AND " );
196+ // P1.RESOURCE_ID IN
197+ subQueryString .append ("P1.LOGICAL_RESOURCE_ID IN " );
198+ // (SELECT R.LOGICAL_RESOURCE_ID
199+ subQueryString .append ("(SELECT R.LOGICAL_RESOURCE_ID " );
200+ // Add FROM clause for "root" resource type
201+ subQueryString .append (super .buildFromClause ());
202+ // Add WHERE clause for "root" resource type
203+ subQueryString .append (super .buildWhereClause ());
204+ subQueryString .append (")" );
205+
206+ queryString .append ("(" );
207+ //The subquery should return a list of strings in the FHIR Reference String value format
208+ //(e.g. {@code "Patient/<resource_id>"})
209+ SqlQueryData subQueryData = new SqlQueryData (subQueryString .toString (), bindVariables );
210+ boolean isFirstItem = true ;
211+ for (String strValue : this .resourceDao .searchStringValues (subQueryData )) {
212+ if (!isFirstItem ) {
213+ queryString .append (" , " );
214+ }
215+ if (strValue != null ) {
216+ queryString .append ("'" ).append (strValue ).append ("'" );
217+ isFirstItem = false ;
218+ }
219+ }
220+ // if nothing added so far, then need to add '', otherwise sql will fail.
221+ if (isFirstItem ) {
222+ queryString .append ("''" );
223+ }
224+ queryString .append (")" );
225+ }
226+
227+
186228 private void processIncludeParameters (StringBuilder queryString , List <Object > bindVariables ) throws Exception {
187229 final String METHODNAME = "processIncludeParameters" ;
188230 log .entering (CLASSNAME , METHODNAME );
189-
231+
190232 for (InclusionParameter includeParm : this .includeParameters ) {
191233 // UNION ALL
192234 queryString .append (UNION_ALL );
@@ -199,23 +241,12 @@ private void processIncludeParameters(StringBuilder queryString, List<Object> bi
199241 // R.RESOURCE_ID = LR.CURRENT_RESOURCE_ID AND
200242 queryString .append ("R.RESOURCE_ID = LR.CURRENT_RESOURCE_ID AND " );
201243 // ('Organization/' || LR.LOGICAL_ID IN
202- queryString .append ("('" ).append (includeParm .getSearchParameterTargetType ()).append ("/' || LR.LOGICAL_ID IN " );
203- // (SELECT P1.STR_VALUE FROM OBSERVATION_STR_VALUES P1 WHERE
204- queryString .append ("(SELECT P1.STR_VALUE FROM " ).append (this .resourceType .getSimpleName ()).append ("_STR_VALUES P1 WHERE " );
205- // P1.PARAMETER_NAME_ID=xx AND
206- queryString .append ("P1.PARAMETER_NAME_ID=" ).append (this .getParameterNameId (includeParm .getSearchParameter ())).append (" AND " );
207- // P1.RESOURCE_ID IN
208- queryString .append ("P1.LOGICAL_RESOURCE_ID IN " );
209- // (SELECT R.LOGICAL_RESOURCE_ID
210- queryString .append ("(SELECT R.LOGICAL_RESOURCE_ID " );
211- // Add FROM clause for "root" resource type
212- queryString .append (super .buildFromClause ());
213- // Add WHERE clause for "root" resource type
214- queryString .append (super .buildWhereClause ());
215-
216- queryString .append (")))" );
217-
218- this .addBindVariables (bindVariables );
244+ queryString .append ("('" ).append (includeParm .getSearchParameterTargetType ()).append ("/' || LR.LOGICAL_ID IN " );
245+
246+ // Execute sub query to get the string values for constructing the query string.
247+ // This avoids DB engine to run this sub query once for each record in the previously joined tables.
248+ executeIncludeSubQuery (queryString , includeParm , bindVariables );
249+ queryString .append (")" );
219250 }
220251 log .exiting (CLASSNAME , METHODNAME );
221252 }
0 commit comments