X-Git-Url: http://lists.indexdata.dk/cgi-bin?a=blobdiff_plain;f=src%2Fclient.c;h=cb5088d249e350fec4fff0ac17233acfbabee125;hb=4dff82b21feb6db92443026561d106691ad29ee0;hp=5a73db2d2de21797e171c968e970de2e24977e50;hpb=40da7ed5f74bb4ad3bbce81943622bc2cd9ab524;p=pazpar2-moved-to-github.git diff --git a/src/client.c b/src/client.c index 5a73db2..cb5088d 100644 --- a/src/client.c +++ b/src/client.c @@ -556,38 +556,41 @@ void client_record_response(struct client *cl) } } -static int client_set_facets_request(struct client *cl, ZOOM_connection link) { - int index = 0; +static int client_set_facets_request(struct client *cl, ZOOM_connection link) +{ struct session_database *sdb = client_get_database(cl); const char *opt_facet_term_sort = session_setting_oneval(sdb, PZ_TERMLIST_TERM_SORT); const char *opt_facet_term_count = session_setting_oneval(sdb, PZ_TERMLIST_TERM_COUNT); - struct session *session = client_get_session(cl); - struct conf_service *service = session->service; - int num = service->num_metadata; - WRBUF wrbuf = wrbuf_alloc(); - int first = 1; - yaz_log(YLOG_DEBUG, "Facet settings, sort: %s count: %s", opt_facet_term_sort, opt_facet_term_count); - for (index = 0; index < num; index++) { - struct conf_metadata *conf_meta = &service->metadata[index]; - if (conf_meta->termlist) { - if (first) - first = 0; - else - wrbuf_puts(wrbuf, ","); - wrbuf_printf(wrbuf, "@attr 1=%s ", conf_meta->name); - - if (opt_facet_term_sort && opt_facet_term_sort[0] != '\0') { - wrbuf_printf(wrbuf, " @attr 2=%s ", opt_facet_term_sort); - } - if (opt_facet_term_count && opt_facet_term_count[0] != '\0') { - wrbuf_printf(wrbuf, " @attr 3=%s ", opt_facet_term_count); + /* Disable when no count is set */ + if (opt_facet_term_count && *opt_facet_term_count) + { + int index = 0; + struct session *session = client_get_session(cl); + struct conf_service *service = session->service; + int num = service->num_metadata; + WRBUF wrbuf = wrbuf_alloc(); + yaz_log(YLOG_DEBUG, "Facet settings, sort: %s count: %s", + opt_facet_term_sort, opt_facet_term_count); + for (index = 0; index < num; index++) + { + struct conf_metadata *conf_meta = &service->metadata[index]; + if (conf_meta->termlist) + { + if (wrbuf_len(wrbuf)) + wrbuf_puts(wrbuf, ", "); + wrbuf_printf(wrbuf, "@attr 1=%s", conf_meta->name); + + if (opt_facet_term_sort && *opt_facet_term_sort) + wrbuf_printf(wrbuf, " @attr 2=%s", opt_facet_term_sort); + wrbuf_printf(wrbuf, " @attr 3=%s", opt_facet_term_count); } } - } - if (wrbuf_len(wrbuf)) { - yaz_log(YLOG_LOG, "Setting ZOOM facets option: %s", wrbuf_cstr(wrbuf)); - ZOOM_connection_option_set(link, "facets", wrbuf_cstr(wrbuf)); - return 1; + if (wrbuf_len(wrbuf)) + { + yaz_log(YLOG_LOG, "Setting ZOOM facets option: %s", wrbuf_cstr(wrbuf)); + ZOOM_connection_option_set(link, "facets", wrbuf_cstr(wrbuf)); + return 1; + } } return 0; } @@ -838,6 +841,34 @@ static char *make_cqlquery(struct client *cl) return r; } +// returns a xmalloced SOLR query corresponding to the pquery in client +// TODO Could prob. be merge with the similar make_cqlquery +static char *make_solrquery(struct client *cl) +{ + cql_transform_t sqlt = solr_transform_create(); + Z_RPNQuery *zquery; + char *r; + WRBUF wrb = wrbuf_alloc(); + int status; + ODR odr_out = odr_createmem(ODR_ENCODE); + + zquery = p_query_rpn(odr_out, cl->pquery); + yaz_log(YLOG_LOG, "PQF: %s", cl->pquery); + if ((status = solr_transform_rpn2solr_wrbuf(sqlt, wrb, zquery))) + { + yaz_log(YLOG_WARN, "Failed to generate SOLR query, code=%d", status); + r = 0; + } + else + { + r = xstrdup(wrbuf_cstr(wrb)); + } + wrbuf_destroy(wrb); + odr_destroy(odr_out); + cql_transform_close(sqlt); + return r; +} + // Parse the query given the settings specific to this client int client_parse_query(struct client *cl, const char *query) { @@ -895,6 +926,8 @@ int client_parse_query(struct client *cl, const char *query) xfree(cl->cqlquery); if (*sru) { + if (!strcmp(sru, "solr") + if (!(cl->cqlquery = make_cqlquery(cl))) return -1; }