[hibernate-commits] Hibernate SVN: r20821 - in search/trunk/hibernate-search/src/main/java/org/hibernate/search: query and 1 other directory.
hibernate-commits at lists.jboss.org
hibernate-commits at lists.jboss.org
Wed Oct 13 07:26:14 EDT 2010
Author: epbernard
Date: 2010-10-13 07:26:14 -0400 (Wed, 13 Oct 2010)
New Revision: 20821
Added:
search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/ObjectLoaderBuilder.java
Modified:
search/trunk/hibernate-search/src/main/java/org/hibernate/search/engine/ProjectionLoader.java
search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/FullTextQueryImpl.java
Log:
HSEARCH-546 Support THIS Projection and fetching definition
Extract object loader strategy in a dedicated class
Make use of this loader strategy in ProjectionLoader
Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/engine/ProjectionLoader.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/engine/ProjectionLoader.java 2010-10-13 11:25:36 UTC (rev 20820)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/engine/ProjectionLoader.java 2010-10-13 11:26:14 UTC (rev 20821)
@@ -28,6 +28,8 @@
import java.util.Set;
import org.hibernate.Session;
+import org.hibernate.annotations.common.AssertionFailure;
+import org.hibernate.search.query.ObjectLoaderBuilder;
import org.hibernate.transform.ResultTransformer;
/**
@@ -40,21 +42,23 @@
public class ProjectionLoader implements Loader {
private SearchFactoryImplementor searchFactoryImplementor;
private Session session;
- private MultiClassesQueryLoader objectLoader;
+ private Loader objectLoader;
private Boolean projectThis;
private ResultTransformer transformer;
private String[] aliases;
private Set<Class<?>> entityTypes;
+ private ObjectLoaderBuilder loaderBuilder;
public void init(Session session, SearchFactoryImplementor searchFactoryImplementor) {
this.session = session;
this.searchFactoryImplementor = searchFactoryImplementor;
}
- public void init(Session session, SearchFactoryImplementor searchFactoryImplementor, ResultTransformer transformer, String[] aliases) {
+ public void init(Session session, SearchFactoryImplementor searchFactoryImplementor, ResultTransformer transformer, ObjectLoaderBuilder loaderBuilder, String[] aliases) {
init( session, searchFactoryImplementor );
this.transformer = transformer;
this.aliases = aliases;
+ this.loaderBuilder = loaderBuilder;
}
public void setEntityTypes(Set<Class<?>> entityTypes) {
@@ -84,10 +88,7 @@
if ( projectThis == null ) {
projectThis = entityInfo.indexesOfThis.size() != 0;
if ( projectThis ) {
- MultiClassesQueryLoader loader = new MultiClassesQueryLoader();
- loader.init( session, searchFactoryImplementor );
- loader.setEntityTypes( entityTypes );
- objectLoader = loader;
+ objectLoader = loaderBuilder.buildLoader();
}
}
}
@@ -105,7 +106,7 @@
for ( int index : entityInfo.indexesOfThis ) {
// set one by one to avoid loosing null objects (skipped in the objectLoader.load( EntityInfo[] ))
// use objectLoader.executeLoad to prevent measuring load time again (see AbstractLoader)
- entityInfo.projection[index] = objectLoader.executeLoad( entityInfo );
+ entityInfo.projection[index] = objectLoader.loadWithoutTiming( entityInfo );
}
}
}
Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/FullTextQueryImpl.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/FullTextQueryImpl.java 2010-10-13 11:25:36 UTC (rev 20820)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/FullTextQueryImpl.java 2010-10-13 11:26:14 UTC (rev 20821)
@@ -215,65 +215,23 @@
* @return The loader instance to use to load the results of the query.
*/
private Loader getLoader() {
- Loader loader;
+ ObjectLoaderBuilder loaderBuilder = new ObjectLoaderBuilder()
+ .criteria(criteria)
+ .targetedEntities(targetedEntities)
+ .indexedTargetedEntities(indexedTargetedEntities)
+ .session(session)
+ .searchFactory(searchFactoryImplementor);
if ( indexProjection != null ) {
- loader = getProjectionLoader();
+ return getProjectionLoader( loaderBuilder );
}
- else if ( criteria != null ) {
- loader = getCriteriaLoader();
- }
- else if ( targetedEntities.size() == 1 ) {
- loader = getSingleEntityLoader();
- }
else {
- loader = getMultipleEntitiesLoader();
+ return loaderBuilder.buildLoader();
}
- return loader;
}
- private Loader getMultipleEntitiesLoader() {
- final MultiClassesQueryLoader multiClassesLoader = new MultiClassesQueryLoader();
- multiClassesLoader.init( ( Session ) session, searchFactoryImplementor );
- multiClassesLoader.setEntityTypes( indexedTargetedEntities );
- return multiClassesLoader;
- }
-
- private Loader getSingleEntityLoader() {
- final QueryLoader queryLoader = new QueryLoader();
- queryLoader.init( ( Session ) session, searchFactoryImplementor );
- queryLoader.setEntityType( targetedEntities.iterator().next() );
- return queryLoader;
- }
-
- private Loader getCriteriaLoader() {
- if ( targetedEntities.size() > 1 ) {
- throw new SearchException( "Cannot mix criteria and multiple entity types" );
- }
- Class entityType = targetedEntities.size() == 0 ? null : targetedEntities.iterator().next();
- if ( criteria instanceof CriteriaImpl ) {
- String targetEntity = ( ( CriteriaImpl ) criteria ).getEntityOrClassName();
- if ( entityType != null && !entityType.getName().equals( targetEntity ) ) {
- throw new SearchException( "Criteria query entity should match query entity" );
- }
- else {
- try {
- entityType = ReflectHelper.classForName( targetEntity );
- }
- catch ( ClassNotFoundException e ) {
- throw new SearchException( "Unable to load entity class from criteria: " + targetEntity, e );
- }
- }
- }
- QueryLoader queryLoader = new QueryLoader();
- queryLoader.init( ( Session ) session, searchFactoryImplementor );
- queryLoader.setEntityType( entityType );
- queryLoader.setCriteria( criteria );
- return queryLoader;
- }
-
- private Loader getProjectionLoader() {
+ private Loader getProjectionLoader(ObjectLoaderBuilder loaderBuilder) {
ProjectionLoader loader = new ProjectionLoader();
- loader.init( ( Session ) session, searchFactoryImplementor, resultTransformer, indexProjection );
+ loader.init( ( Session ) session, searchFactoryImplementor, resultTransformer, loaderBuilder, indexProjection );
loader.setEntityTypes( indexedTargetedEntities );
return loader;
}
Added: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/ObjectLoaderBuilder.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/ObjectLoaderBuilder.java (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/ObjectLoaderBuilder.java 2010-10-13 11:26:14 UTC (rev 20821)
@@ -0,0 +1,103 @@
+package org.hibernate.search.query;
+
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.annotations.common.util.ReflectHelper;
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.impl.CriteriaImpl;
+import org.hibernate.search.SearchException;
+import org.hibernate.search.engine.Loader;
+import org.hibernate.search.engine.MultiClassesQueryLoader;
+import org.hibernate.search.engine.QueryLoader;
+import org.hibernate.search.engine.SearchFactoryImplementor;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ObjectLoaderBuilder {
+ private Criteria criteria;
+ private List<Class<?>> targetedEntities;
+ private SessionImplementor session;
+ private SearchFactoryImplementor searchFactoryImplementor;
+ private Set<Class<?>> indexedTargetedEntities;
+
+ public ObjectLoaderBuilder criteria(Criteria criteria) {
+ this.criteria = criteria;
+ return this;
+ }
+
+ public ObjectLoaderBuilder targetedEntities(List<Class<?>> targetedEntities) {
+ this.targetedEntities = targetedEntities;
+ return this;
+ }
+
+ public Loader buildLoader() {
+ if ( criteria != null ) {
+ return getCriteriaLoader();
+ }
+ else if ( targetedEntities.size() == 1 ) {
+ return getSingleEntityLoader();
+ }
+ else {
+ return getMultipleEntitiesLoader();
+ }
+ }
+
+ private Loader getMultipleEntitiesLoader() {
+ final MultiClassesQueryLoader multiClassesLoader = new MultiClassesQueryLoader();
+ multiClassesLoader.init( (Session) session, searchFactoryImplementor );
+ multiClassesLoader.setEntityTypes( indexedTargetedEntities );
+ return multiClassesLoader;
+ }
+
+ private Loader getSingleEntityLoader() {
+ final QueryLoader queryLoader = new QueryLoader();
+ queryLoader.init( ( Session ) session, searchFactoryImplementor );
+ queryLoader.setEntityType( targetedEntities.iterator().next() );
+ return queryLoader;
+ }
+
+ private Loader getCriteriaLoader() {
+ if ( targetedEntities.size() > 1 ) {
+ throw new SearchException( "Cannot mix criteria and multiple entity types" );
+ }
+ Class entityType = targetedEntities.size() == 0 ? null : targetedEntities.iterator().next();
+ if ( criteria instanceof CriteriaImpl) {
+ String targetEntity = ( ( CriteriaImpl ) criteria ).getEntityOrClassName();
+ if ( entityType != null && !entityType.getName().equals( targetEntity ) ) {
+ throw new SearchException( "Criteria query entity should match query entity" );
+ }
+ else {
+ try {
+ entityType = ReflectHelper.classForName( targetEntity );
+ }
+ catch ( ClassNotFoundException e ) {
+ throw new SearchException( "Unable to load entity class from criteria: " + targetEntity, e );
+ }
+ }
+ }
+ QueryLoader queryLoader = new QueryLoader();
+ queryLoader.init( ( Session ) session, searchFactoryImplementor );
+ queryLoader.setEntityType( entityType );
+ queryLoader.setCriteria( criteria );
+ return queryLoader;
+ }
+
+ public ObjectLoaderBuilder session(SessionImplementor session) {
+ this.session = session;
+ return this;
+ }
+
+ public ObjectLoaderBuilder searchFactory(SearchFactoryImplementor searchFactoryImplementor) {
+ this.searchFactoryImplementor = searchFactoryImplementor;
+ return this;
+ }
+
+ public ObjectLoaderBuilder indexedTargetedEntities(Set<Class<?>> indexedTargetedEntities) {
+ this.indexedTargetedEntities = indexedTargetedEntities;
+ return this;
+ }
+}
More information about the hibernate-commits
mailing list