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( ) );
Show replies by thread