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

DATASOLR-153 - Added support for dismax queries. #113

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

<groupId>org.springframework.data</groupId>
<artifactId>spring-data-solr</artifactId>
<version>4.1.0.BUILD-SNAPSHOT</version>
<version>4.1.0.BUILD</version>

<name>Spring Data Solr</name>
<description>Spring Data module providing support for Apache Solr repositories.</description>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,14 @@
*/
package org.springframework.data.solr.core;

import static org.apache.solr.common.params.CommonParams.*;
import static org.apache.solr.common.params.DisMaxParams.*;
import static org.apache.solr.common.params.SimpleParams.QF;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map.Entry;

import org.apache.commons.lang3.StringUtils;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrQuery.ORDER;
Expand All @@ -36,7 +39,6 @@
import org.springframework.data.domain.Sort.Order;
import org.springframework.data.mapping.context.MappingContext;
import org.springframework.data.solr.core.query.*;
import org.springframework.data.solr.core.query.Criteria.Predicate;
import org.springframework.data.solr.core.query.FacetOptions.FacetParameter;
import org.springframework.data.solr.core.query.FacetOptions.FieldWithDateRangeParameters;
import org.springframework.data.solr.core.query.FacetOptions.FieldWithFacetParameters;
Expand Down Expand Up @@ -65,6 +67,7 @@
* @author Joachim Uhrlaß
* @author Petar Tahchiev
* @author Juan Manuel de Blas
* @author Matthew Hall
*/
public class DefaultQueryParser extends QueryParserBase<SolrDataQuery> {

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

if (query instanceof DisMaxQuery) {
processDisMaxOptions(solrQuery, (DisMaxQuery) query);
}

return solrQuery;
}

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

protected void processDisMaxOptions(SolrQuery solrQuery, DisMaxQuery disMaxQuery) {

if (disMaxQuery == null || disMaxQuery.getDisMaxOptions() == null) {
return;
}

DisMaxOptions disMaxOptions = disMaxQuery.getDisMaxOptions();

solrQuery.set("defType", "dismax");

setSolrParamIfPresent(solrQuery, DF, disMaxOptions.getDefaultField());

setSolrParamIfPresent(solrQuery, ALTQ, disMaxOptions.getAltQuery());
setSolrParamIfPresent(solrQuery, QF, disMaxOptions.getQueryFields());
setSolrParamIfPresent(solrQuery, MM, disMaxOptions.getMinimumMatch());

setSolrParamIfPresent(solrQuery, BQ, disMaxOptions.getBoostQuery());
setSolrParamIfPresent(solrQuery, BF, disMaxOptions.getBoostFunction());
setSolrParamIfPresent(solrQuery, PF, disMaxOptions.getPhraseFunction());

setSolrParamIfPresent(solrQuery, PS,
disMaxOptions.getPhraseSlop() == null ? null : String.valueOf(disMaxOptions.getPhraseSlop()));
setSolrParamIfPresent(solrQuery, QS,
disMaxOptions.getQuerySlop() == null ? null : String.valueOf(disMaxOptions.getQuerySlop()));
setSolrParamIfPresent(solrQuery, TIE,
disMaxOptions.getTie() == null ? null : String.valueOf(disMaxOptions.getTie()));
}

private static void setSolrParamIfPresent(SolrQuery solrQuery, String param, String value) {
if (!org.springframework.util.StringUtils.isEmpty(value)) {
solrQuery.setParam(param, value);
}
}

private void processFacetOptions(SolrQuery solrQuery, FacetQuery query, @Nullable Class<?> domainType) {

if (enableFaceting(solrQuery, query)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.apache.commons.lang3.StringUtils;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
Expand Down Expand Up @@ -62,6 +61,7 @@
* @author Radek Mensik
* @author David Webb
* @author Michael Rocke
* @author Matthew Hall
*/
public abstract class QueryParserBase<QUERYTPYE extends SolrDataQuery> implements QueryParser {

Expand Down Expand Up @@ -1064,6 +1064,31 @@ public Map<String, Object> getNamesAssociation() {
}
}

/**
* @author Matthew Hall
* @since 4.1
*/
static class NamedObjectsDisMaxQuery extends AbstractDisMaxQueryDecorator implements NamedObjects {

private Map<String, Object> namesAssociation = new HashMap<>();

public NamedObjectsDisMaxQuery(DisMaxQuery query) {
super(query);
}

@Override
public void setName(Object object, String name) {
setObjectName(namesAssociation, object, name);
}

@Override
public Map<String, Object> getNamesAssociation() {
return Collections.unmodifiableMap(namesAssociation);
}

}


/**
* Create new new {@link Context} for rendering {@link Function functions}.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,11 @@
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.apache.solr.client.solrj.SolrQuery;
import org.springframework.data.mapping.context.MappingContext;
import org.springframework.data.solr.core.mapping.SolrPersistentEntity;
import org.springframework.data.solr.core.mapping.SolrPersistentProperty;
import org.springframework.data.solr.core.query.DisMaxQuery;
import org.springframework.data.solr.core.query.FacetQuery;
import org.springframework.data.solr.core.query.HighlightQuery;
import org.springframework.data.solr.core.query.Query;
Expand All @@ -35,6 +35,7 @@

/**
* @author Christoph Strobl
* @author Matthew Hall
*/
public class QueryParsers {

Expand All @@ -60,6 +61,7 @@ public QueryParsers(
parserPairs.add(new QueryParserPair(FacetQuery.class, defaultQueryParser));
parserPairs.add(new QueryParserPair(HighlightQuery.class, defaultQueryParser));
parserPairs.add(new QueryParserPair(Query.class, defaultQueryParser));
parserPairs.add(new QueryParserPair(DisMaxQuery.class, defaultQueryParser));
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,13 @@
import java.time.Duration;
import java.util.Collection;
import java.util.Optional;

import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.response.SolrPingResponse;
import org.apache.solr.client.solrj.response.UpdateResponse;
import org.apache.solr.common.SolrInputDocument;
import org.springframework.data.domain.Page;
import org.springframework.data.solr.core.convert.SolrConverter;
import org.springframework.data.solr.core.query.DisMaxQuery;
import org.springframework.data.solr.core.query.FacetAndHighlightQuery;
import org.springframework.data.solr.core.query.FacetQuery;
import org.springframework.data.solr.core.query.HighlightQuery;
Expand All @@ -37,6 +37,7 @@
import org.springframework.data.solr.core.query.result.GroupPage;
import org.springframework.data.solr.core.query.result.HighlightPage;
import org.springframework.data.solr.core.query.result.ScoredPage;
import org.springframework.data.solr.core.query.result.SolrResultPage;
import org.springframework.data.solr.core.query.result.StatsPage;
import org.springframework.data.solr.core.query.result.TermsPage;
import org.springframework.data.solr.core.schema.SchemaOperations;
Expand All @@ -50,6 +51,7 @@
* @author Francisco Spaeth
* @author Shiradwade Sateesh Krishna
* @author David Webb
* @author Matthew Hall
*/
public interface SolrOperations {

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

/**
* Execute the query against Solr and return result as {@link StatsPage}.
*
* @param collection must not be {@literal null}.
* @param query must not be {@literal null}.
* @param clazz must not be {@literal null}.
* @return never {@literal null}.
* @since 4.1
*/
<T> SolrResultPage<T> queryForDisMaxPage(String collection, DisMaxQuery query, Class<T> clazz);

/**
* Execute the query against Solr and return result as {@link StatsPage}.
*
* @param collection must not be {@literal null}.
* @param query must not be {@literal null}.
* @param clazz must not be {@literal null}.
* @param requestMethod must not be {@literal null}.
* @return never {@literal null}.
* @since 4.1
*/
public <T> SolrResultPage<T> queryForDisMaxPage(String collection, DisMaxQuery query, Class<T> clazz,
@Nullable RequestMethod requestMethod);
/**
* Execute the query against Solr and return result as page.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;

import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrRequest;
Expand All @@ -52,6 +51,7 @@
import org.springframework.data.domain.Pageable;
import org.springframework.data.mapping.context.MappingContext;
import org.springframework.data.solr.UncategorizedSolrException;
import org.springframework.data.solr.core.QueryParserBase.NamedObjectsDisMaxQuery;
import org.springframework.data.solr.core.QueryParserBase.NamedObjectsFacetAndHighlightQuery;
import org.springframework.data.solr.core.QueryParserBase.NamedObjectsFacetQuery;
import org.springframework.data.solr.core.QueryParserBase.NamedObjectsHighlightQuery;
Expand All @@ -62,6 +62,7 @@
import org.springframework.data.solr.core.mapping.SolrPersistentEntity;
import org.springframework.data.solr.core.mapping.SolrPersistentProperty;
import org.springframework.data.solr.core.query.AbstractQueryDecorator;
import org.springframework.data.solr.core.query.DisMaxQuery;
import org.springframework.data.solr.core.query.FacetAndHighlightQuery;
import org.springframework.data.solr.core.query.FacetQuery;
import org.springframework.data.solr.core.query.HighlightQuery;
Expand Down Expand Up @@ -91,6 +92,7 @@
* @author Petar Tahchiev
* @author Mark Paluch
* @author Juan Manuel de Blas
* @author Matthew Hall
*/
public class SolrTemplate implements SolrOperations, InitializingBean, ApplicationContextAware {

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

@Override
public <T> SolrResultPage<T> queryForDisMaxPage(String collection, DisMaxQuery query, Class<T> clazz) {
return queryForDisMaxPage(collection, query, clazz, null);
}

@Override
public <T> SolrResultPage<T> queryForDisMaxPage(String collection, DisMaxQuery query, Class<T> clazz,
@Nullable RequestMethod requestMethod) {

QueryResponse response;
NamedObjectsDisMaxQuery namedObjectsQuery = new NamedObjectsDisMaxQuery(query);
response = querySolr(collection, namedObjectsQuery, clazz,
requestMethod != null ? requestMethod : getDefaultRequestMethod());
Map<String, Object> objectsName = namedObjectsQuery.getNamesAssociation();

return createSolrResultPage(query, clazz, response, objectsName);
}

private <T> SolrResultPage<T> createSolrResultPage(Query query, Class<T> clazz, QueryResponse response,
Map<String, Object> objectsName) {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package org.springframework.data.solr.core.query;

import org.springframework.lang.Nullable;


/**
* General purpose {@link DisMaxQuery} decorator.
*
* @author Matthew Hall
* @since 4.1.0
*/
public abstract class AbstractDisMaxQueryDecorator extends AbstractQueryDecorator implements DisMaxQuery {

private DisMaxQuery query;

public AbstractDisMaxQueryDecorator(DisMaxQuery query) {
super(query);
this.query = query;
}

@Nullable
@Override
public DisMaxOptions getDisMaxOptions() {
return this.query.getDisMaxOptions();
}

public <T extends SolrDataQuery> T setDisMaxOptions(DisMaxOptions disMaxOptions) {
return this.query.setDisMaxOptions(disMaxOptions);
}
}
Loading