X-Git-Url: http://lists.indexdata.dk/cgi-bin?a=blobdiff_plain;f=src%2Fsession.c;h=a42cedce0e9ab6a0b603d4cdb14675b69b96180b;hb=946243040b4b9c47fca3d3896a9ba256b3b17fea;hp=77d9ee82f08e7ec5e16958e5dd573843110bc2c4;hpb=8cb5fdac44498271111dce8145623bded04cc27f;p=pazpar2-moved-to-github.git diff --git a/src/session.c b/src/session.c index 77d9ee8..a42cedc 100644 --- a/src/session.c +++ b/src/session.c @@ -748,6 +748,7 @@ enum pazpar2_error_code session_search(struct session *se, const char *filter, const char *limit, const char **addinfo, + const char **addinfo2, struct reclist_sortparms *sp, const char *mergekey, const char *rank) @@ -758,6 +759,11 @@ enum pazpar2_error_code session_search(struct session *se, int no_failed_limit = 0; struct client_list *l, *l0; + 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_SHOW_PREF); + session_log(se, YLOG_DEBUG, "Search"); *addinfo = 0; @@ -813,7 +819,7 @@ enum pazpar2_error_code session_search(struct session *se, if (prepare_map(se, client_get_database(cl)) < 0) continue; - parse_ret = client_parse_query(cl, query, se->facet_limits); + parse_ret = client_parse_query(cl, query, se->facet_limits, addinfo2); if (parse_ret == -1) no_failed_query++; else if (parse_ret == -2) @@ -845,7 +851,6 @@ enum pazpar2_error_code session_search(struct session *se, else return PAZPAR2_NO_TARGETS; } - session_log(se, YLOG_LOG, "session_start_search done"); return PAZPAR2_NO_ERROR; } @@ -1667,13 +1672,45 @@ static int check_record_filter(xmlNode *root, struct session_database *sdb) return match; } - static int ingest_to_cluster(struct client *cl, xmlDoc *xdoc, xmlNode *root, int record_no, const char *mergekey_norm); +static int ingest_sub_record(struct client *cl, xmlDoc *xdoc, xmlNode *root, + int record_no, NMEM nmem, + struct session_database *sdb) +{ + int ret = 0; + const char *mergekey_norm; + struct session *se = client_get_session(cl); + struct conf_service *service = se->service; + + if (!check_record_filter(root, sdb)) + { + session_log(se, YLOG_LOG, "Filtered out record no %d from %s", record_no, sdb->database->id); + xmlFreeDoc(xdoc); + return -2; + } + + mergekey_norm = get_mergekey(xdoc, cl, record_no, service, nmem, + se->mergekey); + if (!mergekey_norm) + { + session_log(se, YLOG_WARN, "Got no mergekey"); + xmlFreeDoc(xdoc); + return -1; + } + session_enter(se, "ingest_sub_record"); + if (client_get_session(cl) == se && se->relevance) + ret = ingest_to_cluster(cl, xdoc, root, record_no, mergekey_norm); + session_leave(se, "ingest_sub_record"); + + xmlFreeDoc(xdoc); + return ret; +} + /** \brief ingest XML record \param cl client holds the result set for record \param rec record buffer (0 terminated) @@ -1687,42 +1724,34 @@ int ingest_record(struct client *cl, const char *rec, int record_no, NMEM nmem) { struct session *se = client_get_session(cl); - int ret = 0; struct session_database *sdb = client_get_database(cl); struct conf_service *service = se->service; xmlDoc *xdoc = normalize_record(se, sdb, service, rec, nmem); xmlNode *root; - const char *mergekey_norm; if (!xdoc) return -1; root = xmlDocGetRootElement(xdoc); - if (!check_record_filter(root, sdb)) + if (!strcmp((const char *) root->name, "cluster")) { - session_log(se, YLOG_LOG, "Filtered out record no %d from %s", record_no, sdb->database->id); - xmlFreeDoc(xdoc); - return -2; + root = root->children; + return ingest_sub_record(cl, xdoc, root, record_no, nmem, sdb); } - - mergekey_norm = get_mergekey(xdoc, cl, record_no, service, nmem, - se->mergekey); - if (!mergekey_norm) + else if (!strcmp((const char *) root->name, "record")) { - session_log(se, YLOG_WARN, "Got no mergekey"); - xmlFreeDoc(xdoc); + return ingest_sub_record(cl, xdoc, root, record_no, nmem, sdb); + } + else + { + session_log(se, YLOG_WARN, "Bad pz root element: %s", + (const char *) root->name); return -1; } - session_enter(se, "ingest_record"); - if (client_get_session(cl) == se && se->relevance) - ret = ingest_to_cluster(cl, xdoc, root, record_no, mergekey_norm); - session_leave(se, "ingest_record"); - - xmlFreeDoc(xdoc); - return ret; } + // struct conf_metadata *ser_md = &service->metadata[md_field_id]; // struct record_metadata *rec_md = record->metadata[md_field_id]; static int match_metadata_local(struct conf_service *service,