Changed extract code so that it optimizes updates of records where content
[idzebra-moved-to-github.git] / index / recgrs.c
index c85b635..3137760 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: recgrs.c,v 1.13 2007-01-15 15:10:17 adam Exp $
+/* $Id: recgrs.c,v 1.16 2007-03-07 21:08:36 adam Exp $
    Copyright (C) 1995-2007
    Index Data ApS
 
@@ -27,6 +27,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
 #include <yaz/log.h>
 #include <yaz/oid.h>
+#include <yaz/diagbib1.h>
 
 #include <d1_absyn.h>
 #include <idzebra/recgrs.h>
@@ -525,25 +526,6 @@ static void mk_tag_path_full(char *tag_path_full, size_t max, data1_node *n)
 }
        
 
-static void index_staticrank(struct recExtractCtrl *p,
-                             RecWord *wrd,
-                             data1_absyn *absyn)
-{
-    const char *staticrank_index = data1_absyn_get_staticrank(absyn);
-
-    if (staticrank_index && !strcmp(wrd->index_name, staticrank_index))
-    {
-        char valz[20];
-        size_t len = wrd->term_len;
-
-        if (len > sizeof(valz)-1)
-            len = sizeof(valz)-1;
-        memcpy(valz, wrd->term_buf, len);
-        valz[len] = '\0';
-        p->staticrank = atozint(valz);
-    }
-}
-
 static void index_xpath(struct source_parser *sp, data1_node *n,
                        struct recExtractCtrl *p,
                        int level, RecWord *wrd,
@@ -555,7 +537,6 @@ static void index_xpath(struct source_parser *sp, data1_node *n,
     char tag_path_full[1024];
     int termlist_only = 1;
     data1_termlist *tl;
-    int xpdone = 0;
 
     if (!n->root->u.root.absyn 
         || 
@@ -570,7 +551,6 @@ static void index_xpath(struct source_parser *sp, data1_node *n,
     case DATA1N_data:
         wrd->term_buf = n->u.data.data;
         wrd->term_len = n->u.data.len;
-        xpdone = 0;
 
        mk_tag_path_full(tag_path_full, sizeof(tag_path_full), n);
        
@@ -607,7 +587,6 @@ static void index_xpath(struct source_parser *sp, data1_node *n,
                 else
                 {
                     (*p->tokenAdd)(&wrd_tl);
-                    index_staticrank(p, &wrd_tl, n->root->u.root.absyn);
                 }
                 if (wrd_tl.seqno > max_seqno)
                     max_seqno = wrd_tl.seqno;
@@ -618,7 +597,7 @@ static void index_xpath(struct source_parser *sp, data1_node *n,
        }
        /* xpath indexing is done, if there was no termlist given, 
           or no ! in the termlist, and default indexing is enabled... */
-       if (!p->flagShowRecords && !xpdone && !termlist_only)
+       if (!p->flagShowRecords && !termlist_only)
        {
            wrd->index_name = xpath_index;
            wrd->index_type = 'w';
@@ -626,8 +605,6 @@ static void index_xpath(struct source_parser *sp, data1_node *n,
        }
         break;
     case DATA1N_tag:
-        if (termlist_only)
-            return;
        mk_tag_path_full(tag_path_full, sizeof(tag_path_full), n);
 
         wrd->index_type = '0';
@@ -647,7 +624,8 @@ static void index_xpath(struct source_parser *sp, data1_node *n,
         {
             data1_xattr *xp;
 
-            (*p->tokenAdd)(wrd);   /* index element pag (AKA tag path) */
+            if (!termlist_only)
+                (*p->tokenAdd)(wrd);   /* index element pag (AKA tag path) */
             
             if (xpath_is_start == 1) /* only for the starting tag... */
             {
@@ -662,35 +640,38 @@ static void index_xpath(struct source_parser *sp, data1_node *n,
                     /* this could be cached as well */
                     sprintf (attr_tag_path_full, "@%s/%s",
                              xp->name, tag_path_full);
-                    
+
                     tll[i] = xpath_termlist_by_tagpath(attr_tag_path_full,n);
                     
-                    /* attribute  (no value) */
-                    wrd->index_type = '0';
-                    wrd->index_name = ZEBRA_XPATH_ATTR_NAME;
-                    wrd->term_buf = xp->name;
-                    wrd->term_len = strlen(xp->name);
-                    
-                    wrd->seqno--;
-                    (*p->tokenAdd)(wrd);
-                    
-                    if (xp->value 
-                        &&
-                        strlen(xp->name) + strlen(xp->value) < sizeof(comb)-2)
+                    if (!termlist_only)
                     {
-                        /* attribute value exact */
-                        strcpy (comb, xp->name);
-                        strcat (comb, "=");
-                        strcat (comb, xp->value);
-                        
-                        wrd->index_name = ZEBRA_XPATH_ATTR_NAME;
+                        /* attribute  (no value) */
                         wrd->index_type = '0';
-                        wrd->term_buf = comb;
-                        wrd->term_len = strlen(comb);
-                        wrd->seqno--;
+                        wrd->index_name = ZEBRA_XPATH_ATTR_NAME;
+                        wrd->term_buf = xp->name;
+                        wrd->term_len = strlen(xp->name);
                         
+                        wrd->seqno--;
                         (*p->tokenAdd)(wrd);
-                    }                
+                        
+                        if (xp->value 
+                            &&
+                            strlen(xp->name) + strlen(xp->value) < sizeof(comb)-2)
+                        {
+                            /* attribute value exact */
+                            strcpy (comb, xp->name);
+                            strcat (comb, "=");
+                            strcat (comb, xp->value);
+                            
+                            wrd->index_name = ZEBRA_XPATH_ATTR_NAME;
+                            wrd->index_type = '0';
+                            wrd->term_buf = comb;
+                            wrd->term_len = strlen(comb);
+                            wrd->seqno--;
+                            
+                            (*p->tokenAdd)(wrd);
+                        }
+                    }     
                     i++;
                 }
                 
@@ -702,7 +683,6 @@ static void index_xpath(struct source_parser *sp, data1_node *n,
                     
                     sprintf (attr_tag_path_full, "@%s/%s",
                              xp->name, tag_path_full);
-                    
                     if ((tl = tll[i]))
                     {
                         /* If there is a termlist given (=xelm directive) */
@@ -724,8 +704,6 @@ static void index_xpath(struct source_parser *sp, data1_node *n,
                                     wrd->term_buf = xp->value;
                                     wrd->term_len = strlen(xp->value);
                                     (*p->tokenAdd)(wrd);
-                                    index_staticrank(p, wrd,
-                                                     n->root->u.root.absyn);
                                 }
                             }
                         }
@@ -733,7 +711,7 @@ static void index_xpath(struct source_parser *sp, data1_node *n,
                     /* if there was no termlist for the given path, 
                        or the termlist didn't have a ! element, index 
                        the attribute as "w" */
-                    if ((!xpdone) && (!termlist_only))
+                    if (!xpdone && !termlist_only)
                     {
                         index_xpath_attr (attr_tag_path_full, xp->name,
                                           xp->value,  "w", p, wrd);
@@ -793,7 +771,6 @@ static void index_termlist (struct source_parser *sp, data1_node *par,
            {
                wrd->index_type = *tlist->structure;
                wrd->index_name = tlist->index_name;
-                index_staticrank(p, wrd, n->root->u.root.absyn);
                (*p->tokenAdd)(wrd);
            }
        }
@@ -1137,7 +1114,7 @@ int zebra_grs_retrieve(void *clientData, struct recRetrieveCtrl *p,
     node = (*grs_read)(&gri);
     if (!node)
     {
-       p->diagnostic = 14;
+       p->diagnostic = YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS;
         nmem_destroy (mem);
        return 0;
     }
@@ -1213,7 +1190,7 @@ int zebra_grs_retrieve(void *clientData, struct recRetrieveCtrl *p,
                onode = node;
                if (!(node = data1_map_record(p->dh, onode, map, mem)))
                {
-                   p->diagnostic = 14;
+                   p->diagnostic = YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS;
                    nmem_destroy (mem);
                    return 0;
                }
@@ -1242,7 +1219,7 @@ int zebra_grs_retrieve(void *clientData, struct recRetrieveCtrl *p,
                 onode = node;
                 if (!(node = data1_map_record(p->dh, onode, map, mem)))
                 {
-                    p->diagnostic = 14;
+                    p->diagnostic = YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS;
                     nmem_destroy (mem);
                     return 0;
                 }