/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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.apache.jackrabbit.core.query.lucene; import java.io.IOException; import org.apache.jackrabbit.core.SessionImpl; import org.apache.jackrabbit.core.query.lucene.constraint.EvaluationContext; import org.apache.jackrabbit.core.state.ItemStateManager; import org.apache.jackrabbit.spi.Name; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.Term; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.Sort; /** * <code>JackrabbitIndexSearcher</code> implements an index searcher with * jackrabbit specific optimizations. */ public class JackrabbitIndexSearcher extends IndexSearcher implements EvaluationContext { /** * The session that executes the query. */ private final SessionImpl session; /** * The underlying index reader. */ private final IndexReader reader; /** * The item state manager of the workspace. */ private final ItemStateManager ism; /** * Creates a new jackrabbit index searcher. * * @param s the session that executes the query. * @param r the index reader. * @param ism the shared item state manager. */ public JackrabbitIndexSearcher(SessionImpl s, IndexReader r, ItemStateManager ism) { super(r); this.session = s; this.reader = r; this.ism = ism; } /** * Executes the query and returns the hits that match the query. * * @param query the query to execute. * @param sort the sort criteria. * @param resultFetchHint a hint on how many results should be fetched. * @param selectorName the single selector name for the query hits. * @return the query hits. * @throws IOException if an error occurs while executing the query. */ public MultiColumnQueryHits execute(Query query, Sort sort, long resultFetchHint, Name selectorName) throws IOException { return new QueryHitsAdapter( evaluate(query, sort, resultFetchHint), selectorName); } /** * Evaluates the query and returns the hits that match the query. * * @param query the query to execute. * @param sort the sort criteria. * @param resultFetchHint a hint on how many results should be fetched. * @return the query hits. * @throws IOException if an error occurs while executing the query. */ public QueryHits evaluate(Query query, Sort sort, long resultFetchHint) throws IOException { query = query.rewrite(reader); QueryHits hits = null; if (query instanceof JackrabbitQuery) { hits = ((JackrabbitQuery) query).execute(this, session, sort); } if (hits == null) { if (sort.getSort().length == 0) { hits = new LuceneQueryHits(reader, this, query); } else { hits = new SortedLuceneQueryHits(this, query, sort, resultFetchHint); } } return hits; } //---------------------------< IndexSearcher >------------------------------ @Override public int docFreq(Term term) throws IOException { // provide a fixed document frequency for fields that are not fulltext // indexed. correct frequency is only useful for fulltext queries. if (FieldNames.isFulltextField(term.field())) { return super.docFreq(term); } else { return 1; } } //------------------------< EvaluationContext >----------------------------- /** * Evaluates the query and returns the hits that match the query. * * @param query the query to execute. * @return the query hits. * @throws IOException if an error occurs while executing the query. */ public QueryHits evaluate(Query query) throws IOException { return evaluate(query, new Sort(), Integer.MAX_VALUE); } /** * @return session that executes the query. */ public SessionImpl getSession() { return session; } /** * @return the item state manager of the workspace. */ public ItemStateManager getItemStateManager() { return ism; } }