X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fcqltransform.c;h=6cd8c109d1013f97a4e5aa8ddefb3c065c438deb;hb=1015e59c397c0421df1be835e1418ef95531ad98;hp=8411878d1e29e7be5ed30b15d3bbaa64e58f6a4f;hpb=c8f8034d0c8c592d036d19a7885ebc2db1706c59;p=yaz-moved-to-github.git diff --git a/src/cqltransform.c b/src/cqltransform.c index 8411878..6cd8c10 100644 --- a/src/cqltransform.c +++ b/src/cqltransform.c @@ -1,11 +1,7 @@ -/* $Id: cqltransform.c,v 1.30 2007-12-20 22:45:37 adam Exp $ - Copyright (C) 1995-2007, Index Data ApS - Index Data Aps - -This file is part of the YAZ toolkit. - -See the file LICENSE. -*/ +/* This file is part of the YAZ toolkit. + * Copyright (C) 1995-2008 Index Data + * See the file LICENSE for details. + */ /** * \file cqltransform.c @@ -185,6 +181,18 @@ int cql_pr_attr_uri(cql_transform_t ct, const char *category, { if (!res) res = cql_lookup_property(ct, category, prefix, eval); + /* we have some aliases for some relations unfortunately.. */ + if (!res && !prefix && !strcmp(category, "relation")) + { + if (!strcmp(val, "==")) + res = cql_lookup_property(ct, category, prefix, "exact"); + if (!strcmp(val, "=")) + res = cql_lookup_property(ct, category, prefix, "eq"); + if (!strcmp(val, "<=")) + res = cql_lookup_property(ct, category, prefix, "le"); + if (!strcmp(val, ">=")) + res = cql_lookup_property(ct, category, prefix, "ge"); + } if (!res) res = cql_lookup_property(ct, category, prefix, "*"); } @@ -505,6 +513,34 @@ void emit_term(cql_transform_t ct, xfree(z3958_mem); } +void emit_terms(cql_transform_t ct, + struct cql_node *cn, + void (*pr)(const char *buf, void *client_data), + void *client_data, + const char *op) +{ + struct cql_node *ne = cn->u.st.extra_terms; + if (ne) + { + (*pr)("@", client_data); + (*pr)(op, client_data); + (*pr)(" ", client_data); + } + emit_term(ct, cn, cn->u.st.term, strlen(cn->u.st.term), + pr, client_data); + for (; ne; ne = ne->u.st.extra_terms) + { + if (ne->u.st.extra_terms) + { + (*pr)("@", client_data); + (*pr)(op, client_data); + (*pr)(" ", client_data); + } + emit_term(ct, cn, ne->u.st.term, strlen(ne->u.st.term), + pr, client_data); + } +} + void emit_wordlist(cql_transform_t ct, struct cql_node *cn, void (*pr)(const char *buf, void *client_data), @@ -572,18 +608,7 @@ void cql_transform_r(cql_transform_t ct, } } cql_pr_attr(ct, "always", 0, 0, pr, client_data, 0); - if (cn->u.st.relation && !cql_strcmp(cn->u.st.relation, "=")) - cql_pr_attr(ct, "relation", "eq", "scr", - pr, client_data, 19); - else if (cn->u.st.relation && !cql_strcmp(cn->u.st.relation, "<=")) - cql_pr_attr(ct, "relation", "le", "scr", - pr, client_data, 19); - else if (cn->u.st.relation && !cql_strcmp(cn->u.st.relation, ">=")) - cql_pr_attr(ct, "relation", "ge", "scr", - pr, client_data, 19); - else - cql_pr_attr(ct, "relation", cn->u.st.relation, "eq", - pr, client_data, 19); + cql_pr_attr(ct, "relation", cn->u.st.relation, 0, pr, client_data, 19); cql_pr_attr(ct, "structure", cn->u.st.relation, 0, pr, client_data, 24); if (cn->u.st.relation && !cql_strcmp(cn->u.st.relation, "all")) @@ -596,8 +621,7 @@ void cql_transform_r(cql_transform_t ct, } else { - emit_term(ct, cn, cn->u.st.term, strlen(cn->u.st.term), - pr, client_data); + emit_terms(ct, cn, pr, client_data, "and"); } break; case CQL_NODE_BOOL: