tmarc.xsl: set journal-subpart to 773$g only
[pazpar2-moved-to-github.git] / src / session.c
index 373dd49..fa9ebb3 100644 (file)
@@ -191,20 +191,48 @@ void add_facet(struct session *s, const char *type, const char *value, int count
     pp2_relevance_token_t prt;
     const char *facet_component;
     WRBUF facet_wrbuf = wrbuf_alloc();
-    prt = pp2_relevance_tokenize(service->facet_pct);
-    
+    WRBUF display_wrbuf = wrbuf_alloc();
+    int i;
+    const char *icu_chain_id = 0;
+
+    for (i = 0; i < service->num_metadata; i++)
+        if (!strcmp((service->metadata + i)->name, type))
+            icu_chain_id = (service->metadata + i)->icu_chain;
+    yaz_log(YLOG_LOG, "icu_chain id=%s", icu_chain_id ? icu_chain_id : "null");
+
+    if (!icu_chain_id)
+        icu_chain_id = "facet";
+    prt = pp2_relevance_create(service->charsets, icu_chain_id);
+    if (!prt)
+    {
+        yaz_log(YLOG_FATAL, "Unknown ICU chain '%s' for facet of type '%s'",
+                icu_chain_id, type);
+        wrbuf_destroy(facet_wrbuf);
+        wrbuf_destroy(display_wrbuf);
+        return;
+    }
     pp2_relevance_first(prt, value, 0);
     while ((facet_component = pp2_relevance_token_next(prt)))
     {
+        const char *display_component;
         if (*facet_component)
         {
             if (wrbuf_len(facet_wrbuf))
                 wrbuf_puts(facet_wrbuf, " ");
             wrbuf_puts(facet_wrbuf, facet_component);
         }
+        display_component = pp2_get_display(prt);
+        if (display_component)
+        {
+            if (wrbuf_len(display_wrbuf))
+                wrbuf_puts(display_wrbuf, " ");
+            wrbuf_puts(display_wrbuf, display_component);
+        }
     }
     pp2_relevance_token_destroy(prt);
-    
+    yaz_log(YLOG_LOG, "facet norm=%s", wrbuf_cstr(facet_wrbuf));
+    yaz_log(YLOG_LOG, "facet display=%s", wrbuf_cstr(display_wrbuf));
     if (wrbuf_len(facet_wrbuf))
     {
         int i;
@@ -217,6 +245,7 @@ void add_facet(struct session *s, const char *type, const char *value, int count
             {
                 session_log(s, YLOG_FATAL, "Too many termlists");
                 wrbuf_destroy(facet_wrbuf);
+                wrbuf_destroy(display_wrbuf);
                 return;
             }
             
@@ -229,10 +258,11 @@ void add_facet(struct session *s, const char *type, const char *value, int count
 #if 0
         session_log(s, YLOG_DEBUG, "Facets for %s: %s norm:%s (%d)", type, value, wrbuf_cstr(facet_wrbuf), count);
 #endif
-        termlist_insert(s->termlists[i].termlist, wrbuf_cstr(facet_wrbuf),
-                        count);
+        termlist_insert(s->termlists[i].termlist, wrbuf_cstr(display_wrbuf),
+                        wrbuf_cstr(facet_wrbuf), count);
     }
     wrbuf_destroy(facet_wrbuf);
+    wrbuf_destroy(display_wrbuf);
 }
 
 static xmlDoc *record_to_xml(struct session *se,
@@ -782,7 +812,6 @@ void session_destroy(struct session *se) {
     nmem_destroy(se->nmem);
     service_destroy(se->service);
     yaz_mutex_destroy(&se->session_mutex);
-    wrbuf_destroy(se->wrbuf);
 }
 
 /* Depreciated: use session_destroy */
@@ -825,7 +854,6 @@ struct session *new_session(NMEM nmem, struct conf_service *service,
     session->clients = 0;
     session->session_nmem = nmem;
     session->nmem = nmem_create();
-    session->wrbuf = wrbuf_alloc();
     session->databases = 0;
     for (i = 0; i <= SESSION_WATCH_MAX; i++)
     {
@@ -1108,7 +1136,7 @@ static int get_mergekey_from_doc(xmlDoc *doc, xmlNode *root, const char *name,
                 {
                     const char *norm_str;
                     pp2_relevance_token_t prt =
-                        pp2_relevance_tokenize(service->mergekey_pct);
+                        pp2_relevance_create(service->charsets, "mergekey");
                     
                     pp2_relevance_first(prt, (const char *) value, 0);
                     if (wrbuf_len(norm_wr) > 0)
@@ -1147,7 +1175,7 @@ static const char *get_mergekey(xmlDoc *doc, struct client *cl, int record_no,
     {
         const char *norm_str;
         pp2_relevance_token_t prt =
-            pp2_relevance_tokenize(service->mergekey_pct);
+            pp2_relevance_create(service->charsets, "mergekey");
 
         pp2_relevance_first(prt, (const char *) mergekey, 0);
         while ((norm_str = pp2_relevance_token_next(prt)))
@@ -1454,7 +1482,7 @@ static int ingest_to_cluster(struct client *cl,
                                 nmem_malloc(se->nmem, 
                                             sizeof(union data_types));
                          
-                        prt = pp2_relevance_tokenize(service->sort_pct);
+                        prt = pp2_relevance_create(service->charsets, "sort");
 
                         pp2_relevance_first(prt, rec_md->data.text.disp,
                                             skip_article);