[hibernate-commits] Hibernate SVN: r15362 - search/trunk/src/java/org/hibernate/search/backend/impl/lucene/works.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Tue Oct 21 12:20:59 EDT 2008


Author: sannegrinovero
Date: 2008-10-21 12:20:59 -0400 (Tue, 21 Oct 2008)
New Revision: 15362

Added:
   search/trunk/src/java/org/hibernate/search/backend/impl/lucene/works/DeleteExtWorkDelegate.java
Modified:
   search/trunk/src/java/org/hibernate/search/backend/impl/lucene/works/LuceneWorkVisitor.java
Log:
HSEARCH-225 resolved

Added: search/trunk/src/java/org/hibernate/search/backend/impl/lucene/works/DeleteExtWorkDelegate.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/backend/impl/lucene/works/DeleteExtWorkDelegate.java	                        (rev 0)
+++ search/trunk/src/java/org/hibernate/search/backend/impl/lucene/works/DeleteExtWorkDelegate.java	2008-10-21 16:20:59 UTC (rev 15362)
@@ -0,0 +1,84 @@
+package org.hibernate.search.backend.impl.lucene.works;
+
+import java.io.Serializable;
+
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexWriter;
+import org.apache.lucene.index.Term;
+import org.hibernate.annotations.common.AssertionFailure;
+import org.hibernate.search.SearchException;
+import org.hibernate.search.backend.LuceneWork;
+import org.hibernate.search.backend.Workspace;
+import org.hibernate.search.backend.impl.lucene.IndexInteractionType;
+import org.hibernate.search.engine.DocumentBuilder;
+import org.hibernate.search.util.LoggerFactory;
+import org.slf4j.Logger;
+
+/**
+ * Stateless extension of <code>DeleteLuceneWork</code>,
+ * performing the same LuceneWork in an optimal way in case
+ * the index is NOT shared across different entities
+ * (which is the default).
+ *
+ * @author Sanne Grinovero
+ * @see DeleteWorkDelegate
+ */
+public class DeleteExtWorkDelegate extends DeleteWorkDelegate {
+
+	private final Class managedType;
+	private final DocumentBuilder builder;
+	private final Logger log = LoggerFactory.make();
+
+	DeleteExtWorkDelegate(Workspace workspace) {
+		super( workspace );
+		if ( workspace.getEntitiesInDirectory().size() != 1 ) {
+			throw new AssertionFailure( "Can't use this delegate on shared indexes" );
+		}
+		managedType = workspace.getEntitiesInDirectory().iterator().next();
+		builder = workspace.getDocumentBuilder( managedType );
+	}
+
+	@Override
+	public IndexInteractionType getIndexInteractionType() {
+		// no particular reason to prefer Reader, just it's possibly more tested
+		// as using the writer is an option of latest Lucene version only (2.4).
+		return IndexInteractionType.PREFER_INDEXREADER;
+	}
+
+	@Override
+	public void performWork(LuceneWork work, IndexWriter writer) {
+		checkType( work );
+		Serializable id = work.getId();
+		log.trace( "Removing {}#{} by id using an IndexWriter.", managedType, id );
+		Term idTerm = builder.getTerm( id );
+		try {
+			writer.deleteDocuments( idTerm );
+		}
+		catch ( Exception e ) {
+			String message = "Unable to remove " + managedType + "#" + id + " from index.";
+			throw new SearchException( message, e );
+		}
+	}
+
+	@Override
+	public void performWork(LuceneWork work, IndexReader reader) {
+		checkType( work );
+		Serializable id = work.getId();
+		log.trace( "Removing {}#{} by id using an IndexReader.", managedType, id );
+		Term idTerm = builder.getTerm( id );
+		try {
+			reader.deleteDocuments( idTerm );
+		}
+		catch ( Exception e ) {
+			String message = "Unable to remove " + managedType + "#" + id + " from index.";
+			throw new SearchException( message, e );
+		}
+	}
+	
+	private void checkType(final LuceneWork work) {
+		if ( work.getEntityClass() != managedType ) {
+			throw new AssertionFailure( "Unexpected type" );
+		}
+	}
+
+}


Property changes on: search/trunk/src/java/org/hibernate/search/backend/impl/lucene/works/DeleteExtWorkDelegate.java
___________________________________________________________________
Name: svn:executable
   + *

Modified: search/trunk/src/java/org/hibernate/search/backend/impl/lucene/works/LuceneWorkVisitor.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/backend/impl/lucene/works/LuceneWorkVisitor.java	2008-10-21 16:18:08 UTC (rev 15361)
+++ search/trunk/src/java/org/hibernate/search/backend/impl/lucene/works/LuceneWorkVisitor.java	2008-10-21 16:20:59 UTC (rev 15362)
@@ -25,10 +25,15 @@
 	private final Workspace linkedWorkspace;
 
 	public LuceneWorkVisitor(Workspace workspace) {
+		if ( workspace.getEntitiesInDirectory().size() == 1 ) {
+			this.deleteDelegate = new DeleteExtWorkDelegate( workspace );
+		}
+		else {
+			this.deleteDelegate = new DeleteWorkDelegate( workspace );
+		}
+		this.purgeAllDelegate = new PurgeAllWorkDelegate();
 		this.addDelegate = new AddWorkDelegate( workspace );
-		this.deleteDelegate = new DeleteWorkDelegate( workspace );
 		this.optimizeDelegate = new OptimizeWorkDelegate( workspace );
-		this.purgeAllDelegate = new PurgeAllWorkDelegate();
 		this.linkedWorkspace = workspace;
 	}
 




More information about the hibernate-commits mailing list