Skip to content

Commit 7e4b1a3

Browse files
committed
fix(search-engine): compute the max clause count limit only if necessary
https://gravitee.atlassian.net/browse/APIM-4901 gravitee-io/issues#9730 (cherry picked from commit e3a6ddd)
1 parent ee23c03 commit 7e4b1a3

File tree

2 files changed

+30
-9
lines changed

2 files changed

+30
-9
lines changed

gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/impl/search/lucene/searcher/AbstractDocumentSearcher.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ public abstract class AbstractDocumentSearcher implements DocumentSearcher {
4646
protected static final String FIELD_API_TYPE_VALUE = "api";
4747

4848
protected static void increaseMaxClauseCountIfNecessary(int size) {
49-
if (size > BooleanQuery.getMaxClauseCount()) {
50-
BooleanQuery.setMaxClauseCount(size);
49+
if (size > IndexSearcher.getMaxClauseCount()) {
50+
IndexSearcher.setMaxClauseCount(size);
5151
}
5252
}
5353

gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/rest/api/service/impl/search/lucene/searcher/ApiDocumentSearcher.java

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import org.apache.lucene.search.BooleanClause;
4646
import org.apache.lucene.search.BooleanQuery;
4747
import org.apache.lucene.search.BoostQuery;
48+
import org.apache.lucene.search.IndexSearcher;
4849
import org.apache.lucene.search.PhraseQuery;
4950
import org.apache.lucene.search.Query;
5051
import org.apache.lucene.search.TermQuery;
@@ -137,10 +138,7 @@ private Optional<BooleanQuery> buildIdsQuery(
137138
io.gravitee.rest.api.service.search.query.Query<?> query
138139
) {
139140
if (!isBlank(query.getQuery()) && query.getIds() != null && !query.getIds().isEmpty()) {
140-
increaseMaxClauseCountIfNecessary(query.getIds().size());
141-
142141
BooleanQuery.Builder mainQuery = new BooleanQuery.Builder();
143-
144142
query
145143
.getIds()
146144
.forEach(id -> {
@@ -198,22 +196,45 @@ private Optional<BooleanQuery> buildWildcardQuery(
198196
@Override
199197
public SearchResult search(ExecutionContext executionContext, io.gravitee.rest.api.service.search.query.Query<?> query)
200198
throws TechnicalException {
199+
BooleanQuery.Builder apiQuery = new BooleanQuery.Builder();
200+
201201
try {
202202
final Optional<Query> baseFilterQuery = this.buildFilterQuery(FIELD_ID, query.getFilters());
203-
204-
BooleanQuery.Builder apiQuery = new BooleanQuery.Builder();
205203
this.buildExcludedFilters(query.getExcludedFilters()).ifPresent(q -> apiQuery.add(q, BooleanClause.Occur.MUST_NOT));
206204
this.buildExplicitQuery(executionContext, query, baseFilterQuery).ifPresent(q -> apiQuery.add(q, BooleanClause.Occur.MUST));
207205
this.buildExactMatchQuery(executionContext, query, baseFilterQuery)
208206
.ifPresent(q -> apiQuery.add(new BoostQuery(q, 4.0f), BooleanClause.Occur.SHOULD));
209207
this.buildWildcardQuery(executionContext, query, baseFilterQuery).ifPresent(q -> apiQuery.add(q, BooleanClause.Occur.SHOULD));
210208
this.buildIdsQuery(executionContext, query).ifPresent(q -> apiQuery.add(q, BooleanClause.Occur.SHOULD));
211-
212-
return this.search(apiQuery.build(), query.getSort());
213209
} catch (ParseException pe) {
214210
logger.error("Invalid query to search for API documents", pe);
215211
throw new TechnicalException("Invalid query to search for API documents", pe);
216212
}
213+
214+
BooleanQuery finalQuery = apiQuery.build();
215+
216+
try {
217+
return this.search(finalQuery, query.getSort());
218+
} catch (IndexSearcher.TooManyClauses tooManyClauses) {
219+
int maxClauseCount = getClauseCount(finalQuery);
220+
increaseMaxClauseCountIfNecessary(maxClauseCount);
221+
return this.search(finalQuery, query.getSort());
222+
}
223+
}
224+
225+
private int getClauseCount(Query query) {
226+
int result = 0;
227+
if (query instanceof BooleanQuery) {
228+
List<BooleanClause> clauses = ((BooleanQuery) query).clauses();
229+
result = clauses.size();
230+
for (BooleanClause clause : clauses) {
231+
result += getClauseCount(clause.getQuery());
232+
}
233+
} else if (query instanceof BoostQuery) {
234+
result += getClauseCount(((BoostQuery) query).getQuery());
235+
}
236+
237+
return result;
217238
}
218239

219240
private Optional<BooleanQuery> buildExcludedFilters(Map<String, Collection<String>> excludedFilters) {

0 commit comments

Comments
 (0)