X-Git-Url: http://lists.indexdata.com/cgi-bin?a=blobdiff_plain;f=src%2Fclient.c;h=8890060c9f3f3c0d00e9e3d2435a67e64171ff01;hb=623e44e53759f90d04a14b0ad7243ac2f816ba41;hp=0ae364138febd121880e99894dbb927197e700c8;hpb=7a464badf789151889130191602d5dea5ba1d243;p=pazpar2-moved-to-github.git diff --git a/src/client.c b/src/client.c index 0ae3641..8890060 100644 --- a/src/client.c +++ b/src/client.c @@ -108,6 +108,7 @@ struct client { struct session *session; char *pquery; // Current search char *cqlquery; // used for SRU targets only + char *addinfo; // diagnostic info for most resent error Odr_int hits; int record_offset; int maxrecs; @@ -121,6 +122,7 @@ struct client { YAZ_MUTEX mutex; int ref_count; char *id; + facet_limits_t facet_limits; }; struct suggestions { @@ -184,6 +186,8 @@ void client_set_state(struct client *cl, enum client_state st) client_get_id(cl), no_active); if (no_active == 0) { session_alert_watch(cl->session, SESSION_WATCH_SHOW); + session_alert_watch(cl->session, SESSION_WATCH_BYTARGET); + session_alert_watch(cl->session, SESSION_WATCH_TERMLIST); session_alert_watch(cl->session, SESSION_WATCH_SHOW_PREF); } } @@ -552,10 +556,15 @@ void client_got_records(struct client *cl) struct session *se = cl->session; if (se) { - client_unlock(cl); - session_alert_watch(se, SESSION_WATCH_SHOW); - session_alert_watch(se, SESSION_WATCH_RECORD); - client_lock(cl); + if (reclist_get_num_records(se->reclist) > 0) + { + client_unlock(cl); + session_alert_watch(se, SESSION_WATCH_SHOW); + session_alert_watch(se, SESSION_WATCH_BYTARGET); + session_alert_watch(se, SESSION_WATCH_TERMLIST); + session_alert_watch(se, SESSION_WATCH_RECORD); + client_lock(cl); + } } } @@ -695,12 +704,37 @@ int client_has_facet(struct client *cl, const char *name) return 0; } -void client_start_search(struct client *cl, const char *sort_strategy_and_spec, - int increasing) +static const char *get_strategy_plus_sort(struct client *l, const char *field) +{ + struct session_database *sdb = client_get_database(l); + struct setting *s; + + const char *strategy_plus_sort = 0; + + for (s = sdb->settings[PZ_SORTMAP]; s; s = s->next) + { + char *p = strchr(s->name + 3, ':'); + if (!p) + { + yaz_log(YLOG_WARN, "Malformed sortmap name: %s", s->name); + continue; + } + p++; + if (!strcmp(p, field)) + { + strategy_plus_sort = s->value; + break; + } + } + return strategy_plus_sort; +} + +void client_start_search(struct client *cl) { struct session_database *sdb = client_get_database(cl); struct connection *co = client_get_connection(cl); ZOOM_connection link = connection_get_link(co); + struct session *se = client_get_session(cl); ZOOM_resultset rs; const char *opt_piggyback = session_setting_oneval(sdb, PZ_PIGGYBACK); const char *opt_queryenc = session_setting_oneval(sdb, PZ_QUERYENCODING); @@ -716,8 +750,6 @@ void client_start_search(struct client *cl, const char *sort_strategy_and_spec, assert(link); - cl->hits = 0; - cl->record_offset = 0; cl->diagnostic = 0; if (extra_args && *extra_args) @@ -780,25 +812,43 @@ void client_start_search(struct client *cl, const char *sort_strategy_and_spec, ZOOM_query_prefix(q, cl->pquery); } - if (sort_strategy_and_spec && - strlen(sort_strategy_and_spec) < 40 /* spec below */) - { - char spec[50], *p; - strcpy(spec, sort_strategy_and_spec); - p = strchr(spec, ':'); - if (p) + if (se->sorted_results) + { /* first entry is current sorting ! */ + const char *sort_strategy_and_spec = + get_strategy_plus_sort(cl, se->sorted_results->field); + int increasing = se->sorted_results->increasing; + if (sort_strategy_and_spec && strlen(sort_strategy_and_spec) < 40) { - *p++ = '\0'; /* cut the string in two */ - while (*p == ' ') - p++; - if (increasing) - strcat(p, " <"); - else - strcat(p, " >"); - yaz_log(YLOG_LOG, "applying %s %s", spec, p); - ZOOM_query_sortby2(q, spec, p); + char spec[50], *p; + strcpy(spec, sort_strategy_and_spec); + p = strchr(spec, ':'); + if (p) + { + *p++ = '\0'; /* cut the string in two */ + while (*p == ' ') + p++; + if (increasing) + strcat(p, " <"); + else + strcat(p, " >"); + yaz_log(YLOG_LOG, "applying %s %s", spec, p); + ZOOM_query_sortby2(q, spec, p); + } + } + else + { + /* no native sorting.. If this is not the first search, then + skip it entirely */ + if (se->sorted_results->next) + { + ZOOM_query_destroy(q); + client_set_state_nb(cl, Client_Idle); + return; + } } } + cl->hits = 0; + cl->record_offset = 0; rs = ZOOM_connection_search(link, q); ZOOM_query_destroy(q); ZOOM_resultset_destroy(cl->resultset); @@ -813,6 +863,7 @@ struct client *client_create(const char *id) cl->startrecs = 0; cl->pquery = 0; cl->cqlquery = 0; + cl->addinfo = 0; cl->database = 0; cl->connection = 0; cl->session = 0; @@ -827,6 +878,7 @@ struct client *client_create(const char *id) pazpar2_mutex_create(&cl->mutex, "client"); cl->preferred = 0; cl->ref_count = 1; + cl->facet_limits = 0; assert(id); cl->id = xstrdup(id); client_use(1); @@ -863,8 +915,11 @@ int client_destroy(struct client *c) c->pquery = 0; xfree(c->cqlquery); c->cqlquery = 0; + xfree(c->addinfo); + c->addinfo = 0; xfree(c->id); assert(!c->connection); + facet_limits_destroy(c->facet_limits); if (c->resultset) { @@ -988,6 +1043,33 @@ static char *make_solrquery(struct client *cl) return r; } +const char *client_get_facet_limit_local(struct client *cl, + struct session_database *sdb, + int *l, + NMEM nmem, int *num, char ***values) +{ + const char *name = 0; + const char *value = 0; + for (; (name = facet_limits_get(cl->facet_limits, *l, &value)); (*l)++) + { + struct setting *s = 0; + + for (s = sdb->settings[PZ_LIMITMAP]; s; s = s->next) + { + const char *p = strchr(s->name + 3, ':'); + if (p && !strcmp(p + 1, name) && s->value && + !strncmp(s->value, "local:", 6)) + { + nmem_strsplit_escape2(nmem, "|", value, values, + num, 1, '\\', 1); + (*l)++; + return name; + } + } + } + return 0; +} + static int apply_limit(struct session_database *sdb, facet_limits_t facet_limits, WRBUF w_pqf, WRBUF w_ccl) @@ -1112,6 +1194,9 @@ int client_parse_query(struct client *cl, const char *query, if (apply_limit(sdb, facet_limits, w_pqf, w_ccl)) return -2; + facet_limits_destroy(cl->facet_limits); + cl->facet_limits = facet_limits_dup(facet_limits); + yaz_log(YLOG_LOG, "CCL query: %s", wrbuf_cstr(w_ccl)); cn = ccl_find_str(ccl_map, wrbuf_cstr(w_ccl), &cerror, &cpos); ccl_qual_rm(&ccl_map); @@ -1223,13 +1308,20 @@ int client_get_num_records(struct client *cl) return cl->record_offset; } -void client_set_diagnostic(struct client *cl, int diagnostic) +void client_set_diagnostic(struct client *cl, int diagnostic, + const char *addinfo) { cl->diagnostic = diagnostic; + xfree(cl->addinfo); + cl->addinfo = 0; + if (addinfo) + cl->addinfo = xstrdup(addinfo); } -int client_get_diagnostic(struct client *cl) +int client_get_diagnostic(struct client *cl, const char **addinfo) { + if (addinfo) + *addinfo = cl->addinfo; return cl->diagnostic; } @@ -1239,7 +1331,7 @@ const char * client_get_suggestions_xml(struct client *cl, WRBUF wrbuf) struct suggestions *suggestions = cl->suggestions; if (!suggestions) { - yaz_log(YLOG_DEBUG, "No suggestions found"); + //yaz_log(YLOG_DEBUG, "No suggestions found"); return ""; } if (suggestions->passthrough) {