Skip to content

Commit 1784819

Browse files
committed
Factory design pattern for QueryCollectorContextSpec
Signed-off-by: Varun Jain <varunudr@amazon.com>
1 parent 5618ee1 commit 1784819

File tree

8 files changed

+134
-120
lines changed

8 files changed

+134
-120
lines changed

server/src/main/java/org/opensearch/plugins/SearchPlugin.java

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@
6868
import org.opensearch.search.deciders.ConcurrentSearchRequestDecider;
6969
import org.opensearch.search.fetch.FetchSubPhase;
7070
import org.opensearch.search.fetch.subphase.highlight.Highlighter;
71-
import org.opensearch.search.query.QueryCollectorContextFactory;
71+
import org.opensearch.search.query.QueryCollectorContextSpecFactory;
7272
import org.opensearch.search.query.QueryPhaseSearcher;
7373
import org.opensearch.search.rescore.Rescorer;
7474
import org.opensearch.search.rescore.RescorerBuilder;
@@ -228,7 +228,7 @@ default Optional<ExecutorServiceProvider> getIndexSearcherExecutorProvider() {
228228
return Optional.empty();
229229
}
230230

231-
default List<FactorySpec<?>> getCollectorContextFactory() {
231+
default List<FactorySpec<?>> getCollectorContextSpec() {
232232
return emptyList();
233233
}
234234

@@ -417,35 +417,35 @@ public QuerySpec(String name, Writeable.Reader<T> reader, QueryParser<T> parser)
417417
* @param <T>
418418
*/
419419
class FactorySpec<T extends QueryBuilder> {
420-
public String getName() {
421-
return name;
422-
}
420+
// public String getName() {
421+
// return name;
422+
// }
423423

424-
public QueryCollectorContextFactory getQueryCollectorContextFactory() {
425-
return queryCollectorContextFactory;
424+
public QueryCollectorContextSpecFactory getQueryCollectorContextSpec() {
425+
return queryCollectorContextSpecFactory;
426426
}
427427

428-
private final String name;
428+
// private final String name;
429+
//
430+
// public Class<?> getClassType() {
431+
// return classType;
432+
// }
429433

430-
public Class<?> getClassType() {
431-
return classType;
432-
}
433-
434-
private final Class<?> classType;
435-
private final QueryCollectorContextFactory queryCollectorContextFactory;
434+
// private final Class<?> classType;
435+
private final QueryCollectorContextSpecFactory queryCollectorContextSpecFactory;
436436

437437
/**
438438
* Specification of custom {@link Query}.
439439
*
440440
* @param name the name by which this query might be parsed or deserialized. Make sure that the query builder returns this name for
441441
* {@link NamedWriteable#getWriteableName()}. It is an error if this name conflicts with another registered name, including
442442
* names from other plugins.
443-
* @param queryCollectorContextFactory Factory associated with the query builder
443+
* @param queryCollectorContextSpecFactory Factory associated with the query builder
444444
*/
445-
public FactorySpec(String name, Class<?> classType, QueryCollectorContextFactory queryCollectorContextFactory) {
446-
this.name = name;
447-
this.classType = classType;
448-
this.queryCollectorContextFactory = queryCollectorContextFactory;
445+
public FactorySpec(String name, Class<?> classType, QueryCollectorContextSpecFactory queryCollectorContextSpecFactory) {
446+
// this.name = name;
447+
// this.classType = classType;
448+
this.queryCollectorContextSpecFactory = queryCollectorContextSpecFactory;
449449
}
450450
}
451451

server/src/main/java/org/opensearch/search/SearchModule.java

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@
257257
import org.opensearch.search.fetch.subphase.highlight.Highlighter;
258258
import org.opensearch.search.fetch.subphase.highlight.PlainHighlighter;
259259
import org.opensearch.search.fetch.subphase.highlight.UnifiedHighlighter;
260-
import org.opensearch.search.query.QueryCollectorContextFactoryRegistery;
260+
import org.opensearch.search.query.QueryCollectorContextSpecRegistry;
261261
import org.opensearch.search.query.QueryPhase;
262262
import org.opensearch.search.query.QueryPhaseSearcher;
263263
import org.opensearch.search.query.QueryPhaseSearcherWrapper;
@@ -353,7 +353,7 @@ public SearchModule(Settings settings, List<SearchPlugin> plugins) {
353353
indexSearcherExecutorProvider = registerIndexSearcherExecutorProvider(plugins);
354354
namedWriteables.addAll(SortValue.namedWriteables());
355355
concurrentSearchDeciderFactories = registerConcurrentSearchDeciderFactories(plugins);
356-
registerQueryCollectorContextFactory(plugins);
356+
registerQueryCollectorContextSpec(plugins);
357357
}
358358

359359
private Collection<ConcurrentSearchRequestDecider.Factory> registerConcurrentSearchDeciderFactories(List<SearchPlugin> plugins) {
@@ -1301,21 +1301,8 @@ private SearchPlugin.ExecutorServiceProvider registerIndexSearcherExecutorProvid
13011301
return provider;
13021302
}
13031303

1304-
private void registerQueryCollectorContextFactory(List<SearchPlugin> plugins) {
1305-
// QueryCollectorContextFactory queryCollectorContextFactory = null;
1306-
// for (SearchPlugin plugin : plugins) {
1307-
// final Optional<QueryCollectorContextFactory> factoryOpt = plugin.getCollectorContextFactory();
1308-
//
1309-
// if (factoryOpt.isPresent()) {
1310-
// queryCollectorContextFactory = factoryOpt.get();
1311-
// break;
1312-
// }
1313-
// }
1314-
// if (queryCollectorContextFactory == null) {
1315-
// queryCollectorContextFactory = new TopDocsCollectorContextFactory();
1316-
// }
1317-
// return queryCollectorContextFactory;
1318-
registerFromPlugin(plugins, SearchPlugin::getCollectorContextFactory, QueryCollectorContextFactoryRegistery::registerFactory);
1304+
private void registerQueryCollectorContextSpec(List<SearchPlugin> plugins) {
1305+
registerFromPlugin(plugins, SearchPlugin::getCollectorContextSpec, QueryCollectorContextSpecRegistry::registerFactory);
13191306
}
13201307

13211308
public FetchPhase getFetchPhase() {

server/src/main/java/org/opensearch/search/query/QueryCollectorContextFactoryRegistery.java

Lines changed: 0 additions & 41 deletions
This file was deleted.
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
*
4+
* The OpenSearch Contributors require contributions made to
5+
* this file be licensed under the Apache-2.0 license or a
6+
* compatible open source license.
7+
*/
8+
9+
package org.opensearch.search.query;
10+
11+
import org.apache.lucene.search.Collector;
12+
import org.apache.lucene.search.CollectorManager;
13+
14+
import java.io.IOException;
15+
16+
public interface QueryCollectorContextSpec {
17+
String getProfileName();
18+
19+
Collector create(Collector in) throws IOException;
20+
21+
CollectorManager<?, ReduceableSearchResult> createManager(CollectorManager<?, ReduceableSearchResult> in) throws IOException;
22+
23+
void postProcess(QuerySearchResult result) throws IOException;
24+
}

server/src/main/java/org/opensearch/search/query/QueryCollectorContextFactory.java renamed to server/src/main/java/org/opensearch/search/query/QueryCollectorContextSpecFactory.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,16 @@
88

99
package org.opensearch.search.query;
1010

11+
import org.apache.lucene.search.Query;
12+
import org.opensearch.search.internal.SearchContext;
13+
1114
import java.io.IOException;
1215

1316
/**
1417
* QueryCollectorContextFactory
1518
*/
16-
public interface QueryCollectorContextFactory {
17-
QueryCollectorContext createCollectorContext(CollectorContextParams params) throws IOException;
19+
public interface QueryCollectorContextSpecFactory {
20+
boolean supports(Query query);
21+
22+
QueryCollectorContextSpec create(SearchContext searchContext, boolean hasFilterCollector) throws IOException;
1823
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
*
4+
* The OpenSearch Contributors require contributions made to
5+
* this file be licensed under the Apache-2.0 license or a
6+
* compatible open source license.
7+
*/
8+
9+
package org.opensearch.search.query;
10+
11+
import org.apache.lucene.search.Query;
12+
import org.opensearch.plugins.SearchPlugin;
13+
14+
import java.util.List;
15+
import java.util.concurrent.CopyOnWriteArrayList;
16+
17+
/**
18+
* QueryCollectorContextFactoryRegistery
19+
*/
20+
public class QueryCollectorContextSpecRegistry {
21+
// private static final Map<Class<?>, QueryCollectorContextSpec> registry = new ConcurrentHashMap<>();
22+
23+
private static final List<QueryCollectorContextSpecFactory> registry = new CopyOnWriteArrayList<>();
24+
25+
public static QueryCollectorContextSpecFactory getFactory(Query query) {
26+
27+
return registry.stream().filter(entry -> entry.supports(query)).findFirst().orElse(null);
28+
}
29+
30+
public static void registerFactory(SearchPlugin.FactorySpec<?> specs) {
31+
registry.add(specs.getQueryCollectorContextSpec());
32+
}
33+
}

server/src/main/java/org/opensearch/search/query/QueryPhase.java

Lines changed: 47 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@
8383
import static org.opensearch.search.query.QueryCollectorContext.createFilteredCollectorContext;
8484
import static org.opensearch.search.query.QueryCollectorContext.createMinScoreCollectorContext;
8585
import static org.opensearch.search.query.QueryCollectorContext.createMultiCollectorContext;
86+
import static org.opensearch.search.query.TopDocsCollectorContext.createTopDocsCollectorContext;
8687

8788
/**
8889
* Query phase of a search request, used to run the query and get back from each shard information about the matching documents
@@ -445,27 +446,34 @@ protected boolean searchWithCollector(
445446
boolean hasTimeout
446447
) throws IOException {
447448
// create the top docs collector last when the other collectors are known
448-
QueryCollectorContextFactory queryCollectorContextFactory = QueryCollectorContextFactoryRegistery.getFactory(query);
449-
CollectorContextParams collectorContextParams = new CollectorContextParams.Builder().withSearchContext(searchContext)
450-
.withHasFilterCollector(hasFilterCollector)
451-
.build();
452-
if (queryCollectorContextFactory == null) {
453-
queryCollectorContextFactory = new TopDocsCollectorContextFactory();
449+
QueryCollectorContext queryCollectorContext;
450+
QueryCollectorContextSpecFactory queryCollectorContextSpecFactory = QueryCollectorContextSpecRegistry.getFactory(query);
451+
if (queryCollectorContextSpecFactory == null) {
452+
queryCollectorContext = createTopDocsCollectorContext(searchContext, hasFilterCollector);
453+
} else {
454+
QueryCollectorContextSpec queryCollectorContextSpec = queryCollectorContextSpecFactory.create(
455+
searchContext,
456+
hasFilterCollector
457+
);
458+
queryCollectorContext = new QueryCollectorContext(queryCollectorContextSpec.getProfileName()) {
459+
@Override
460+
Collector create(Collector in) throws IOException {
461+
return queryCollectorContextSpec.create(in);
462+
}
463+
464+
@Override
465+
CollectorManager<?, ReduceableSearchResult> createManager(CollectorManager<?, ReduceableSearchResult> in)
466+
throws IOException {
467+
return queryCollectorContextSpec.createManager(in);
468+
}
469+
470+
@Override
471+
void postProcess(QuerySearchResult result) throws IOException {
472+
queryCollectorContextSpec.postProcess(result);
473+
}
474+
};
454475
}
455-
final QueryCollectorContext queryCollectorContext = queryCollectorContextFactory.createCollectorContext(collectorContextParams);
456-
// final TopDocsCollectorContext topDocsFactory = createTopDocsCollectorContext(searchContext, hasFilterCollector);
457-
return searchWithCollector(searchContext, searcher, query, collectors, queryCollectorContext, hasFilterCollector, hasTimeout);
458-
}
459476

460-
protected boolean searchWithCollector(
461-
SearchContext searchContext,
462-
ContextIndexSearcher searcher,
463-
Query query,
464-
LinkedList<QueryCollectorContext> collectors,
465-
QueryCollectorContext queryCollectorContext,
466-
boolean hasFilterCollector,
467-
boolean hasTimeout
468-
) throws IOException {
469477
return QueryPhase.searchWithCollector(
470478
searchContext,
471479
searcher,
@@ -476,5 +484,25 @@ protected boolean searchWithCollector(
476484
hasTimeout
477485
);
478486
}
487+
488+
// protected boolean searchWithCollector(
489+
// SearchContext searchContext,
490+
// ContextIndexSearcher searcher,
491+
// Query query,
492+
// LinkedList<QueryCollectorContext> collectors,
493+
// QueryCollectorContext queryCollectorContext,
494+
// boolean hasFilterCollector,
495+
// boolean hasTimeout
496+
// ) throws IOException {
497+
// return QueryPhase.searchWithCollector(
498+
// searchContext,
499+
// searcher,
500+
// query,
501+
// collectors,
502+
// queryCollectorContext,
503+
// hasFilterCollector,
504+
// hasTimeout
505+
// );
506+
// }
479507
}
480508
}

server/src/main/java/org/opensearch/search/query/TopDocsCollectorContextFactory.java

Lines changed: 0 additions & 22 deletions
This file was deleted.

0 commit comments

Comments
 (0)