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