[hibernate-commits] Hibernate SVN: r14907 - in search/trunk/src: java/org/hibernate/search/filter and 3 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Wed Jul 9 12:19:27 EDT 2008


Author: hardy.ferentschik
Date: 2008-07-09 12:19:27 -0400 (Wed, 09 Jul 2008)
New Revision: 14907

Modified:
   search/trunk/src/java/org/hibernate/search/Environment.java
   search/trunk/src/java/org/hibernate/search/filter/CachingWrapperFilter.java
   search/trunk/src/java/org/hibernate/search/impl/SearchFactoryImpl.java
   search/trunk/src/java/org/hibernate/search/query/FullTextQueryImpl.java
   search/trunk/src/test/org/hibernate/search/test/filter/ExcludeAllFilterFactory.java
   search/trunk/src/test/org/hibernate/search/test/filter/FilterTest.java
Log:
HSEARCH-174:
- Made the hard ref count configurable for CachingWrapperFilter. I don't like much that I had to add another getter to SEarchFactoryImplementor and SearchFactoryImpl.

Modified: search/trunk/src/java/org/hibernate/search/Environment.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/Environment.java	2008-07-09 16:14:49 UTC (rev 14906)
+++ search/trunk/src/java/org/hibernate/search/Environment.java	2008-07-09 16:19:27 UTC (rev 14907)
@@ -62,9 +62,14 @@
 	 * define the reader strategy used
 	 */
 	public static final String READER_STRATEGY = READER_PREFIX + "strategy";
+	
 	/**
 	 * filter caching strategy class (must have a no-arg constructor and implements FilterCachingStrategy)
 	 */
 	public static final String FILTER_CACHING_STRATEGY = "hibernate.search.filter.cache_strategy";
-
+	
+	/**
+	 * Property name for the hard ref count of our <code>CachingWrapperFilter</code>.
+	 */
+	public static final String CACHING_WRAPPER_FILTER_SIZE = "hibernate.search.filter.caching_wrapper.size";	
 }

Modified: search/trunk/src/java/org/hibernate/search/filter/CachingWrapperFilter.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/filter/CachingWrapperFilter.java	2008-07-09 16:14:49 UTC (rev 14906)
+++ search/trunk/src/java/org/hibernate/search/filter/CachingWrapperFilter.java	2008-07-09 16:19:27 UTC (rev 14907)
@@ -6,6 +6,8 @@
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.search.Filter;
 import org.hibernate.util.SoftLimitMRUCache;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * A slightly different version of Lucene's original <code>CachingWrapperFilter</code> which
@@ -19,26 +21,40 @@
 @SuppressWarnings("serial")
 public class CachingWrapperFilter extends Filter {
 	
-	private static final int DEFAULT_SIZE = 5;
+	private final Logger log = LoggerFactory.getLogger( CachingWrapperFilter.class );
 	
+	public static final int DEFAULT_SIZE = 5;
+	
+	private final int size;
+	
 	/**
 	 * The cache using soft references in order to store the filter bit sets.
 	 */
-	protected transient SoftLimitMRUCache cache;
+	private transient SoftLimitMRUCache cache;
 	
-	protected Filter filter;
+	private Filter filter;
 
 	/**
 	 * @param filter
 	 *            Filter to cache results of
 	 */
 	public CachingWrapperFilter(Filter filter) {
+		this(filter, DEFAULT_SIZE);
+	}
+	
+	/**
+	 * @param filter
+	 *            Filter to cache results of
+	 */
+	public CachingWrapperFilter(Filter filter, int size) {
 		this.filter = filter;
-	}
+		this.size = size;
+	}	
 
 	public BitSet bits(IndexReader reader) throws IOException {
 		if (cache == null) {
-			cache = new SoftLimitMRUCache(DEFAULT_SIZE);
+			log.debug("Initialising SoftLimitMRUCache with hard ref size of {}", size);
+			cache = new SoftLimitMRUCache(size);
 		}
 
 		synchronized (cache) { // check cache

Modified: search/trunk/src/java/org/hibernate/search/impl/SearchFactoryImpl.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/impl/SearchFactoryImpl.java	2008-07-09 16:14:49 UTC (rev 14906)
+++ search/trunk/src/java/org/hibernate/search/impl/SearchFactoryImpl.java	2008-07-09 16:19:27 UTC (rev 14907)
@@ -38,9 +38,11 @@
 import org.hibernate.search.backend.OptimizeLuceneWork;
 import org.hibernate.search.backend.Worker;
 import org.hibernate.search.backend.WorkerFactory;
+import org.hibernate.search.backend.configuration.ConfigurationParseHelper;
 import org.hibernate.search.engine.DocumentBuilder;
 import org.hibernate.search.engine.FilterDef;
 import org.hibernate.search.engine.SearchFactoryImplementor;
+import org.hibernate.search.filter.CachingWrapperFilter;
 import org.hibernate.search.filter.FilterCachingStrategy;
 import org.hibernate.search.filter.MRUFilterCachingStrategy;
 import org.hibernate.search.reader.ReaderProvider;
@@ -54,6 +56,7 @@
 /**
  * @author Emmanuel Bernard
  */
+ at SuppressWarnings("unchecked")
 public class SearchFactoryImpl implements SearchFactoryImplementor {
 	private static final ThreadLocal<WeakHashMap<Configuration, SearchFactoryImpl>> contexts =
 			new ThreadLocal<WeakHashMap<Configuration, SearchFactoryImpl>>();
@@ -74,6 +77,7 @@
 	private final FilterCachingStrategy filterCachingStrategy;
 	private Map<String, Analyzer> analyzers;
 	private final AtomicBoolean stopped = new AtomicBoolean( false );
+	private final int cachingWrapperFilterSize;
 
 	/**
 	 * Each directory provider (index) can have its own performance settings.
@@ -105,6 +109,8 @@
 		this.worker = WorkerFactory.createWorker( cfg, this );
 		this.readerProvider = ReaderProviderFactory.createReaderProvider( cfg, this );
 		this.filterCachingStrategy = buildFilterCachingStrategy( cfg.getProperties() );
+		
+		this.cachingWrapperFilterSize = ConfigurationParseHelper.getIntValue( cfg.getProperties(), Environment.CACHING_WRAPPER_FILTER_SIZE, CachingWrapperFilter.DEFAULT_SIZE );
 	}
 
 	private static String defineIndexingStrategy(Configuration cfg) {
@@ -384,5 +390,9 @@
 	public void addDirectoryProvider(DirectoryProvider<?> provider) {
 		this.dirProviderData.put( provider, new DirectoryProviderData() );
 	}
+
+	public int getCachingWrapperFilterSize() {
+		return cachingWrapperFilterSize;
+	}
 	
 }

Modified: search/trunk/src/java/org/hibernate/search/query/FullTextQueryImpl.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/query/FullTextQueryImpl.java	2008-07-09 16:14:49 UTC (rev 14906)
+++ search/trunk/src/java/org/hibernate/search/query/FullTextQueryImpl.java	2008-07-09 16:19:27 UTC (rev 14907)
@@ -385,7 +385,8 @@
 		if (def.getUseCachingWrapperFilter() == CachingWrapperFilter.YES
 				|| (def.getUseCachingWrapperFilter() == CachingWrapperFilter.AUTOMATIC && def
 						.isCache())) {
-			filter = new org.hibernate.search.filter.CachingWrapperFilter(filter);
+			int cachingWrapperFilterSize = getSearchFactoryImplementor().getCachingWrapperFilterSize();
+			filter = new org.hibernate.search.filter.CachingWrapperFilter(filter, cachingWrapperFilterSize);
 		}
 		
 		return filter;

Modified: search/trunk/src/test/org/hibernate/search/test/filter/ExcludeAllFilterFactory.java
===================================================================
--- search/trunk/src/test/org/hibernate/search/test/filter/ExcludeAllFilterFactory.java	2008-07-09 16:14:49 UTC (rev 14906)
+++ search/trunk/src/test/org/hibernate/search/test/filter/ExcludeAllFilterFactory.java	2008-07-09 16:19:27 UTC (rev 14907)
@@ -1,9 +1,8 @@
-// $Id:$
+// $Id$
 package org.hibernate.search.test.filter;
 
 import org.apache.lucene.search.Filter;
 import org.hibernate.search.annotations.Factory;
-import org.hibernate.search.filter.CachingWrapperFilter;
 
 /**
  * @author Emmanuel Bernard
@@ -11,6 +10,6 @@
 public class ExcludeAllFilterFactory {
 	@Factory
 	public Filter getFilter() {
-		return new CachingWrapperFilter( new ExcludeAllFilter() );
+		return 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-07-09 16:14:49 UTC (rev 14906)
+++ search/trunk/src/test/org/hibernate/search/test/filter/FilterTest.java	2008-07-09 16:19:27 UTC (rev 14907)
@@ -1,8 +1,9 @@
-// $Id:$
+// $Id$
 package org.hibernate.search.test.filter;
 
 import java.util.Calendar;
 
+import org.apache.lucene.analysis.StopAnalyzer;
 import org.apache.lucene.index.Term;
 import org.apache.lucene.search.BooleanClause;
 import org.apache.lucene.search.BooleanQuery;
@@ -10,9 +11,11 @@
 import org.apache.lucene.search.RangeFilter;
 import org.apache.lucene.search.TermQuery;
 import org.hibernate.Session;
+import org.hibernate.search.Environment;
 import org.hibernate.search.FullTextQuery;
 import org.hibernate.search.FullTextSession;
 import org.hibernate.search.Search;
+import org.hibernate.search.store.RAMDirectoryProvider;
 import org.hibernate.search.test.SearchTestCase;
 
 /**
@@ -68,9 +71,9 @@
 		ftQuery.enableFullTextFilter( "cachetest");
 		assertEquals("Should filter out all", 0, ftQuery.getResultSize() );
 		
-		// HSEARCH-174 - we call System.gc() to force a garbage collection. Prior to the fix
-		// to HSEARCH-174 this would cause the filter to be garbage collected since Lucene 
-		// used weak references in the cache.
+		// HSEARCH-174 - we call System.gc() to force a garbage collection.
+		// Prior to the fix for HSEARCH-174 this would cause the filter to be 
+		// garbage collected since Lucene used weak references.
 		System.gc();
 
 		ftQuery = s.createFullTextQuery( query, Driver.class );
@@ -168,4 +171,9 @@
 				Soap.class
 		};
 	}
+	
+	protected void configure(org.hibernate.cfg.Configuration cfg) {
+		super.configure(cfg);
+		cfg.setProperty( "hibernate.search.filter.caching_wrapper.size", "10" );
+	}	
 }




More information about the hibernate-commits mailing list