~~ 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.

Indexing In VXQuery

  VXQuery includes indexing functionality for creating, viewing, using, updating and deleting.


* Configuring Indexing

  VXQuery creates all indexes in a user specified directory.
  In order to use indexing, you will need to set the index directory in your cluster configuration file.
  Add the following line to your cluster configuration (e.g. cluster.xml).
  Make sure you create the indexing directory ("path/to/index/directory").
  Please note: The indexing directory must exist on all nodes.

--------
<index_directory>path/to/index/directory</index_directory>
--------


* Creating An Index For A Collection

  To create an index for an XML collection stored in <$collection>, use the following query:

--------
build-index-on-collection($collection as xs:string) as xs:boolean
--------

  Consider an example where this function takes the collection path ("/home/data/bookstore/barnes") as an argument.

  Example:

--------
build-index-on-collection("/home/data/bookstore/barnes")
--------

  Result:

------
true
------


* Viewing Indexes

  The <show-indexes> function displays a list of collections that have been indexed.
  This function takes no arguments and returns a sequence of collection paths.
  If there are no indexes created for any collection, the result will be an empty sequence.

------
show-indexes() as xs:string*
------

  Suppose we have a two collections ("/home/data/bookstore/barnes" and "/home/data/bookstore/borders") that have been indexed.

  Example:

------
show-indexes()
------

  Result:

------
/home/data/bookstore/barnes
/home/data/bookstore/borders
------

* Using An Index In Query

  To use an index in a query, use the <collection-from-index> function.
  The function takes two arguments: <$collection> as <xs:string> and <$path> as <xs:string>
  The query is written the same way as you would use the <collection> function with one additional argument for the
  search path steps.

------
collection-from-index($collection as xs:string, $path as xs:string) as node()*
------

  Example:

------
for $x in collection-from-index("/home/data/bookstore/barnes", "/bookstore/book")/book
where $x/price<30
order by $x/title
return $x/title
------

  Result:

------
<book category="CHILDREN">
  <title lang="en">Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>
------

* Updating An Index

  When the indexed data has changed, the index can be updated corresponding.
  The <update-index> function will check for file system changes and update an index.
  The function takes one argument: <$collection> as xs:string.

--------
update-index($collection as xs:string) as xs:boolean
--------

  Example:

-------
update-index("/home/data/bookstore/barnes")
-------

  Result:

------
true
------


* Deleting An Index

  An index can be deleted by using the <delete-index> function.
  The function takes one argument: <$collection> as xs:string.

--------
delete-index($collection as xs:string) as xs:boolean
--------

  Example:

-------
delete-index("/home/data/bookstore/barnes")
-------

  Result:

------
true
------


* Indexing Partitioned Collections

  Similar to the <collection> function, indexing queries can be partitioned for collection distributed among
  several directories.
  Partitioned queries use the vertical bar (|) to delimit partition paths within a query.

  Previous examples used a single collection.
  The following example has two collections in a single <$collection> variable for building an index:

--------
build-index-on-collection("/home/data/bookstore/barnes|/home/data/bookstore/borders")
--------

  The partition delimiter can be used in all the indexing <$collection> arguments.

