X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=doc%2Ftools.xml;h=49fd18bc20a1bf81be5f407b0744114213e341b1;hp=f995950450b1dfce108091299eb67f7ecc1b17fd;hb=590c754f58a6fa4ca0f9050e470642eecd261031;hpb=bd7e251dac1b07c54884d26295f66b90cfb23131 diff --git a/doc/tools.xml b/doc/tools.xml index f995950..49fd18b 100644 --- a/doc/tools.xml +++ b/doc/tools.xml @@ -1,4 +1,4 @@ - + Supporting Tools @@ -32,19 +32,73 @@ in simple test applications and scripting environments (like Tcl). The demonstration client included with YAZ uses the PQF. + + + + The PQF have been adopted by other parties developing Z39.50 + software. It is often referred to as Prefix Query Notation + - PQN. + + - The PQF is defined by the pquery module in the YAZ library. The - pquery.h file provides the declaration of the - functions + The PQF is defined by the pquery module in the YAZ library. + There are two sets of function that have similar behavior. First + set operates on a PQF parser handle, second set doesn't. First set + set of functions are more flexible than the second set. Second set + is obsolete and is only provided to ensure backwards compatibility. - -Z_RPNQuery *p_query_rpn (ODR o, oid_proto proto, const char *qbuf); + + First set of functions all operate on a PQF parser handle: + + + #include <yaz/pquery.h> -Z_AttributesPlusTerm *p_query_scan (ODR o, oid_proto proto, - Odr_oid **attributeSetP, const char *qbuf); + YAZ_PQF_Parser yaz_pqf_create (void); -int p_query_attset (const char *arg); - + void yaz_pqf_destroy (YAZ_PQF_Parser p); + + Z_RPNQuery *yaz_pqf_parse (YAZ_PQF_Parser p, ODR o, const char *qbuf); + + Z_AttributesPlusTerm *yaz_pqf_scan (YAZ_PQF_Parser p, ODR o, + Odr_oid **attributeSetId, const char *qbuf); + + + int yaz_pqf_error (YAZ_PQF_Parser p, const char **msg, size_t *off); + + + A PQF parser is created and destructed by functions + yaz_pqf_create and + yaz_pqf_destroy respectively. + Function yaz_pqf_parse parses query given + by string qbuf. If parsing was successful, + a Z39.50 RPN Query is returned which is created using ODR stream + o. If parsing failed, a NULL pointer is + returned. + Function yaz_pqf_scan takes a scan query in + qbuf. If parsing was successful, the function + returns attributes plus term pointer and modifies + attributeSetId to hold attribute set for the + scan request - both allocated using ODR stream o. + If parsing failed, yaz_pqf_scan returns a NULL pointer. + Error information for bad queries can be obtained by a call to + yaz_pqf_error which returns an error code and + modifies *msg to point to an error description, + and modifies *off to the offset within last + query were parsing failed. + + + The second set of functions are declared as follows: + + + #include <yaz/pquery.h> + + Z_RPNQuery *p_query_rpn (ODR o, oid_proto proto, const char *qbuf); + + Z_AttributesPlusTerm *p_query_scan (ODR o, oid_proto proto, + Odr_oid **attributeSetP, const char *qbuf); + + int p_query_attset (const char *arg); + The function p_query_rpn() takes as arguments an &odr; stream (see section The ODR Module) @@ -57,10 +111,10 @@ int p_query_attset (const char *arg); If the parse went well, p_query_rpn() returns a pointer to a Z_RPNQuery structure which can be - placed directly into a Z_SearchRequest. + placed directly into a Z_SearchRequest. + If parsing failed, due to syntax error, a NULL pointer is returned. - The p_query_attset specifies which attribute set to use if the query doesn't specify one by the @attrset operator. @@ -72,53 +126,71 @@ int p_query_attset (const char *arg); The grammar of the PQF is as follows: - - Query ::= [ '@attrset' AttSet ] QueryStruct. - - AttSet ::= string. + + query ::= top-set query-struct. - QueryStruct ::= [ Attribute ] Simple | Complex. + top-set ::= [ '@attrset' string ] - Attribute ::= '@attr' [ AttSet ] AttributeType '=' AttributeValue. + query-struct ::= attr-spec | simple | complex | '@term' term-type - AttributeType ::= integer. + attr-spec ::= '@attr' [ string ] string query-struct - AttributeValue ::= integer || string. + complex ::= operator query-struct query-struct. - Complex ::= Operator QueryStruct QueryStruct. + operator ::= '@and' | '@or' | '@not' | '@prox' proximity. - Operator ::= '@and' | '@or' | '@not' | '@prox' Proximity. + simple ::= result-set | term. - Simple ::= ResultSet | Term. + result-set ::= '@set' string. - ResultSet ::= '@set' string. + term ::= string. - Term ::= string | '"' string '"'. + proximity ::= exclusion distance ordered relation which-code unit-code. - Proximity ::= Exclusion Distance Ordered Relation WhichCode UnitCode. + exclusion ::= '1' | '0' | 'void'. - Exclusion ::= '1' | '0' | 'void'. + distance ::= integer. - Distance ::= integer. + ordered ::= '1' | '0'. - Ordered ::= '1' | '0'. + relation ::= integer. - Relation ::= integer. + which-code ::= 'known' | 'private' | integer. - WhichCode ::= 'known' | 'private' | integer. + unit-code ::= integer. - UnitCode ::= integer. - + term-type ::= 'general' | 'numeric' | 'string' | 'oid' | 'datetime' | 'null'. + You will note that the syntax above is a fairly faithful - representation of RPN, except for the Attibute, which has been + representation of RPN, except for the Attribute, which has been moved a step away from the term, allowing you to associate one or more attributes with an entire query structure. The parser will automatically apply the given attributes to each term as required. + The @attr operator is followed by an attribute specification + (attr-spec above). The specification consists + of optional an attribute set, an attribute type-value pair and + a sub query. The attribute type-value pair is packed in one string: + an attribute type, a dash, followed by an attribute value. + The type is always an integer but the value may be either an + integer or a string (if it doesn't start with a digit character). + + + + Z39.50 version 3 defines various encoding of terms. + Use the @term operator to indicate the encoding type: + general, numeric, + string (for InternationalString), .. + If no term type has been given, the general form + is used which is the only encoding allowed in both version 2 - and 3 + of the Z39.50 standard. + + + The following are all examples of valid queries in the PQF. @@ -133,6 +205,8 @@ int p_query_attset (const char *arg); @or @and bob dylan @set Result-1 + @attr 1=4 computer + @attr 4=1 @and @attr 1=1 "bob dylan" @attr 1=4 "slow train coming" @attr 4=1 @attr 1=4 "self portrait" @@ -140,6 +214,10 @@ int p_query_attset (const char *arg); @prox 0 3 1 2 k 2 dylan zimmerman @and @attr 2=4 @attr gils 1=2038 -114 @attr 2=2 @attr gils 1=2039 -109 + + @term string "a UTF-8 string, maybe?" + + @attr 1=/book/title computer @@ -207,7 +285,7 @@ int p_query_attset (const char *arg); | string -- Qualifiers is a list of strings separated by comma - Relation ::= '=' | '>=' | '<=' | '<>' | '>' | '<' + Relation ::= '=' | '>=' | '<=' | '<>' | '>' | '<' -- Relational operators. This really doesn't follow the ISO8777 -- standard. @@ -418,7 +496,7 @@ struct ccl_rpn_node *ccl_find_str (CCL_bibset bibset, const char *str, The OID module provides a higher-level representation of the - family of object identifers which describe the Z39.50 protocol and its + family of object identifiers which describe the Z39.50 protocol and its related objects. The definition of the module interface is given in the oid.h file. @@ -584,7 +662,7 @@ typedef struct oident The oid_ent_to_oid() function can be used whenever you need to prepare a PDU containing one or more OIDs. The separation of - the protocol element from the remainer of the + the protocol element from the remainder of the OID-description makes it simple to write applications that can communicate with either Z39.50 or OSI SR-based applications.