Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 76e087c

Browse files
author
Luke Sikina
committedJul 13, 2024
take 2
1 parent f576d8d commit 76e087c

File tree

1 file changed

+34
-24
lines changed

1 file changed

+34
-24
lines changed
 

‎src/main/java/edu/harvard/dbmi/avillach/dictionary/filter/FilterQueryGenerator.java

+34-24
Original file line numberDiff line numberDiff line change
@@ -31,30 +31,35 @@ public QueryParamPair generateFilterQuery(Filter filter, Pageable pageable) {
3131
if (!CollectionUtils.isEmpty(filter.facets())) {
3232
clauses.addAll(createFacetFilter(filter.facets(), params));
3333
}
34-
if (StringUtils.hasText(filter.search())) {
35-
clauses.add(createSearchFilter(filter.search(), params));
34+
if (clauses.isEmpty()) {
35+
clauses.add(createValuelessNodeFilter());
3636
}
37-
clauses.add(createValuelessNodeFilter());
3837

3938

40-
String query = "(\n" + String.join("\n\tINTERSECT\n", clauses) + "\n) ORDER BY concept_node_id\n";
39+
String query = "(\n" + String.join("\n\tINTERSECT\n", clauses) + "\n)";
40+
if (StringUtils.hasText(filter.search())) {
41+
String searchQuery = createSearchFilter(filter.search(), params);
42+
query = "(" + query + "\n\tUNION \n\t" + searchQuery + ")";
43+
}
44+
String superQuery = """
45+
WITH q AS (
46+
%s
47+
)
48+
SELECT concept_node_id
49+
FROM q
50+
GROUP BY concept_node_id
51+
HAVING max(rank) > 0
52+
ORDER BY max(rank) DESC
53+
""".formatted(query);
4154
if (pageable.isPaged()) {
42-
query = query + """
55+
superQuery = superQuery + """
4356
LIMIT :limit
4457
OFFSET :offset
4558
""";
4659
params.addValue("limit", pageable.getPageSize())
4760
.addValue("offset", pageable.getOffset());
4861
}
4962

50-
String superQuery = """
51-
WITH q AS (%s)
52-
SELECT concept_node_id
53-
FROM q
54-
GROUP BY concept_node_id
55-
ORDER BY max(rank) DESC"
56-
""".formatted(query);
57-
5863

5964
return new QueryParamPair(superQuery, params);
6065
}
@@ -63,16 +68,16 @@ private String createValuelessNodeFilter() {
6368
// concept nodes that have no values and no min/max should not get returned by search
6469
return """
6570
SELECT
66-
concept_node.concept_node_id, 0 as rank
67-
FROM
68-
concept_node
69-
LEFT JOIN concept_node_meta AS continuous_min ON concept_node.concept_node_id = continuous_min.concept_node_id AND continuous_min.KEY = 'min'
70-
LEFT JOIN concept_node_meta AS continuous_max ON concept_node.concept_node_id = continuous_max.concept_node_id AND continuous_max.KEY = 'max'
71-
LEFT JOIN concept_node_meta AS categorical_values ON concept_node.concept_node_id = categorical_values.concept_node_id AND categorical_values.KEY = 'values'
72-
WHERE
73-
continuous_min.value <> '' OR
74-
continuous_max.value <> '' OR
75-
categorical_values.value <> ''
71+
concept_node.concept_node_id, 0 as rank
72+
FROM
73+
concept_node
74+
LEFT JOIN concept_node_meta AS continuous_min ON concept_node.concept_node_id = continuous_min.concept_node_id AND continuous_min.KEY = 'min'
75+
LEFT JOIN concept_node_meta AS continuous_max ON concept_node.concept_node_id = continuous_max.concept_node_id AND continuous_max.KEY = 'max'
76+
LEFT JOIN concept_node_meta AS categorical_values ON concept_node.concept_node_id = categorical_values.concept_node_id AND categorical_values.KEY = 'values'
77+
WHERE
78+
continuous_min.value <> '' OR
79+
continuous_max.value <> '' OR
80+
categorical_values.value <> ''
7681
""";
7782
}
7883

@@ -86,7 +91,12 @@ private String createSearchFilter(String search, MapSqlParameterSource params) {
8691
FROM
8792
concept_node
8893
WHERE
89-
concept_node.searchable_fields @@ (phraseto_tsquery(:search)::text || ':*')::tsquery
94+
concept_node.searchable_fields @@ (phraseto_tsquery(:search)::text || ':*')::tsquery AND
95+
(
96+
continuous_min.value <> '' OR
97+
continuous_max.value <> '' OR
98+
categorical_values.value <> ''
99+
)
90100
)
91101
""";
92102
}

0 commit comments

Comments
 (0)
Please sign in to comment.