package org.exist.xmldb;
import org.xmldb.api.base.ResourceSet;
import org.xmldb.api.base.XMLDBException;
import org.xmldb.api.modules.XMLResource;
import org.xmldb.api.modules.XPathQueryService;
/**
* Extends {@link org.xmldb.api.modules.XPathQueryService} by additional
* methods specific to eXist.
*
* @author Wolfgang <wolfgang@exist-db.org>
*
*/
public interface XPathQueryServiceImpl extends XPathQueryService {
/**
* Process an XPath query based on the result of a previous query.
* The XMLResource contains the result received from a previous
* query.
*
* @param res an XMLResource as obtained from a previous query.
* @param query the XPath query
*/
public ResourceSet query( XMLResource res, String query )
throws XMLDBException;
/**
* Process an XPath query based on the result of a previous query and sort the
* results using the second XPath expression. The XMLResource contains
* the result received from a previous query.
*
* @param res an XMLResource as obtained from a previous query
* @param query the XPath query
* @param sortExpr another XPath expression, which is executed relative to
* the results of the primary expression. The result of applying sortExpr is converted
* to a string value, which is then used to sort the results.
* @throws XMLDBException
*/
public ResourceSet query( XMLResource res, String query, String sortExpr)
throws XMLDBException;
/**
* Process an XPath query and sort the results by applying a second XPath expression
* to each of the search results. The result of applying the sort expression is converted
* into a string, which is then used to sort the set of results.
*
* @param query the XPath query
* @param sortExpr another XPath expression, which is executed relative to the
* results of the primary expression.
* @throws XMLDBException
*/
public ResourceSet query( String query, String sortExpr)
throws XMLDBException;
/**
* Declare an external XPath variable and assign a value to it.
*
* A variable can be referenced inside an XPath expression as
* <b>$variable</b>. For example, if you declare a variable with
*
* <pre>
* declareVariable("name", "HAMLET");
* </pre>
*
* you may use the variable in an XPath expression as follows:
*
* <pre>
* //SPEECH[SPEAKER=$name]
* </pre>
*
* Any Java object may be passed as initial value. The query engine will try
* to map this into a corresponding XPath value. You may also pass an
* XMLResource as obtained from another XPath expression. This will be
* converted into a node.
*
* @param qname a valid QName by which the variable is identified. Any
* prefix should have been mapped to a namespace, i.e. if a variable is called
* <b>x:name</b>, there should be a prefix/namespace mapping for the prefix
* x
* @param initialValue the initial value, which is assigned to the variable
*
* @throws XMLDBException
*/
public void declareVariable(String qname, Object initialValue) throws XMLDBException;
/**
* Execute all following queries in a protected environment. Acquire a write lock
* on all resources in the current collection (i.e. the one from which this service
* was obtained) before executing the query. If a query spans multiple collections,
* call beginProtected on the outer collection which contains all the other
* collections.
*
* It is thus guaranteed that documents referenced by the
* query or the result set are not modified by other threads
* until {@link #endProtected} is called.
*/
public void beginProtected() throws XMLDBException;
/**
* Close the protected environment. All locks held
* by the current thread are released. The query result set
* is no longer guaranteed to be stable.
*
* Note: if beginProtected was used, you have to make sure
* endProtected is called in ALL cases. Otherwise some resource
* locks may not be released properly.
*/
public void endProtected();
}