+yf::Zoom::BackendPtr yf::Zoom::Frontend::explain_search(mp::Package &package,
+ std::string &database,
+ int *error,
+ char **addinfo,
+ ODR odr,
+ std::string &torus_db,
+ std::string &realm)
+{
+ m_backend.reset();
+
+ BackendPtr b(new Backend);
+
+ b->m_frontend_database = database;
+ b->enable_explain = true;
+
+ Z_GDU *gdu = package.request().get();
+ Z_APDU *apdu_req = gdu->u.z3950;
+ Z_APDU *apdu_res = 0;
+ Z_SearchRequest *sr = apdu_req->u.searchRequest;
+ Z_Query *query = sr->query;
+
+ if (query->which == Z_Query_type_104 &&
+ query->u.type_104->which == Z_External_CQL)
+ {
+ std::string torus_url = m_p->torus_searchable_url;
+ std::string torus_query(query->u.type_104->u.cql);
+ xmlDoc *doc = mp::get_searchable(package, torus_url, "",
+ torus_query,
+ realm, m_p->proxy);
+ if (m_p->explain_xsp)
+ {
+ xmlDoc *rec_res = xsltApplyStylesheet(m_p->explain_xsp, doc, 0);
+
+ xmlFreeDoc(doc);
+ doc = rec_res;
+ }
+ *error = YAZ_BIB1_QUERY_TYPE_UNSUPP;
+ *addinfo = odr_strdup(odr, "CQL, IR-Explain---1");
+
+ xmlChar *buf_out = 0;
+ int len_out;
+ xmlDocDumpMemory(doc, &buf_out, &len_out);
+
+ fwrite(buf_out, 1, len_out, yaz_log_file());
+
+ xmlFree(buf_out);
+ if (b->explain_doc)
+ xmlFreeDoc(b->explain_doc);
+ b->explain_doc = doc;
+ return m_backend;
+ }
+ else
+ {
+ *error = YAZ_BIB1_QUERY_TYPE_UNSUPP;
+ *addinfo = odr_strdup(odr, "RPN/CCL, IR-Explain---1");
+ return m_backend;
+ }
+}
+