X-Git-Url: http://sru.miketaylor.org.uk/?a=blobdiff_plain;f=src%2Ffilter_zoom.cpp;h=f8d4f3404d63c196f09dc6a7ea833b5f5cc9eb6e;hb=a99ea96b31c554425edb89e152d09ffdefc8f7ab;hp=d38f6ea38da218cebbff53870add908abe2e386d;hpb=d0f81dec2d80f97fdef5b4a30ec631ea677b2385;p=metaproxy-moved-to-github.git diff --git a/src/filter_zoom.cpp b/src/filter_zoom.cpp index d38f6ea..f8d4f34 100644 --- a/src/filter_zoom.cpp +++ b/src/filter_zoom.cpp @@ -117,11 +117,12 @@ namespace metaproxy_1 { FrontendPtr get_frontend(mp::Package &package); void release_frontend(mp::Package &package); SearchablePtr parse_torus(const xmlNode *ptr); - + struct cql_node *convert_cql_fields(struct cql_node *cn, ODR odr); std::map m_clients; boost::mutex m_mutex; boost::condition m_cond_session_ready; std::string torus_url; + std::map fieldmap; std::string xsldir; }; } @@ -377,11 +378,6 @@ yf::Zoom::SearchablePtr yf::Zoom::Impl::parse_torus(const xmlNode *ptr1) (const char *) ptr3->name + 7); } } - if (s->database.length() && s->target.length()) - { - yaz_log(YLOG_LOG, "add db=%s target=%s", - s->database.c_str(), s->target.c_str()); - } return s; } } @@ -411,6 +407,25 @@ void yf::Zoom::Impl::configure(const xmlNode *ptr, bool test_only) attr->name)); } } + else if (!strcmp((const char *) ptr->name, "fieldmap")) + { + const struct _xmlAttr *attr; + std::string ccl_field; + std::string cql_field; + for (attr = ptr->properties; attr; attr = attr->next) + { + if (!strcmp((const char *) attr->name, "ccl")) + ccl_field = mp::xml::get_text(attr->children); + else if (!strcmp((const char *) attr->name, "cql")) + cql_field = mp::xml::get_text(attr->children); + else + throw mp::filter::FilterException( + "Bad attribute " + std::string((const char *) + attr->name)); + } + if (cql_field.length()) + fieldmap[cql_field] = ccl_field; + } else if (!strcmp((const char *) ptr->name, "records")) { yaz_log(YLOG_WARN, "records ignored!"); @@ -707,6 +722,38 @@ Z_Records *yf::Zoom::Frontend::get_records(Odr_int start, return records; } +struct cql_node *yf::Zoom::Impl::convert_cql_fields(struct cql_node *cn, + ODR odr) +{ + struct cql_node *r = 0; + if (!cn) + return 0; + switch (cn->which) + { + case CQL_NODE_ST: + if (cn->u.st.index) + { + std::map::const_iterator it; + it = fieldmap.find(cn->u.st.index); + if (it == fieldmap.end()) + return cn; + if (it->second.length()) + cn->u.st.index = odr_strdup(odr, it->second.c_str()); + else + cn->u.st.index = 0; + } + break; + case CQL_NODE_BOOL: + r = convert_cql_fields(cn->u.boolean.left, odr); + if (!r) + r = convert_cql_fields(cn->u.boolean.right, odr); + break; + case CQL_NODE_SORT: + r = convert_cql_fields(cn->u.sort.search, odr); + break; + } + return r; +} void yf::Zoom::Frontend::handle_search(mp::Package &package) { @@ -774,10 +821,24 @@ void yf::Zoom::Frontend::handle_search(mp::Package &package) 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 + addinfo = 0; + if (cn_error->which == CQL_NODE_ST) + addinfo = cn_error->u.st.index; + + apdu_res = + odr.create_searchResponse(apdu_req, + YAZ_BIB1_UNSUPP_USE_ATTRIBUTE, + addinfo); + package.response() = apdu_res; + return; + } char ccl_buf[1024]; r = cql_to_ccl_buf(cn, ccl_buf, sizeof(ccl_buf)); - yaz_log(YLOG_LOG, "cql_to_ccl_buf returned %d", r); if (r == 0) { ccl_wrbuf = wrbuf_alloc(); @@ -808,17 +869,28 @@ void yf::Zoom::Frontend::handle_search(mp::Package &package) assert(pqf_wrbuf == 0); int cerror, cpos; struct ccl_rpn_node *cn; + yaz_log(YLOG_LOG, "CCL: %s", wrbuf_cstr(ccl_wrbuf)); cn = ccl_find_str(b->sptr->ccl_bibset, wrbuf_cstr(ccl_wrbuf), &cerror, &cpos); wrbuf_destroy(ccl_wrbuf); if (!cn) { char *addinfo = odr_strdup(odr, ccl_err_msg(cerror)); + int z3950_diag = YAZ_BIB1_MALFORMED_QUERY; + switch (cerror) + { + case CCL_ERR_UNKNOWN_QUAL: + z3950_diag = YAZ_BIB1_UNSUPP_USE_ATTRIBUTE; + break; + case CCL_ERR_TRUNC_NOT_LEFT: + case CCL_ERR_TRUNC_NOT_RIGHT: + case CCL_ERR_TRUNC_NOT_BOTH: + z3950_diag = YAZ_BIB1_UNSUPP_TRUNCATION_ATTRIBUTE; + break; + } apdu_res = - odr.create_searchResponse(apdu_req, - YAZ_BIB1_MALFORMED_QUERY, - addinfo); + odr.create_searchResponse(apdu_req, z3950_diag, addinfo); package.response() = apdu_res; return; }