[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