void client_set_state(struct client *cl, enum client_state st)
{
+ int was_active = 0;
+ if (client_is_active(cl))
+ was_active = 1;
cl->state = st;
- /* no need to check for all client being non-active if this one
- already is. Note that session_active_clients also LOCKS session */
- if (!client_is_active(cl) && cl->session)
+ /* If client is going from being active to inactive and all clients
+ are now idle we fire a watch for the session . The assumption is
+ that session is not mutex locked if client is already active */
+ if (was_active && !client_is_active(cl) && cl->session)
{
int no_active = session_active_clients(cl->session);
if (no_active == 0)
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);
+ /* Disable when no count is set */
+ if (opt_facet_term_count == 0 || opt_facet_term_count[0] == '\0') {
+ yaz_log(YLOG_LOG, "Resetting ZOOM facets option to empty.");
+ ZOOM_connection_option_set(link, "facets", "");
+ return 0;
+ }
struct session *session = client_get_session(cl);
struct conf_service *service = session->service;
int num = service->num_metadata;
- yaz_log(YLOG_DEBUG, "Facet settings, sort: %s count: %s", opt_facet_term_sort, opt_facet_term_count);
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) {
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)
{
xfree(cl->cqlquery);
if (*sru)
{
+ if (!strcmp(sru, "solr")
+
if (!(cl->cqlquery = make_cqlquery(cl)))
return -1;
}