X-Git-Url: http://lists.indexdata.com/cgi-bin?a=blobdiff_plain;f=src%2Fsession.c;h=bb1f6cb750538022a9b7e37621b1212af4894726;hb=1c320abd379ba19f7ab6ff3ed3a31fb72873990b;hp=50c4b94361d40f70ab6efde4d6afa5abdea9a4ac;hpb=6e2b2cc9c5c0290bf2fc53ff3dab7bf15c97526b;p=pazpar2-moved-to-github.git diff --git a/src/session.c b/src/session.c index 50c4b94..bb1f6cb 100644 --- a/src/session.c +++ b/src/session.c @@ -631,6 +631,8 @@ static void session_clear_set(struct session *se, struct reclist_sortparms *sp) se->total_records = se->total_merged = 0; se->num_termlists = 0; + relevance_clear(se->relevance); + /* reset list of sorted results and clear to relevance search */ se->sorted_results = nmem_malloc(se->nmem, sizeof(*se->sorted_results)); se->sorted_results->name = nmem_strdup(se->nmem, sp->name); @@ -644,7 +646,9 @@ static void session_clear_set(struct session *se, struct reclist_sortparms *sp) se->reclist = reclist_create(se->nmem); } -static void session_sort_unlocked(struct session *se, struct reclist_sortparms *sp) +static void session_sort_unlocked(struct session *se, + struct reclist_sortparms *sp, + const char *mergekey) { struct reclist_sortparms *sr; struct client_list *l; @@ -655,20 +659,37 @@ static void session_sort_unlocked(struct session *se, struct reclist_sortparms * session_log(se, YLOG_DEBUG, "session_sort field=%s increasing=%d type=%d", field, increasing, type); - /* see if we already have sorted for this criteria */ - for (sr = se->sorted_results; sr; sr = sr->next) + + if (!mergekey || + (se->mergekey && !strcmp(se->mergekey, mergekey))) { - if (!reclist_sortparms_cmp(sr, sp)) - break; + /* mergekey unchanged.. */ + /* see if we already have sorted for this criteria */ + for (sr = se->sorted_results; sr; sr = sr->next) + { + if (!reclist_sortparms_cmp(sr, sp)) + break; + } + if (sr) + { + session_log(se, YLOG_DEBUG, "search_sort: field=%s increasing=%d type=%d already fetched", + field, increasing, type); + return; + } + session_log(se, YLOG_DEBUG, "search_sort: field=%s increasing=%d type=%d must fetch", + field, increasing, type); } - if (sr) + else { - session_log(se, YLOG_DEBUG, "search_sort: field=%s increasing=%d type=%d already fetched", - field, increasing, type); - return; + /* new mergekey must research/reingest anyway */ + assert(mergekey); + xfree(se->mergekey); + se->mergekey = *mergekey ? xstrdup(mergekey) : 0; + clients_research = 1; + + session_log(se, YLOG_DEBUG, "search_sort: new mergekey = %s", + mergekey); } - session_log(se, YLOG_DEBUG, "search_sort: field=%s increasing=%d type=%d must fetch", - field, increasing, type); // We need to reset reclist on every sort that changes the records, not just for position // So if just one client requires new searching, we need to clear set. @@ -717,9 +738,11 @@ static void session_sort_unlocked(struct session *se, struct reclist_sortparms * } } -void session_sort(struct session *se, struct reclist_sortparms *sp) { +void session_sort(struct session *se, struct reclist_sortparms *sp, + const char *mergekey) +{ //session_enter(se, "session_sort"); - session_sort_unlocked(se, sp); + session_sort_unlocked(se, sp, mergekey); //session_leave(se, "session_sort"); } @@ -731,7 +754,8 @@ enum pazpar2_error_code session_search(struct session *se, const char *filter, const char *limit, const char **addinfo, - struct reclist_sortparms *sp) + struct reclist_sortparms *sp, + const char *mergekey) { int live_channels = 0; int no_working = 0; @@ -752,6 +776,12 @@ enum pazpar2_error_code session_search(struct session *se, session_enter(se, "session_search"); se->settings_modified = 0; + if (mergekey) + { + xfree(se->mergekey); + se->mergekey = *mergekey ? xstrdup(mergekey) : 0; + } + session_clear_set(se, sp); relevance_destroy(&se->relevance); @@ -925,6 +955,7 @@ void session_destroy(struct session *se) normalize_cache_destroy(se->normalize_cache); relevance_destroy(&se->relevance); reclist_destroy(se->reclist); + xfree(se->mergekey); if (nmem_total(se->nmem)) session_log(se, YLOG_DEBUG, "NMEN operation usage %zd", nmem_total(se->nmem)); if (nmem_total(se->session_nmem)) @@ -973,6 +1004,7 @@ struct session *new_session(NMEM nmem, struct conf_service *service, session->databases = 0; session->sorted_results = 0; session->facet_limits = 0; + session->mergekey = 0; for (i = 0; i <= SESSION_WATCH_MAX; i++) { @@ -1317,9 +1349,7 @@ struct record_cluster **show_range_start(struct session *se, client_update_show_stat(rec->client, 1); } } - if (*num > 0) - recs = - nmem_malloc(se->nmem, *num * sizeof(struct record_cluster *)); + recs = nmem_malloc(se->nmem, (*num > 0 ? *num : 1) * sizeof(*recs)); for (i = 0; i < *num; i++) { struct record_cluster *r = reclist_read_record(se->reclist); @@ -1472,7 +1502,7 @@ static int get_mergekey_from_doc(xmlDoc *doc, xmlNode *root, const char *name, else if (!strcmp(name, (const char *) type)) { xmlChar *value = xmlNodeListGetString(doc, n->children, 1); - if (value) + if (value && *value) { const char *norm_str; pp2_charset_token_t prt = @@ -1491,10 +1521,11 @@ static int get_mergekey_from_doc(xmlDoc *doc, xmlNode *root, const char *name, wrbuf_puts(norm_wr, norm_str); } } - xmlFree(value); pp2_charset_token_destroy(prt); no_found++; } + if (value) + xmlFree(value); } xmlFree(type); } @@ -1503,15 +1534,25 @@ static int get_mergekey_from_doc(xmlDoc *doc, xmlNode *root, const char *name, } static const char *get_mergekey(xmlDoc *doc, struct client *cl, int record_no, - struct conf_service *service, NMEM nmem) + struct conf_service *service, NMEM nmem, + const char *session_mergekey) { char *mergekey_norm = 0; xmlNode *root = xmlDocGetRootElement(doc); WRBUF norm_wr = wrbuf_alloc(); + xmlChar *mergekey; - /* consider mergekey from XSL first */ - xmlChar *mergekey = xmlGetProp(root, (xmlChar *) "mergekey"); - if (mergekey) + if (session_mergekey) + { + int i, num = 0; + char **values = 0; + nmem_strsplit_escape2(nmem, ",", session_mergekey, &values, + &num, 1, '\\', 1); + + for (i = 0; i < num; i++) + get_mergekey_from_doc(doc, root, values[i], service, norm_wr); + } + else if ((mergekey = xmlGetProp(root, (xmlChar *) "mergekey"))) { const char *norm_str; pp2_charset_token_t prt = @@ -1669,7 +1710,8 @@ int ingest_record(struct client *cl, const char *rec, return -2; } - mergekey_norm = get_mergekey(xdoc, cl, record_no, service, nmem); + mergekey_norm = get_mergekey(xdoc, cl, record_no, service, nmem, + se->mergekey); if (!mergekey_norm) { session_log(se, YLOG_WARN, "Got no mergekey"); @@ -1677,7 +1719,7 @@ int ingest_record(struct client *cl, const char *rec, return -1; } session_enter(se, "ingest_record"); - if (client_get_session(cl) == se) + if (client_get_session(cl) == se && se->relevance) ret = ingest_to_cluster(cl, xdoc, root, record_no, mergekey_norm); session_leave(se, "ingest_record"); @@ -2155,7 +2197,7 @@ void session_log(struct session *s, int level, const char *fmt, ...) va_start(ap, fmt); yaz_vsnprintf(buf, sizeof(buf)-30, fmt, ap); - yaz_log(level, "Session %u: %s", s->session_id, buf); + yaz_log(level, "Session %u: %s", s ? s->session_id : 0, buf); va_end(ap); }