[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