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