X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Frpn2cql.c;h=de06fab2f1ccbb1b81fee7e85a069479642678ce;hb=30be9a32fd26a2d08aa4413942408500c93ad4a3;hp=108c0ec548dcaa5f59dbcb309331c36941fe9727;hpb=b977948f73d07c0bf4478565f9af3497ffe862e7;p=yaz-moved-to-github.git diff --git a/src/rpn2cql.c b/src/rpn2cql.c index 108c0ec..de06fab 100644 --- a/src/rpn2cql.c +++ b/src/rpn2cql.c @@ -1,5 +1,5 @@ /* This file is part of the YAZ toolkit. - * Copyright (C) 1995-2008 Index Data + * Copyright (C) 1995-2009 Index Data * See the file LICENSE for details. */ @@ -7,15 +7,6 @@ * \file * \brief Implements RPN to CQL conversion * - * Evaluation order of rules: - * - * always - * relation - * structure - * position - * truncation - * index - * relationModifier */ #include @@ -28,14 +19,41 @@ #include static int rpn2cql_attr(cql_transform_t ct, - void (*pr)(const char *buf, void *client_data), - void *client_data, Z_AttributeList *attributes, WRBUF w) { - int i; - for (i = 0; i < attributes->num_attributes; i++) + const char *relation = cql_lookup_reverse(ct, "relation.", attributes); + const char *index = cql_lookup_reverse(ct, "index.", attributes); + const char *structure = cql_lookup_reverse(ct, "structure.", attributes); + if (index && strcmp(index, "index.cql.serverChoice")) { - Z_AttributeElement *elem = attributes->attributes[i]; + wrbuf_puts(w, index+6); + if (relation) + { + relation += 9; + + if (!strcmp(relation, "exact")) + relation = "=="; + else if (!strcmp(relation, "eq")) + relation = "="; + else if (!strcmp(relation, "le")) + relation = "<="; + else if (!strcmp(relation, "ge")) + relation = ">="; + wrbuf_puts(w, relation); + } + else + wrbuf_puts(w, "="); + + if (structure) + { + structure += 10; + if (strcmp(structure, "*")) + { + wrbuf_puts(w, "/"); + wrbuf_puts(w, structure); + wrbuf_puts(w, " "); + } + } } return 0; } @@ -55,25 +73,43 @@ static int rpn2cql_simple(cql_transform_t ct, { Z_AttributesPlusTerm *apt = q->u.attributesPlusTerm; Z_Term *term = apt->term; + const char *sterm = 0; + size_t lterm = 0; wrbuf_rewind(w); - ret = rpn2cql_attr(ct, pr, client_data, apt->attributes, w); + ret = rpn2cql_attr(ct, apt->attributes, w); switch(term->which) { case Z_Term_general: - wrbuf_write(w, (const char *) term->u.general->buf, term->u.general->len); + lterm = term->u.general->len; + sterm = (const char *) term->u.general->buf; break; case Z_Term_numeric: wrbuf_printf(w, "%d", *term->u.numeric); break; case Z_Term_characterString: - wrbuf_puts(w, term->u.characterString); + sterm = term->u.characterString; + lterm = strlen(sterm); break; default: ret = -1; cql_transform_set_error(ct, YAZ_BIB1_TERM_TYPE_UNSUPP, 0); } + + if (term) + { + size_t i; + int must_quote = 0; + for (i = 0 ; i < lterm; i++) + if (sterm[i] == ' ') + must_quote = 1; + if (must_quote) + wrbuf_puts(w, "\""); + wrbuf_write(w, sterm, lterm); + if (must_quote) + wrbuf_puts(w, "\""); + } if (ret == 0) pr(wrbuf_cstr(w), client_data); } @@ -145,6 +181,7 @@ int cql_transform_rpn2cql_wrbuf(cql_transform_t ct, /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab