Happy new year
[idzebra-moved-to-github.git] / index / retrieve.c
index 39bbca1..d934ed3 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of the Zebra server.
-   Copyright (C) 1995-2008 Index Data
+   Copyright (C) 1994-2009 Index Data
 
 Zebra 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
@@ -269,7 +269,7 @@ static int sort_fetch(
         }
         zebra_sort_type(zh->reg->sort_index, ord);
         zebra_sort_sysno(zh->reg->sort_index, fi->sysno);
-        zebra_sort_read(zh->reg->sort_index, wrbuf_str);
+        zebra_sort_read(zh->reg->sort_index, 0, wrbuf_str);
 
         while (off != wrbuf_len(wrbuf_str))
         {
@@ -484,6 +484,41 @@ static void retrieve_puts_int(WRBUF wrbuf, const char *name,
 }
 
 
+static void snippet_check_fields(ZebraHandle zh, WRBUF wrbuf,
+                                 zebra_snippets *doc,
+                                 const zebra_snippet_word *doc_w,
+                                 const char *w_index_type)
+{
+    /* beginning of snippet. See which fields the snippet also
+       occur */
+    const zebra_snippet_word *w;
+    int no = 0;
+    for (w = zebra_snippets_constlist(doc); w; w = w->next)
+    {
+        /* same sequence but other field? */
+        if (w->seqno == doc_w->seqno && w->ord != doc_w->ord)
+        {
+            const char *index_type;
+            const char *db = 0;
+            const char *string_index = 0;
+            
+            zebraExplain_lookup_ord(zh->reg->zei, w->ord, 
+                                    &index_type, &db, &string_index);
+            /* only report for same index type */
+            if (!strcmp(w_index_type, index_type))
+            {
+                if (no == 0)
+                    wrbuf_printf(wrbuf, " fields=\"%s", string_index);
+                else
+                    wrbuf_printf(wrbuf, " %s", string_index);
+                no++;
+            }
+        }
+    }
+    if (no)
+        wrbuf_printf(wrbuf, "\"");
+}
+
 static void snippet_xml_record(ZebraHandle zh, WRBUF wrbuf, zebra_snippets *doc)
 {
     const zebra_snippet_word *doc_w;
@@ -503,8 +538,11 @@ static void snippet_xml_record(ZebraHandle zh, WRBUF wrbuf, zebra_snippets *doc)
 
             if (mark_state == 0)
             {
+                
                 wrbuf_printf(wrbuf, "  <snippet name=\"%s\"",  string_index);
-                wrbuf_printf(wrbuf, " type=\"%s\">", index_type);
+                wrbuf_printf(wrbuf, " type=\"%s\"", index_type);
+                snippet_check_fields(zh, wrbuf, doc, doc_w, index_type);
+                wrbuf_printf(wrbuf, ">");
             }
             if (doc_w->match)
                 wrbuf_puts(wrbuf, "<s>");
@@ -664,13 +702,20 @@ static int term_qsort_handle(const void *a, const void *b)
 
 static void term_collect_freq(ZebraHandle zh,
                               struct term_collect *col, int no_terms_collect,
-                              int ord, RSET rset)
+                              int ord, RSET rset, double scale_factor)
 {
     int i;
     for (i = 0; i < no_terms_collect; i++)
     {
         if (col[i].term)
-            col[i].set_occur = freq_term(zh, ord, col[i].term, rset);
+        {
+            if (scale_factor < 0.0)
+            {
+                col[i].set_occur = freq_term(zh, ord, col[i].term, rset);
+            }
+            else
+                col[i].set_occur = scale_factor * col[i].oc;
+        }
     }
     qsort(col, no_terms_collect, sizeof(*col), term_qsort_handle);
 }
@@ -736,7 +781,7 @@ static int perform_facet_sort(ZebraHandle zh, int no_ord, int *ord_array,
             zebra_sort_type(zh->reg->sort_index, ord_array[ord_i]);
             
             wrbuf_rewind(w);
-            if (zebra_sort_read(zh->reg->sort_index, w))
+            if (zebra_sort_read(zh->reg->sort_index, 0, w))
             {
                 zebra_strmap_t sm = map_array[ord_i];
                 int off = 0;
@@ -876,7 +921,8 @@ static int perform_facet(ZebraHandle zh,
             no_collect_terms = 1;
         col = term_collect_create(map_array[i], no_collect_terms, nmem);
         term_collect_freq(zh, col, no_collect_terms, ord_array[i],
-                          resultSetRef(zh, fi->setname));
+                          resultSetRef(zh, fi->setname), 
+                          cat == zinfo_index_category_sort ? 1.0 : -1.0);
         
         if (use_xml)
             wrbuf_printf(wr, "  <facet type=\"%s\" index=\"%s\">\n",
@@ -943,8 +989,6 @@ static int facet_fetch(
     /* whether sort or index based */
     zinfo_index_category_t cat = zinfo_index_category_sort;
 
-    res_get_int(zh->res, "facetNumRecs", &num_recs);
-
     /* see if XML is required for response */
     if (oid_oidcmp(input_format, yaz_oid_recsyn_xml) == 0)
         use_xml = 1;
@@ -976,6 +1020,7 @@ static int facet_fetch(
         if (ord == -1)
             break;
         ord_array[i] = ord;
+        num_recs = 10000;
     }
     if (spec)
     {
@@ -995,6 +1040,8 @@ static int facet_fetch(
     if (spec)
         return YAZ_BIB1_SPECIFIED_ELEMENT_SET_NAME_NOT_VALID_FOR_SPECIFIED_;
 
+    res_get_int(zh->res, "facetNumRecs", &num_recs);
+
     pos_array = (zint *) nmem_malloc(fi->nmem, num_recs * sizeof(*pos_array));
     for (i = 0; i < num_recs; i++)
        pos_array[i] = i+1;
@@ -1182,7 +1229,7 @@ int zebra_record_fetch(ZebraHandle zh, const char *setname,
                        const Odr_oid *input_format, Z_RecordComposition *comp,
                        const Odr_oid **output_format,
                        char **rec_bufp, int *rec_lenp, char **basenamep,
-                       char **addinfo)
+                       WRBUF addinfo_w)
 {
     Record rec;
     char *fname, *file_type, *basename;
@@ -1202,7 +1249,6 @@ int zebra_record_fetch(ZebraHandle zh, const char *setname,
 
     sysno = sysnos[0];
     *basenamep = 0;
-    *addinfo = 0;
     elemsetname = yaz_get_esn(comp);
 
     fetch_info.zh = zh;
@@ -1215,7 +1261,6 @@ int zebra_record_fetch(ZebraHandle zh, const char *setname,
     if (elemsetname && 0 == strncmp(elemsetname, "zebra::", 7))
     {
         WRBUF result = wrbuf_alloc();
-        WRBUF addinfo_w = wrbuf_alloc();
         int r = zebra_special_fetch(&fetch_info, elemsetname + 7,
                                     input_format, output_format,
                                     result, addinfo_w);
@@ -1224,13 +1269,7 @@ int zebra_record_fetch(ZebraHandle zh, const char *setname,
             *rec_bufp = odr_strdup(odr, wrbuf_cstr(result));
             *rec_lenp = wrbuf_len(result);
         }
-        else 
-        {
-            if (wrbuf_len(addinfo_w))
-                *addinfo = odr_strdup(odr, wrbuf_cstr(addinfo_w));
-        }
         wrbuf_destroy(result);
-        wrbuf_destroy(addinfo_w);
         return r;
     }
 
@@ -1284,12 +1323,8 @@ int zebra_record_fetch(ZebraHandle zh, const char *setname,
         if (!(rt = recType_byName(zh->reg->recTypes, zh->res,
                                   file_type, &clientData)))
         {
-            char addinfo_str[100];
-
-            sprintf(addinfo_str, "Could not handle record type %.40s",
-                    file_type);
-                    
-            *addinfo = odr_strdup(odr, addinfo_str);
+            wrbuf_printf(addinfo_w, "Could not handle record type %.40s",
+                         file_type);
             return_code = YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS;
         }
         else
@@ -1300,7 +1335,8 @@ int zebra_record_fetch(ZebraHandle zh, const char *setname,
             *output_format = retrieveCtrl.output_format;
             *rec_bufp = (char *) retrieveCtrl.rec_buf;
             *rec_lenp = retrieveCtrl.rec_len;
-            *addinfo = retrieveCtrl.addinfo;
+            if (retrieveCtrl.addinfo)
+                wrbuf_puts(addinfo_w, retrieveCtrl.addinfo);
         }
 
         stream.destroy(&stream);