X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fcql.y;h=4021373e46c1b79a1eebf8807b1d3885945ce307;hb=7dfff1f7b79d8a3cf5f5ed62c71f6e4c2a616072;hp=c6151a23a05c0ccd8f3b9f76fd98128bc21d55d5;hpb=d940392c53c32ccf76fb287cc5b997b9e921a431;p=yaz-moved-to-github.git diff --git a/src/cql.y b/src/cql.y index c6151a2..4021373 100644 --- a/src/cql.y +++ b/src/cql.y @@ -1,5 +1,5 @@ /* This file is part of the YAZ toolkit. - * Copyright (C) 1995-2008 Index Data + * Copyright (C) 1995-2011 Index Data * See the file LICENSE for details. */ /* bison parser for CQL grammar. */ @@ -11,10 +11,13 @@ * This is a YACC parser, but since it must be reentrant, Bison is required. * The original source file is cql.y. */ +#if HAVE_CONFIG_H +#include +#endif #include #include #include -#include +#include #include #include #include @@ -53,7 +56,7 @@ %} %pure_parser -%token DOTTERM TERM AND OR NOT PROX GE LE NE EXACT +%token DOTTERM TERM AND OR NOT PROX GE LE NE EXACT SORTBY %% @@ -61,12 +64,38 @@ top: { $$.rel = cql_node_mk_sc(((CQL_parser) parm)->nmem, "cql.serverChoice", "=", 0); ((CQL_parser) parm)->top = 0; -} cqlQuery1 { +} cqlQuery1 sortby { cql_node_destroy($$.rel); - ((CQL_parser) parm)->top = $2.cql; + if ($3.cql) + { + $3.cql->u.sort.search = $2.cql; + ((CQL_parser) parm)->top = $3.cql; + } else { + ((CQL_parser) parm)->top = $2.cql; + } } ; +sortby: /* empty */ + { $$.cql = 0; } +| SORTBY sortSpec { + $$.cql = $2.cql; + }; + +sortSpec: sortSpec singleSpec { + $$.cql = $1.cql; + $$.cql->u.sort.next = $2.cql; + } +| singleSpec +{ + $$.cql = $1.cql; +}; + +singleSpec: index modifiers { + $$.cql = cql_node_mk_sort(((CQL_parser) parm)->nmem, $1.buf, $2.cql); + } +; + cqlQuery1: cqlQuery | cqlQuery error { cql_node_destroy($1.cql); @@ -203,6 +232,7 @@ searchTerm: | OR | NOT | PROX +| SORTBY ; %% @@ -254,7 +284,7 @@ int yylex(YYSTYPE *lval, void *vp) return 0; if (c == '\n') return 0; - } while (isspace(c)); + } while (yaz_isspace(c)); if (strchr("()=>buf = "prox"; return PROX; } + if (!cql_strcmp(lval->buf, "sortby")) + { + lval->buf = "sortby"; + return SORTBY; + } if (!cql_strcmp(lval->buf, "all")) relation_like = 1; if (!cql_strcmp(lval->buf, "any")) @@ -378,8 +413,7 @@ int cql_parser_stream(CQL_parser cp, cp->getbyte = getbyte; cp->ungetbyte = ungetbyte; cp->client_data = client_data; - if (cp->top) - cql_node_destroy(cp->top); + cql_node_destroy(cp->top); cql_parse(cp); if (cp->top) return 0; @@ -411,3 +445,12 @@ struct cql_node *cql_parser_result(CQL_parser cp) { return cp->top; } + +/* + * Local variables: + * c-basic-offset: 4 + * c-file-style: "Stroustrup" + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */