/* * Copyright 2004-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.compass.core.lucene.engine.transaction.support; import java.io.IOException; import org.apache.commons.logging.Log; import org.apache.lucene.index.Term; import org.apache.lucene.index.TermDocs; import org.apache.lucene.search.Filter; import org.apache.lucene.search.Hits; import org.compass.core.Resource; import org.compass.core.engine.SearchEngineException; import org.compass.core.lucene.engine.DefaultLuceneSearchEngineHits; import org.compass.core.lucene.engine.EmptyLuceneSearchEngineHits; import org.compass.core.lucene.engine.LuceneSearchEngine; import org.compass.core.lucene.engine.LuceneSearchEngineHits; import org.compass.core.lucene.engine.LuceneSearchEngineInternalSearch; import org.compass.core.lucene.engine.LuceneSearchEngineQuery; import org.compass.core.lucene.engine.manager.LuceneIndexHolder; import org.compass.core.lucene.support.ResourceHelper; import org.compass.core.spi.ResourceKey; /** * A base class that does all the search based operations <b>without</b> visibility for on going * changes within the transaction. * * @author kimchy */ public abstract class AbstractSearchTransactionProcessor extends AbstractTransactionProcessor { protected AbstractSearchTransactionProcessor(Log logger, LuceneSearchEngine searchEngine) { super(logger, searchEngine); } protected LuceneSearchEngineHits performFind(LuceneSearchEngineQuery query) throws SearchEngineException { LuceneSearchEngineInternalSearch internalSearch = internalSearch(query.getSubIndexes(), query.getAliases()); if (internalSearch.isEmpty()) { return new EmptyLuceneSearchEngineHits(searchEngine, internalSearch); } Filter qFilter = null; if (query.getFilter() != null) { qFilter = query.getFilter().getFilter(); } Hits hits = findByQuery(internalSearch, query, qFilter); return new DefaultLuceneSearchEngineHits(hits, searchEngine, query, internalSearch); } protected LuceneSearchEngineInternalSearch performInternalSearch(String[] subIndexes, String[] aliases) throws SearchEngineException { // TODO somehow, we need to find a way to pass the useFieldCache parameter return buildInternalSearch(subIndexes, aliases, true); } protected Resource[] performGet(ResourceKey resourceKey) throws SearchEngineException { LuceneIndexHolder indexHolder = indexManager.getIndexHoldersCache().getHolder(resourceKey.getSubIndex()); try { Term t = new Term(resourceKey.getUIDPath(), resourceKey.buildUID()); TermDocs termDocs = null; try { termDocs = indexHolder.getIndexReader().termDocs(t); if (termDocs != null) { return ResourceHelper.hitsToResourceArray(termDocs, indexHolder.getIndexReader(), searchEngine); } else { return new Resource[0]; } } catch (IOException e) { throw new SearchEngineException("Failed to search for property [" + resourceKey + "]", e); } finally { try { if (termDocs != null) { termDocs.close(); } } catch (IOException e) { // swallow it } } } finally { indexHolder.release(); } } }