2263 Z_GDU *gdu = package.request().get();
2264 Z_APDU *apdu_req = gdu->u.z3950;
2265 Z_APDU *apdu_res = 0;
2267 Z_SearchRequest *sr = apdu_req->u.searchRequest;
2268 if (sr->num_databaseNames != 1)
2270 int error = YAZ_BIB1_TOO_MANY_DATABASES_SPECIFIED;
2272 apdu_res = odr.create_searchResponse(apdu_req, error, 0);
2273 package.response() = apdu_res;
2277 int same_retries = 0;
2278 int proxy_retries = 0;
2284 std::string db(sr->databaseNames[0]);
2287 &addinfo, odr, &proxy_step);
2290 if (
retry(package, odr, b, error, &addinfo, proxy_step,
2291 same_retries, proxy_retries))
2297 apdu_res = odr.create_searchResponse(apdu_req, error, addinfo);
2298 package.response() = apdu_res;
2301 if (!b || b->enable_explain)
2304 b->set_option(
"setname",
"default");
2306 bool enable_pz2_retrieval =
false;
2307 bool enable_pz2_transform =
false;
2308 bool enable_record_transform =
false;
2309 bool assume_marc8_charset =
false;
2310 bool use_turbomarc =
false;
2312 enable_pz2_retrieval,
2313 enable_pz2_transform,
2314 enable_record_transform,
2315 assume_marc8_charset,
2319 Z_Query *query = sr->query;
2320 mp::wrbuf ccl_wrbuf;
2321 mp::wrbuf pqf_wrbuf;
2322 std::string sortkeys;
2324 if (query->which == Z_Query_type_1 || query->which == Z_Query_type_101)
2327 yaz_rpnquery_to_wrbuf(pqf_wrbuf, query->u.type_1);
2329 else if (query->which == Z_Query_type_2)
2332 wrbuf_write(ccl_wrbuf, (
const char *) query->u.type_2->buf,
2333 query->u.type_2->len);
2335 else if (query->which == Z_Query_type_104 &&
2336 query->u.type_104->which == Z_External_CQL)
2339 const char *cql = query->u.type_104->u.cql;
2340 CQL_parser cp = cql_parser_create();
2341 int r = cql_parser_string(cp, cql);
2342 package.log(
"zoom", YLOG_LOG,
"CQL: %s", cql);
2345 cql_parser_destroy(cp);
2346 error = YAZ_BIB1_MALFORMED_QUERY;
2347 const char *addinfo =
"CQL syntax error";
2350 odr.create_searchResponse(apdu_req, error, addinfo);
2351 package.response() = apdu_res;
2354 struct cql_node *cn = cql_parser_result(cp);
2359 error = YAZ_BIB1_UNSUPP_USE_ATTRIBUTE;
2361 if (cn_error->which == CQL_NODE_ST)
2362 addinfo = cn_error->u.st.index;
2365 apdu_res = odr.create_searchResponse(apdu_req, error, addinfo);
2366 package.response() = apdu_res;
2367 cql_parser_destroy(cp);
2370 r = cql_to_ccl(cn, wrbuf_vp_puts, ccl_wrbuf);
2373 error = YAZ_BIB1_MALFORMED_QUERY;
2374 const char *addinfo =
"CQL to CCL conversion error";
2377 apdu_res = odr.create_searchResponse(apdu_req, error, addinfo);
2378 package.response() = apdu_res;
2379 cql_parser_destroy(cp);
2383 mp::wrbuf sru_sortkeys_wrbuf;
2384 if (cql_sortby_to_sortkeys(cn, wrbuf_vp_puts, sru_sortkeys_wrbuf))
2386 error = YAZ_BIB1_ILLEGAL_SORT_RELATION;
2387 const char *addinfo =
"CQL to CCL sortby conversion";
2390 apdu_res = odr.create_searchResponse(apdu_req, error, addinfo);
2391 package.response() = apdu_res;
2392 cql_parser_destroy(cp);
2395 mp::wrbuf sort_spec_wrbuf;
2396 yaz_srw_sortkeys_to_sort_spec(wrbuf_cstr(sru_sortkeys_wrbuf),
2398 yaz_tok_cfg_t tc = yaz_tok_cfg_create();
2399 yaz_tok_parse_t tp =
2400 yaz_tok_parse_buf(tc, wrbuf_cstr(sort_spec_wrbuf));
2401 yaz_tok_cfg_destroy(tc);
2404 int token = yaz_tok_move(tp);
2405 while (token != YAZ_TOK_EOF)
2407 if (token == YAZ_TOK_STRING)
2409 const char *field = yaz_tok_parse_string(tp);
2410 std::map<std::string,std::string>::iterator it;
2411 it = b->sptr->sortmap.find(field);
2412 if (it != b->sptr->sortmap.end())
2413 sortkeys += it->second;
2418 token = yaz_tok_move(tp);
2419 if (token == YAZ_TOK_STRING)
2421 sortkeys += yaz_tok_parse_string(tp);
2423 if (token != YAZ_TOK_EOF)
2426 token = yaz_tok_move(tp);
2429 yaz_tok_parse_destroy(tp);
2430 cql_parser_destroy(cp);
2434 error = YAZ_BIB1_QUERY_TYPE_UNSUPP;
2435 const char *addinfo = 0;
2437 apdu_res = odr.create_searchResponse(apdu_req, error, addinfo);
2438 package.response() = apdu_res;
2442 if (ccl_wrbuf.len())
2445 assert(pqf_wrbuf.len() == 0);
2447 struct ccl_rpn_node *cn;
2448 package.log(
"zoom", YLOG_LOG,
"CCL: %s", wrbuf_cstr(ccl_wrbuf));
2449 cn = ccl_find_str(b->sptr->ccl_bibset, wrbuf_cstr(ccl_wrbuf),
2453 char *addinfo = odr_strdup_null(odr, ccl_err_msg(cerror));
2454 error = YAZ_BIB1_MALFORMED_QUERY;
2458 case CCL_ERR_UNKNOWN_QUAL:
2459 case CCL_ERR_TRUNC_NOT_LEFT:
2460 case CCL_ERR_TRUNC_NOT_RIGHT:
2461 case CCL_ERR_TRUNC_NOT_BOTH:
2462 case CCL_ERR_TRUNC_NOT_EMBED:
2463 case CCL_ERR_TRUNC_NOT_SINGLE:
2464 error = YAZ_BIB1_UNSUPP_SEARCH;
2468 apdu_res = odr.create_searchResponse(apdu_req, error, addinfo);
2469 package.response() = apdu_res;
2472 ccl_pquery(pqf_wrbuf, cn);
2473 package.log(
"zoom", YLOG_LOG,
"RPN: %s", wrbuf_cstr(pqf_wrbuf));
2477 assert(pqf_wrbuf.len());
2479 ZOOM_query q = ZOOM_query_create();
2480 ZOOM_query_sortby2(q, b->sptr->sortStrategy.c_str(), sortkeys.c_str());
2482 Z_FacetList *fl = 0;
2486 fl = yaz_oi_get_facetlist(&sr->otherInfo);
2488 fl = yaz_oi_get_facetlist(&sr->additionalSearchInfo);
2490 if (b->get_option(
"sru"))
2493 zquery = p_query_rpn(odr, wrbuf_cstr(pqf_wrbuf));
2495 mp::wrbuf wrb_addinfo;
2497 if (!strcmp(b->get_option(
"sru"),
"solr"))
2498 error = solr_transform_rpn2solr_stream_r(b->cqlt, wrb_addinfo,
2499 wrbuf_vp_puts, wrb_cql,
2502 error = cql_transform_rpn2cql_stream_r(b->cqlt, wrb_addinfo,
2503 wrbuf_vp_puts, wrb_cql,
2508 apdu_res = odr.create_searchResponse(apdu_req, error,
2509 wrb_addinfo.c_str_null());
2510 package.response() = apdu_res;
2513 ZOOM_query_cql(q, wrb_cql.c_str());
2514 package.log(
"zoom", YLOG_LOG,
"search CQL: %s", wrb_cql.c_str());
2515 b->search(q, &hits, &error, &addinfo, &fl, odr);
2516 ZOOM_query_destroy(q);
2520 ZOOM_query_prefix(q, pqf_wrbuf.c_str());
2521 package.log(
"zoom", YLOG_LOG,
"search PQF: %s", pqf_wrbuf.c_str());
2522 b->search(q, &hits, &error, &addinfo, &fl, odr);
2523 ZOOM_query_destroy(q);
2528 if (
retry(package, odr, b, error, &addinfo, proxy_step,
2529 same_retries, proxy_retries))
2533 const char *element_set_name = 0;
2534 Odr_int number_to_present = 0;
2536 mp::util::piggyback_sr(sr, hits, number_to_present, &element_set_name);
2538 Odr_int number_of_records_returned = 0;
2541 0, number_to_present, &error, &addinfo,
2542 &number_of_records_returned, odr, b, sr->preferredRecordSyntax,
2546 apdu_res = odr.create_searchResponse(apdu_req, error, addinfo);
2549 apdu_res->u.searchResponse->records = records;
2550 apdu_res->u.searchResponse->numberOfRecordsReturned =
2551 odr_intdup(odr, number_of_records_returned);
2553 apdu_res->u.searchResponse->resultCount = odr_intdup(odr, hits);
2555 yaz_oi_set_facetlist(&apdu_res->u.searchResponse->additionalSearchInfo,
2557 package.response() = apdu_res;