+ // RPN
+ pqf_wrbuf = wrbuf_alloc();
+ yaz_rpnquery_to_wrbuf(pqf_wrbuf, query->u.type_1);
+ }
+ else if (query->which == Z_Query_type_2)
+ {
+ // CCL
+ ccl_wrbuf = wrbuf_alloc();
+ wrbuf_write(ccl_wrbuf, (const char *) query->u.type_2->buf,
+ query->u.type_2->len);
+ }
+ else if (query->which == Z_Query_type_104 &&
+ query->u.type_104->which == Z_External_CQL)
+ {
+ // CQL
+ const char *cql = query->u.type_104->u.cql;
+ CQL_parser cp = cql_parser_create();
+ int r = cql_parser_string(cp, cql);
+ package.log("zoom", YLOG_LOG, "CQL: %s", cql);
+ if (r)
+ {
+ cql_parser_destroy(cp);
+ error = YAZ_BIB1_MALFORMED_QUERY;
+ const char *addinfo = "CQL syntax error";
+ log_diagnostic(package, error, addinfo);
+ apdu_res =
+ odr.create_searchResponse(apdu_req, error, addinfo);
+ package.response() = apdu_res;
+ return;
+ }
+ struct cql_node *cn = cql_parser_result(cp);
+ struct cql_node *cn_error = m_p->convert_cql_fields(cn, odr);
+ if (cn_error)
+ {
+ // hopefully we are getting a ptr to a index+relation+term node
+ error = YAZ_BIB1_UNSUPP_USE_ATTRIBUTE;
+ addinfo = 0;
+ if (cn_error->which == CQL_NODE_ST)
+ addinfo = cn_error->u.st.index;
+
+ log_diagnostic(package, error, addinfo);
+ apdu_res = odr.create_searchResponse(apdu_req, error, addinfo);
+ package.response() = apdu_res;
+ return;
+ }
+ char ccl_buf[1024];
+
+ r = cql_to_ccl_buf(cn, ccl_buf, sizeof(ccl_buf));
+ if (r == 0)
+ {
+ ccl_wrbuf = wrbuf_alloc();
+ wrbuf_puts(ccl_wrbuf, ccl_buf);
+
+ WRBUF sru_sortkeys_wrbuf = wrbuf_alloc();
+
+ cql_sortby_to_sortkeys(cn, wrbuf_vp_puts, sru_sortkeys_wrbuf);
+ WRBUF sort_spec_wrbuf = wrbuf_alloc();
+ yaz_srw_sortkeys_to_sort_spec(wrbuf_cstr(sru_sortkeys_wrbuf),
+ sort_spec_wrbuf);
+ wrbuf_destroy(sru_sortkeys_wrbuf);
+
+ yaz_tok_cfg_t tc = yaz_tok_cfg_create();
+ yaz_tok_parse_t tp =
+ yaz_tok_parse_buf(tc, wrbuf_cstr(sort_spec_wrbuf));
+ yaz_tok_cfg_destroy(tc);
+
+ /* go through sortspec and map fields */
+ int token = yaz_tok_move(tp);
+ while (token != YAZ_TOK_EOF)
+ {
+ if (token == YAZ_TOK_STRING)
+ {
+ const char *field = yaz_tok_parse_string(tp);
+ std::map<std::string,std::string>::iterator it;
+ it = b->sptr->sortmap.find(field);
+ if (it != b->sptr->sortmap.end())
+ sortkeys += it->second;
+ else
+ sortkeys += field;
+ }
+ sortkeys += " ";
+ token = yaz_tok_move(tp);
+ if (token == YAZ_TOK_STRING)
+ {
+ sortkeys += yaz_tok_parse_string(tp);
+ }
+ if (token != YAZ_TOK_EOF)
+ {
+ sortkeys += " ";
+ token = yaz_tok_move(tp);
+ }
+ }
+ yaz_tok_parse_destroy(tp);
+ wrbuf_destroy(sort_spec_wrbuf);
+ }
+ cql_parser_destroy(cp);
+ if (r)
+ {
+ error = YAZ_BIB1_MALFORMED_QUERY;
+ const char *addinfo = "CQL to CCL conversion error";