From: <ssk...@vh...> - 2005-12-05 15:38:22
|
Author: sskracic Date: 2005-12-05 16:35:53 +0100 (Mon, 05 Dec 2005) New Revision: 1024 Modified: trunk/ccm-core/src/com/arsdigita/search/QueryEngineRegistry.java trunk/ccm-core/src/com/arsdigita/search/intermedia/Initializer.java trunk/ccm-core/src/com/arsdigita/search/lucene/Initializer.java Log: Simplified the way the QueryEngineRegistry dispatches the search requests to query engines. QueryEngine implementations should now only register all of their capabilities under a single engine key, and the query will be dispatched for the first engine which has all the required filtering capabilities, ie. match is produced on containsAll() instead of equals(). Modified: trunk/ccm-core/src/com/arsdigita/search/QueryEngineRegistry.java =================================================================== --- trunk/ccm-core/src/com/arsdigita/search/QueryEngineRegistry.java 2005-12-05 15:32:04 UTC (rev 1023) +++ trunk/ccm-core/src/com/arsdigita/search/QueryEngineRegistry.java 2005-12-05 15:35:53 UTC (rev 1024) @@ -19,27 +19,28 @@ package com.arsdigita.search; import com.arsdigita.util.Assert; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; import java.util.Map; -import java.util.HashMap; import java.util.Set; -import java.util.HashSet; - import org.apache.log4j.Logger; /** - * Provides a registry of query engine implementations for + * Provides a registry of query engine implementations for * various sets of filters. Application programmers do not need * to access instances of this class directly, rather they * should use the <code>process</code> method in the <code>Search</code> * class. - * + * * @see com.arsdigita.search.QueryEngine */ public class QueryEngineRegistry { - + private static Map s_engines = new HashMap(); - private static final Logger s_log = + private static final Logger s_log = Logger.getLogger(QueryEngineRegistry.class); static { @@ -50,11 +51,11 @@ /** * Registers a new query engine implementation for an - * indexer capable of accepting a specific set of filter + * indexer capable of accepting a specific set of filter * types. * @param indexer the search engine type * @param filters the filter types supported - * @param engine the engine implementation + * @param engine the engine implementation */ public static void registerEngine(IndexerType indexer, FilterType[] filters, @@ -66,11 +67,11 @@ /** * Registers a new query engine implementation for an - * indexer capable of accepting a specific set of filter + * indexer capable of accepting a specific set of filter * types. * @param indexer the search engine type * @param filters the filter types supported - * @param engine the engine implementation + * @param engine the engine implementation */ public static void registerEngine(String indexer, FilterType[] filters, @@ -78,16 +79,16 @@ Assert.exists(indexer, String.class); Assert.exists(filters, FilterType.class); Assert.exists(engine, QueryEngine.class); - + if (s_log.isDebugEnabled()) { s_log.debug("Register engine " + engine.getClass() + " for " + indexer); for (int i = 0 ; i < filters.length ; i++) { - s_log.debug(" Filter: " + filters[i].getKey() + " (" + + s_log.debug(" Filter: " + filters[i].getKey() + " (" + filters[i].getClass() + ")"); } } - - s_engines.put(new EngineKey(indexer, filters), + + s_engines.put(new EngineKey(indexer, filters), engine); } @@ -98,7 +99,7 @@ * @param filters the filter types requested * @return a search engine implementation, or null */ - public static QueryEngine getEngine(String indexer, + public static QueryEngine getEngine(String indexer, FilterType[] filters) { Assert.exists(indexer, String.class); Assert.exists(filters, FilterType.class); @@ -106,18 +107,32 @@ if (s_log.isDebugEnabled()) { s_log.debug("Lookup engine for " + indexer); for (int i = 0 ; i < filters.length ; i++) { - s_log.debug(" Filter: " + filters[i].getKey() + " (" + + s_log.debug(" Filter: " + filters[i].getKey() + " (" + filters[i].getClass() + ")"); } } - - return (QueryEngine)s_engines.get(new EngineKey(indexer, filters)); + QueryEngine engine = null; + for (Iterator it = s_engines.keySet().iterator(); it.hasNext(); ) { + EngineKey current = (EngineKey) it.next(); + if (current.containsAllFilters(filters)) { + if (s_log.isDebugEnabled()) { + s_log.debug("Found match: " + current); + } + engine = (QueryEngine) s_engines.get(current); + break; + } + } + if (s_log.isDebugEnabled()) { + s_log.debug("Returning: " + engine); + } + return engine; } + private static class EngineKey { private String m_indexer; private Set m_filters; - + public EngineKey(String indexer, FilterType[] filters) { m_indexer = indexer; @@ -126,7 +141,11 @@ m_filters.add(filters[i]); } } - + + public boolean containsAllFilters(FilterType[] filters) { + return m_filters.containsAll(Arrays.asList(filters)); + } + public int hashCode() { return m_filters.hashCode(); } @@ -135,14 +154,18 @@ if (!(o instanceof EngineKey)) { return false; } - + EngineKey key = (EngineKey)o; if (!m_indexer.equals(key.m_indexer)) { return false; } - + return m_filters.equals(key.m_filters); } + + public String toString() { + return "EngineKey[indexer: " + m_indexer + ", filters: " + m_filters + "]"; + } } } Modified: trunk/ccm-core/src/com/arsdigita/search/intermedia/Initializer.java =================================================================== --- trunk/ccm-core/src/com/arsdigita/search/intermedia/Initializer.java 2005-12-05 15:32:04 UTC (rev 1023) +++ trunk/ccm-core/src/com/arsdigita/search/intermedia/Initializer.java 2005-12-05 15:35:53 UTC (rev 1024) @@ -18,17 +18,16 @@ */ package com.arsdigita.search.intermedia; +import com.arsdigita.db.DbHelper; import com.arsdigita.initializer.Configuration; import com.arsdigita.initializer.InitializationException; -import com.arsdigita.db.DbHelper; - -import com.arsdigita.search.Search; -import com.arsdigita.search.IndexerType; import com.arsdigita.search.FilterType; +import com.arsdigita.search.IndexerType; import com.arsdigita.search.QueryEngineRegistry; -import com.arsdigita.search.filters.PermissionFilterType; -import com.arsdigita.search.filters.ObjectTypeFilterType; +import com.arsdigita.search.Search; import com.arsdigita.search.filters.CategoryFilterType; +import com.arsdigita.search.filters.ObjectTypeFilterType; +import com.arsdigita.search.filters.PermissionFilterType; /** * Initializer @@ -154,9 +153,6 @@ BuildIndex.startTimer(); s_log.debug("Registering query engines"); QueryEngineRegistry.registerEngine(IndexerType.INTERMEDIA, - new FilterType[] {}, - new BaseQueryEngine()); - QueryEngineRegistry.registerEngine(IndexerType.INTERMEDIA, new FilterType[] { new PermissionFilterType(), new ObjectTypeFilterType(), Modified: trunk/ccm-core/src/com/arsdigita/search/lucene/Initializer.java =================================================================== --- trunk/ccm-core/src/com/arsdigita/search/lucene/Initializer.java 2005-12-05 15:32:04 UTC (rev 1023) +++ trunk/ccm-core/src/com/arsdigita/search/lucene/Initializer.java 2005-12-05 15:35:53 UTC (rev 1024) @@ -24,15 +24,16 @@ import com.arsdigita.search.IndexerType; import com.arsdigita.search.QueryEngineRegistry; import com.arsdigita.search.Search; - +import com.arsdigita.search.filters.CategoryFilterType; +import com.arsdigita.search.filters.ObjectTypeFilterType; import java.io.File; import java.io.IOException; import java.util.Date; - import org.apache.log4j.Logger; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; +import org.apache.lucene.search.BooleanQuery; /** * Initializer @@ -69,6 +70,7 @@ Analyzer analyzer = conf.getAnalyzer(); LOG.info("Lucene index location: " + location); LOG.info("Lucene Analyzer = " + analyzer.getClass().getName()); + BooleanQuery.setMaxClauseCount(Integer.MAX_VALUE); try { if (!IndexReader.indexExists(location)) { @@ -96,7 +98,10 @@ ((long)interval * 1000l)); QueryEngineRegistry.registerEngine - (IndexerType.LUCENE, new FilterType[] {}, + (IndexerType.LUCENE, new FilterType[] { + new CategoryFilterType(), + new ObjectTypeFilterType() + }, new BaseQueryEngine()); } } |