/*
* 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.dsl.impl;
import java.util.List;
import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.search.Query;
import org.hibernate.search.analyzer.impl.LuceneAnalyzerReference;
import org.hibernate.search.analyzer.impl.RemoteAnalyzerReference;
import org.hibernate.search.query.dsl.SimpleQueryStringTermination;
import org.hibernate.search.util.StringHelper;
import org.hibernate.search.util.logging.impl.Log;
import org.hibernate.search.util.logging.impl.LoggerFactory;
/**
* @author Guillaume Smet
*/
public class ConnectedMultiFieldsSimpleQueryStringQueryBuilder implements SimpleQueryStringTermination {
private static final Log LOG = LoggerFactory.make();
private final String simpleQueryString;
private final QueryCustomizer queryCustomizer;
private final List<FieldsContext> fieldsContexts;
private final QueryBuildingContext queryContext;
private final boolean withAndAsDefaultOperator;
public ConnectedMultiFieldsSimpleQueryStringQueryBuilder(String simpleQueryString,
List<FieldsContext> fieldsContexts,
boolean withAndAsDefaultOperator,
QueryCustomizer queryCustomizer,
QueryBuildingContext queryContext) {
this.simpleQueryString = simpleQueryString;
this.queryContext = queryContext;
this.queryCustomizer = queryCustomizer;
this.fieldsContexts = fieldsContexts;
this.withAndAsDefaultOperator = withAndAsDefaultOperator;
}
@Override
public Query createQuery() {
if ( StringHelper.isEmpty( simpleQueryString ) ) {
throw LOG.simpleQueryParserDoesNotSupportEmptyQueries();
}
Query query;
if ( queryContext.getQueryAnalyzerReference().is( RemoteAnalyzerReference.class ) ) {
RemoteSimpleQueryStringQuery.Builder builder = new RemoteSimpleQueryStringQuery.Builder()
.query( simpleQueryString )
.withAndAsDefaultOperator( withAndAsDefaultOperator )
.originalRemoteAnalyzerReference( queryContext.getOriginalAnalyzerReference().unwrap( RemoteAnalyzerReference.class ) )
.queryRemoteAnalyzerReference( queryContext.getQueryAnalyzerReference().unwrap( RemoteAnalyzerReference.class ) );
fieldsContexts.forEach( fieldsContext -> {
fieldsContext.forEach( fieldContext -> {
builder.field( fieldContext.getField(), fieldContext.getFieldCustomizer().getBoost() );
} );
} );
query = builder.build();
}
else {
ConnectedSimpleQueryParser queryParser = new ConnectedSimpleQueryParser(
queryContext.getQueryAnalyzerReference().unwrap( LuceneAnalyzerReference.class ).getAnalyzer(), fieldsContexts );
queryParser.setDefaultOperator( withAndAsDefaultOperator ? Occur.MUST : Occur.SHOULD );
query = queryParser.parse( simpleQueryString );
if ( query == null ) {
throw LOG.unableToBuildLuceneQueryFromQueryString( simpleQueryString );
}
}
return queryCustomizer.setWrappedQuery( query ).createQuery();
}
}