diff --git a/doc/developer/developer.xml b/doc/developer/developer.xml index 87d8e6c14d62d07174d3c75054588c22972eeb20..80dc4f4ce988ca9fcc11600970fcfdd86cb5a594 100644 --- a/doc/developer/developer.xml +++ b/doc/developer/developer.xml @@ -53,18 +53,55 @@ The other alternative, if you have actually modified <title>How to build the XML manual</title> <para> To build XML manual, you'll need: -<itemizedlist> +<itemizedlist> <listitem><para>xsltproc</para></listitem> <listitem><para>docbook5-xml</para></listitem> <listitem><para>docbook-xsl-ns</para></listitem> <listitem><para>libsaxon-java- for saxon processing</para></listitem> <listitem><para>libxml-commons-resolver1.1-java</para></listitem> +<listitem><para>libxml2-utils</para></listitem> <listitem><para>libxerces2-java</para></listitem> <listitem><para>libxslthl-java</para></listitem> +<listitem><para>lynx</para></listitem> +<listitem><para>jing</para></listitem> </itemizedlist> -Once all pre-requisites are met, <computeroutput>make html</computeroutput> -to build the user guide. + + + +When all pre-requisites are met, you should run: + +<programlisting> + <prompt>$ </prompt> cmake . -DENABLE_DOC=yes +</programlisting> + +to enable documentation builder. + +If you want to make tarantool user guide, you should run the following command +from taratnool root directory: + +<programlisting> + <prompt>$ </prompt> make html +</programlisting> + +or + +<programlisting> + <prompt>$ </prompt> cd doc/user + <prompt>$ </prompt> make +</programlisting> + +The html version of the user guide will be generated in doc/www-data. + +To building the developer guilde, you should run: + +<programlisting> + <prompt>$ </prompt> cd doc/developer + <prompt>$ </prompt> make +</programlisting> + +The html version of the developer guide will be generated in doc/www-data. + </para> </section> </chapter> diff --git a/doc/user/stored-procedures.xml b/doc/user/stored-procedures.xml index d4d9f2678b319b69e7e7aae8ce2b400c4ce5bb8d..5aad1a9a17d14e89f772a6e360b8bde94e183ca3 100644 --- a/doc/user/stored-procedures.xml +++ b/doc/user/stored-procedures.xml @@ -984,87 +984,148 @@ xreflabel="box.index">box.index</code></title> </simpara> </listitem> </varlistentry> +</variablelist> +<para> + The following functions provide iteration support within an index. + <code>next</code> and <code>next_equal</code> provide common + iterators which go from the beginning to the end of the index. + <code>prev</code> and <code>prev_equal</code> provide reverse + iterators which travers the index in the reverse order. + In a non-unique index the routines with the <code>'_equal'</code> + suffix will traverse sequences of tuples with the same key value. +</para> +<variablelist> <varlistentry> <term> - <emphasis role="lua">index:pairs()</emphasis> + <emphasis role="lua">index:next(iteration_state, key)</emphasis> </term> - <listitem><simpara> - A helper function to iterate over all tuples in an - index. - </simpara> - </listitem> + <listitem><simpara></simpara></listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis role="lua">index:prev(iteration_state, key)</emphasis> + </term> + <listitem><simpara></simpara></listitem> + </varlistentry> + <varlistentry> + <term> + <emphasis role="lua">index:next_equal(iteration_state, key)</emphasis> + </term> + <listitem><simpara></simpara></listitem> </varlistentry> <varlistentry> <term> - <emphasis role="lua">index:next(iteration_state, key)</emphasis> + <emphasis role="lua">index:prev_equal(iteration_state, key)</emphasis> </term> - <listitem><simpara> - This function can be used for positioned iteration, or - resuming iteration from a given key. It follows the - <link xlink:href='http://pgl.yoyo.org/luai/i/next'>Lua - iteration pattern</link> and returns a pair - <code><iteration_state, tuple></code>. - When called with no arguments, it starts iteration - from the beginning. If called with userdata - <code>iteration_state</code>, it returns a tuple - corresponding to iterator position, plus a new - <code>iteration_state</code>. When called with a key, - it positions the iterator on the key, and returns the - respective tuple and <code>iteration_state</code>. - </simpara> + <listitem> + <para> + The first argument is the iteration state and the second one is the + key. The functions create a new iterator if <code>iteration_state + </code> is not defined or <code>nil</code>. + The new iterator is positioned at the begining (or the end -- for + reverse iterators) of the sequence of tuples satifsying the key. + If the key is <code>nil</code> (or empty) the first (last) member + of the sequence will be the first (last) member of the index. + </para> + + <para> + The functions follow the + <link xlink:href='http://pgl.yoyo.org/luai/i/next'>Lua iteration + pattern</link> returning <code>{iteration_state, tuple}</code> pair, + where <code>iteration_state</code> is the iterator and + <code>tuple</code> is the tuple the iterator points at. + The function returns <code>nil</code> if the iterator reaches the + end of the index or there are no more tuples satifsying the + <code>key</code> (for <code>_equal</code> functions). + </para> <bridgehead renderas="sect4">Example</bridgehead> <programlisting> -localhost> insert into t0 values (1, 'Russia') -Insert OK, 1 rows affected -localhost> insert into t0 values (2, 'Serbia') -Insert OK, 1 rows affected -localhost> insert into t0 values (3, 'Bulgaria') -Insert OK, 1 rows affected -localhost> lua i = box.space[0].index[0] +localhost> lua box.insert(0, "United Kingdom, The", "Europe") +localhost> lua box.insert(0, "France", "Europe") +localhost> lua box.insert(0, "Netherlands", "Europe") +localhost> lua box.insert(0, "Australia", "Oceania") +localhost> lua box.insert(0, "Vanuatu", "Oceania") +localhost> lua box.insert(0, "United States of America, The", "North America") +localhost> lua box.insert(0, "Canada", "North America") +localhost> lua box.insert(0, "Mexico", "North America") +localhost> lua pi = box.space[0].index[0] -- primary index +localhost> lua si = box.space[0].index[1] -- secondary index +localhost> lua k,v=pi:next() -- init iterator by primary from the begining --- ... -localhost> lua k,v=i:next() +localhost> lua print(v) +--- +'Australia': {'Oceania'} +... +localhost> lua k,v=pi:next(k) -- move to next --- ... localhost> lua print(v) --- -1: {'Russia'} +--- +'Canada': {'North America'} ... -localhost> lua k,v=i:next(k) +localhost> lua k,v=pi:next(k) -- move to next --- ... localhost> lua print(v) --- -2: {'Serbia'} +'France': {'Europe'} ... -localhost> lua k,v=i:next(k) +localhost> lua k,v=si:next_equal() -- init iterator by secondary from the begining --- ... localhost> lua print(v) --- -3: {'Bulgaria'} +'United Kingdom, The': {'Europe'} ... -localhost> lua k,v=i:next(k) +localhost> lua k,v=si:next_equal(k) -- move to next --- ... localhost> lua print(v) --- -nil +'France': {'Europe'} ... -localhost> lua k,v=i:next(2) +localhost> lua k,v=si:next_equal(k) -- move to next --- ... localhost> lua print(v) --- -2: {'Serbia'} +'Netherlands': {'Europe'} +... +localhost> lua for k,v in pi.next, pi, nil do print(v) end +--- +'Australia': {'Oceania'} +'Canada': {'North America'} +'France': {'Europe'} +'Mexico': {'North America'} +'Netherlands': {'Europe'} +'United Kingdom, The': {'Europe'} +'United States of America, The': {'North America'} +'Vanuatu': {'Oceania'} +... +localhost> lua for k,v in pi.prev, pi, nil do print(v) end +--- +'Vanuatu': {'Oceania'} +'United States of America, The': {'North America'} +'United Kingdom, The': {'Europe'} +'Netherlands': {'Europe'} +'Mexico': {'North America'} +'France': {'Europe'} +'Canada': {'North America'} +'Australia': {'Oceania'} +... +localhost> lua for k,v in si.next_equal, si, 'Oceania' do print(v) end +--- +'Australia': {'Oceania'} +'Vanuatu': {'Oceania'} ... -localhost> lua for k,v in i.next, i, nil do print(v) end +localhost> lua for k,v in si.prev_equal, si, 'North America' do print(v) end --- -1: {'Russia'} -2: {'Serbia'} -3: {'Bulgaria'} +'Mexico': {'North America'} +'Canada': {'North America'} +'United States of America, The': {'North America'} ... </programlisting> </listitem> diff --git a/mod/box/box.lua b/mod/box/box.lua index 10d395c3e8f1331ca91c69c09c4aa3db40204d03..4d2f52089194b112223450d9169e8fa54f0acc0d 100644 --- a/mod/box/box.lua +++ b/mod/box/box.lua @@ -259,6 +259,11 @@ function box.on_reload_configuration() return index.idx:next(...) end index_mt.prev = function(index, ...) return index.idx:prev(...) end + + index_mt.next_equal = function(index, ...) + return index.idx:next_equal(...) end + index_mt.prev_equal = function(index, ...) + return index.idx:prev_equal(...) end -- index_mt.select_range = function(index, limit, ...) local range = {}