Fix sample PQF
[yaz-moved-to-github.git] / doc / tools.xml
1 <!-- $Id: tools.xml,v 1.28 2003-10-23 09:56:57 adam Exp $ -->
2  <chapter id="tools"><title>Supporting Tools</title>
3   
4   <para>
5    In support of the service API - primarily the ASN module, which
6    provides the pro-grammatic interface to the Z39.50 APDUs, &yaz; contains
7    a collection of tools that support the development of applications.
8   </para>
9
10   <sect1 id="tools.query"><title>Query Syntax Parsers</title>
11
12    <para>
13     Since the type-1 (RPN) query structure has no direct, useful string
14     representation, every origin application needs to provide some form of
15     mapping from a local query notation or representation to a
16     <token>Z_RPNQuery</token> structure. Some programmers will prefer to
17     construct the query manually, perhaps using
18     <function>odr_malloc()</function> to simplify memory management.
19     The &yaz; distribution includes three separate, query-generating tools
20     that may be of use to you.
21    </para>
22
23    <sect2 id="PQF"><title>Prefix Query Format</title>
24
25     <para>
26      Since RPN or reverse polish notation is really just a fancy way of
27      describing a suffix notation format (operator follows operands), it
28      would seem that the confusion is total when we now introduce a prefix
29      notation for RPN. The reason is one of simple laziness - it's somewhat
30      simpler to interpret a prefix format, and this utility was designed
31      for maximum simplicity, to provide a baseline representation for use
32      in simple test applications and scripting environments (like Tcl). The
33      demonstration client included with YAZ uses the PQF.
34     </para>
35
36     <note>
37      <para>
38       The PQF have been adopted by other parties developing Z39.50
39       software. It is often referred to as Prefix Query Notation
40       - PQN.
41      </para>
42     </note>
43     <para>
44      The PQF is defined by the pquery module in the YAZ library. 
45      There are two sets of function that have similar behavior. First
46      set operates on a PQF parser handle, second set doesn't. First set
47      set of functions are more flexible than the second set. Second set
48      is obsolete and is only provided to ensure backwards compatibility.
49     </para>
50     <para>
51      First set of functions all operate on a PQF parser handle:
52     </para>
53     <synopsis>
54      #include &lt;yaz/pquery.h&gt;
55
56      YAZ_PQF_Parser yaz_pqf_create (void);
57
58      void yaz_pqf_destroy (YAZ_PQF_Parser p);
59
60      Z_RPNQuery *yaz_pqf_parse (YAZ_PQF_Parser p, ODR o, const char *qbuf);
61
62      Z_AttributesPlusTerm *yaz_pqf_scan (YAZ_PQF_Parser p, ODR o,
63                           Odr_oid **attributeSetId, const char *qbuf);
64
65
66      int yaz_pqf_error (YAZ_PQF_Parser p, const char **msg, size_t *off);
67     </synopsis>
68     <para>
69      A PQF parser is created and destructed by functions
70      <function>yaz_pqf_create</function> and
71      <function>yaz_pqf_destroy</function> respectively.
72      Function <function>yaz_pqf_parse</function> parses query given
73      by string <literal>qbuf</literal>. If parsing was successful,
74      a Z39.50 RPN Query is returned which is created using ODR stream
75      <literal>o</literal>. If parsing failed, a NULL pointer is
76      returned.
77      Function <function>yaz_pqf_scan</function> takes a scan query in 
78      <literal>qbuf</literal>. If parsing was successful, the function
79      returns attributes plus term pointer and modifies
80      <literal>attributeSetId</literal> to hold attribute set for the
81      scan request - both allocated using ODR stream <literal>o</literal>.
82      If parsing failed, yaz_pqf_scan returns a NULL pointer.
83      Error information for bad queries can be obtained by a call to
84      <function>yaz_pqf_error</function> which returns an error code and
85      modifies <literal>*msg</literal> to point to an error description,
86      and modifies <literal>*off</literal> to the offset within last
87      query were parsing failed.
88     </para>
89     <para>
90      The second set of functions are declared as follows:
91     </para>
92     <synopsis>
93      #include &lt;yaz/pquery.h&gt;
94
95      Z_RPNQuery *p_query_rpn (ODR o, oid_proto proto, const char *qbuf);
96
97      Z_AttributesPlusTerm *p_query_scan (ODR o, oid_proto proto,
98                              Odr_oid **attributeSetP, const char *qbuf);
99
100      int p_query_attset (const char *arg);
101     </synopsis>
102     <para>
103      The function <function>p_query_rpn()</function> takes as arguments an
104       &odr; stream (see section <link linkend="odr">The ODR Module</link>)
105      to provide a memory source (the structure created is released on
106      the next call to <function>odr_reset()</function> on the stream), a
107      protocol identifier (one of the constants <token>PROTO_Z3950</token> and
108      <token>PROTO_SR</token>), an attribute set reference, and
109      finally a null-terminated string holding the query string.
110     </para>
111     <para>
112      If the parse went well, <function>p_query_rpn()</function> returns a
113      pointer to a <literal>Z_RPNQuery</literal> structure which can be
114      placed directly into a <literal>Z_SearchRequest</literal>. 
115      If parsing failed, due to syntax error, a NULL pointer is returned.
116     </para>
117     <para>
118      The <literal>p_query_attset</literal> specifies which attribute set
119      to use if the query doesn't specify one by the
120      <literal>@attrset</literal> operator.
121      The <literal>p_query_attset</literal> returns 0 if the argument is a
122      valid attribute set specifier; otherwise the function returns -1.
123     </para>
124
125     <para>
126      The grammar of the PQF is as follows:
127     </para>
128
129     <literallayout>
130      query ::= top-set query-struct.
131
132      top-set ::= &lsqb; '@attrset' string &rsqb;
133
134      query-struct ::= attr-spec | simple | complex | '@term' term-type
135
136      attr-spec ::= '@attr' &lsqb; string &rsqb; string query-struct
137
138      complex ::= operator query-struct query-struct.
139
140      operator ::= '@and' | '@or' | '@not' | '@prox' proximity.
141
142      simple ::= result-set | term.
143
144      result-set ::= '@set' string.
145
146      term ::= string.
147
148      proximity ::= exclusion distance ordered relation which-code unit-code.
149
150      exclusion ::= '1' | '0' | 'void'.
151
152      distance ::= integer.
153
154      ordered ::= '1' | '0'.
155
156      relation ::= integer.
157
158      which-code ::= 'known' | 'private' | integer.
159
160      unit-code ::= integer.
161
162      term-type ::= 'general' | 'numeric' | 'string' | 'oid' | 'datetime' | 'null'.
163     </literallayout>
164
165     <para>
166      You will note that the syntax above is a fairly faithful
167      representation of RPN, except for the Attribute, which has been
168      moved a step away from the term, allowing you to associate one or more
169      attributes with an entire query structure. The parser will
170      automatically apply the given attributes to each term as required.
171     </para>
172
173     <para>
174      The @attr operator is followed by an attribute specification 
175      (<literal>attr-spec</literal> above). The specification consists
176      of optional an attribute set, an attribute type-value pair and
177      a sub query. The attribute type-value pair is packed in one string:
178      an attribute type, a dash, followed by an attribute value. 
179      The type is always an integer but the value may be either an
180      integer or a string (if it doesn't start with a digit character).
181     </para>
182
183     <para>
184      Version 3 of the Z39.50 specification defines various encoding of terms.
185      Use <literal>@term </literal> <replaceable>type</replaceable>
186      <replaceable>string</replaceable>,
187      where type is one of: <literal>general</literal>,
188      <literal>numeric</literal> or <literal>string</literal>
189      (for InternationalString).
190      If no term type has been given, the <literal>general</literal> form
191      is used.  This is the only encoding allowed in both versions 2 and 3
192      of the Z39.50 standard.
193     </para>
194     
195     <sect3 id="PQF-prox">
196       <title>Using Proximity Operators with PQF</title>
197       <note>
198         <para>
199           This is an advanced topic, describing how to construct
200           queries that make very specific requirements on the
201           relative location of their operands.
202           You may wish to skip this section and go straight to
203           <link linkend="pqf-examples">the example PQF queries</link>.
204         </para>
205         <para>
206           <warning>
207             <para>
208               Most Z39.50 servers do not support proximity searching, or
209               support only a small subset of the full functionality that
210               can be expressed using the PQF proximity operator.  Be
211               aware that the ability to <emphasis>express</emphasis> a
212               query in PQF is no guarantee that any given server will
213               be able to <emphasis>execute</emphasis> it.
214             </para>
215           </warning>
216         </para>
217       </note>
218       <para>
219         The proximity operator <literal>@prox</literal> is a special
220         and more restrictive version of the conjunction operator
221         <literal>@and</literal>.  Its semantics are described in 
222         section 3.7.2 (Proximity) of Z39.50 the standard itself, which
223         can be read on-line at
224         <ulink url="http://lcweb.loc.gov/z3950/agency/markup/09.html"/>
225       </para>
226       <para>
227         In PQF, the proximity operation is represented by a sequence
228         of the form
229         <screen>
230 @prox <replaceable>exclusion</replaceable> <replaceable>distance</replaceable> <replaceable>ordered</replaceable> <replaceable>relation</replaceable> <replaceable>which-code</replaceable> <replaceable>unit-code</replaceable>
231         </screen>
232         in which the meanings of the parameters are as described in in
233         the standard, and they can take the following values:
234         <itemizedlist>
235           <listitem><formalpara><title>exclusion</title><para>
236             0 = false (i.e. the proximity condition specified by the
237             remaining parameters must be satisfied) or
238             1 = true (the proximity condition specified by the
239             remaining parameters must <emphasis>not</emphasis> be
240             satisifed).
241           </para></formalpara></listitem>
242           <listitem><formalpara><title>distance</title><para>
243             An integer specifying the difference between the locations
244             of the operands: e.g. two adjacent words would have
245             distance=1 since their locations differ by one unit.
246           </para></formalpara></listitem>
247           <listitem><formalpara><title>ordered</title><para>
248             1 = ordered (the operands must occur in the order the
249             query specifies them) or
250             0 = unordered (they may appear in either order).
251           </para></formalpara></listitem>
252           <listitem><formalpara><title>relation</title><para>
253             Recognised values are
254             1 (lessThan),
255             2 (lessThanOrEqual),
256             3 (equal),
257             4 (greaterThanOrEqual),
258             5 (greaterThan) and
259             6 (notEqual).
260           </para></formalpara></listitem>
261           <listitem><formalpara><title>which-code</title><para>
262             <literal>known</literal>
263             or
264             <literal>k</literal>
265             (the unit-code parameter is taken from the well-known list
266             of alternatives described in below) or
267             <literal>private</literal>
268             or
269             <literal>p</literal>
270             (the unit-code paramater has semantics specific to an
271             out-of-band agreement such as a profile).
272           </para></formalpara></listitem>
273           <listitem><formalpara><title>unit-code</title><para>
274             If the which-code parameter is <literal>known</literal>
275             then the recognised values are
276             1 (character),
277             2 (word),
278             3 (sentence),
279             4 (paragraph),
280             5 (section),
281             6 (chapter),
282             7 (document),
283             8 (element),
284             9 (subelement),
285             10 (elementType) and
286             11 (byte).
287             If which-code is <literal>private</literal> then the
288             acceptable values are determined by the profile.
289           </para></formalpara></listitem>
290         </itemizedlist>
291         (The numeric values of the relation and well-known unit-code
292         parameters are taken straight from
293         <ulink url="http://lcweb.loc.gov/z3950/agency/asn1.html#ProximityOperator"
294         >the ASN.1</ulink> of the proximity structure in the standard.)
295       </para>
296     </sect3>
297
298     <sect3 id="pqf-examples"><title>PQF queries</title>
299
300      <para>Queries using simple terms.
301       <screen>
302       dylan
303       "bob dylan"
304       </screen>
305      </para>
306      <para>Boolean operators.
307       <screen>
308        @or "dylan" "zimmerman"
309        @and @or dylan zimmerman when
310        @and when @or dylan zimmerman
311       </screen>
312      </para>
313      <para>
314       Reference to result sets.
315       <screen>
316        @set Result-1
317        @and @set seta setb
318       </screen>
319      </para>
320      <para>
321       Attributes for terms.
322       <screen>
323        @attr 1=4 computer
324        @attr 1=4 @attr 4=1 "self portrait"
325        @attrset exp1 @attr 1=1 CategoryList
326        @attr gils 1=2008 Copenhagen
327        @attr 1=/book/title computer
328       </screen>
329      </para>
330      <para>
331       Proximity.
332       <screen>
333        @prox 0 3 1 2 k 2 dylan zimmerman
334       </screen>
335       <note><para>
336       Here the parameters 0, 3, 1, 2, k and 2 represent exclusion,
337       distance, ordered, relation, which-code and unit-code, in that
338       order.  So:
339       <itemizedlist>
340         <listitem><para>
341           exclusion = 0: the proximity condition must hold
342         </para></listitem>
343         <listitem><para>
344           distance = 3: the terms must be three units apart
345         </para></listitem>
346         <listitem><para>
347           ordered = 1: they must occur in the order they are specified
348         </para></listitem>
349         <listitem><para>
350           relation = 2: lessThanOrEqual (to the distance of 3 units)
351         </para></listitem>
352         <listitem><para>
353           which-code is ``known'', so the standard unit-codes are used
354         </para></listitem>
355         <listitem><para>
356           unit-code = 2: word.
357         </para></listitem>
358       </itemizedlist>
359       So the whole proximity query means that the words
360       <literal>dylan</literal> and <literal>zimmerman</literal> must
361       both occur in the record, in that order, differing in position
362       by three or fewer words (i.e. with two or fewer words between
363       them.)  The query would find ``Bob Dylan, aka. Robert
364       Zimmerman'', but not ``Bob Dylan, born as Robert Zimmerman''
365       since the distance in this case is four.
366       </para></note>
367      </para>
368      <para>
369       Specifying term type.
370       <screen>
371        @term string "a UTF-8 string, maybe?"
372       </screen>
373      </para>
374      <para>Mixed queries
375       <screen>
376        @or @and bob dylan @set Result-1
377        
378        @attr 4=1 @and @attr 1=1 "bob dylan" @attr 1=4 "slow train coming"
379        
380        @and @attr 2=4 @attr gils 1=2038 -114 @attr 2=2 @attr gils 1=2039 -109
381       </screen>
382       <note>
383         <para>
384           The last of these examples is a spatial search: in
385           <ulink url="http://www.gils.net/prof_v2.html#sec_7_4"
386           >the GILS attribute set</ulink>,
387           access point
388           2038 indicates West Bounding Coordinate and
389           2030 indicates East Bounding Coordinate,
390           so the query is for areas extending from -114 degrees
391           to no more than -109 degrees.
392         </para>
393       </note>
394      </para>
395     </sect3>
396    </sect2>
397    <sect2 id="CCL"><title>CCL</title>
398
399     <para>
400      Not all users enjoy typing in prefix query structures and numerical
401      attribute values, even in a minimalistic test client. In the library
402      world, the more intuitive Common Command Language - CCL (ISO 8777)
403      has enjoyed some popularity - especially before the widespread
404      availability of graphical interfaces. It is still useful in
405      applications where you for some reason or other need to provide a
406      symbolic language for expressing boolean query structures.
407     </para>
408
409     <para>
410      The <ulink url="http://europagate.dtv.dk/">EUROPAGATE</ulink>
411      research project working under the Libraries programme
412      of the European Commission's DG XIII has, amongst other useful tools,
413      implemented a general-purpose CCL parser which produces an output
414      structure that can be trivially converted to the internal RPN
415      representation of &yaz; (The <literal>Z_RPNQuery</literal> structure).
416      Since the CCL utility - along with the rest of the software
417      produced by EUROPAGATE - is made freely available on a liberal
418      license, it is included as a supplement to &yaz;.
419     </para>
420
421     <sect3><title>CCL Syntax</title>
422
423      <para>
424       The CCL parser obeys the following grammar for the FIND argument.
425       The syntax is annotated by in the lines prefixed by
426       <literal>&dash;&dash;</literal>.
427      </para>
428
429      <screen>
430       CCL-Find ::= CCL-Find Op Elements
431                 | Elements.
432
433       Op ::= "and" | "or" | "not"
434       -- The above means that Elements are separated by boolean operators.
435
436       Elements ::= '(' CCL-Find ')'
437                 | Set
438                 | Terms
439                 | Qualifiers Relation Terms
440                 | Qualifiers Relation '(' CCL-Find ')'
441                 | Qualifiers '=' string '-' string
442       -- Elements is either a recursive definition, a result set reference, a
443       -- list of terms, qualifiers followed by terms, qualifiers followed
444       -- by a recursive definition or qualifiers in a range (lower - upper).
445
446       Set ::= 'set' = string
447       -- Reference to a result set
448
449       Terms ::= Terms Prox Term
450              | Term
451       -- Proximity of terms.
452
453       Term ::= Term string
454             | string
455       -- This basically means that a term may include a blank
456
457       Qualifiers ::= Qualifiers ',' string
458                   | string
459       -- Qualifiers is a list of strings separated by comma
460
461       Relation ::= '=' | '>=' | '&lt;=' | '&lt;>' | '>' | '&lt;'
462       -- Relational operators. This really doesn't follow the ISO8777
463       -- standard.
464
465       Prox ::= '%' | '!'
466       -- Proximity operator
467
468      </screen>
469      
470      <example><title>CCL queries</title>
471       <para>
472        The following queries are all valid:
473       </para>
474       
475       <screen>
476        dylan
477        
478        "bob dylan"
479        
480        dylan or zimmerman
481        
482        set=1
483        
484        (dylan and bob) or set=1
485        
486       </screen>
487       <para>
488        Assuming that the qualifiers <literal>ti</literal>,
489        <literal>au</literal>
490        and <literal>date</literal> are defined we may use:
491       </para>
492       
493       <screen>
494        ti=self portrait
495        
496        au=(bob dylan and slow train coming)
497
498        date>1980 and (ti=((self portrait)))
499        
500       </screen>
501      </example>
502      
503     </sect3>
504     <sect3><title>CCL Qualifiers</title>
505      
506      <para>
507       Qualifiers are used to direct the search to a particular searchable
508       index, such as title (ti) and author indexes (au). The CCL standard
509       itself doesn't specify a particular set of qualifiers, but it does
510       suggest a few short-hand notations. You can customize the CCL parser
511       to support a particular set of qualifiers to reflect the current target
512       profile. Traditionally, a qualifier would map to a particular
513       use-attribute within the BIB-1 attribute set. It is also
514       possible to set other attributes, such as the structure
515       attribute.
516      </para>
517
518      <para>
519       A  CCL profile is a set of predefined CCL qualifiers that may be
520       read from a file or set in the CCL API.
521       The YAZ client reads its CCL qualifiers from a file named
522       <filename>default.bib</filename>. There are four types of
523       lines in a CCL profile: qualifier specification,
524       qualifier alias, comments and directives.
525      </para>
526      <sect4><title id="qualifier-specification">Qualifier specification</title>
527       <para>
528        A qualifier specification is of the form:
529       </para>
530       
531       <para>
532        <replaceable>qualifier-name</replaceable>  
533        [<replaceable>attributeset</replaceable><literal>,</literal>]<replaceable>type</replaceable><literal>=</literal><replaceable>val</replaceable>
534        [<replaceable>attributeset</replaceable><literal>,</literal>]<replaceable>type</replaceable><literal>=</literal><replaceable>val</replaceable> ...      
535       </para>
536       
537       <para>
538        where <replaceable>qualifier-name</replaceable> is the name of the
539        qualifier to be used (eg. <literal>ti</literal>),
540        <replaceable>type</replaceable> is attribute type in the attribute
541        set (Bib-1 is used if no attribute set is given) and
542        <replaceable>val</replaceable> is attribute value.
543        The <replaceable>type</replaceable> can be specified as an
544        integer or as it be specified either as a single-letter:
545        <literal>u</literal> for use, 
546        <literal>r</literal> for relation,<literal>p</literal> for position,
547        <literal>s</literal> for structure,<literal>t</literal> for truncation
548        or <literal>c</literal> for completeness.
549        The attributes for the special qualifier name <literal>term</literal>
550        are used when no CCL qualifier is given in a query.
551        <table><title>Common Bib-1 attributes</title>
552         <tgroup cols="2">
553          <colspec colwidth="2*" colname="type"></colspec>
554          <colspec colwidth="9*" colname="description"></colspec>
555          <thead>
556           <row>
557            <entry>Type</entry>
558            <entry>Description</entry>
559           </row>
560          </thead>
561          <tbody>
562           <row>
563            <entry><literal>u=</literal><replaceable>value</replaceable></entry>
564            <entry>
565             Use attribute. Common use attributes are
566             1 Personal-name, 4 Title, 7 ISBN, 8 ISSN, 30 Date,
567             62 Subject, 1003 Author), 1016 Any. Specify value
568             as an integer.
569            </entry>
570           </row>
571
572           <row>
573            <entry><literal>r=</literal><replaceable>value</replaceable></entry>
574            <entry>
575             Relation attribute. Common values are
576             1 &lt;, 2 &lt;=, 3 =, 4 &gt;=, 5 &gt;, 6 &lt;&gt;,
577             100 phonetic, 101 stem, 102 relevance, 103 always matches.
578            </entry>
579           </row>
580
581           <row>
582            <entry><literal>p=</literal><replaceable>value</replaceable></entry>
583            <entry>
584             Position attribute. Values: 1 first in field, 2
585             first in any subfield, 3 any position in field.
586            </entry>
587           </row>
588
589           <row>
590            <entry><literal>s=</literal><replaceable>value</replaceable></entry>
591            <entry>
592             Structure attribute. Values: 1 phrase, 2 word,
593             3 key, 4 year, 5 date, 6 word list, 100 date (un),
594             101 name (norm), 102 name (un), 103 structure, 104 urx,
595             105 free-form-text, 106 document-text, 107 local-number,
596             108 string, 109 numeric string.
597            </entry>
598           </row>
599
600           <row>
601            <entry><literal>t=</literal><replaceable>value</replaceable></entry>
602            <entry>
603             Truncation attribute. Values: 1 right, 2 left,
604             3 left&amp; right, 100 none, 101 process #, 102 regular-1,
605             103 regular-2, 104 CCL.
606            </entry>
607           </row>
608
609           <row>
610            <entry><literal>c=</literal><replaceable>value</replaceable></entry>
611            <entry>
612             Completeness attribute. Values: 1 incomplete subfield,
613             2 complete subfield, 3 complete field.
614            </entry>
615           </row>
616
617          </tbody>
618          </tgroup>
619         </table>
620       </para>
621       <para>
622        The complete list of Bib-1 attributes can be found 
623        <ulink url="http://lcweb.loc.gov/z3950/agency/defns/bib1.html">
624         here
625        </ulink>.
626       </para>
627       <para>
628        It is also possible to specify non-numeric attribute values, 
629        which are used in combination with certain types.
630        The special combinations are:
631        
632        <table><title>Special attribute combos</title>
633         <tgroup cols="2">
634          <colspec colwidth="2*" colname="name"></colspec>
635          <colspec colwidth="9*" colname="description"></colspec>
636          <thead>
637           <row>
638            <entry>Name</entry>
639            <entry>Description</entry>
640           </row>
641          </thead>
642          <tbody>
643           <row>
644            <entry><literal>s=pw</literal></entry><entry>
645             The structure is set to either word or phrase depending
646             on the number of tokens in a term (phrase-word).
647            </entry>
648           </row>
649           <row>
650            <entry><literal>s=al</literal></entry><entry>
651             Each token in the term is ANDed. (and-list).
652             This does not set the structure at all.
653            </entry>
654           </row>
655           
656           <row><entry><literal>s=ol</literal></entry><entry>
657             Each token in the term is ORed. (or-list).
658             This does not set the structure at all.
659            </entry>
660           </row>
661           
662           <row><entry><literal>r=o</literal></entry><entry>
663             Allows operators greather-than, less-than, ... equals and
664             sets relation attribute accordingly (relation ordered).
665            </entry>
666           </row>
667           
668           <row><entry><literal>t=l</literal></entry><entry>
669             Allows term to be left-truncated.
670             If term is of the form <literal>?x</literal>, the resulting
671             Type-1 term is <literal>x</literal> and truncation is left.
672            </entry>
673           </row>
674           
675           <row><entry><literal>t=r</literal></entry><entry>
676             Allows term to be right-truncated.
677             If term is of the form <literal>x?</literal>, the resulting
678             Type-1 term is <literal>x</literal> and truncation is right.
679            </entry>
680           </row>
681           
682           <row><entry><literal>t=n</literal></entry><entry>
683             If term is does not include <literal>?</literal>, the
684             truncation attribute is set to none (100).
685            </entry>
686           </row>
687           
688           <row><entry><literal>t=b</literal></entry><entry>
689             Allows term to be both left&amp;right truncated.
690             If term is of the form <literal>?x?</literal>, the
691             resulting term is <literal>x</literal> and trunctation is
692             set to both left&amp;right.
693            </entry>
694           </row>
695          </tbody>
696         </tgroup>
697        </table>
698       </para>
699       <example><title>CCL profile</title>
700        <para>
701         Consider the following definition:
702        </para>
703        
704        <screen>
705         ti       u=4 s=1
706         au       u=1 s=1
707         term     s=105
708         ranked   r=102
709         date     u=30 r=o
710       </screen>
711        <para>
712         Four qualifiers are defined - <literal>ti</literal>, 
713         <literal>au</literal>, <literal>ranked</literal> and
714         <literal>date</literal>.
715        </para>
716        <para>
717         <literal>ti</literal> and <literal>au</literal> both set 
718         structure attribute to phrase (s=1).
719         <literal>ti</literal>
720         sets the use-attribute to 4. <literal>au</literal> sets the
721         use-attribute to 1.
722         When no qualifiers are used in the query the structure-attribute is
723         set to free-form-text (105) (rule for <literal>term</literal>).
724         The <literal>date</literal> sets the relation attribute to
725         the relation used in the CCL query and sets the use attribute
726         to 30 (Bib-1 Date).
727        </para>
728        <para>
729         You can combine attributes. To Search for "ranked title" you
730         can do 
731         <screen>
732          ti,ranked=knuth computer
733         </screen>
734         which will set relation=ranked, use=title, structure=phrase.
735        </para>
736        <para>
737         Query
738         <screen>
739          year > 1980
740         </screen>
741         is a valid query, while
742         <screen>
743          ti > 1980
744         </screen>
745         is invalid.
746        </para>
747       </example>
748      </sect4>
749      <sect4><title>Qualifier alias</title>
750       <para>
751        A qualifier alias is of the form:
752       </para>
753       <para>
754        <replaceable>q</replaceable>  
755        <replaceable>q1</replaceable> <replaceable>q2</replaceable> ..
756       </para>
757       <para>
758        which declares <replaceable>q</replaceable> to
759        be an alias for <replaceable>q1</replaceable>, 
760        <replaceable>q2</replaceable>... such that the CCL
761        query <replaceable>q=x</replaceable> is equivalent to
762        <replaceable>q1=x or w2=x or ...</replaceable>.
763       </para>
764      </sect4>
765
766      <sect4><title>Comments</title>
767       <para>
768        Lines with white space or lines that begin with
769        character <literal>#</literal> are treated as comments.
770       </para>
771      </sect4>
772
773      <sect4><title>Directives</title>
774       <para>
775        Directive specifications takes the form
776       </para>
777       <para><literal>@</literal><replaceable>directive</replaceable> <replaceable>value</replaceable>
778       </para>
779       <table><title>CCL directives</title>
780        <tgroup cols="3">
781         <colspec colwidth="2*" colname="name"></colspec>
782         <colspec colwidth="8*" colname="description"></colspec>
783         <colspec colwidth="1*" colname="default"></colspec>
784         <thead>
785          <row>
786           <entry>Name</entry>
787           <entry>Description</entry>
788           <entry>Default</entry>
789          </row>
790         </thead>
791         <tbody>
792          <row>
793           <entry>truncation</entry>
794           <entry>Truncation character</entry>
795           <entry><literal>?</literal></entry>
796          </row>
797          <row>
798           <entry>field</entry>
799           <entry>Specifies how multiple fields are to be
800            combined. There are two modes: <literal>or</literal>:
801            multiple qualifier fields are ORed,
802            <literal>merge</literal>: attributes for the qualifier
803            fields are merged and assigned to one term.
804            </entry>
805           <entry><literal>merge</literal></entry>
806          </row>
807          <row>
808           <entry>case</entry>
809           <entry>Specificies if CCL operatores and qualifiers should be
810            compared with case sensitivity or not. Specify 0 for
811            case sensitive; 1 for case insensitive.</entry>
812           <entry><literal>0</literal></entry>
813          </row>
814
815          <row>
816           <entry>and</entry>
817           <entry>Specifies token for CCL operator AND.</entry>
818           <entry><literal>and</literal></entry>
819          </row>
820
821          <row>
822           <entry>or</entry>
823           <entry>Specifies token for CCL operator OR.</entry>
824           <entry><literal>or</literal></entry>
825          </row>
826
827          <row>
828           <entry>not</entry>
829           <entry>Specifies token for CCL operator NOT.</entry>
830           <entry><literal>not</literal></entry>
831          </row>
832
833          <row>
834           <entry>set</entry>
835           <entry>Specifies token for CCL operator SET.</entry>
836           <entry><literal>set</literal></entry>
837          </row>
838         </tbody>
839         </tgroup>
840       </table>
841      </sect4>
842     </sect3>
843     <sect3><title>CCL API</title>
844      <para>
845       All public definitions can be found in the header file
846       <filename>ccl.h</filename>. A profile identifier is of type
847       <literal>CCL_bibset</literal>. A profile must be created with the call
848       to the function <function>ccl_qual_mk</function> which returns a profile
849       handle of type <literal>CCL_bibset</literal>.
850      </para>
851
852      <para>
853       To read a file containing qualifier definitions the function
854       <function>ccl_qual_file</function> may be convenient. This function
855       takes an already opened <literal>FILE</literal> handle pointer as
856       argument along with a <literal>CCL_bibset</literal> handle.
857      </para>
858
859      <para>
860       To parse a simple string with a FIND query use the function
861      </para>
862      <screen>
863 struct ccl_rpn_node *ccl_find_str (CCL_bibset bibset, const char *str,
864                                    int *error, int *pos);
865      </screen>
866      <para>
867       which takes the CCL profile (<literal>bibset</literal>) and query
868       (<literal>str</literal>) as input. Upon successful completion the RPN
869       tree is returned. If an error occur, such as a syntax error, the integer
870       pointed to by <literal>error</literal> holds the error code and
871       <literal>pos</literal> holds the offset inside query string in which
872       the parsing failed.
873      </para>
874
875      <para>
876       An English representation of the error may be obtained by calling
877       the <literal>ccl_err_msg</literal> function. The error codes are
878       listed in <filename>ccl.h</filename>.
879      </para>
880
881      <para>
882       To convert the CCL RPN tree (type
883       <literal>struct ccl_rpn_node *</literal>)
884       to the Z_RPNQuery of YAZ the function <function>ccl_rpn_query</function>
885       must be used. This function which is part of YAZ is implemented in
886       <filename>yaz-ccl.c</filename>.
887       After calling this function the CCL RPN tree is probably no longer
888       needed. The <literal>ccl_rpn_delete</literal> destroys the CCL RPN tree.
889      </para>
890
891      <para>
892       A CCL profile may be destroyed by calling the
893       <function>ccl_qual_rm</function> function.
894      </para>
895
896      <para>
897       The token names for the CCL operators may be changed by setting the
898       globals (all type <literal>char *</literal>)
899       <literal>ccl_token_and</literal>, <literal>ccl_token_or</literal>,
900       <literal>ccl_token_not</literal> and <literal>ccl_token_set</literal>.
901       An operator may have aliases, i.e. there may be more than one name for
902       the operator. To do this, separate each alias with a space character.
903      </para>
904     </sect3>
905    </sect2>
906    <sect2 id="tools.cql"><title>CQL</title>
907     <para>
908      <ulink url="http://www.loc.gov/z3950/agency/zing/cql/">CQL</ulink>
909       - Common Query Language - was defined for the
910      <ulink url="http://www.loc.gov/z3950/agency/zing/srw/">SRW</ulink>
911      protocol.
912      In many ways CQL has a similar syntax to CCL.
913      The objective of CQL is different. Where CCL aims to be
914      an end-user language, CQL is <emphasis>the</emphasis> protocol
915      query language for SRW.
916     </para>
917     <tip>
918      <para>
919       If you are new to CQL, read the 
920       <ulink url="http://zing.z3950.org/cql/intro.html">Gentle
921        Introduction</ulink>.
922      </para>
923     </tip>
924     <para>
925      The CQL parser in &yaz; provides the following:
926      <itemizedlist>
927       <listitem>
928        <para>
929         It parses and validates a CQL query.
930        </para>
931       </listitem>
932       <listitem>
933        <para>
934         It generates a C structure that allows you to convert
935         a CQL query to some other query language, such as SQL.
936        </para>
937       </listitem>
938       <listitem>
939        <para>
940         The parser converts a valid CQL query to PQF, thus providing a
941         way to use CQL for both SRW/SRU servers and Z39.50 targets at the
942         same time.
943        </para>
944       </listitem>
945       <listitem>
946        <para>
947         The parser converts CQL to
948         <ulink url="http://www.loc.gov/z3950/agency/zing/cql/xcql.html">
949          XCQL</ulink>.
950         XCQL is an XML representation of CQL.
951         XCQL is part of the SRW specification. However, since SRU
952         supports CQL only, we don't expect XCQL to be widely used.
953         Furthermore, CQL has the advantage over XCQL that it is
954         easy to read.
955        </para>
956       </listitem>
957      </itemizedlist>
958     </para>
959     <sect3 id="tools.cql.parsing"><title>CQL parsing</title>
960      <para>
961       A CQL parser is represented by the <literal>CQL_parser</literal>
962       handle. Its contents should be considered &yaz; internal (private).
963       <synopsis>
964 #include &lt;yaz/cql.h&gt;
965
966 typedef struct cql_parser *CQL_parser;
967
968 CQL_parser cql_parser_create(void);
969 void cql_parser_destroy(CQL_parser cp);
970       </synopsis>
971      A parser is created by <function>cql_parser_create</function> and
972      is destroyed by <function>cql_parser_destroy</function>.
973      </para>
974      <para>
975       To parse a CQL query string, the following function
976       is provided:
977       <synopsis>
978 int cql_parser_string(CQL_parser cp, const char *str);
979       </synopsis>
980       A CQL query is parsed by the <function>cql_parser_string</function>
981       which takes a query <parameter>str</parameter>.
982       If the query was valid (no syntax errors), then zero is returned;
983       otherwise -1 is returned to indicate a syntax error.
984      </para>
985      <para>
986       <synopsis>
987 int cql_parser_stream(CQL_parser cp,
988                       int (*getbyte)(void *client_data),
989                       void (*ungetbyte)(int b, void *client_data),
990                       void *client_data);
991
992 int cql_parser_stdio(CQL_parser cp, FILE *f);
993       </synopsis>
994       The functions <function>cql_parser_stream</function> and
995       <function>cql_parser_stdio</function> parses a CQL query
996       - just like <function>cql_parser_string</function>.
997       The only difference is that the CQL query can be
998       fed to the parser in different ways.
999       The <function>cql_parser_stream</function> uses a generic
1000       byte stream as input. The <function>cql_parser_stdio</function>
1001       uses a <literal>FILE</literal> handle which is opened for reading.
1002      </para>
1003     </sect3>
1004     
1005     <sect3 id="tools.cql.tree"><title>CQL tree</title>
1006      <para>
1007       The the query string is valid, the CQL parser
1008       generates a tree representing the structure of the
1009       CQL query.
1010      </para>
1011      <para>
1012       <synopsis>
1013 struct cql_node *cql_parser_result(CQL_parser cp);
1014       </synopsis>
1015       <function>cql_parser_result</function> returns the
1016       a pointer to the root node of the resulting tree.
1017      </para>
1018      <para>
1019       Each node in a CQL tree is represented by a 
1020       <literal>struct cql_node</literal>.
1021       It is defined as follows:
1022       <synopsis>
1023 #define CQL_NODE_ST 1
1024 #define CQL_NODE_BOOL 2
1025 #define CQL_NODE_MOD 3
1026 struct cql_node {
1027     int which;
1028     union {
1029         struct {
1030             char *index;
1031             char *term;
1032             char *relation;
1033             struct cql_node *modifiers;
1034             struct cql_node *prefixes;
1035         } st;
1036         struct {
1037             char *value;
1038             struct cql_node *left;
1039             struct cql_node *right;
1040             struct cql_node *modifiers;
1041             struct cql_node *prefixes;
1042         } boolean;
1043         struct {
1044             char *name;
1045             char *value;
1046             struct cql_node *next;
1047         } mod;
1048     } u;
1049 };
1050       </synopsis>
1051       There are three kinds of nodes, search term (ST), boolean (BOOL),
1052       and modifier (MOD).
1053      </para>
1054      <para>
1055       The search term node has five members:
1056       <itemizedlist>
1057        <listitem>
1058         <para>
1059          <literal>index</literal>: index for search term.
1060          If an index is unspecified for a search term,
1061          <literal>index</literal> will be NULL.
1062         </para>
1063        </listitem>
1064        <listitem>
1065         <para>
1066          <literal>term</literal>: the search term itself.
1067         </para>
1068        </listitem>
1069        <listitem>
1070         <para>
1071          <literal>relation</literal>: relation for search term.
1072         </para>
1073        </listitem>
1074        <listitem>
1075         <para>
1076          <literal>modifiers</literal>: relation modifiers for search
1077          term. The <literal>modifiers</literal> is a simple linked
1078          list (NULL for last entry). Each relation modifier node
1079          is of type <literal>MOD</literal>.
1080         </para>
1081        </listitem>
1082        <listitem>
1083         <para>
1084          <literal>prefixes</literal>: index prefixes for search
1085          term. The <literal>prefixes</literal> is a simple linked
1086          list (NULL for last entry). Each prefix node
1087          is of type <literal>MOD</literal>.
1088         </para>
1089        </listitem>
1090       </itemizedlist>
1091      </para>
1092
1093      <para>
1094       The boolean node represents both <literal>and</literal>,
1095       <literal>or</literal>, not as well as
1096       proximity.
1097       <itemizedlist>
1098        <listitem>
1099         <para>
1100          <literal>left</literal> and <literal>right</literal>: left
1101          - and right operand respectively.
1102         </para>
1103        </listitem>
1104        <listitem>
1105         <para>
1106          <literal>modifiers</literal>: proximity arguments.
1107         </para>
1108        </listitem>
1109        <listitem>
1110         <para>
1111          <literal>prefixes</literal>: index prefixes.
1112          The <literal>prefixes</literal> is a simple linked
1113          list (NULL for last entry). Each prefix node
1114          is of type <literal>MOD</literal>.
1115         </para>
1116        </listitem>
1117       </itemizedlist>
1118      </para>
1119
1120      <para>
1121       The modifier node is a "utility" node used for name-value pairs,
1122       such as prefixes, proximity arguements, etc.
1123       <itemizedlist>
1124        <listitem>
1125         <para>
1126          <literal>name</literal> name of mod node.
1127         </para>
1128        </listitem>
1129        <listitem>
1130         <para>
1131          <literal>value</literal> value of mod node.
1132         </para>
1133        </listitem>
1134        <listitem>
1135         <para>
1136          <literal>next</literal>: pointer to next node which is
1137          always a mod node (NULL for last entry).
1138         </para>
1139        </listitem>
1140       </itemizedlist>
1141      </para>
1142
1143     </sect3>
1144     <sect3 id="tools.cql.pqf"><title>CQL to PQF conversion</title>
1145      <para>
1146       Conversion to PQF (and Z39.50 RPN) is tricky by the fact
1147       that the resulting RPN depends on the Z39.50 target
1148       capabilities (combinations of supported attributes). 
1149       In addition, the CQL and SRW operates on index prefixes
1150       (URI or strings), whereas the RPN uses Object Identifiers
1151       for attribute sets.
1152      </para>
1153      <para>
1154       The CQL library of &yaz; defines a <literal>cql_transform_t</literal>
1155       type. It represents a particular mapping between CQL and RPN.
1156       This handle is created and destroyed by the functions:
1157      <synopsis>
1158 cql_transform_t cql_transform_open_FILE (FILE *f);
1159 cql_transform_t cql_transform_open_fname(const char *fname);
1160 void cql_transform_close(cql_transform_t ct);
1161       </synopsis>
1162       The first two functions create a tranformation handle from
1163       either an already open FILE or from a filename respectively.
1164      </para>
1165      <para>
1166       The handle is destroyed by <function>cql_transform_close</function> 
1167       in which case no further reference of the handle is allowed.
1168      </para>
1169      <para>
1170       When a <literal>cql_transform_t</literal> handle has been created
1171       you can convert to RPN.
1172       <synopsis>
1173 int cql_transform_buf(cql_transform_t ct,
1174                       struct cql_node *cn, char *out, int max);
1175       </synopsis>
1176       This function converts the CQL tree <literal>cn</literal> 
1177       using handle <literal>ct</literal>.
1178       For the resulting PQF, you supply a buffer <literal>out</literal>
1179       which must be able to hold at at least <literal>max</literal>
1180       characters.
1181      </para>
1182      <para>
1183       If conversion failed, <function>cql_transform_buf</function>
1184       returns a non-zero SRW error code; otherwise zero is returned
1185       (conversion successful).  The meanings of the numeric error
1186       codes are listed in the SRW specifications at
1187       <ulink url="http://www.loc.gov/srw/diagnostic-list.html"/>
1188      </para>
1189      <para>
1190       If conversion fails, more information can be obtained by calling
1191       <synopsis>
1192 int cql_transform_error(cql_transform_t ct, char **addinfop);
1193       </synopsis>
1194       This function returns the most recently returned numeric
1195       error-code and sets the string-pointer at
1196       <literal>*addinfop</literal> to point to a string containing
1197       additional information about the error that occurred: for
1198       example, if the error code is 15 (``Illegal or unsupported index
1199       set''), the additional information is the name of the requested
1200       index set that was not recognised.
1201      </para>
1202      <para>
1203       The SRW error-codes may be translated into brief human-readable
1204       error messages using
1205       <synopsis>
1206 const char *cql_strerror(int code);
1207       </synopsis>
1208      </para>
1209      <para>
1210       If you wish to be able to produce a PQF result in a different
1211       way, there are two alternatives.
1212       <synopsis>
1213 void cql_transform_pr(cql_transform_t ct,
1214                       struct cql_node *cn,
1215                       void (*pr)(const char *buf, void *client_data),
1216                       void *client_data);
1217
1218 int cql_transform_FILE(cql_transform_t ct,
1219                        struct cql_node *cn, FILE *f);
1220       </synopsis>
1221       The former function produces output to a user-defined
1222       output stream. The latter writes the result to an already
1223       open <literal>FILE</literal>.
1224      </para>
1225     </sect3>
1226     <sect3 id="tools.cql.map">
1227      <title>Specification of CQL to RPN mapping</title>
1228      <para>
1229       The file supplied to functions 
1230       <function>cql_transform_open_FILE</function>,
1231       <function>cql_transform_open_fname</function> follows
1232       a structure found in many Unix utilities.
1233       It consists of mapping specifications - one per line.
1234       Lines starting with <literal>#</literal> are ignored (comments).
1235      </para>
1236      <para>
1237       Each line is of the form
1238       <literallayout>
1239        <replaceable>CQL pattern</replaceable><literal> = </literal> <replaceable> RPN equivalent</replaceable>
1240       </literallayout>
1241      </para>
1242      <para>
1243       An RPN pattern is a simple attribute list. Each attribute pair
1244       takes the form:
1245       <literallayout>
1246        [<replaceable>set</replaceable>] <replaceable>type</replaceable><literal>=</literal><replaceable>value</replaceable>
1247       </literallayout>
1248       The attribute <replaceable>set</replaceable> is optional.
1249       The <replaceable>type</replaceable> is the attribute type,
1250       <replaceable>value</replaceable> the attribute value.
1251      </para>
1252      <para>
1253       The following CQL patterns are recognized:
1254       <variablelist>
1255        <varlistentry><term>
1256          <literal>qualifier.</literal><replaceable>set</replaceable><literal>.</literal><replaceable>name</replaceable>
1257         </term>
1258         <listitem>
1259          <para>
1260           This pattern is invoked when a CQL qualifier, such as 
1261           dc.title is converted. <replaceable>set</replaceable>
1262           and <replaceable>name</replaceable> is the index set and qualifier
1263           name respectively.
1264           Typically, the RPN specifies an equivalent use attribute.
1265          </para>
1266          <para>
1267           For terms not bound by a qualifier the pattern
1268           <literal>qualifier.srw.serverChoice</literal> is used.
1269           Here, the prefix <literal>srw</literal> is defined as
1270           <literal>http://www.loc.gov/zing/cql/srw-indexes/v1.0/</literal>.
1271           If this pattern is not defined, the mapping will fail.
1272          </para>
1273         </listitem>
1274        </varlistentry>
1275        <varlistentry><term>
1276          <literal>relation.</literal><replaceable>relation</replaceable>
1277         </term>
1278         <listitem>
1279          <para>
1280           This pattern specifies how a CQL relation is mapped to RPN.
1281           <replaceable>pattern</replaceable> is name of relation
1282           operator. Since <literal>=</literal> is used as
1283           separator between CQL pattern and RPN, CQL relations
1284           including <literal>=</literal> cannot be
1285           used directly. To avoid a conflict, the names
1286           <literal>ge</literal>,
1287           <literal>eq</literal>,
1288           <literal>le</literal>,
1289           must be used for CQL operators, greater-than-or-equal,
1290           equal, less-than-or-equal respectively.
1291           The RPN pattern is supposed to include a relation attribute.
1292          </para>
1293          <para>
1294           For terms not bound by a relation, the pattern
1295           <literal>relation.scr</literal> is used. If the pattern
1296           is not defined, the mapping will fail.
1297          </para>
1298          <para>
1299           The special pattern, <literal>relation.*</literal> is used
1300           when no other relation pattern is matched.
1301          </para>
1302         </listitem>
1303        </varlistentry>
1304
1305        <varlistentry><term>
1306          <literal>relationModifier.</literal><replaceable>mod</replaceable>
1307         </term>
1308         <listitem>
1309          <para>
1310           This pattern specifies how a CQL relation modifier is mapped to RPN.
1311           The RPN pattern is usually a relation attribute.
1312          </para>
1313         </listitem>
1314        </varlistentry>
1315
1316        <varlistentry><term>
1317          <literal>structure.</literal><replaceable>type</replaceable>
1318         </term>
1319         <listitem>
1320          <para>
1321           This pattern specifies how a CQL structure is mapped to RPN.
1322           Note that this CQL pattern is somewhat to similar to
1323           CQL pattern <literal>relation</literal>. 
1324           The <replaceable>type</replaceable> is a CQL relation.
1325          </para>
1326          <para>
1327           The pattern, <literal>structure.*</literal> is used
1328           when no other structure pattern is matched.
1329           Usually, the RPN equivalent specifies a structure attribute.
1330          </para>
1331         </listitem>
1332        </varlistentry>
1333
1334        <varlistentry><term>
1335          <literal>position.</literal><replaceable>type</replaceable>
1336         </term>
1337         <listitem>
1338          <para>
1339           This pattern specifies how the anchor (position) of
1340           CQL is mapped to RPN.
1341           The <replaceable>type</replaceable> is one
1342           of <literal>first</literal>, <literal>any</literal>,
1343           <literal>last</literal>, <literal>firstAndLast</literal>.
1344          </para>
1345          <para>
1346           The pattern, <literal>position.*</literal> is used
1347           when no other position pattern is matched.
1348          </para>
1349         </listitem>
1350        </varlistentry>
1351
1352        <varlistentry><term>
1353          <literal>set.</literal><replaceable>prefix</replaceable>
1354         </term>
1355         <listitem>
1356          <para>
1357           This specification defines a CQL index set for a given prefix.
1358           The value on the right hand side is the URI for the set - 
1359           <emphasis>not</emphasis> RPN. All prefixes used in
1360           qualifier patterns must be defined this way.
1361          </para>
1362         </listitem>
1363        </varlistentry>
1364       </variablelist>
1365      </para>
1366      <example><title>CQL to RPN mapping file</title>
1367       <para>
1368        This simple file defines two index sets, three qualifiers and three
1369        relations, a position pattern and a default structure.
1370       </para>
1371       <programlisting><![CDATA[
1372        set.srw    = http://www.loc.gov/zing/cql/srw-indexes/v1.0/
1373        set.dc     = http://www.loc.gov/zing/cql/dc-indexes/v1.0/
1374
1375        qualifier.srw.serverChoice = 1=1016
1376        qualifier.dc.title         = 1=4
1377        qualifier.dc.subject       = 1=21
1378   
1379        relation.<                 = 2=1
1380        relation.eq                = 2=3
1381        relation.scr               = 2=3
1382
1383        position.any               = 3=3 6=1
1384
1385        structure.*                = 4=1
1386 ]]>
1387       </programlisting>
1388       <para>
1389        With the mappings above, the CQL query
1390        <screen>
1391         computer
1392        </screen>
1393        is converted to the PQF:
1394        <screen>
1395         @attr 1=1016 @attr 2=3 @attr 4=1 @attr 3=3 @attr 6=1 "computer"
1396        </screen>
1397        by rules <literal>qualifier.srw.serverChoice</literal>,
1398        <literal>relation.scr</literal>, <literal>structure.*</literal>,
1399        <literal>position.any</literal>.
1400       </para>
1401       <para>
1402        CQL query
1403        <screen>
1404         computer^
1405        </screen>
1406        is rejected, since <literal>position.right</literal> is
1407        undefined.
1408       </para>
1409       <para>
1410        CQL query
1411        <screen>
1412         >my = "http://www.loc.gov/zing/cql/dc-indexes/v1.0/" my.title = x
1413        </screen>
1414        is converted to
1415        <screen>
1416         @attr 1=4 @attr 2=3 @attr 4=1 @attr 3=3 @attr 6=1 "x"
1417        </screen>
1418       </para>
1419      </example>
1420     </sect3>
1421     <sect3 id="tools.cql.xcql"><title>CQL to XCQL conversion</title>
1422      <para>
1423       Conversion from CQL to XCQL is trivial and does not
1424       require a mapping to be defined.
1425       There three functions to choose from depending on the
1426       way you wish to store the resulting output (XML buffer
1427       containing XCQL).
1428       <synopsis>
1429 int cql_to_xml_buf(struct cql_node *cn, char *out, int max);
1430 void cql_to_xml(struct cql_node *cn, 
1431                 void (*pr)(const char *buf, void *client_data),
1432                 void *client_data);
1433 void cql_to_xml_stdio(struct cql_node *cn, FILE *f);
1434       </synopsis>
1435       Function <function>cql_to_xml_buf</function> converts
1436       to XCQL and stores result in a user supplied buffer of a given
1437       max size.
1438      </para>
1439      <para>
1440       <function>cql_to_xml</function> writes the result in
1441       a user defined output stream.
1442       <function>cql_to_xml_stdio</function> writes to a
1443       a file.
1444      </para>
1445     </sect3>
1446    </sect2>
1447   </sect1>
1448   <sect1 id="tools.oid"><title>Object Identifiers</title>
1449
1450    <para>
1451     The basic YAZ representation of an OID is an array of integers,
1452     terminated with the value -1. The &odr; module provides two
1453     utility-functions to create and copy this type of data elements:
1454    </para>
1455
1456    <screen>
1457     Odr_oid *odr_getoidbystr(ODR o, char *str);
1458    </screen>
1459
1460    <para>
1461     Creates an OID based on a string-based representation using dots (.)
1462     to separate elements in the OID.
1463    </para>
1464
1465    <screen>
1466     Odr_oid *odr_oiddup(ODR odr, Odr_oid *o);
1467    </screen>
1468
1469    <para>
1470     Creates a copy of the OID referenced by the <emphasis>o</emphasis>
1471     parameter.
1472     Both functions take an &odr; stream as parameter. This stream is used to
1473     allocate memory for the data elements, which is released on a
1474     subsequent call to <function>odr_reset()</function> on that stream.
1475    </para>
1476
1477    <para>
1478     The OID module provides a higher-level representation of the
1479     family of object identifiers which describe the Z39.50 protocol and its
1480     related objects. The definition of the module interface is given in
1481     the <filename>oid.h</filename> file.
1482    </para>
1483
1484    <para>
1485     The interface is mainly based on the <literal>oident</literal> structure.
1486     The definition of this structure looks like this:
1487    </para>
1488
1489    <screen>
1490 typedef struct oident
1491 {
1492     oid_proto proto;
1493     oid_class oclass;
1494     oid_value value;
1495     int oidsuffix[OID_SIZE];
1496     char *desc;
1497 } oident;
1498    </screen>
1499
1500    <para>
1501     The proto field takes one of the values
1502    </para>
1503
1504    <screen>
1505     PROTO_Z3950
1506     PROTO_GENERAL
1507    </screen>
1508
1509    <para>
1510     Use <literal>PROTO_Z3950</literal> for Z39.50 Object Identifers,
1511     <literal>PROTO_GENERAL</literal> for other types (such as
1512     those associated with ILL).
1513    </para>
1514    <para>
1515
1516     The oclass field takes one of the values
1517    </para>
1518
1519    <screen>
1520     CLASS_APPCTX
1521     CLASS_ABSYN
1522     CLASS_ATTSET
1523     CLASS_TRANSYN
1524     CLASS_DIAGSET
1525     CLASS_RECSYN
1526     CLASS_RESFORM
1527     CLASS_ACCFORM
1528     CLASS_EXTSERV
1529     CLASS_USERINFO
1530     CLASS_ELEMSPEC
1531     CLASS_VARSET
1532     CLASS_SCHEMA
1533     CLASS_TAGSET
1534     CLASS_GENERAL
1535    </screen>
1536
1537    <para>
1538     corresponding to the OID classes defined by the Z39.50 standard.
1539
1540     Finally, the value field takes one of the values
1541    </para>
1542
1543    <screen>
1544     VAL_APDU
1545     VAL_BER
1546     VAL_BASIC_CTX
1547     VAL_BIB1
1548     VAL_EXP1
1549     VAL_EXT1
1550     VAL_CCL1
1551     VAL_GILS
1552     VAL_WAIS
1553     VAL_STAS
1554     VAL_DIAG1
1555     VAL_ISO2709
1556     VAL_UNIMARC
1557     VAL_INTERMARC
1558     VAL_CCF
1559     VAL_USMARC
1560     VAL_UKMARC
1561     VAL_NORMARC
1562     VAL_LIBRISMARC
1563     VAL_DANMARC
1564     VAL_FINMARC
1565     VAL_MAB
1566     VAL_CANMARC
1567     VAL_SBN
1568     VAL_PICAMARC
1569     VAL_AUSMARC
1570     VAL_IBERMARC
1571     VAL_EXPLAIN
1572     VAL_SUTRS
1573     VAL_OPAC
1574     VAL_SUMMARY
1575     VAL_GRS0
1576     VAL_GRS1
1577     VAL_EXTENDED
1578     VAL_RESOURCE1
1579     VAL_RESOURCE2
1580     VAL_PROMPT1
1581     VAL_DES1
1582     VAL_KRB1
1583     VAL_PRESSET
1584     VAL_PQUERY
1585     VAL_PCQUERY
1586     VAL_ITEMORDER
1587     VAL_DBUPDATE
1588     VAL_EXPORTSPEC
1589     VAL_EXPORTINV
1590     VAL_NONE
1591     VAL_SETM
1592     VAL_SETG
1593     VAL_VAR1
1594     VAL_ESPEC1
1595    </screen>
1596
1597    <para>
1598     again, corresponding to the specific OIDs defined by the standard.
1599     Refer to the
1600     <ulink url="http://lcweb.loc.gov/z3950/agency/defns/oids.html">
1601      Registry of Z39.50 Object Identifiers</ulink> for the
1602      whole list.
1603    </para>
1604
1605    <para>
1606     The desc field contains a brief, mnemonic name for the OID in question.
1607    </para>
1608
1609    <para>
1610     The function
1611    </para>
1612
1613    <screen>
1614     struct oident *oid_getentbyoid(int *o);
1615    </screen>
1616
1617    <para>
1618     takes as argument an OID, and returns a pointer to a static area
1619     containing an <literal>oident</literal> structure. You typically use
1620     this function when you receive a PDU containing an OID, and you wish
1621     to branch out depending on the specific OID value.
1622    </para>
1623
1624    <para>
1625     The function
1626    </para>
1627
1628    <screen>
1629     int *oid_ent_to_oid(struct oident *ent, int *dst);
1630    </screen>
1631
1632    <para>
1633     Takes as argument an <literal>oident</literal> structure - in which
1634     the <literal>proto</literal>, <literal>oclass</literal>/, and
1635     <literal>value</literal> fields are assumed to be set correctly -
1636     and returns a pointer to a the buffer as given by <literal>dst</literal>
1637     containing the base
1638     representation of the corresponding OID. The function returns
1639     NULL and the array dst is unchanged if a mapping couldn't place.
1640     The array <literal>dst</literal> should be at least of size
1641     <literal>OID_SIZE</literal>.
1642    </para>
1643    <para>
1644
1645     The <function>oid_ent_to_oid()</function> function can be used whenever
1646     you need to prepare a PDU containing one or more OIDs. The separation of
1647     the <literal>protocol</literal> element from the remainder of the
1648     OID-description makes it simple to write applications that can
1649     communicate with either Z39.50 or OSI SR-based applications.
1650    </para>
1651
1652    <para>
1653     The function
1654    </para>
1655
1656    <screen>
1657     oid_value oid_getvalbyname(const char *name);
1658    </screen>
1659
1660    <para>
1661     takes as argument a mnemonic OID name, and returns the
1662     <literal>/value</literal> field of the first entry in the database that 
1663     contains the given name in its <literal>desc</literal> field.
1664    </para>
1665
1666    <para>
1667     Three utility functions are provided for translating OIDs'
1668     symbolic names (e.g. <literal>Usmarc</literal> into OID structures
1669     (int arrays) and strings containing the OID in dotted notation
1670     (e.g. <literal>1.2.840.10003.9.5.1</literal>).  They are:
1671    </para>
1672
1673    <screen>
1674     int *oid_name_to_oid(oid_class oclass, const char *name, int *oid);
1675     char *oid_to_dotstring(const int *oid, char *oidbuf);
1676     char *oid_name_to_dotstring(oid_class oclass, const char *name, char *oidbuf);
1677    </screen>
1678
1679    <para>
1680     <literal>oid_name_to_oid()</literal>
1681      translates the specified symbolic <literal>name</literal>,
1682      interpreted as being of class <literal>oclass</literal>.  (The
1683      class must be specified as many symbolic names exist within
1684      multiple classes - for example, <literal>Zthes</literal> is the
1685      symbolic name of an attribute set, a schema and a tag-set.)  The
1686      sequence of integers representing the OID is written into the
1687      area <literal>oid</literal> provided by the caller; it is the
1688      caller's responsibility to ensure that this area is large enough
1689      to contain the translated OID.  As a convenience, the address of
1690      the buffer (i.e. the value of <literal>oid</literal>) is
1691      returned.
1692    </para>
1693    <para>
1694     <literal>oid_to_dotstring()</literal>
1695     Translates the int-array <literal>oid</literal> into a dotted
1696     string which is written into the area <literal>oidbuf</literal>
1697     supplied by the caller; it is the caller's responsibility to
1698     ensure that this area is large enough.  The address of the buffer
1699     is returned.
1700    </para>
1701    <para>
1702     <literal>oid_name_to_dotstring()</literal>
1703     combines the previous two functions to derive a dotted string
1704     representing the OID specified by <literal>oclass</literal> and
1705     <literal>name</literal>, writing it into the buffer passed as
1706     <literal>oidbuf</literal> and returning its address.
1707    </para>
1708
1709    <para>
1710     Finally, the module provides the following utility functions, whose
1711     meaning should be obvious:
1712    </para>
1713
1714    <screen>
1715     void oid_oidcpy(int *t, int *s);
1716     void oid_oidcat(int *t, int *s);
1717     int oid_oidcmp(int *o1, int *o2);
1718     int oid_oidlen(int *o);
1719    </screen>
1720
1721    <note>
1722     <para>
1723      The OID module has been criticized - and perhaps rightly so
1724      - for needlessly abstracting the
1725      representation of OIDs. Other toolkits use a simple
1726      string-representation of OIDs with good results. In practice, we have
1727      found the interface comfortable and quick to work with, and it is a
1728      simple matter (for what it's worth) to create applications compatible
1729      with both ISO SR and Z39.50. Finally, the use of the
1730      <literal>/oident</literal> database is by no means mandatory.
1731      You can easily create your own system for representing OIDs, as long
1732      as it is compatible with the low-level integer-array representation
1733      of the ODR module.
1734     </para>
1735    </note>
1736
1737   </sect1>
1738
1739   <sect1 id="tools.nmem"><title>Nibble Memory</title>
1740
1741    <para>
1742     Sometimes when you need to allocate and construct a large,
1743     interconnected complex of structures, it can be a bit of a pain to
1744     release the associated memory again. For the structures describing the
1745     Z39.50 PDUs and related structures, it is convenient to use the
1746     memory-management system of the &odr; subsystem (see
1747     <link linkend="odr-use">Using ODR</link>). However, in some circumstances
1748     where you might otherwise benefit from using a simple nibble memory
1749     management system, it may be impractical to use
1750     <function>odr_malloc()</function> and <function>odr_reset()</function>.
1751     For this purpose, the memory manager which also supports the &odr;
1752     streams is made available in the NMEM module. The external interface
1753     to this module is given in the <filename>nmem.h</filename> file.
1754    </para>
1755
1756    <para>
1757     The following prototypes are given:
1758    </para>
1759
1760    <screen>
1761     NMEM nmem_create(void);
1762     void nmem_destroy(NMEM n);
1763     void *nmem_malloc(NMEM n, int size);
1764     void nmem_reset(NMEM n);
1765     int nmem_total(NMEM n);
1766     void nmem_init(void);
1767     void nmem_exit(void);
1768    </screen>
1769
1770    <para>
1771     The <function>nmem_create()</function> function returns a pointer to a
1772     memory control handle, which can be released again by
1773     <function>nmem_destroy()</function> when no longer needed.
1774     The function <function>nmem_malloc()</function> allocates a block of
1775     memory of the requested size. A call to <function>nmem_reset()</function>
1776     or <function>nmem_destroy()</function> will release all memory allocated
1777     on the handle since it was created (or since the last call to
1778     <function>nmem_reset()</function>. The function
1779     <function>nmem_total()</function> returns the number of bytes currently
1780     allocated on the handle.
1781    </para>
1782
1783    <para>
1784     The nibble memory pool is shared amongst threads. POSIX
1785     mutex'es and WIN32 Critical sections are introduced to keep the
1786     module thread safe. Function <function>nmem_init()</function>
1787     initializes the nibble memory library and it is called automatically
1788     the first time the <literal>YAZ.DLL</literal> is loaded. &yaz; uses
1789     function <function>DllMain</function> to achieve this. You should
1790     <emphasis>not</emphasis> call <function>nmem_init</function> or
1791     <function>nmem_exit</function> unless you're absolute sure what
1792     you're doing. Note that in previous &yaz; versions you'd have to call
1793     <function>nmem_init</function> yourself. 
1794    </para>
1795
1796   </sect1>
1797  </chapter>
1798  
1799  <!-- Keep this comment at the end of the file
1800  Local variables:
1801  mode: sgml
1802  sgml-omittag:t
1803  sgml-shorttag:t
1804  sgml-minimize-attributes:nil
1805  sgml-always-quote-attributes:t
1806  sgml-indent-step:1
1807  sgml-indent-data:t
1808  sgml-parent-document: "yaz.xml"
1809  sgml-local-catalogs: nil
1810  sgml-namecase-general:t
1811  End:
1812  -->