Skip to content

Commit 20f1331

Browse files
committed
Gracefully handle empty criteria groups in cohort definitions.
Fixes #155
1 parent c9b2c42 commit 20f1331

File tree

1 file changed

+24
-16
lines changed

1 file changed

+24
-16
lines changed

src/main/java/org/ohdsi/webapi/cohortdefinition/CohortExpressionQueryBuilder.java

+24-16
Original file line numberDiff line numberDiff line change
@@ -369,25 +369,33 @@ public String getCriteriaGroupQuery(CriteriaGroup group, String eventTable) {
369369
indexId++;
370370
}
371371

372-
String occurrenceCountClause = "HAVING COUNT(index_id) ";
373-
374-
if (group.type.equalsIgnoreCase("ALL")) // count must match number of criteria + sub-groups in group.
375-
occurrenceCountClause += "= " + indexId;
376-
377-
if (group.type.equalsIgnoreCase("ANY")) // count must be > 0 for an 'ANY' criteria
378-
occurrenceCountClause += "> 0";
379-
380-
if (group.type.toUpperCase().startsWith("AT_"))
372+
if (indexId > 0) // this group is not empty
381373
{
382-
if (group.type.toUpperCase().endsWith("LEAST"))
383-
occurrenceCountClause += ">= " + group.count;
384-
else
385-
occurrenceCountClause += "<= " + group.count;
374+
query = StringUtils.replace(query, "@criteriaQueries", StringUtils.join(additionalCriteriaQueries, "\nUNION ALL\n"));
375+
376+
String occurrenceCountClause = "HAVING COUNT(index_id) ";
377+
if (group.type.equalsIgnoreCase("ALL")) // count must match number of criteria + sub-groups in group.
378+
occurrenceCountClause += "= " + indexId;
379+
380+
if (group.type.equalsIgnoreCase("ANY")) // count must be > 0 for an 'ANY' criteria
381+
occurrenceCountClause += "> 0";
382+
383+
if (group.type.toUpperCase().startsWith("AT_"))
384+
{
385+
if (group.type.toUpperCase().endsWith("LEAST"))
386+
occurrenceCountClause += ">= " + group.count;
387+
else
388+
occurrenceCountClause += "<= " + group.count;
389+
}
390+
query = StringUtils.replace(query, "@occurrenceCountClause", occurrenceCountClause);
391+
}
392+
else // query group is empty so replace queries and occurence count clause with a friendly default
393+
{
394+
query = StringUtils.replace(query, "@criteriaQueries", "select ET.person_id, ET.event_id from @eventTable ET");
395+
query = StringUtils.replace(query, "@occurrenceCountClause", "");
386396
}
387-
397+
388398
query = StringUtils.replace(query, "@eventTable", eventTable);
389-
query = StringUtils.replace(query, "@occurrenceCountClause", occurrenceCountClause);
390-
query = StringUtils.replace(query, "@criteriaQueries", StringUtils.join(additionalCriteriaQueries, "\nUNION ALL\n"));
391399

392400
return query;
393401
}

0 commit comments

Comments
 (0)