X-Git-Url: http://lists.indexdata.com/cgi-bin?a=blobdiff_plain;f=src%2Flogic.c;h=b02deac6958d7e44537f924381abcfb8f9d56e34;hb=bc04e18bcab36d307a8e4c820c7d309e71cf6d69;hp=1ceffce21b5a296067b5ea7d074c9a865b77e439;hpb=7a99aea06e5d23ce1320c4e3a368543c6a7ab1e4;p=pazpar2-moved-to-github.git diff --git a/src/logic.c b/src/logic.c index 1ceffce..b02deac 100644 --- a/src/logic.c +++ b/src/logic.c @@ -1,4 +1,4 @@ -/* $Id: logic.c,v 1.38 2007-06-07 12:27:03 adam Exp $ +/* $Id: logic.c,v 1.42 2007-06-13 13:04:34 adam Exp $ Copyright (c) 2006-2007, Index Data. This file is part of Pazpar2. @@ -72,6 +72,8 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include "settings.h" #include "normalize7bit.h" +#define TERMLIST_HIGH_SCORE 25 + #define MAX_CHUNK 15 // Note: Some things in this structure will eventually move to configuration @@ -143,7 +145,8 @@ static void add_facet(struct session *s, const char *type, const char *value) s->termlists[i].name = nmem_strdup(s->nmem, type); s->termlists[i].termlist - = termlist_create(s->nmem, s->expected_maxrecs, 15); + = termlist_create(s->nmem, s->expected_maxrecs, + TERMLIST_HIGH_SCORE); s->num_termlists = i + 1; } termlist_insert(s->termlists[i].termlist, value); @@ -465,7 +468,9 @@ static struct database_criterion *parse_filter(NMEM m, const char *buf) return res; } -char *search(struct session *se, char *query, char *filter) +enum pazpar2_error_code search(struct session *se, + char *query, char *filter, + const char **addinfo) { int live_channels = 0; struct client *cl; @@ -473,6 +478,7 @@ char *search(struct session *se, char *query, char *filter) yaz_log(YLOG_DEBUG, "Search"); + *addinfo = 0; nmem_reset(se->nmem); criteria = parse_filter(se->nmem, filter); se->requestid++; @@ -487,23 +493,29 @@ char *search(struct session *se, char *query, char *filter) se->expected_maxrecs = maxrecs; } else - return "NOTARGETS"; + return PAZPAR2_NO_TARGETS; se->relevance = 0; for (cl = se->clients; cl; cl = client_next_in_session(cl)) { if (prepare_session_database(se, client_get_database(cl)) < 0) - return "CONFIG_ERROR"; + { + *addinfo = client_get_database(cl)->database->url; + return PAZPAR2_CONFIG_TARGET; + } // Query must parse for all targets - if (client_parse_query(cl, query) < 0) - return "QUERY"; + if (client_parse_query(cl, query) < 0) + { + *addinfo = "query"; + return PAZPAR2_MALFORMED_PARAMETER_VALUE; + } } for (cl = se->clients; cl; cl = client_next_in_session(cl)) client_prep_connection(cl); - return 0; + return PAZPAR2_NO_ERROR; } // Creates a new session_database object for a database @@ -639,7 +651,6 @@ void destroy_session(struct session *s) { struct session_database *sdb; - yaz_log(YLOG_LOG, "Destroying session"); while (s->clients) client_destroy(s->clients); for (sdb = s->databases; sdb; sdb = sdb->next) @@ -655,6 +666,7 @@ struct session *new_session(NMEM nmem) yaz_log(YLOG_DEBUG, "New Pazpar2 session"); + session->relevance = 0; session->total_hits = 0; session->total_records = 0; session->num_termlists = 0; @@ -744,34 +756,44 @@ struct record_cluster **show(struct session *s, struct reclist_sortparms *sp, yaz_timing_t t = yaz_timing_create(); #endif - for (spp = sp; spp; spp = spp->next) - if (spp->type == Metadata_sortkey_relevance) - { - relevance_prepare_read(s->relevance, s->reclist); - break; - } - reclist_sort(s->reclist, sp); - - *total = s->reclist->num_records; - *sumhits = s->total_hits; - - for (i = 0; i < start; i++) - if (!reclist_read_record(s->reclist)) - { - *num = 0; - recs = 0; - break; - } - - for (i = 0; i < *num; i++) + if (!s->relevance) + { + *num = 0; + *total = 0; + *sumhits = 0; + recs = 0; + } + else { - struct record_cluster *r = reclist_read_record(s->reclist); - if (!r) + for (spp = sp; spp; spp = spp->next) + if (spp->type == Metadata_sortkey_relevance) + { + relevance_prepare_read(s->relevance, s->reclist); + break; + } + reclist_sort(s->reclist, sp); + + *total = s->reclist->num_records; + *sumhits = s->total_hits; + + for (i = 0; i < start; i++) + if (!reclist_read_record(s->reclist)) + { + *num = 0; + recs = 0; + break; + } + + for (i = 0; i < *num; i++) { - *num = i; - break; + struct record_cluster *r = reclist_read_record(s->reclist); + if (!r) + { + *num = i; + break; + } + recs[i] = r; } - recs[i] = r; } #if USE_TIMING yaz_timing_stop(t); @@ -938,7 +960,7 @@ struct record *ingest_record(struct client *cl, Z_External *rec, int first, last; type = xmlGetProp(n, (xmlChar *) "type"); - value = xmlNodeListGetString(xdoc, n->children, 0); + value = xmlNodeListGetString(xdoc, n->children, 1); if (!type || !value) continue;