X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Fsession.c;h=64920dab0ced4c9c4dcc62852bced78d2f3b9d81;hb=3d15adb76380c419eafbb8ae0755208474cc9568;hp=36be0616c55b6e99ca86d6056d33797f2031a803;hpb=eca44e3cf91bcb32e816f99736f81286312f51d7;p=pazpar2-moved-to-github.git diff --git a/src/session.c b/src/session.c index 36be061..64920da 100644 --- a/src/session.c +++ b/src/session.c @@ -408,40 +408,43 @@ const char *session_setting_oneval(struct session_database *db, int offset) // setting. However, this is not a realistic use scenario. static int prepare_map(struct session *se, struct session_database *sdb) { - const char *s; - - if (sdb->settings && sdb->settings[PZ_XSLT] && !sdb->map && - (s = session_setting_oneval(sdb, PZ_XSLT))) + if (sdb->settings && !sdb->map) { - char auto_stylesheet[256]; + const char *s; - if (!strcmp(s, "auto")) + if (sdb->settings[PZ_XSLT] && + (s = session_setting_oneval(sdb, PZ_XSLT))) { - const char *request_syntax = session_setting_oneval( - sdb, PZ_REQUESTSYNTAX); - if (request_syntax) + char auto_stylesheet[256]; + + if (!strcmp(s, "auto")) { - char *cp; - yaz_snprintf(auto_stylesheet, sizeof(auto_stylesheet), - "%s.xsl", request_syntax); - for (cp = auto_stylesheet; *cp; cp++) + const char *request_syntax = session_setting_oneval( + sdb, PZ_REQUESTSYNTAX); + if (request_syntax) { - /* deliberately only consider ASCII */ - if (*cp > 32 && *cp < 127) - *cp = tolower(*cp); + char *cp; + yaz_snprintf(auto_stylesheet, sizeof(auto_stylesheet), + "%s.xsl", request_syntax); + for (cp = auto_stylesheet; *cp; cp++) + { + /* deliberately only consider ASCII */ + if (*cp > 32 && *cp < 127) + *cp = tolower(*cp); + } + s = auto_stylesheet; + } + else + { + session_log(se, YLOG_WARN, + "No pz:requestsyntax for auto stylesheet"); } - s = auto_stylesheet; - } - else - { - session_log(se, YLOG_WARN, - "No pz:requestsyntax for auto stylesheet"); } + sdb->map = normalize_cache_get(se->normalize_cache, + se->service, s); + if (!sdb->map) + return -1; } - sdb->map = normalize_cache_get(se->normalize_cache, - se->service, s); - if (!sdb->map) - return -1; } return 0; } @@ -634,12 +637,12 @@ void session_sort(struct session *se, const char *field, int increasing) } if (sr) { - yaz_log(YLOG_LOG, "search_sort: field=%s increasing=%d already fetched", + session_log(se, YLOG_DEBUG, "search_sort: field=%s increasing=%d already fetched", field, increasing); session_leave(se); return; } - yaz_log(YLOG_LOG, "search_sort: field=%s increasing=%d must fetch", + session_log(se, YLOG_DEBUG, "search_sort: field=%s increasing=%d must fetch", field, increasing); sr = nmem_malloc(se->nmem, sizeof(*sr)); sr->field = nmem_strdup(se->nmem, field); @@ -689,6 +692,8 @@ enum pazpar2_error_code session_search(struct session *se, se->reclist = 0; se->settings_modified = 0; relevance_destroy(&se->relevance); + if (nmem_total(se->nmem)) + session_log(se, YLOG_DEBUG, "NMEN operation usage %zd", nmem_total(se->nmem)); nmem_reset(se->nmem); se->total_records = se->total_merged = 0; se->num_termlists = 0; @@ -746,12 +751,12 @@ enum pazpar2_error_code session_search(struct session *se, &tval); if (parse_ret == 1 && r == 2) { - session_log(se, YLOG_LOG, "client REUSE %s", client_get_id(cl)); + session_log(se, YLOG_LOG, "client %s REUSE result", client_get_id(cl)); client_reingest(cl); } else if (r) { - session_log(se, YLOG_LOG, "client NEW %s", client_get_id(cl)); + session_log(se, YLOG_LOG, "client %s NEW search", client_get_id(cl)); client_start_search(cl); } no_working++; @@ -775,7 +780,7 @@ enum pazpar2_error_code session_search(struct session *se, else return PAZPAR2_NO_TARGETS; } - yaz_log(YLOG_LOG, "session_start_search done"); + session_log(se, YLOG_LOG, "session_start_search done"); return PAZPAR2_NO_ERROR; } @@ -821,8 +826,7 @@ void session_init_databases(struct session *se) static struct session_database *load_session_database(struct session *se, char *id) { - struct database *db = new_database(id, se->session_nmem); - + struct database *db = new_database_inherit_settings(id, se->session_nmem, se->service->settings); session_init_databases_fun((void*) se, db); // New sdb is head of se->databases list @@ -886,6 +890,10 @@ void session_destroy(struct session *se) normalize_cache_destroy(se->normalize_cache); relevance_destroy(&se->relevance); reclist_destroy(se->reclist); + if (nmem_total(se->nmem)) + session_log(se, YLOG_DEBUG, "NMEN operation usage %zd", nmem_total(se->nmem)); + if (nmem_total(se->session_nmem)) + session_log(se, YLOG_DEBUG, "NMEN session usage %zd", nmem_total(se->session_nmem)); nmem_destroy(se->nmem); service_destroy(se->service); yaz_mutex_destroy(&se->session_mutex); @@ -1015,6 +1023,14 @@ static int cmp_ht(const void *p1, const void *p2) return h2->hits - h1->hits; } +// Compares two hitsbytarget nodes by hitcount +static int cmp_ht_approx(const void *p1, const void *p2) +{ + const struct hitsbytarget *h1 = p1; + const struct hitsbytarget *h2 = p2; + return h2->approximation - h1->approximation; +} + static int targets_termlist_nb(WRBUF wrbuf, struct session *se, int num, NMEM nmem, int version) { @@ -1022,7 +1038,10 @@ static int targets_termlist_nb(WRBUF wrbuf, struct session *se, int num, int count, i; ht = hitsbytarget_nb(se, &count, nmem); - qsort(ht, count, sizeof(struct hitsbytarget), cmp_ht); + if (version >= 2) + qsort(ht, count, sizeof(struct hitsbytarget), cmp_ht_approx); + else + qsort(ht, count, sizeof(struct hitsbytarget), cmp_ht); for (i = 0; i < count && i < num && ht[i].hits > 0; i++) { @@ -1576,6 +1595,7 @@ int ingest_record(struct client *cl, const char *rec, return ret; } +// Skip record on non-zero static int check_limit_local(struct client *cl, struct record *record, int record_no) @@ -1594,9 +1614,7 @@ static int check_limit_local(struct client *cl, char **values = 0; int i, num_v = 0; - const char *name = - client_get_facet_limit_local(cl, sdb, &l, nmem_tmp, &num_v, - &values); + const char *name = client_get_facet_limit_local(cl, sdb, &l, nmem_tmp, &num_v, &values); if (!name) break; @@ -1608,7 +1626,7 @@ static int check_limit_local(struct client *cl, } ser_md = &service->metadata[md_field_id]; rec_md = record->metadata[md_field_id]; - yaz_log(YLOG_LOG, "check limit local %s", name); + yaz_log(YLOG_DEBUG, "check limit local %s", name); for (i = 0; i < num_v; ) { if (rec_md) @@ -1623,10 +1641,10 @@ static int check_limit_local(struct client *cl, } else { - yaz_log(YLOG_LOG, "cmp: '%s' '%s'", - rec_md->data.text.disp, values[i]); + yaz_log(YLOG_DEBUG, "cmp: '%s' '%s'", rec_md->data.text.disp, values[i]); if (!strcmp(rec_md->data.text.disp, values[i])) { + // Value equals, should not be filtered. break; } } @@ -1638,6 +1656,7 @@ static int check_limit_local(struct client *cl, i++; } } + // At end , not match if (i == num_v) { skip_record = 1; @@ -1776,6 +1795,8 @@ static int ingest_to_cluster(struct client *cl, struct record_metadata *rec_md = 0; int md_field_id = -1; int sk_field_id = -1; + int rank = 0; + xmlChar *rank_str = 0; type = xmlGetProp(n, (xmlChar *) "type"); value = xmlNodeListGetString(xdoc, n->children, 1); @@ -1789,6 +1810,15 @@ static int ingest_to_cluster(struct client *cl, continue; ser_md = &service->metadata[md_field_id]; + + rank_str = xmlGetProp(n, (xmlChar *) "rank"); + if (rank_str) + { + rank = atoi((const char *) rank_str); + xmlFree(rank_str); + } + else + rank = ser_md->rank; if (ser_md->sortkey_offset >= 0) { @@ -1888,10 +1918,11 @@ static int ingest_to_cluster(struct client *cl, // ranking of _all_ fields enabled ... - if (ser_md->rank) + if (rank) + { relevance_countwords(se->relevance, cluster, - (char *) value, ser_md->rank, - ser_md->name); + (char *) value, rank, ser_md->name); + } // construct facets ... unless the client already has reported them if (ser_md->termlist && !client_has_facet(cl, (char *) type))