1 /* This file is part of the YAZ toolkit.
2 * Copyright (C) 1995-2010 Index Data
3 * See the file LICENSE for details.
8 * \brief Implements Z39.50 Query Printing
15 #include <yaz/logrpn.h>
16 #include <yaz/oid_db.h>
18 static const char *relToStr(Odr_int v)
23 case 1: str = "Less than"; break;
24 case 2: str = "Less than or equal"; break;
25 case 3: str = "Equal"; break;
26 case 4: str = "Greater or equal"; break;
27 case 5: str = "Greater than"; break;
28 case 6: str = "Not equal"; break;
29 case 100: str = "Phonetic"; break;
30 case 101: str = "Stem"; break;
31 case 102: str = "Relevance"; break;
32 case 103: str = "AlwaysMatches"; break;
37 static void attrStr(Odr_int type, Odr_int value, char *str)
47 rstr = relToStr(value);
49 sprintf(str, "relation=%s", rstr);
51 sprintf(str, "relation=" ODR_INT_PRINTF, value);
57 sprintf(str, "position=First in field");
60 sprintf(str, "position=First in any subfield");
63 sprintf(str, "position=Any position in field");
66 sprintf(str, "position");
73 sprintf(str, "structure=Phrase");
76 sprintf(str, "structure=Word");
79 sprintf(str, "structure=Key");
82 sprintf(str, "structure=Year");
85 sprintf(str, "structure=Date");
88 sprintf(str, "structure=Word list");
91 sprintf(str, "structure=Date (un)");
94 sprintf(str, "structure=Name (norm)");
97 sprintf(str, "structure=Name (un)");
100 sprintf(str, "structure=Structure");
103 sprintf(str, "structure=urx");
106 sprintf(str, "structure=free-form-text");
109 sprintf(str, "structure=document-text");
112 sprintf(str, "structure=local-number");
115 sprintf(str, "structure=string");
118 sprintf(str, "structure=numeric string");
121 sprintf(str, "structure");
128 sprintf(str, "truncation=Right");
131 sprintf(str, "truncation=Left");
134 sprintf(str, "truncation=Left&right");
137 sprintf(str, "truncation=Do not truncate");
140 sprintf(str, "truncation=Process #");
143 sprintf(str, "truncation=re-1");
146 sprintf(str, "truncation=re-2");
149 sprintf(str, "truncation=CCL");
152 sprintf(str, "truncation");
159 sprintf(str, "completeness=Incomplete subfield");
162 sprintf(str, "completeness=Complete subfield");
165 sprintf(str, "completeness=Complete field");
168 sprintf(str, "completeness");
173 sprintf(str + strlen(str), " (" ODR_INT_PRINTF "=" ODR_INT_PRINTF")",
176 sprintf(str, ODR_INT_PRINTF "=" ODR_INT_PRINTF, type, value);
180 * zlog_attributes: print attributes of term
182 static void zlog_attributes(Z_AttributesPlusTerm *t, int depth,
183 const Odr_oid *ast, int loglevel)
187 int num_attributes = t->attributes->num_attributes;
189 for (of = 0; of < num_attributes; of++)
191 char attset_name_buf[OID_STR_MAX];
192 const char *attset_name = 0;
193 Z_AttributeElement *element;
194 element = t->attributes->attributes[of];
195 if (element->attributeSet)
197 attset_name = yaz_oid_to_string_buf(element->attributeSet,
202 switch (element->which)
204 case Z_AttributeValue_numeric:
205 attrStr(*element->attributeType,
206 *element->value.numeric, str);
207 yaz_log(loglevel, "%*.0s%s %s", depth, "", attset_name, str);
209 case Z_AttributeValue_complex:
210 yaz_log(loglevel, "%*.0s%s attributeType=" ODR_INT_PRINTF
212 depth, "", attset_name, *element->attributeType);
213 for (i = 0; i<element->value.complex->num_list; i++)
215 if (element->value.complex->list[i]->which ==
216 Z_StringOrNumeric_string)
217 yaz_log(loglevel, "%*.0s string: '%s'", depth, "",
218 element->value.complex->list[i]->u.string);
219 else if (element->value.complex->list[i]->which ==
220 Z_StringOrNumeric_numeric)
221 yaz_log(loglevel, "%*.0s numeric: '" ODR_INT_PRINTF
223 *element->value.complex->list[i]->u.numeric);
227 yaz_log(loglevel, "%.*s%s attribute unknown",
228 depth, "", attset_name);
233 static char *complex_op_name(Z_Operator *op)
241 case Z_Operator_and_not:
243 case Z_Operator_prox:
246 return "unknown complex operator";
250 static char *prox_unit_name(Z_ProximityOperator *op)
252 if (op->which!=Z_ProximityOperator_known)
256 case Z_ProxUnit_character: return "character";
257 case Z_ProxUnit_word: return "word";
258 case Z_ProxUnit_sentence: return "sentence";
259 case Z_ProxUnit_paragraph: return "paragraph";
260 case Z_ProxUnit_section: return "section";
261 case Z_ProxUnit_chapter: return "chapter";
262 case Z_ProxUnit_document: return "document";
263 case Z_ProxUnit_element: return "element";
264 case Z_ProxUnit_subelement: return "subelement";
265 case Z_ProxUnit_elementType: return "elementType";
266 case Z_ProxUnit_byte: return "byte";
267 default: return "unknown";
271 static void zlog_structure(Z_RPNStructure *zs, int depth,
272 const Odr_oid *ast, int loglevel)
274 if (zs->which == Z_RPNStructure_complex)
276 Z_Operator *op = zs->u.complex->roperator;
281 case Z_Operator_and_not:
282 yaz_log(loglevel, "%*.0s %s", depth, "", complex_op_name(op) );
284 case Z_Operator_prox:
285 yaz_log(loglevel, "%*.0s prox excl=%s dist=" ODR_INT_PRINTF
288 depth, "", op->u.prox->exclusion ?
289 (*op->u.prox->exclusion ? "T" : "F") : "N",
290 *op->u.prox->distance,
291 *op->u.prox->ordered ? "T" : "F",
292 relToStr(*op->u.prox->relationType),
293 prox_unit_name(op->u.prox) );
296 yaz_log(loglevel, "%*.0s unknown complex", depth, "");
299 zlog_structure(zs->u.complex->s1, depth+2, ast, loglevel);
300 zlog_structure(zs->u.complex->s2, depth+2, ast, loglevel);
302 else if (zs->which == Z_RPNStructure_simple)
304 if (zs->u.simple->which == Z_Operand_APT)
306 Z_AttributesPlusTerm *zapt = zs->u.simple->u.attributesPlusTerm;
308 switch (zapt->term->which)
311 yaz_log(loglevel, "%*.0s term '%.*s' (general)", depth, "",
312 zapt->term->u.general->len,
313 zapt->term->u.general->buf);
315 case Z_Term_characterString:
316 yaz_log(loglevel, "%*.0s term '%s' (string)", depth, "",
317 zapt->term->u.characterString);
320 yaz_log(loglevel, "%*.0s term '" ODR_INT_PRINTF
321 "' (numeric)", depth, "",
322 *zapt->term->u.numeric);
325 yaz_log(loglevel, "%*.0s term (null)", depth, "");
328 yaz_log(loglevel, "%*.0s term (not general)", depth, "");
330 zlog_attributes(zapt, depth+2, ast, loglevel);
332 else if (zs->u.simple->which == Z_Operand_resultSetId)
334 yaz_log(loglevel, "%*.0s set '%s'", depth, "",
335 zs->u.simple->u.resultSetId);
338 yaz_log(loglevel, "%*.0s unknown simple structure", depth, "");
341 yaz_log(loglevel, "%*.0s unknown structure", depth, "");
344 void log_rpn_query_level(int loglevel, Z_RPNQuery *rpn)
346 zlog_structure(rpn->RPNStructure, 0, rpn->attributeSetId, loglevel);
349 void log_rpn_query(Z_RPNQuery *rpn)
351 log_rpn_query_level(YLOG_LOG, rpn);
354 void log_scan_term_level(int loglevel,
355 Z_AttributesPlusTerm *zapt, const Odr_oid *ast)
360 if (zapt->term->which == Z_Term_general)
362 yaz_log(loglevel, "%*.0s term '%.*s' (general)", depth, "",
363 zapt->term->u.general->len, zapt->term->u.general->buf);
366 yaz_log(loglevel, "%*.0s term (not general)", depth, "");
367 zlog_attributes(zapt, depth+2, ast, loglevel);
370 void log_scan_term(Z_AttributesPlusTerm *zapt, const Odr_oid *ast)
372 log_scan_term_level(YLOG_LOG, zapt, ast);
375 void yaz_log_zquery_level(int loglevel, Z_Query *q)
381 case Z_Query_type_1: case Z_Query_type_101:
382 log_rpn_query_level(loglevel, q->u.type_1);
385 yaz_log(loglevel, "CCL: %.*s", q->u.type_2->len, q->u.type_2->buf);
387 case Z_Query_type_100:
388 yaz_log(loglevel, "Z39.58: %.*s", q->u.type_100->len,
391 case Z_Query_type_104:
392 if (q->u.type_104->which == Z_External_CQL)
393 yaz_log(loglevel, "CQL: %s", q->u.type_104->u.cql);
397 void yaz_log_zquery(Z_Query *q)
399 yaz_log_zquery_level(YLOG_LOG, q);
405 * c-file-style: "Stroustrup"
406 * indent-tabs-mode: nil
408 * vim: shiftwidth=4 tabstop=8 expandtab