Skip to content

Commit

Permalink
HSEARCH-2242 Convert FacetManager implementation to no longer use Fil…
Browse files Browse the repository at this point in the history
…ters
  • Loading branch information
Sanne committed Apr 25, 2016
1 parent a419b74 commit d57da63
Show file tree
Hide file tree
Showing 6 changed files with 112 additions and 27 deletions.
Expand Up @@ -363,9 +363,8 @@ private JsonObject getEffectiveFilter(JsonArray typeFilters) {
filters.add( ToElasticsearch.condition( "should", typeFilters ) );

// facet filters
Filter facetFilter = getFacetManager().getFacetFilter();
if ( facetFilter != null ) {
filters.add( ToElasticsearch.fromLuceneFilter( getFacetManager().getFacetFilter() ) );
for ( Query query : getFacetManager().getFacetFilters().getFilterQueries() ) {
filters.add( ToElasticsearch.fromLuceneQuery( query ) );
}

// wrap filters into must if there is more than one
Expand Down
Expand Up @@ -6,16 +6,15 @@
*/
package org.hibernate.search.query.engine.impl;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;

import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.Filter;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.QueryWrapperFilter;
import org.hibernate.search.query.dsl.impl.FacetingRequestImpl;
import org.hibernate.search.query.engine.spi.FacetManager;
import org.hibernate.search.query.facet.Facet;
Expand Down Expand Up @@ -49,9 +48,9 @@ public class FacetManagerImpl implements FacetManager {
private Map<String, List<Facet>> facetResults;

/**
* The combined filter for all selected facets which needs to be applied on the current query
* The set of boolean clause filters for all selected facets which needs to be applied on the current query
*/
private Filter facetFilter;
private QueryFilters facetFilterset;

/**
* The query from which this manager was retrieved
Expand Down Expand Up @@ -128,26 +127,34 @@ public void setFacetResults(Map<String, List<Facet>> facetResults) {
}

void queryHasChanged() {
facetFilter = null;
facetFilterset = null;
this.facetResults = null;
query.clearCachedResults();
}

public Filter getFacetFilter() {
if ( facetFilter == null ) {
BooleanQuery.Builder boolQueryBuilder = new BooleanQuery.Builder();
for ( FacetSelectionImpl selection : facetSelection.values() ) {
if ( !selection.getFacetList().isEmpty() ) {
Query selectionGroupQuery = createSelectionGroupQuery( selection );
boolQueryBuilder.add( selectionGroupQuery, BooleanClause.Occur.MUST );
public QueryFilters getFacetFilters() {
if ( facetFilterset == null ) {
int size = facetSelection.values().size();
if ( size != 0 ) {
List<Query> filterQueries = new ArrayList<>( size );
for ( FacetSelectionImpl selection : facetSelection.values() ) {
if ( !selection.getFacetList().isEmpty() ) {
Query selectionGroupQuery = createSelectionGroupQuery( selection );
filterQueries.add( selectionGroupQuery );
}
}
if ( filterQueries.size() != 0 ) {
this.facetFilterset = new QueryFilters( filterQueries );
}
else {
facetFilterset = QueryFilters.EMPTY_FILTERSET;
}
}
BooleanQuery boolQuery = boolQueryBuilder.build();
if ( boolQuery.getClauses().length > 0 ) {
this.facetFilter = new QueryWrapperFilter( boolQuery );
else {
facetFilterset = QueryFilters.EMPTY_FILTERSET;
}
}
return facetFilter;
return facetFilterset;
}

private Query createSelectionGroupQuery(FacetSelectionImpl selection) {
Expand Down
Expand Up @@ -46,17 +46,20 @@ public final class LazyQueryState implements Closeable {
private final boolean fieldSortDoMaxScore;
private final ExtendedSearchIntegrator extendedIntegrator;
private final Set<Class<?>> targetedTypes;
private final QueryFilters facetingFilters;

private Query rewrittenQuery;

public LazyQueryState(Query userQuery,
QueryFilters facetingFilters,
IndexReader reader,
Similarity searcherSimilarity,
ExtendedSearchIntegrator extendedIntegrator,
Set<Class<?>> targetedTypes,
boolean fieldSortDoTrackScores,
boolean fieldSortDoMaxScore) {
this.userQuery = userQuery;
this.facetingFilters = facetingFilters;
this.fieldSortDoTrackScores = fieldSortDoTrackScores;
this.fieldSortDoMaxScore = fieldSortDoMaxScore;
this.searcher = new IndexSearcher( reader );
Expand Down Expand Up @@ -184,7 +187,9 @@ private void putInFieldTypeBucket(Set<String> stringEncodedFieldNames,

private Query rewrittenQuery() throws IOException {
if ( rewrittenQuery == null ) {
rewrittenQuery = userQuery.rewrite( searcher.getIndexReader() );
//Apply faceting filters:
final Query effectiveQuery = facetingFilters.filterOrPassthrough( userQuery );
rewrittenQuery = effectiveQuery.rewrite( searcher.getIndexReader() );
}
return rewrittenQuery;
}
Expand Down
Expand Up @@ -293,7 +293,7 @@ private QueryHits getQueryHits(LazyQueryState searcher, Integer n) throws IOExce
filter,
sort,
getTimeoutManager(),
facetManager.getFacetRequests(),
getFacetManager().getFacetRequests(),
this.timeoutExceptionFactory,
spatialSearchCenter,
spatialFieldName
Expand All @@ -319,7 +319,7 @@ else if ( 0 == n) {
sort,
n,
getTimeoutManager(),
facetManager.getFacetRequests(),
getFacetManager().getFacetRequests(),
this.timeoutExceptionFactory,
spatialSearchCenter,
spatialFieldName
Expand All @@ -331,7 +331,7 @@ else if ( 0 == n) {
extendedIntegrator.getStatisticsImplementor()
.searchExecuted( searcher.describeQuery(), System.nanoTime() - startTime );
}
facetManager.setFacetResults( queryHits.getFacets() );
getFacetManager().setFacetResults( queryHits.getFacets() );
return queryHits;
}

Expand Down Expand Up @@ -478,11 +478,14 @@ private LazyQueryState buildSearcher(ExtendedSearchIntegrator extendedIntegrator

final Query filteredQuery = filterQueryByTenantId( filterQueryByClasses( luceneQuery ) );

final QueryFilters facetingFilters = getFacetManager().getFacetFilters();

//handle the sort and projection
final String[] projection = this.projectedFields;
if ( Boolean.TRUE.equals( forceScoring ) ) {
return new LazyQueryState(
filteredQuery,
facetingFilters,
compoundReader,
searcherSimilarity,
extendedIntegrator,
Expand All @@ -494,6 +497,7 @@ private LazyQueryState buildSearcher(ExtendedSearchIntegrator extendedIntegrator
else if ( Boolean.FALSE.equals( forceScoring ) ) {
return new LazyQueryState(
filteredQuery,
facetingFilters,
compoundReader,
searcherSimilarity,
extendedIntegrator,
Expand All @@ -513,6 +517,7 @@ else if ( this.sort != null ) {
if ( activate ) {
return new LazyQueryState(
filteredQuery,
facetingFilters,
compoundReader,
searcherSimilarity,
extendedIntegrator,
Expand All @@ -526,6 +531,7 @@ else if ( this.sort != null ) {
//default
return new LazyQueryState(
filteredQuery,
facetingFilters,
compoundReader,
searcherSimilarity,
extendedIntegrator,
Expand Down Expand Up @@ -630,10 +636,6 @@ private void buildFilters() {
chainedFilter.addFilter( userFilter );
}

if ( getFacetManager().getFacetFilter() != null ) {
chainedFilter.addFilter( facetManager.getFacetFilter() );
}

if ( chainedFilter.isEmpty() ) {
filter = null;
}
Expand Down
@@ -0,0 +1,70 @@
/*
* Hibernate Search, full-text search for your domain model
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.search.query.engine.impl;

import java.util.Collections;
import java.util.List;

import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.BooleanClause.Occur;

/**
* Internal representation for a set of filters to be applied on a query.
*
* @author Sanne Grinovero
*/
public final class QueryFilters {

public static final QueryFilters EMPTY_FILTERSET = new QueryFilters();

private final List<Query> filterQueries;

private QueryFilters() {
filterQueries = Collections.emptyList();
}

public QueryFilters(List<Query> filterQueries) {
this.filterQueries = filterQueries;
}

/**
* Will wrap the passed Query into a BooleanQuery to apply all filters as boolean clauses.
* Returns the unmodified (same instance) of the input if there are no filters to be applied.
* @param filteredQuery
* @return
*/
public Query filterOrPassthrough(Query filteredQuery) {
if ( isEmpty() ) {
return filteredQuery;
}
else {
BooleanQuery.Builder boolQueryBuilder = new BooleanQuery.Builder();
boolQueryBuilder.add( filteredQuery, Occur.MUST );
for ( Query bc : filterQueries ) {
boolQueryBuilder.add( bc, BooleanClause.Occur.FILTER );
}
return boolQueryBuilder.build();
}
}

/**
* @return lists all Lucene query instances which should be applied as filters
*/
public List<Query> getFilterQueries() {
return filterQueries;
}

/**
* @return <tt>true</tt> if this contains to filters to be applied.
*/
public boolean isEmpty() {
return filterQueries.isEmpty();
}

}
Expand Up @@ -22,6 +22,7 @@
import org.hibernate.search.query.engine.QueryTimeoutException;
import org.hibernate.search.query.engine.impl.DocumentExtractorImpl;
import org.hibernate.search.query.engine.impl.LazyQueryState;
import org.hibernate.search.query.engine.impl.QueryFilters;
import org.hibernate.search.query.engine.impl.QueryHits;
import org.hibernate.search.query.engine.impl.TimeoutManagerImpl;
import org.hibernate.search.query.engine.spi.DocumentExtractor;
Expand Down Expand Up @@ -87,6 +88,7 @@ public void testProvidedId() throws Exception {
//follows an example of what Infinispan Query actually needs to resolve a search request:
LazyQueryState lowLevelSearcher = new LazyQueryState(
luceneQuery,
QueryFilters.EMPTY_FILTERSET,
indexReader,
defaultSimilarity,
extendedIntegrator,
Expand Down

0 comments on commit d57da63

Please sign in to comment.