[hibernate-commits] Hibernate SVN: r11700 - in trunk/HibernateExt/search/src: test/org/hibernate/search/test/worker and 1 other directory.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Fri Jun 22 15:39:47 EDT 2007


Author: epbernard
Date: 2007-06-22 15:39:47 -0400 (Fri, 22 Jun 2007)
New Revision: 11700

Added:
   trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/ConcurrencyTest.java
   trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/Drink.java
   trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/Food.java
Modified:
   trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessor.java
Log:
HSEARCH-88 rework the hasCode algorithm to handle multiple entities per index

Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessor.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessor.java	2007-06-22 02:59:19 UTC (rev 11699)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessor.java	2007-06-22 19:39:47 UTC (rev 11700)
@@ -10,6 +10,7 @@
 import org.hibernate.search.backend.Workspace;
 import org.hibernate.search.backend.OptimizeLuceneWork;
 import org.hibernate.search.engine.SearchFactoryImplementor;
+import org.hibernate.search.store.DirectoryProvider;
 
 /**
  * Apply the operations to Lucene directories
@@ -32,7 +33,7 @@
 		workspace = new Workspace( searchFactoryImplementor );
 		worker = new LuceneWorker( workspace );
 		try {
-			deadlockFreeQueue(queue, workspace);
+			deadlockFreeQueue(queue, workspace, searchFactoryImplementor);
 			for ( LuceneWork luceneWork : queue ) {
 				worker.performWork( luceneWork );
 			}
@@ -48,11 +49,11 @@
 	 * dead lock between concurrent threads or processes
 	 * To achieve that, the work will be done per directory provider
 	 */
-	private void deadlockFreeQueue(List<LuceneWork> queue, final Workspace workspace) {
+	private void deadlockFreeQueue(List<LuceneWork> queue, final Workspace workspace, final SearchFactoryImplementor searchFactoryImplementor) {
 		Collections.sort( queue, new Comparator<LuceneWork>() {
 			public int compare(LuceneWork o1, LuceneWork o2) {
-				long h1 = getWorkHashCode( o1, workspace );
-				long h2 = getWorkHashCode( o2, workspace );
+				long h1 = getWorkHashCode( o1, searchFactoryImplementor );
+				long h2 = getWorkHashCode( o2, searchFactoryImplementor );
 				return h1 < h2 ?
 						-1 :
 						h1 == h2 ?
@@ -62,10 +63,14 @@
 		} );
 	}
 
-	private long getWorkHashCode(LuceneWork luceneWork, Workspace workspace) {
-		long h = workspace.getDocumentBuilder( luceneWork.getEntityClass() ).hashCode() * 2;
-		if ( luceneWork instanceof AddLuceneWork ) h+=1; //addwork after deleteWork
-		if ( luceneWork instanceof OptimizeLuceneWork ) h+=2; //optimize after everything
-		return h;
+	private long getWorkHashCode(LuceneWork luceneWork, SearchFactoryImplementor searchFactoryImplementor) {
+		Class entity = luceneWork.getEntityClass();
+		DirectoryProvider provider = searchFactoryImplementor.getDirectoryProvider( entity );
+		int h = provider.getClass().hashCode();
+		h = 31 * h + provider.hashCode();
+		long extendedHash = h; //to be sure extendedHash + 1 < extendedHash + 2 is always true
+		if ( luceneWork instanceof AddLuceneWork ) extendedHash+=1; //addwork after deleteWork
+		if ( luceneWork instanceof OptimizeLuceneWork ) extendedHash+=2; //optimize after everything
+		return extendedHash;
 	}
 }

Added: trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/ConcurrencyTest.java
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/ConcurrencyTest.java	                        (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/ConcurrencyTest.java	2007-06-22 19:39:47 UTC (rev 11700)
@@ -0,0 +1,56 @@
+//$Id$
+package org.hibernate.search.test.worker;
+
+import org.hibernate.search.test.SearchTestCase;
+import org.hibernate.Session;
+import org.hibernate.annotations.common.AssertionFailure;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ConcurrencyTest extends SearchTestCase {
+
+	public void testMultipleEntitiesInSameIndex() throws Exception {
+		Session s = openSession( );
+		s.getTransaction().begin();
+		Drink d = new Drink();
+		d.setName( "Water" );
+		Food f = new Food();
+		f.setName( "Bread" );
+		s.persist( d );
+		s.persist( f );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession( );
+		s.getTransaction().begin();
+		d = (Drink) s.get( Drink.class, d.getId() );
+		d.setName( "Coke" );
+		f = (Food) s.get( Food.class, f.getId() );
+		f.setName( "Cake" );
+		try {
+			s.getTransaction().commit();
+		}
+		catch (Exception e) {
+			//Check for error logs from JDBCTransaction
+		}
+		s.close();
+
+		s = openSession( );
+		s.getTransaction().begin();
+		d = (Drink) s.get( Drink.class, d.getId() );
+		s.delete( d );
+		f = (Food) s.get( Food.class, f.getId() );
+		s.delete( f );
+		s.getTransaction().commit();
+		s.close();
+
+	}
+
+	protected Class[] getMappings() {
+		return new Class[] {
+				Drink.class,
+				Food.class
+		};
+	}
+}

Added: trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/Drink.java
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/Drink.java	                        (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/Drink.java	2007-06-22 19:39:47 UTC (rev 11700)
@@ -0,0 +1,43 @@
+//$Id$
+package org.hibernate.search.test.worker;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.annotations.DocumentId;
+import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.Index;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Indexed(index = "consumable")
+public class Drink {
+	@Id
+	@GeneratedValue
+	@DocumentId
+	private Integer id;
+
+	@Field(index = Index.TOKENIZED )
+	private String name;
+
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}

Added: trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/Food.java
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/Food.java	                        (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/Food.java	2007-06-22 19:39:47 UTC (rev 11700)
@@ -0,0 +1,43 @@
+//$Id$
+package org.hibernate.search.test.worker;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.annotations.DocumentId;
+import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.Index;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Indexed(index = "consumable")
+public class Food {
+	@Id
+	@GeneratedValue
+	@DocumentId
+	private Integer id;
+
+	@Field(index = Index.TOKENIZED )
+	private String name;
+
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}




More information about the hibernate-commits mailing list