[hibernate-commits] Hibernate SVN: r14332 - in search/trunk/src: java/org/hibernate/search/reader and 1 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Tue Feb 12 23:27:52 EST 2008


Author: epbernard
Date: 2008-02-12 23:27:52 -0500 (Tue, 12 Feb 2008)
New Revision: 14332

Added:
   search/trunk/src/java/org/hibernate/search/reader/CacheableMultiReader.java
   search/trunk/src/test/org/hibernate/search/test/filter/ExcludeAllFilter.java
   search/trunk/src/test/org/hibernate/search/test/filter/ExcludeAllFilterFactory.java
Removed:
   search/trunk/src/java/org/hibernate/search/lucene/
Modified:
   search/trunk/src/java/org/hibernate/search/reader/ReaderProviderHelper.java
   search/trunk/src/java/org/hibernate/search/reader/SharedReaderProvider.java
   search/trunk/src/test/org/hibernate/search/test/filter/Driver.java
   search/trunk/src/test/org/hibernate/search/test/filter/FilterTest.java
Log:
HSEARCH-136 use an IndexReader that plays well with CachingWrapperFilter

Added: search/trunk/src/java/org/hibernate/search/reader/CacheableMultiReader.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/reader/CacheableMultiReader.java	                        (rev 0)
+++ search/trunk/src/java/org/hibernate/search/reader/CacheableMultiReader.java	2008-02-13 04:27:52 UTC (rev 14332)
@@ -0,0 +1,44 @@
+//$
+package org.hibernate.search.reader;
+
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.MultiReader;
+
+/**
+ * MultiReader ensuring equals returns true if the underlying readers are the same (and in the same order)
+ * Especially useful when using {@link org.apache.lucene.search.CachingWrapperFilter}
+ *
+ * @author Emmanuel Bernard
+ */
+public class CacheableMultiReader extends MultiReader {
+
+	public CacheableMultiReader(IndexReader[] subReaders) {
+		super( subReaders );
+	}
+
+	public CacheableMultiReader(IndexReader[] subReaders, boolean closeSubReaders) {
+		super( subReaders, closeSubReaders );
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if ( this == obj ) return true;
+		if ( ! ( obj instanceof CacheableMultiReader ) ) return false;
+		CacheableMultiReader that = ( CacheableMultiReader ) obj;
+		int length = this.subReaders.length;
+		if ( length != that.subReaders.length ) return false;
+		for (int index = 0 ; index < length ; index++) {
+			if ( ! this.subReaders[index].equals( that.subReaders[index] ) ) return false;
+		}
+		return true;
+	}
+
+	@Override
+	public int hashCode() {
+		int result = 0;
+		for (Object reader : this.subReaders) {
+			result = 31*result + reader.hashCode();
+		}
+		return result;
+	}
+}

Modified: search/trunk/src/java/org/hibernate/search/reader/ReaderProviderHelper.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/reader/ReaderProviderHelper.java	2008-02-12 17:02:10 UTC (rev 14331)
+++ search/trunk/src/java/org/hibernate/search/reader/ReaderProviderHelper.java	2008-02-13 04:27:52 UTC (rev 14332)
@@ -19,7 +19,7 @@
 			//everything should be the same so wrap in an MultiReader
 			//return readers[0];
 			try {
-				return new MultiReader( readers );
+				return new CacheableMultiReader( readers );
 			}
 			catch (Exception e) {
 				//Lucene 2.2 used to through IOExceptions here
@@ -29,7 +29,7 @@
 		}
 		else {
 			try {
-				return new MultiReader( readers );
+				return new CacheableMultiReader( readers );
 			}
 			catch (Exception e) {
 				//Lucene 2.2 used to through IOExceptions here

Modified: search/trunk/src/java/org/hibernate/search/reader/SharedReaderProvider.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/reader/SharedReaderProvider.java	2008-02-12 17:02:10 UTC (rev 14331)
+++ search/trunk/src/java/org/hibernate/search/reader/SharedReaderProvider.java	2008-02-13 04:27:52 UTC (rev 14332)
@@ -206,6 +206,7 @@
 		boolean trace = log.isTraceEnabled();
 		if ( reader == null ) return;
 		IndexReader[] readers;
+		//TODO should it be CacheableMultiReader? Probably no
 		if ( reader instanceof MultiReader ) {
 			try {
 				readers = (IndexReader[]) subReadersField.get( reader );

Modified: search/trunk/src/test/org/hibernate/search/test/filter/Driver.java
===================================================================
--- search/trunk/src/test/org/hibernate/search/test/filter/Driver.java	2008-02-12 17:02:10 UTC (rev 14331)
+++ search/trunk/src/test/org/hibernate/search/test/filter/Driver.java	2008-02-13 04:27:52 UTC (rev 14332)
@@ -21,7 +21,8 @@
 @Indexed
 @FullTextFilterDefs( {
 		@FullTextFilterDef(name = "bestDriver", impl = BestDriversFilter.class), //actual Filter implementation
-		@FullTextFilterDef(name = "security", impl = SecurityFilterFactory.class) //Filter factory with parameters
+		@FullTextFilterDef(name = "security", impl = SecurityFilterFactory.class), //Filter factory with parameters
+		@FullTextFilterDef(name = "cachetest", impl = ExcludeAllFilterFactory.class, cache = true) //Filter factory with parameters
 })
 public class Driver {
 	@Id

Added: search/trunk/src/test/org/hibernate/search/test/filter/ExcludeAllFilter.java
===================================================================
--- search/trunk/src/test/org/hibernate/search/test/filter/ExcludeAllFilter.java	                        (rev 0)
+++ search/trunk/src/test/org/hibernate/search/test/filter/ExcludeAllFilter.java	2008-02-13 04:27:52 UTC (rev 14332)
@@ -0,0 +1,22 @@
+//$
+package org.hibernate.search.test.filter;
+
+import java.util.BitSet;
+import java.io.IOException;
+
+import org.apache.lucene.search.Filter;
+import org.apache.lucene.index.IndexReader;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ExcludeAllFilter extends Filter {
+	private static boolean done = false;
+
+	public BitSet bits(IndexReader reader) throws IOException {
+		if (done) throw new IllegalStateException("Called twice");
+		BitSet bitSet = new BitSet( reader.maxDoc() );
+		done = true;
+		return bitSet;
+	}
+}

Added: search/trunk/src/test/org/hibernate/search/test/filter/ExcludeAllFilterFactory.java
===================================================================
--- search/trunk/src/test/org/hibernate/search/test/filter/ExcludeAllFilterFactory.java	                        (rev 0)
+++ search/trunk/src/test/org/hibernate/search/test/filter/ExcludeAllFilterFactory.java	2008-02-13 04:27:52 UTC (rev 14332)
@@ -0,0 +1,16 @@
+//$
+package org.hibernate.search.test.filter;
+
+import org.apache.lucene.search.CachingWrapperFilter;
+import org.apache.lucene.search.Filter;
+import org.hibernate.search.annotations.Factory;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ExcludeAllFilterFactory {
+	@Factory
+	public Filter getFilter() {
+		return new CachingWrapperFilter( new ExcludeAllFilter() );
+	}
+}

Modified: search/trunk/src/test/org/hibernate/search/test/filter/FilterTest.java
===================================================================
--- search/trunk/src/test/org/hibernate/search/test/filter/FilterTest.java	2008-02-12 17:02:10 UTC (rev 14331)
+++ search/trunk/src/test/org/hibernate/search/test/filter/FilterTest.java	2008-02-13 04:27:52 UTC (rev 14332)
@@ -55,6 +55,35 @@
 		deleteData();
 	}
 
+	public void testCache() {
+		createData();
+		FullTextSession s = Search.createFullTextSession( openSession( ) );
+		s.getTransaction().begin();
+		BooleanQuery query = new BooleanQuery();
+		query.add( new TermQuery( new Term("teacher", "andre") ), BooleanClause.Occur.SHOULD );
+		query.add( new TermQuery( new Term("teacher", "max") ), BooleanClause.Occur.SHOULD );
+		query.add( new TermQuery( new Term("teacher", "aaron") ), BooleanClause.Occur.SHOULD );
+		FullTextQuery ftQuery = s.createFullTextQuery( query, Driver.class );
+		assertEquals("No filter should happen", 3, ftQuery.getResultSize() );
+
+		ftQuery = s.createFullTextQuery( query, Driver.class );
+		ftQuery.enableFullTextFilter( "cachetest");
+		assertEquals("Should filter out all", 0, ftQuery.getResultSize() );
+
+		ftQuery = s.createFullTextQuery( query, Driver.class );
+		ftQuery.enableFullTextFilter( "cachetest");
+		try {
+			ftQuery.getResultSize();
+		}
+		catch (IllegalStateException e) {
+			fail("Cache does not work");
+		}
+
+		s.getTransaction().commit();
+		s.close();
+		deleteData();
+	}
+
 	public void testStraightFilters() {
 		createData();
 		FullTextSession s = Search.createFullTextSession( openSession( ) );




More information about the hibernate-commits mailing list