/* * 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.exoplatform.services.jcr.impl.core.query.lucene; import org.apache.lucene.index.IndexReader; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.Sort; import org.exoplatform.commons.utils.SecurityHelper; import org.exoplatform.services.jcr.dataflow.ItemDataConsumer; import org.exoplatform.services.jcr.datamodel.InternalQName; import org.exoplatform.services.jcr.impl.core.SessionImpl; import org.exoplatform.services.jcr.impl.core.query.lucene.constraint.EvaluationContext; import java.io.IOException; import java.security.PrivilegedExceptionAction; /** * <code>JackrabbitIndexSearcher</code> implements an index searcher with * jackrabbit specific optimizations. */ public class JcrIndexSearcher 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 ItemDataConsumer 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 JcrIndexSearcher(SessionImpl s, IndexReader r, ItemDataConsumer 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, InternalQName 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(final Query query, final Sort sort, final long resultFetchHint) throws IOException { return SecurityHelper.doPrivilegedIOExceptionAction(new PrivilegedExceptionAction<QueryHits>() { public QueryHits run() throws Exception { Query localQuery = query.rewrite(reader); QueryHits hits = null; if (localQuery instanceof JcrQuery) { hits = ((JcrQuery)localQuery).execute(JcrIndexSearcher.this, session, sort); } if (hits == null) { if (sort == null || sort.getSort().length == 0) { hits = new LuceneQueryHits(reader, JcrIndexSearcher.this, query); } else { hits = new SortedLuceneQueryHits(reader, JcrIndexSearcher.this, localQuery, sort, resultFetchHint); } } return hits; } }); } //------------------------< 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 ItemDataConsumer getItemStateManager() { return ism; } }