Skip to content
This repository was archived by the owner on Sep 19, 2023. It is now read-only.

Commit 41980d8

Browse files
author
Matt Hall
committed
DATASOLR-153 - Added support for dismax queries.
1 parent 6d10043 commit 41980d8

File tree

10 files changed

+426
-7
lines changed

10 files changed

+426
-7
lines changed

src/main/java/org/springframework/data/solr/core/DefaultQueryParser.java

+41-2
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,14 @@
1515
*/
1616
package org.springframework.data.solr.core;
1717

18+
import static org.apache.solr.common.params.CommonParams.*;
19+
import static org.apache.solr.common.params.DisMaxParams.*;
20+
import static org.apache.solr.common.params.SimpleParams.QF;
21+
1822
import java.util.ArrayList;
1923
import java.util.Collection;
2024
import java.util.List;
2125
import java.util.Map.Entry;
22-
2326
import org.apache.commons.lang3.StringUtils;
2427
import org.apache.solr.client.solrj.SolrQuery;
2528
import org.apache.solr.client.solrj.SolrQuery.ORDER;
@@ -36,7 +39,6 @@
3639
import org.springframework.data.domain.Sort.Order;
3740
import org.springframework.data.mapping.context.MappingContext;
3841
import org.springframework.data.solr.core.query.*;
39-
import org.springframework.data.solr.core.query.Criteria.Predicate;
4042
import org.springframework.data.solr.core.query.FacetOptions.FacetParameter;
4143
import org.springframework.data.solr.core.query.FacetOptions.FieldWithDateRangeParameters;
4244
import org.springframework.data.solr.core.query.FacetOptions.FieldWithFacetParameters;
@@ -65,6 +67,7 @@
6567
* @author Joachim Uhrlaß
6668
* @author Petar Tahchiev
6769
* @author Juan Manuel de Blas
70+
* @author Matthew Hall
6871
*/
6972
public class DefaultQueryParser extends QueryParserBase<SolrDataQuery> {
7073

@@ -109,6 +112,10 @@ public final SolrQuery doConstructSolrQuery(SolrDataQuery query, @Nullable Class
109112
processHighlightOptions(solrQuery, (HighlightQuery) query, domainType);
110113
}
111114

115+
if (query instanceof DisMaxQuery) {
116+
processDisMaxOptions(solrQuery, (DisMaxQuery) query);
117+
}
118+
112119
return solrQuery;
113120
}
114121

@@ -132,6 +139,38 @@ private void processQueryOptions(SolrQuery solrQuery, Query query, @Nullable Cla
132139
LOGGER.debug("Constructed SolrQuery:\r\n {}", solrQuery);
133140
}
134141

142+
protected void processDisMaxOptions(SolrQuery solrQuery, DisMaxQuery disMaxQuery) {
143+
144+
if (disMaxQuery == null || disMaxQuery.getDisMaxOptions() == null) {
145+
return;
146+
}
147+
148+
DisMaxOptions disMaxOptions = disMaxQuery.getDisMaxOptions();
149+
150+
solrQuery.set("defType", "dismax");
151+
152+
setSolrParamIfPresent(solrQuery, DF, disMaxOptions.getDefaultField());
153+
154+
setSolrParamIfPresent(solrQuery, ALTQ, disMaxOptions.getAltQuery());
155+
setSolrParamIfPresent(solrQuery, QF, disMaxOptions.getQueryFunction());
156+
setSolrParamIfPresent(solrQuery, MM, disMaxOptions.getMinimumMatch());
157+
158+
setSolrParamIfPresent(solrQuery, BQ, disMaxOptions.getBoostQuery());
159+
setSolrParamIfPresent(solrQuery, BF, disMaxOptions.getBoostFunction());
160+
setSolrParamIfPresent(solrQuery, PF, disMaxOptions.getPhraseFunction());
161+
162+
setSolrParamIfPresent(solrQuery, PS, disMaxOptions.getPhraseSlop() == null ? null :
163+
String.valueOf(disMaxOptions.getPhraseSlop()));
164+
setSolrParamIfPresent(solrQuery, QS, disMaxOptions.getQuerySlop() == null ? null : String.valueOf(disMaxOptions.getQuerySlop()));
165+
setSolrParamIfPresent(solrQuery, TIE, disMaxOptions.getTie() == null ? null : String.valueOf(disMaxOptions.getTie()));
166+
}
167+
168+
private static void setSolrParamIfPresent(SolrQuery solrQuery, String param, String value) {
169+
if (!org.springframework.util.StringUtils.isEmpty(value)) {
170+
solrQuery.setParam(param, value);
171+
}
172+
}
173+
135174
private void processFacetOptions(SolrQuery solrQuery, FacetQuery query, @Nullable Class<?> domainType) {
136175

137176
if (enableFaceting(solrQuery, query)) {

src/main/java/org/springframework/data/solr/core/QueryParserBase.java

+26-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import java.util.Map;
2626
import java.util.Map.Entry;
2727
import java.util.Set;
28-
2928
import org.apache.commons.lang3.StringUtils;
3029
import org.apache.solr.client.solrj.SolrClient;
3130
import org.apache.solr.client.solrj.SolrQuery;
@@ -62,6 +61,7 @@
6261
* @author Radek Mensik
6362
* @author David Webb
6463
* @author Michael Rocke
64+
* @author Matthew Hall
6565
*/
6666
public abstract class QueryParserBase<QUERYTPYE extends SolrDataQuery> implements QueryParser {
6767

@@ -1064,6 +1064,31 @@ public Map<String, Object> getNamesAssociation() {
10641064
}
10651065
}
10661066

1067+
/**
1068+
* @author Matthew Hall
1069+
* @since 4.1
1070+
*/
1071+
static class NamedObjectsDisMaxQuery extends AbstractDisMaxQueryDecorator implements NamedObjects {
1072+
1073+
private Map<String, Object> namesAssociation = new HashMap<>();
1074+
1075+
public NamedObjectsDisMaxQuery(DisMaxQuery query) {
1076+
super(query);
1077+
}
1078+
1079+
@Override
1080+
public void setName(Object object, String name) {
1081+
setObjectName(namesAssociation, object, name);
1082+
}
1083+
1084+
@Override
1085+
public Map<String, Object> getNamesAssociation() {
1086+
return Collections.unmodifiableMap(namesAssociation);
1087+
}
1088+
1089+
}
1090+
1091+
10671092
/**
10681093
* Create new new {@link Context} for rendering {@link Function functions}.
10691094
*

src/main/java/org/springframework/data/solr/core/QueryParsers.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@
1919
import java.util.LinkedHashMap;
2020
import java.util.List;
2121
import java.util.Map;
22-
2322
import org.apache.solr.client.solrj.SolrQuery;
2423
import org.springframework.data.mapping.context.MappingContext;
2524
import org.springframework.data.solr.core.mapping.SolrPersistentEntity;
2625
import org.springframework.data.solr.core.mapping.SolrPersistentProperty;
26+
import org.springframework.data.solr.core.query.DisMaxQuery;
2727
import org.springframework.data.solr.core.query.FacetQuery;
2828
import org.springframework.data.solr.core.query.HighlightQuery;
2929
import org.springframework.data.solr.core.query.Query;
@@ -35,6 +35,7 @@
3535

3636
/**
3737
* @author Christoph Strobl
38+
* @author Matthew Hall
3839
*/
3940
public class QueryParsers {
4041

@@ -60,6 +61,7 @@ public QueryParsers(
6061
parserPairs.add(new QueryParserPair(FacetQuery.class, defaultQueryParser));
6162
parserPairs.add(new QueryParserPair(HighlightQuery.class, defaultQueryParser));
6263
parserPairs.add(new QueryParserPair(Query.class, defaultQueryParser));
64+
parserPairs.add(new QueryParserPair(DisMaxQuery.class, defaultQueryParser));
6365
}
6466

6567
/**

src/main/java/org/springframework/data/solr/core/SolrOperations.java

+26-1
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@
1818
import java.time.Duration;
1919
import java.util.Collection;
2020
import java.util.Optional;
21-
2221
import org.apache.solr.client.solrj.SolrClient;
2322
import org.apache.solr.client.solrj.response.SolrPingResponse;
2423
import org.apache.solr.client.solrj.response.UpdateResponse;
2524
import org.apache.solr.common.SolrInputDocument;
2625
import org.springframework.data.domain.Page;
2726
import org.springframework.data.solr.core.convert.SolrConverter;
27+
import org.springframework.data.solr.core.query.DisMaxQuery;
2828
import org.springframework.data.solr.core.query.FacetAndHighlightQuery;
2929
import org.springframework.data.solr.core.query.FacetQuery;
3030
import org.springframework.data.solr.core.query.HighlightQuery;
@@ -37,6 +37,7 @@
3737
import org.springframework.data.solr.core.query.result.GroupPage;
3838
import org.springframework.data.solr.core.query.result.HighlightPage;
3939
import org.springframework.data.solr.core.query.result.ScoredPage;
40+
import org.springframework.data.solr.core.query.result.SolrResultPage;
4041
import org.springframework.data.solr.core.query.result.StatsPage;
4142
import org.springframework.data.solr.core.query.result.TermsPage;
4243
import org.springframework.data.solr.core.schema.SchemaOperations;
@@ -50,6 +51,7 @@
5051
* @author Francisco Spaeth
5152
* @author Shiradwade Sateesh Krishna
5253
* @author David Webb
54+
* @author Matthew Hall
5355
*/
5456
public interface SolrOperations {
5557

@@ -455,6 +457,29 @@ <T> FacetAndHighlightPage<T> queryForFacetAndHighlightPage(String collection, Fa
455457
*/
456458
<T> StatsPage<T> queryForStatsPage(String collection, Query query, Class<T> clazz, RequestMethod method);
457459

460+
/**
461+
* Execute the query against Solr and return result as {@link StatsPage}.
462+
*
463+
* @param collection must not be {@literal null}.
464+
* @param query must not be {@literal null}.
465+
* @param clazz must not be {@literal null}.
466+
* @return never {@literal null}.
467+
* @since 4.1
468+
*/
469+
<T> SolrResultPage<T> queryForDisMaxPage(String collection, DisMaxQuery query, Class<T> clazz);
470+
471+
/**
472+
* Execute the query against Solr and return result as {@link StatsPage}.
473+
*
474+
* @param collection must not be {@literal null}.
475+
* @param query must not be {@literal null}.
476+
* @param clazz must not be {@literal null}.
477+
* @param requestMethod must not be {@literal null}.
478+
* @return never {@literal null}.
479+
* @since 4.1
480+
*/
481+
public <T> SolrResultPage<T> queryForDisMaxPage(String collection, DisMaxQuery query, Class<T> clazz,
482+
@Nullable RequestMethod requestMethod);
458483
/**
459484
* Execute the query against Solr and return result as page.
460485
*

src/main/java/org/springframework/data/solr/core/SolrTemplate.java

+21-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import java.util.Optional;
2828
import java.util.Set;
2929
import java.util.stream.Collectors;
30-
3130
import org.apache.solr.client.solrj.SolrClient;
3231
import org.apache.solr.client.solrj.SolrQuery;
3332
import org.apache.solr.client.solrj.SolrRequest;
@@ -52,6 +51,7 @@
5251
import org.springframework.data.domain.Pageable;
5352
import org.springframework.data.mapping.context.MappingContext;
5453
import org.springframework.data.solr.UncategorizedSolrException;
54+
import org.springframework.data.solr.core.QueryParserBase.NamedObjectsDisMaxQuery;
5555
import org.springframework.data.solr.core.QueryParserBase.NamedObjectsFacetAndHighlightQuery;
5656
import org.springframework.data.solr.core.QueryParserBase.NamedObjectsFacetQuery;
5757
import org.springframework.data.solr.core.QueryParserBase.NamedObjectsHighlightQuery;
@@ -62,6 +62,7 @@
6262
import org.springframework.data.solr.core.mapping.SolrPersistentEntity;
6363
import org.springframework.data.solr.core.mapping.SolrPersistentProperty;
6464
import org.springframework.data.solr.core.query.AbstractQueryDecorator;
65+
import org.springframework.data.solr.core.query.DisMaxQuery;
6566
import org.springframework.data.solr.core.query.FacetAndHighlightQuery;
6667
import org.springframework.data.solr.core.query.FacetQuery;
6768
import org.springframework.data.solr.core.query.HighlightQuery;
@@ -91,6 +92,7 @@
9192
* @author Petar Tahchiev
9293
* @author Mark Paluch
9394
* @author Juan Manuel de Blas
95+
* @author Matthew Hall
9496
*/
9597
public class SolrTemplate implements SolrOperations, InitializingBean, ApplicationContextAware {
9698

@@ -431,6 +433,24 @@ public <T> FacetAndHighlightPage<T> queryForFacetAndHighlightPage(String collect
431433
return createSolrResultPage(query, clazz, response, objectsName);
432434
}
433435

436+
@Override
437+
public <T> SolrResultPage<T> queryForDisMaxPage(String collection, DisMaxQuery query, Class<T> clazz) {
438+
return queryForDisMaxPage(collection, query, clazz, null);
439+
}
440+
441+
@Override
442+
public <T> SolrResultPage<T> queryForDisMaxPage(String collection, DisMaxQuery query, Class<T> clazz,
443+
@Nullable RequestMethod requestMethod) {
444+
445+
QueryResponse response;
446+
NamedObjectsDisMaxQuery namedObjectsQuery = new NamedObjectsDisMaxQuery(query);
447+
response = querySolr(collection, namedObjectsQuery, clazz,
448+
requestMethod != null ? requestMethod : getDefaultRequestMethod());
449+
Map<String, Object> objectsName = namedObjectsQuery.getNamesAssociation();
450+
451+
return createSolrResultPage(query, clazz, response, objectsName);
452+
}
453+
434454
private <T> SolrResultPage<T> createSolrResultPage(Query query, Class<T> clazz, QueryResponse response,
435455
Map<String, Object> objectsName) {
436456

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package org.springframework.data.solr.core.query;
2+
3+
import org.springframework.lang.Nullable;
4+
5+
6+
/**
7+
* General purpose {@link DisMaxQuery} decorator.
8+
*
9+
* @author Matthew Hall
10+
* @since 4.1.0
11+
*/
12+
public abstract class AbstractDisMaxQueryDecorator extends AbstractQueryDecorator implements DisMaxQuery {
13+
14+
private DisMaxQuery query;
15+
16+
public AbstractDisMaxQueryDecorator(DisMaxQuery query) {
17+
super(query);
18+
this.query = query;
19+
}
20+
21+
@Nullable
22+
@Override
23+
public DisMaxOptions getDisMaxOptions() {
24+
return this.query.getDisMaxOptions();
25+
}
26+
27+
public <T extends SolrDataQuery> T setDisMaxOptions(DisMaxOptions disMaxOptions) {
28+
return this.query.setDisMaxOptions(disMaxOptions);
29+
}
30+
}

0 commit comments

Comments
 (0)