more data1 cleanup
[idzebra-moved-to-github.git] / recctrl / recgrs.c
index 7413384..d7af403 100644 (file)
@@ -3,7 +3,16 @@
  * All rights reserved.
  *
  * $Log: recgrs.c,v $
- * Revision 1.44  2002-04-11 20:09:47  adam
+ * Revision 1.47  2002-05-03 13:50:25  adam
+ * data1 cleanup
+ *
+ * Revision 1.46  2002/04/13 18:16:43  adam
+ * More XPATH work; common sequence numbers for extract keys
+ *
+ * Revision 1.45  2002/04/12 14:40:42  adam
+ * Work on XPATH
+ *
+ * Revision 1.44  2002/04/11 20:09:47  adam
  * work on string tag indexing
  *
  * Revision 1.43  2002/03/21 23:06:36  adam
@@ -324,20 +333,22 @@ static void grs_destroy(void *clientData)
     free (h);
 }
 
-static void index_string_tag (data1_node *n,
-                              struct recExtractCtrl *p,
-                              int level, RecWord *wrd,
-                              int use)
+static void index_xpath (data1_node *n, struct recExtractCtrl *p,
+                         int level, RecWord *wrd, int use)
 {
     int i;
+    char tag_path_full[1024];
+    size_t flen = 0;
+    data1_node *nn;
+
     switch (n->which)
     {
     case DATA1N_data:
         wrd->reg_type = 'w';
         wrd->string = n->u.data.data;
         wrd->length = n->u.data.len;
-        wrd->attrSet = VAL_BIB1;
-        wrd->attrUse = 1016;
+        wrd->attrSet = VAL_IDXPATH,
+        wrd->attrUse = use;
         if (p->flagShowRecords)
         {
             printf("%*s data=", (level + 1) * 4, "");
@@ -351,16 +362,40 @@ static void index_string_tag (data1_node *n,
         }
         break;
     case DATA1N_tag:
-        wrd->reg_type = 'w';
-        wrd->string = n->u.tag.tag;
-        wrd->length = strlen(n->u.tag.tag);
-        wrd->attrSet = VAL_BIB1;
+        for (nn = n; nn; nn = nn->parent)
+        {
+            if (n->which == DATA1N_tag)
+            {
+                size_t tlen = strlen(nn->u.tag.tag);
+                if (tlen + flen > (sizeof(tag_path_full)-2))
+                    return;
+                memcpy (tag_path_full + flen, nn->u.tag.tag, tlen);
+                flen += tlen;
+                tag_path_full[flen++] = '/';
+            }
+            else if (n->which == DATA1N_root)
+            {
+                size_t tlen = strlen(nn->u.root.type);
+                if (tlen + flen > (sizeof(tag_path_full)-2))
+                    return;
+                memcpy (tag_path_full + flen, nn->u.root.type, tlen);
+                flen += tlen;
+                tag_path_full[flen++] = '/';
+                break;
+            }
+        }
+        wrd->reg_type = '0';
+        wrd->string = tag_path_full;
+        wrd->length = flen;
+        wrd->attrSet = VAL_IDXPATH,
         wrd->attrUse = use;
         if (p->flagShowRecords)
         {
             printf("%*s tag=", (level + 1) * 4, "");
-            for (i = 0; i<wrd->length && i < 8; i++)
+            for (i = 0; i<wrd->length && i < 40; i++)
                 fputc (wrd->string[i], stdout);
+            if (i == 40)
+                printf (" ..");
             printf("\n");
         }
         else
@@ -448,10 +483,9 @@ static void index_termlist (data1_node *par, data1_node *n,
     }
 }
 
-static int dumpkeys(data1_node *n, struct recExtractCtrl *p, int level)
+static int dumpkeys(data1_node *n, struct recExtractCtrl *p, int level,
+                    RecWord *wrd)
 {
-    RecWord wrd;
-    (*p->init)(p, &wrd);      /* set defaults */
     for (; n; n = n->next)
     {
        if (p->flagShowRecords) /* display element description to user */
@@ -493,14 +527,14 @@ static int dumpkeys(data1_node *n, struct recExtractCtrl *p, int level)
 
        if (n->which == DATA1N_tag)
        {
-            index_termlist (n, n, p, level, &wrd);
+            index_termlist (n, n, p, level, wrd);
             /* index start tag */
             if (!n->root->u.root.absyn)
-                index_string_tag (n, p, level, &wrd, 1);
+                index_xpath (n, p, level, wrd, 1);
        }
 
        if (n->child)
-           if (dumpkeys(n->child, p, level + 1) < 0)
+           if (dumpkeys(n->child, p, level + 1, wrd) < 0)
                return -1;
 
 
@@ -522,9 +556,9 @@ static int dumpkeys(data1_node *n, struct recExtractCtrl *p, int level)
            }
 
            if (par)
-               index_termlist (par, n, p, level, &wrd);
+               index_termlist (par, n, p, level, wrd);
             if (!n->root->u.root.absyn)
-                index_string_tag (n, p, level, &wrd, 1016);
+                index_xpath (n, p, level, wrd, 1016);
 
        }
 
@@ -532,7 +566,7 @@ static int dumpkeys(data1_node *n, struct recExtractCtrl *p, int level)
        {
             /* index end tag */
             if (!n->root->u.root.absyn)
-                index_string_tag (n, p, level, &wrd, 2);
+                index_xpath (n, p, level, wrd, 2);
        }
 
 
@@ -548,6 +582,7 @@ int grs_extract_tree(struct recExtractCtrl *p, data1_node *n)
 {
     oident oe;
     int oidtmp[OID_SIZE];
+    RecWord wrd;
 
     oe.proto = PROTO_Z3950;
     oe.oclass = CLASS_SCHEMA;
@@ -558,7 +593,8 @@ int grs_extract_tree(struct recExtractCtrl *p, data1_node *n)
         if ((oid_ent_to_oid (&oe, oidtmp)))
             (*p->schemaAdd)(p, oidtmp);
     }
-    return dumpkeys(n, p, 0);
+    (*p->init)(p, &wrd);
+    return dumpkeys(n, p, 0, &wrd);
 }
 
 static int grs_extract_sub(struct grs_handlers *h, struct recExtractCtrl *p,
@@ -568,6 +604,7 @@ static int grs_extract_sub(struct grs_handlers *h, struct recExtractCtrl *p,
     struct grs_read_info gri;
     oident oe;
     int oidtmp[OID_SIZE];
+    RecWord wrd;
 
     gri.readf = p->readf;
     gri.seekf = p->seekf;
@@ -597,7 +634,8 @@ static int grs_extract_sub(struct grs_handlers *h, struct recExtractCtrl *p,
 #if 0
     data1_pr_tree (p->dh, n, stdout);
 #endif
-    if (dumpkeys(n, p, 0) < 0)
+    (*p->init)(p, &wrd);
+    if (dumpkeys(n, p, 0, &wrd) < 0)
     {
        data1_free_tree(p->dh, n);
        return RECCTRL_EXTRACT_ERROR;
@@ -731,8 +769,7 @@ static int grs_retrieve(void *clientData, struct recRetrieveCtrl *p)
     data1_pr_tree (p->dh, node, stdout);
 #endif
     logf (LOG_DEBUG, "grs_retrieve: size");
-    if ((dnew = data1_insert_taggeddata(p->dh, node, node,
-                                      "size", mem)))
+    if ((dnew = data1_mk_tag_data_wd(p->dh, node, node,"size", mem)))
     {
        dnew->u.data.what = DATA1I_text;
        dnew->u.data.data = dnew->lbuf;
@@ -742,7 +779,7 @@ static int grs_retrieve(void *clientData, struct recRetrieveCtrl *p)
 
     tagname = res_get_def(p->res, "tagrank", "rank");
     if (strcmp(tagname, "0") && p->score >= 0 &&
-       (dnew = data1_insert_taggeddata(p->dh, node, node, tagname, mem)))
+       (dnew = data1_mk_tag_data_wd(p->dh, node, node, tagname, mem)))
     {
         logf (LOG_DEBUG, "grs_retrieve: %s", tagname);
        dnew->u.data.what = DATA1I_num;
@@ -753,7 +790,7 @@ static int grs_retrieve(void *clientData, struct recRetrieveCtrl *p)
 
     tagname = res_get_def(p->res, "tagsysno", "localControlNumber");
     if (strcmp(tagname, "0") && p->localno > 0 &&
-        (dnew = data1_insert_taggeddata(p->dh, node, node, tagname, mem)))
+        (dnew = data1_mk_tag_data_wd(p->dh, node, node, tagname, mem)))
     {
         logf (LOG_DEBUG, "grs_retrieve: %s", tagname);
        dnew->u.data.what = DATA1I_text;
@@ -762,6 +799,8 @@ static int grs_retrieve(void *clientData, struct recRetrieveCtrl *p)
        dnew->u.data.len = strlen(dnew->u.data.data);
     }
 
+    data1_pr_tree (p->dh, node, stdout);
+
     if (p->comp && p->comp->which == Z_RecordComp_complex &&
        p->comp->u.complex->generic &&
        p->comp->u.complex->generic->schema)
@@ -849,8 +888,8 @@ static int grs_retrieve(void *clientData, struct recRetrieveCtrl *p)
            }
            *(p++) = '\0';
                
-           if ((dnew = data1_insert_taggeddata(dh, node, node,
-                                               "schemaIdentifier", mem)))
+           if ((dnew = data1_mk_tag_data_wd(dh, node, node,
+                                             "schemaIdentifier", mem)))
            {
                dnew->u.data.what = DATA1I_oid;
                dnew->u.data.data = (char *) nmem_malloc(mem, p - tmp);