[hibernate-commits] Hibernate SVN: r11634 - in trunk/HibernateExt/search/src: java/org/hibernate/search/backend and 3 other directories.
hibernate-commits at lists.jboss.org
hibernate-commits at lists.jboss.org
Tue Jun 5 19:12:44 EDT 2007
Author: epbernard
Date: 2007-06-05 19:12:44 -0400 (Tue, 05 Jun 2007)
New Revision: 11634
Modified:
trunk/HibernateExt/search/src/java/org/hibernate/search/Environment.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/WorkQueue.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/BatchedQueueingProcessor.java
trunk/HibernateExt/search/src/java/org/hibernate/search/impl/FullTextSessionImpl.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/session/MassIndexTest.java
Log:
HSEARCH-33 Support hibernate.search.worker.batch_size for massive indexation
Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/Environment.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/Environment.java 2007-06-05 20:58:24 UTC (rev 11633)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/Environment.java 2007-06-05 23:12:44 UTC (rev 11634)
@@ -25,6 +25,11 @@
public static final String WORKER_EXECUTION = WORKER_PREFIX + "execution";
/**
+ * Defines the maximum number of indexing operation batched per transaction
+ */
+ public static final String WORKER_BATCHSIZE = WORKER_PREFIX + "batch_size";
+
+ /**
* only used then execution is async
* Thread pool size
* default 1
Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/WorkQueue.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/WorkQueue.java 2007-06-05 20:58:24 UTC (rev 11633)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/WorkQueue.java 2007-06-05 23:12:44 UTC (rev 11634)
@@ -19,6 +19,10 @@
queue = new ArrayList<Work>(size);
}
+ private WorkQueue(List<Work> queue) {
+ this.queue = queue;
+ }
+
public WorkQueue() {
this(10);
}
@@ -33,7 +37,13 @@
return queue;
}
+ public WorkQueue splitQueue() {
+ WorkQueue subQueue = new WorkQueue( queue );
+ this.queue = new ArrayList<Work>( queue.size() );
+ return subQueue;
+ }
+
public List<LuceneWork> getSealedQueue() {
if (sealedQueue == null) throw new AssertionFailure("Access a Sealed WorkQueue whcih has not been sealed");
return sealedQueue;
@@ -49,4 +59,8 @@
queue.clear();
if (sealedQueue != null) sealedQueue.clear();
}
+
+ public int size() {
+ return queue.size();
+ }
}
Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/BatchedQueueingProcessor.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/BatchedQueueingProcessor.java 2007-06-05 20:58:24 UTC (rev 11633)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/BatchedQueueingProcessor.java 2007-06-05 23:12:44 UTC (rev 11634)
@@ -34,6 +34,7 @@
*/
public class BatchedQueueingProcessor implements QueueingProcessor {
private boolean sync;
+ private int batchSize;
private ExecutorService executorService;
private BackendQueueProcessorFactory backendQueueProcessorFactory;
private SearchFactoryImplementor searchFactoryImplementor;
@@ -52,6 +53,9 @@
int queueSize = Integer.parseInt(
properties.getProperty( Environment.WORKER_WORKQUEUE_SIZE, Integer.toString( Integer.MAX_VALUE ) ).trim()
);
+ batchSize = Integer.parseInt(
+ properties.getProperty( Environment.WORKER_BATCHSIZE, "0" ).trim()
+ );
if ( !sync ) {
/**
* choose min = max with a sizable queue to be able to
@@ -96,6 +100,11 @@
//don't check for builder it's done in performWorks
Work work = new Work(entity, id, workType);
workQueue.add( work );
+ if ( batchSize > 0 && workQueue.size() >= batchSize ) {
+ WorkQueue subQueue = workQueue.splitQueue();
+ prepareWorks( subQueue );
+ performWorks( subQueue );
+ }
}
Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/impl/FullTextSessionImpl.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/impl/FullTextSessionImpl.java 2007-06-05 20:58:24 UTC (rev 11633)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/impl/FullTextSessionImpl.java 2007-06-05 23:12:44 UTC (rev 11634)
@@ -89,7 +89,7 @@
if (entity == null) return;
Class clazz = Hibernate.getClass( entity );
//TODO cache that at the FTSession level
- SearchFactoryImplementor searchFactoryImplementor = ContextHelper.getSearchFactory( session );
+ SearchFactoryImplementor searchFactoryImplementor = getSearchFactoryImplementor();
//not strictly necessary but a small optimization
DocumentBuilder<Object> builder = searchFactoryImplementor.getDocumentBuilders().get( clazz );
if ( builder != null ) {
@@ -112,6 +112,13 @@
return searchFactory;
}
+ private SearchFactoryImplementor getSearchFactoryImplementor() {
+ if (searchFactory == null) {
+ searchFactory = ContextHelper.getSearchFactory( session );
+ }
+ return searchFactory;
+ }
+
public Query createSQLQuery(String sql, String returnAlias, Class returnClass) {
return session.createSQLQuery( sql, returnAlias, returnClass );
}
Modified: trunk/HibernateExt/search/src/test/org/hibernate/search/test/session/MassIndexTest.java
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/session/MassIndexTest.java 2007-06-05 20:58:24 UTC (rev 11633)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/session/MassIndexTest.java 2007-06-05 23:12:44 UTC (rev 11634)
@@ -3,14 +3,19 @@
import java.util.List;
import java.sql.ResultSet;
+import java.io.File;
import org.hibernate.search.test.SearchTestCase;
import org.hibernate.search.impl.FullTextSessionImpl;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;
+import org.hibernate.search.Environment;
+import org.hibernate.search.store.FSDirectoryProvider;
import org.hibernate.search.util.ContextHelper;
import org.hibernate.Transaction;
import org.hibernate.Session;
+import org.hibernate.ScrollMode;
+import org.hibernate.ScrollableResults;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.analysis.StopAnalyzer;
import org.apache.lucene.store.Directory;
@@ -26,6 +31,40 @@
*/
public class MassIndexTest extends SearchTestCase {
+ public void testBatchSize() throws Exception {
+ FullTextSession s = Search.createFullTextSession( openSession() );
+ Transaction tx = s.beginTransaction();
+ int loop = 14;
+ for (int i = 0 ; i < loop; i++) {
+ s.connection().createStatement().executeUpdate( "insert into Email(id, title, body, header) values( + "
+ + (i+1) + ", 'Bob Sponge', 'Meet the guys who create the software', 'nope')");
+ }
+ tx.commit();
+ s.close();
+
+ //check non created object does get found!!1
+ s = new FullTextSessionImpl( openSession() );
+ tx = s.beginTransaction();
+ ScrollableResults results = s.createCriteria( Email.class ).scroll( ScrollMode.FORWARD_ONLY );
+ int index = 0;
+ while( results.next() ) {
+ index++;
+ s.index( results.get(0) );
+ if (index % 5 == 0) s.clear();
+ }
+ tx.commit();
+ s.clear();
+ tx = s.beginTransaction();
+ QueryParser parser = new QueryParser("id", new StopAnalyzer() );
+ List result = s.createFullTextQuery( parser.parse( "body:create" ) ).list();
+ assertEquals( 14, result.size() );
+ for (Object object : result) {
+ s.delete( object );
+ }
+ tx.commit();
+ s.close();
+ }
+
public void testTransactional() throws Exception {
FullTextSession s = Search.createFullTextSession( openSession() );
Transaction tx = s.beginTransaction();
@@ -127,6 +166,12 @@
s.close();
}
+ protected void configure(org.hibernate.cfg.Configuration cfg) {
+ super.configure( cfg );
+ cfg.setProperty( "hibernate.search.worker.batch_size", "5" );
+ cfg.setProperty( Environment.ANALYZER_CLASS, StopAnalyzer.class.getName() );
+ }
+
protected Class[] getMappings() {
return new Class[] {
Email.class,
More information about the hibernate-commits
mailing list