X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fsession.c;h=e9784256a1be46fa5243edda8de9228569ae755e;hb=a76512b8ddfe29c8b37c63ea5c1300b5a38102e4;hp=9e52d59f4492b128d9061973c747fbdf12e6fb6f;hpb=7db45d2bc967511916800d163b2c3e290c62da40;p=pazpar2-moved-to-github.git diff --git a/src/session.c b/src/session.c index 9e52d59..e978425 100644 --- a/src/session.c +++ b/src/session.c @@ -1,5 +1,5 @@ /* This file is part of Pazpar2. - Copyright (C) 2006-2013 Index Data + Copyright (C) Index Data Pazpar2 is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -57,7 +57,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include #include -#define USE_TIMING 1 +#define USE_TIMING 0 #if USE_TIMING #include #endif @@ -905,36 +905,38 @@ static struct session_database *find_session_database(struct session *se, } // Apply a session override to a database -void session_apply_setting(struct session *se, char *dbname, char *setting, +void session_apply_setting(struct session *se, char *dbname, char *name, char *value) { struct session_database *sdb = find_session_database(se, dbname); struct conf_service *service = se->service; - struct setting *new = nmem_malloc(se->session_nmem, sizeof(*new)); - int offset = settings_create_offset(service, setting); + struct setting *s; + int offset = settings_create_offset(service, name); expand_settings_array(&sdb->settings, &sdb->num_settings, offset, se->session_nmem); - new->precedence = 0; - new->target = dbname; - new->name = setting; - new->value = value; - new->next = sdb->settings[offset]; - sdb->settings[offset] = new; - - se->settings_modified = 1; // Force later recompute of settings-driven data structures // (happens when a search starts and client connections are prepared) - switch (offset) - { - case PZ_XSLT: - if (sdb->map) + if (offset == PZ_XSLT) + sdb->map = 0; + + se->settings_modified = 1; + for (s = sdb->settings[offset]; s; s = s->next) + if (!strcmp(s->name, name) && + dbname && s->target && !strcmp(dbname, s->target)) { - sdb->map = 0; + s->value = value; + return; } - break; - } + s = nmem_malloc(se->session_nmem, sizeof(*s)); + s->precedence = 0; + s->target = dbname; + s->name = name; + s->value = value; + s->next = sdb->settings[offset]; + sdb->settings[offset] = s; + } void session_destroy(struct session *se) @@ -1280,6 +1282,12 @@ int session_fetch_more(struct session *se) { session_log(se, YLOG_LOG, "%s: no more to fetch", client_get_id(cl)); + session_log(se, YLOG_LOG, "%s: hits=" ODR_INT_PRINTF + " records=%d filtered=%d", + client_get_id(cl), + client_get_hits(cl), + client_get_num_records(cl), + client_get_num_records_filtered(cl)); } } else @@ -1314,7 +1322,7 @@ struct record_cluster **show_range_start(struct session *se, if (se->relevance) { for (spp = sp; spp; spp = spp->next) - if (spp->type == Metadata_sortkey_relevance) + if (spp->type == Metadata_type_relevance) { relevance_prepare_read(se->relevance, se->reclist); break; @@ -1455,17 +1463,20 @@ static struct record_metadata *record_metadata_init( } *attrp = 0; - if (type == Metadata_type_generic) + switch (type) { - char *p = nmem_strdup(nmem, value); - - p = normalize7bit_generic(p, " ,/.:(["); - - rec_md->data.text.disp = p; + case Metadata_type_generic: + case Metadata_type_skiparticle: + if (strstr(value, "://")) /* looks like a URL */ + rec_md->data.text.disp = nmem_strdup(nmem, value); + else + rec_md->data.text.disp = + normalize7bit_generic(nmem_strdup(nmem, value), " ,/.:(["); rec_md->data.text.sort = 0; rec_md->data.text.snippet = 0; - } - else if (type == Metadata_type_year || type == Metadata_type_date) + break; + case Metadata_type_year: + case Metadata_type_date: { int first, last; int longdate = 0; @@ -1478,8 +1489,14 @@ static struct record_metadata *record_metadata_init( rec_md->data.number.min = first; rec_md->data.number.max = last; } - else + break; + case Metadata_type_float: + rec_md->data.fnumber = atof(value); + break; + case Metadata_type_relevance: + case Metadata_type_position: return 0; + } return rec_md; } @@ -1676,9 +1693,6 @@ static int ingest_sub_record(struct client *cl, xmlDoc *xdoc, xmlNode *root, { int ret = 0; struct session *se = client_get_session(cl); - struct conf_service *service = se->service; - - insert_settings_values(sdb, xdoc, root, service); if (!check_record_filter(root, sdb)) { @@ -1711,9 +1725,19 @@ int ingest_record(struct client *cl, const char *rec, struct session_database *sdb = client_get_database(cl); struct conf_service *service = se->service; xmlDoc *xdoc = normalize_record(se, sdb, service, rec, nmem); - int r = 0; - xmlNode *root; + int r = ingest_xml_record(cl, xdoc, record_no, nmem, 0); + client_store_xdoc(cl, record_no, xdoc); + return r; +} +int ingest_xml_record(struct client *cl, xmlDoc *xdoc, + int record_no, NMEM nmem, int cached_copy) +{ + struct session *se = client_get_session(cl); + struct session_database *sdb = client_get_database(cl); + struct conf_service *service = se->service; + xmlNode *root; + int r = 0; if (!xdoc) return -1; @@ -1728,24 +1752,52 @@ int ingest_record(struct client *cl, const char *rec, if (!strcmp((const char *) root->name, "cluster")) { + int no_merge_keys = 0; + int no_merge_dups = 0; xmlNode *sroot; + struct record_metadata_attr *mk = 0; + for (sroot = root->children; sroot; sroot = sroot->next) - if (sroot->type == XML_ELEMENT_NODE) + if (sroot->type == XML_ELEMENT_NODE && + !strcmp((const char *) sroot->name, "record")) { + struct record_metadata_attr **mkp; const char *mergekey_norm = get_mergekey(xdoc, sroot, cl, record_no, service, nmem, - se->mergekey); - - struct record_metadata_attr *mk = (struct record_metadata_attr*) - nmem_malloc(nmem, sizeof(*mk)); - mk->name = 0; - mk->value = nmem_strdup(nmem, mergekey_norm); - mk->next = 0; - + se->mergekey); + if (!mergekey_norm) + { + r = -1; + break; + } + for (mkp = &mk; *mkp; mkp = &(*mkp)->next) + if (!strcmp((*mkp)->value, mergekey_norm)) + break; + if (!*mkp) + { + *mkp = (struct record_metadata_attr*) + nmem_malloc(nmem, sizeof(**mkp)); + (*mkp)->name = 0; + (*mkp)->value = nmem_strdup(nmem, mergekey_norm); + (*mkp)->next = 0; + no_merge_keys++; + } + else + no_merge_dups++; + } + if (no_merge_keys > 1 || no_merge_dups > 0) + { + yaz_log(YLOG_LOG, "Got %d mergekeys, %d dups for position %d", + no_merge_keys, no_merge_dups, record_no); + } + for (sroot = root->children; !r && sroot; sroot = sroot->next) + if (sroot->type == XML_ELEMENT_NODE && + !strcmp((const char *) sroot->name, "record")) + { + if (!cached_copy) + insert_settings_values(sdb, xdoc, root, service); r = ingest_sub_record(cl, xdoc, sroot, record_no, nmem, sdb, mk); - if (r) - break; } } else if (!strcmp((const char *) root->name, "record")) @@ -1761,6 +1813,8 @@ int ingest_record(struct client *cl, const char *rec, mk->value = nmem_strdup(nmem, mergekey_norm); mk->next = 0; + if (!cached_copy) + insert_settings_values(sdb, xdoc, root, service); r = ingest_sub_record(cl, xdoc, root, record_no, nmem, sdb, mk); } } @@ -1770,7 +1824,6 @@ int ingest_record(struct client *cl, const char *rec, (const char *) root->name); r = -1; } - xmlFreeDoc(xdoc); return r; } @@ -2030,18 +2083,22 @@ static int ingest_to_cluster(struct client *cl, if (check_limit_local(cl, record, record_no)) { - session_log(se, YLOG_LOG, "Facet filtered out record no %d from %s", - record_no, sdb->database->id); if (type) xmlFree(type); if (value) xmlFree(value); return -2; } - cluster = reclist_insert(se->reclist, service, record, + cluster = reclist_insert(se->reclist, se->relevance, service, record, merge_keys, &se->total_merged); if (!cluster) + { + if (type) + xmlFree(type); + if (value) + xmlFree(value); return 0; // complete match with existing record + } { const char *use_term_factor_str = @@ -2061,9 +2118,6 @@ static int ingest_to_cluster(struct client *cl, session_log(se, YLOG_LOG, "Cluster id %s from %s (#%d)", cluster->recid, sdb->database->id, record_no); - - relevance_newrec(se->relevance, cluster); - // original metadata, to check if first existence of a field metadata0 = xmalloc(sizeof(*metadata0) * service->num_metadata); memcpy(metadata0, cluster->metadata, @@ -2185,7 +2239,7 @@ static int ingest_to_cluster(struct client *cl, { const char *sort_str = 0; int skip_article = - ser_sk->type == Metadata_sortkey_skiparticle; + ser_sk->type == Metadata_type_skiparticle; if (!cluster->sortkeys[sk_field_id]) cluster->sortkeys[sk_field_id] =