Added support for specification of staticrank for grs-class of filters.
[idzebra-moved-to-github.git] / index / recgrs.c
index e9283c9..46805ab 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: recgrs.c,v 1.10 2006-11-29 18:06:57 adam Exp $
+/* $Id: recgrs.c,v 1.12 2006-12-22 13:57:27 adam Exp $
    Copyright (C) 1995-2006
    Index Data ApS
 
@@ -295,8 +295,6 @@ int d1_check_xpath_predicate(data1_node *n, struct xpath_predicate *p)
                 res = 0;
                 /* looking for the attribute with a specified name */
                 for (attr = n->u.tag.attributes; attr; attr = attr->next) {
-                    yaz_log(YLOG_DEBUG,"  - attribute %s <-> %s", attname, attr->name );
-                    
                     if (!strcmp(attr->name, attname)) {
                         if (p->u.relation.op[0]) {
                             if (*p->u.relation.op != '=') {
@@ -305,8 +303,6 @@ int d1_check_xpath_predicate(data1_node *n, struct xpath_predicate *p)
                                 yaz_log(YLOG_WARN, "predicate %s ignored", p->u.relation.name);
                                 res = 1; break;
                             } else {
-                                yaz_log(YLOG_DEBUG,"    - value %s <-> %s", 
-                                     p->u.relation.value, attr->value );
                                 if (!strcmp(attr->value, p->u.relation.value)) {
                                     res = 1; break;
                                 } 
@@ -317,7 +313,6 @@ int d1_check_xpath_predicate(data1_node *n, struct xpath_predicate *p)
                         }
                     }
                 }
-               yaz_log(YLOG_DEBUG, "return %d", res);
                 return res;
             } else {
                 return 1;
@@ -436,12 +431,8 @@ data1_termlist *xpath_termlist_by_tagpath(char *tagpath, data1_node *n)
                backwards trough xpath location steps ... */
             for (i = xpe->xpath_len - 1; i>0; i--)
            {
-                yaz_log(YLOG_DEBUG, "Checking step %d: %s on tag %s",
-                       i, xp[i].part, nn->u.tag.tag);
-                
                 if (!d1_check_xpath_predicate(nn, xp[i].predicate))
                {
-                    yaz_log(YLOG_DEBUG, "  Predicates didn't match");
                     ok = 0;
                     break;
                 }
@@ -534,6 +525,25 @@ 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,
@@ -546,6 +556,7 @@ static void index_xpath(struct source_parser *sp, data1_node *n,
     int termlist_only = 1;
     data1_termlist *tl;
     int xpdone = 0;
+
     if (!n->root->u.root.absyn 
         || 
         n->root->u.root.absyn->xpath_indexing == DATA1_XPATH_INDEXING_ENABLE)
@@ -553,6 +564,7 @@ static void index_xpath(struct source_parser *sp, data1_node *n,
        termlist_only = 0;
     }
 
+
     switch (n->which)
     {
     case DATA1N_data:
@@ -593,7 +605,10 @@ static void index_xpath(struct source_parser *sp, data1_node *n,
                     fputc ('\n', stdout);
                 }
                 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;
            }
@@ -709,6 +724,8 @@ 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);
                                 }
                             }
                         }
@@ -776,6 +793,7 @@ 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);
            }
        }