org.hibernate.search.query.dsl.impl.ConnectedQueryContextBuilder Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of hibernate-search-engine Show documentation
Show all versions of hibernate-search-engine Show documentation
Core of the Object/Lucene mapper, query engine and index management
/*
* 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 .
*/
package org.hibernate.search.query.dsl.impl;
import java.util.Set;
import org.hibernate.search.exception.SearchException;
import org.hibernate.search.engine.integration.impl.SearchFactoryImplementor;
import org.hibernate.search.query.dsl.EntityContext;
import org.hibernate.search.query.dsl.QueryBuilder;
import org.hibernate.search.query.dsl.QueryContextBuilder;
import org.hibernate.search.util.impl.ScopedAnalyzer;
/**
* Assuming connection with the search factory
*
* @author Emmanuel Bernard
*/
public class ConnectedQueryContextBuilder implements QueryContextBuilder {
private final SearchFactoryImplementor factory;
public ConnectedQueryContextBuilder(SearchFactoryImplementor factory) {
this.factory = factory;
}
@Override
public EntityContext forEntity(Class> entityType) {
return new HSearchEntityContext(entityType, factory );
}
public final class HSearchEntityContext implements EntityContext {
private final ScopedAnalyzer queryAnalyzer;
private final QueryBuildingContext context;
public HSearchEntityContext(Class> entityType, SearchFactoryImplementor factory) {
// get a type for meta-data retrieval; if the given type itself is not indexed, one indexed sub-type will
// be used; note that this allows to e.g. query for fields not present on the given type but on one of its
// sub-types, but we accept this for now
Class> indexBoundType = getIndexBoundType( entityType, factory );
if ( indexBoundType == null ) {
throw new SearchException( String.format( "Can't build query for type %s which is"
+ " neither indexed nor has any indexed sub-types.",
entityType.getCanonicalName() ) );
}
queryAnalyzer = new ScopedAnalyzer( factory.getAnalyzer( indexBoundType ) );
context = new QueryBuildingContext( factory, queryAnalyzer, indexBoundType );
}
/**
* Returns the given type itself if it is indexed, otherwise the first found indexed sub-type.
*
* @param entityType the type of interest
* @param factory search factory
* @return the given type itself if it is indexed, otherwise the first found indexed sub-type or {@code null} if
* neither the given type nor any of its sub-types are indexed
*/
private Class> getIndexBoundType(Class> entityType, SearchFactoryImplementor factory) {
if ( factory.getIndexBinding( entityType ) != null ) {
return entityType;
}
Set> indexedSubTypes = factory.getIndexedTypesPolymorphic( new Class>[] { entityType } );
if ( !indexedSubTypes.isEmpty() ) {
return indexedSubTypes.iterator().next();
}
return null;
}
@Override
public EntityContext overridesForField(String field, String analyzerName) {
queryAnalyzer.addScopedAnalyzer( field, factory.getAnalyzer( analyzerName ) );
return this;
}
@Override
public QueryBuilder get() {
return new ConnectedQueryBuilder(context);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy