Author: glandais Date: 2008-03-13 16:59:15 +0000 (Thu, 13 Mar 2008) New Revision: 1329 Modified: trunk/simexplorer-is/simexplorer-is-storage/src/java/fr/cemagref/simexplorer/is/storage/database/lucene/LuceneDatabase.java Log: Comments Modified: trunk/simexplorer-is/simexplorer-is-storage/src/java/fr/cemagref/simexplorer/is/storage/database/lucene/LuceneDatabase.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-storage/src/java/fr/cemagref/simexplorer/is/storage/database/lucene/LuceneDatabase.java 2008-03-13 16:58:58 UTC (rev 1328) +++ trunk/simexplorer-is/simexplorer-is-storage/src/java/fr/cemagref/simexplorer/is/storage/database/lucene/LuceneDatabase.java 2008-03-13 16:59:15 UTC (rev 1329) @@ -125,6 +125,7 @@ * Instantiates a new lucene database. */ public LuceneDatabase() { + // retrieve default values from config file Properties config = Config.getProperties(); this.dbFolder = String.valueOf(config.getProperty(Config.DB_FOLDER_PROPERTY)); this.optimizePeriod = Integer.valueOf(config.getProperty(Config.OPTIMIZE_PERIOD_PROPERTY)); @@ -145,6 +146,7 @@ * @return the searcher pool */ private SearcherPool getSearcherPool() { + // if searcher pool doesn't exist yet, create it if (searcherPool == null) { searcherPool = new SearcherPool(); } @@ -201,7 +203,7 @@ } /** - * Filter search. + * Filter search, with security but without sorting. * * @param searcher the searcher * @param query the query @@ -216,7 +218,7 @@ } /** - * Filter search. + * Filter search, with a security filter. * * @param searcher the searcher * @param query the query @@ -230,12 +232,14 @@ private Hits filterSearch(Searcher searcher, Query query, String userFilter, Sort sorting) throws IOException { Hits result = null; Filter filter = null; + // Retrieve filter of user if (userFilter != null) { synchronized (filterSynchronizer) { filter = filters.get(userFilter); } } + // no filter = no filtering for user if (filter == null) { if (sorting == null) { result = searcher.search(query); @@ -244,6 +248,7 @@ } } else { synchronized (filter) { + // search with user filter if (sorting == null) { result = searcher.search(query, filter); } else { @@ -255,23 +260,30 @@ } /** - * Creates the query. + * Creates a query for a security filter. + * This query is a big OR on all elements on UUIDs * - * @param visibleItems the visible items + * @param visibleItems the visible items for the user * * @return the query */ private Query createQuery(Collection<String> visibleItems) { + // maximum number of terms for a boolean query int maxTerms = BooleanQuery.getMaxClauseCount() - 1; int i = 0; + // does the current query has not maxTerms éléments boolean subQueryIsQuery = true; BooleanQuery query = new BooleanQuery(); + // sub query with maxTerms elements BooleanQuery subQuery = new BooleanQuery(); for (String string : visibleItems) { + // add term to subquery subQuery.add(new TermQuery(new Term(KEY_UUID, string)), BooleanClause.Occur.SHOULD); + // if max terms is reached if (i % maxTerms == 0) { + // add subquery to main query and mark sub query as not being main query subQueryIsQuery = false; query.add(new BooleanClause(subQuery, BooleanClause.Occur.SHOULD)); subQuery = new BooleanQuery(); @@ -279,6 +291,7 @@ i++; } + // sub query is the main query? if (subQueryIsQuery) { return subQuery; } @@ -286,7 +299,7 @@ } /** - * Creates the filter. + * Creates the filter corresponding to a list of visible items. * * @param visibleItems the visible items * @@ -294,6 +307,7 @@ * */ private Filter createFilter(Collection<String> visibleItems) { + // wrap the query as a filter and cache it Filter filter = new CachingWrapperFilter(new QueryWrapperFilter(createQuery(visibleItems))); return filter; } @@ -306,9 +320,12 @@ if (writer == null) { // Create an analyzer SimpleAnalyzer simpleAnalyzer = new SimpleAnalyzer(); + // each field has its own analyzer analyzer = new PerFieldAnalyzerWrapper(simpleAnalyzer); PerFieldAnalyzerWrapper perFieldAnalyzerWrapper = (PerFieldAnalyzerWrapper) analyzer; KeywordAnalyzer keywordAnalyzer = new KeywordAnalyzer(); + // all these fields are stored as a single keyword + // other fields use default analyzer : simpleAnalyzer perFieldAnalyzerWrapper.addAnalyzer(KEY_UUID, keywordAnalyzer); perFieldAnalyzerWrapper.addAnalyzer(KEY_UUID_VERSION, keywordAnalyzer); perFieldAnalyzerWrapper.addAnalyzer(KEY_UUID_VERSION_PARENT, keywordAnalyzer); @@ -321,10 +338,6 @@ perFieldAnalyzerWrapper.addAnalyzer(KEY_PARENT_UUID, keywordAnalyzer); perFieldAnalyzerWrapper.addAnalyzer(KEY_PARENT_VERSION, keywordAnalyzer); - perFieldAnalyzerWrapper.addAnalyzer(KEY_NAME, simpleAnalyzer); - perFieldAnalyzerWrapper.addAnalyzer(KEY_DESCRIPTION, simpleAnalyzer); - - // Retrieve all searchable columns File indexDir = new File(dbFolder); // Create directories File resultFolder = new File(indexDir.getParent()); @@ -349,6 +362,7 @@ commit(); } } catch (IOException e) { + // something went wrong throw new SimExplorerTechnicalException(e); } }