/*
* 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;
import java.io.IOException;
import java.util.Iterator;
import javax.jcr.RepositoryException;
import javax.jcr.query.InvalidQueryException;
import org.apache.jackrabbit.core.fs.FileSystem;
import org.apache.jackrabbit.core.id.NodeId;
import org.apache.jackrabbit.core.session.SessionContext;
import org.apache.jackrabbit.core.state.NodeState;
/**
* Defines an interface for the actual node indexing and query execution.
* The goal is to allow different implementations based on the persistent
* manager in use. Some persistent model might allow to execute a query
* in an optimized manner, e.g. database persistence.
*/
public interface QueryHandler {
/**
* Initializes this query handler. This method is called after the
* <code>QueryHandler</code> is instantiated.
* <p>
* If a file system has been configured (i.e. the fs argument is not
* <code>null</code>), then the query handler is expected to close
* the given file system when the {@link #close()} method is called.
*
* @param fs the configured search index file system, or <code>null</code>
* @param context the context for this query handler.
* @throws IOException if an error occurs during initialization.
*/
void init(FileSystem fs, QueryHandlerContext context) throws IOException;
/**
* Returns the query handler context that passed in {@link
* #init(FileSystem, QueryHandlerContext)}.
*
* @return the query handler context.
*/
QueryHandlerContext getContext();
/**
* Adds a <code>Node</code> to the search index.
* @param node the NodeState to add.
* @throws RepositoryException if an error occurs while indexing the node.
* @throws IOException if an error occurs while adding the node to the index.
*/
void addNode(NodeState node) throws RepositoryException, IOException;
/**
* Deletes the Node with <code>id</code> from the search index.
* @param id the <code>id</code> of the node to delete.
* @throws IOException if an error occurs while deleting the node.
*/
void deleteNode(NodeId id) throws IOException;
/**
* Updates the index in an atomic operation. Some nodes may be removed and
* added again in the same updateNodes() call, which is equivalent to an
* node update.
*
* @param remove Iterator of <code>NodeIds</code> of nodes to delete
* @param add Iterator of <code>NodeState</code> instance to add to the
* index.
* @throws RepositoryException if an error occurs while indexing a node.
* @throws IOException if an error occurs while updating the index.
*/
void updateNodes(Iterator<NodeId> remove, Iterator<NodeState> add)
throws RepositoryException, IOException;
/**
* Closes this <code>QueryHandler</code> and frees resources attached
* to this handler.
*/
void close() throws IOException;
/**
* Creates a new query by specifying the query statement itself and the
* language in which the query is stated. If the query statement is
* syntactically invalid, given the language specified, an
* InvalidQueryException is thrown. <code>language</code> must specify a query language
* string from among those returned by QueryManager.getSupportedQueryLanguages(); if it is not
* then an <code>InvalidQueryException</code> is thrown.
*
* @param sessionContext component context of the current session
* @param statement the query statement.
* @param language the syntax of the query statement.
* @throws InvalidQueryException if statement is invalid or language is unsupported.
* @return A <code>Query</code> object.
*/
ExecutableQuery createExecutableQuery(
SessionContext sessionContext, String statement, String language)
throws InvalidQueryException;
/**
* @return the name of the query class to use.
*/
String getQueryClass();
/**
* Returns the ids of the nodes that refer to the node with <code>id</code>
* by weak references.
*
* @param id the id of the target node.
* @return the ids of the referring nodes.
* @throws RepositoryException if an error occurs.
* @throws IOException if an error occurs while reading from the
* index.
*/
public Iterable<NodeId> getWeaklyReferringNodes(NodeId id)
throws RepositoryException, IOException;
}