7b67975b91740fa408568f2d39625ad7b5ed1b5c
[yazpp-moved-to-github.git] / src / yaz-cql2rpn.cpp
1 /* This file is part of the yazpp toolkit.
2  * Copyright (C) 1998-2013 Index Data and Mike Taylor
3  * See the file LICENSE for details.
4  */
5
6 #if HAVE_CONFIG_H
7 #include <config.h>
8 #endif
9 #include <yaz/log.h>
10 #include <yaz/diagsrw.h>
11 #include <yaz/pquery.h>
12 #include <yaz/sortspec.h>
13 #include <yazpp/cql2rpn.h>
14
15 using namespace yazpp_1;
16
17 Yaz_cql2rpn::Yaz_cql2rpn()
18 {
19     m_transform = 0;
20 }
21
22 Yaz_cql2rpn::~Yaz_cql2rpn()
23 {
24     if (m_transform)
25         cql_transform_close(m_transform);
26 }
27
28 void Yaz_cql2rpn::set_pqf_file(const char *fname)
29 {
30     if (!m_transform)
31         m_transform = cql_transform_open_fname(fname);
32 }
33
34
35 bool Yaz_cql2rpn::parse_spec_file(const char *fname, int *error)
36 {
37     *error = 0;
38     cql_transform_close(m_transform);
39     m_transform = cql_transform_open_fname(fname);
40     return m_transform ? true : false;
41 }
42
43 int Yaz_cql2rpn::query_transform(const char *cql_query,
44                                  Z_RPNQuery **rpnquery, ODR o,
45                                  char **addinfop)
46 {
47     const char *addinfo = 0;
48     if (!m_transform)
49         return -3;
50     CQL_parser cp = cql_parser_create();
51
52     int r = cql_parser_string(cp, cql_query);
53     if (r)
54     {
55         r = YAZ_SRW_QUERY_SYNTAX_ERROR;
56     }
57     else
58     {
59         WRBUF pqf = wrbuf_alloc();
60         r = cql_transform(m_transform, cql_parser_result(cp),
61                           wrbuf_vp_puts, pqf);
62         if (!r)
63         {
64             WRBUF sortkeys = wrbuf_alloc();
65             WRBUF sortspec = wrbuf_alloc();
66             if (cql_sortby_to_sortkeys(cql_parser_result(cp),
67                                        wrbuf_vp_puts, sortkeys))
68             {
69                 r = YAZ_SRW_UNSUPP_SORT_TYPE;
70             }
71             else
72             {
73                 yaz_srw_sortkeys_to_sort_spec(wrbuf_cstr(sortkeys), sortspec);
74                 Z_SortKeySpecList *sksl =
75                     yaz_sort_spec(o, wrbuf_cstr(sortspec));
76                 if (sksl)
77                     yaz_sort_spec_to_type7(sksl, pqf);
78             }
79             wrbuf_destroy(sortspec);
80             wrbuf_destroy(sortkeys);
81
82             YAZ_PQF_Parser pp = yaz_pqf_create();
83
84             *rpnquery = yaz_pqf_parse(pp, o, wrbuf_cstr(pqf));
85             if (!*rpnquery)
86             {
87                 size_t off;
88                 const char *pqf_msg;
89                 yaz_pqf_error(pp, &pqf_msg, &off);
90                 r = -1;
91             }
92             yaz_pqf_destroy(pp);
93         }
94         else
95         {
96             r = cql_transform_error(m_transform, &addinfo);
97         }
98         wrbuf_destroy(pqf);
99     }
100     cql_parser_destroy(cp);
101     *addinfop = odr_strdup_null(o, addinfo);
102     return r;
103 }
104 /*
105  * Local variables:
106  * c-basic-offset: 4
107  * c-file-style: "Stroustrup"
108  * indent-tabs-mode: nil
109  * End:
110  * vim: shiftwidth=4 tabstop=8 expandtab
111  */
112