From: Adam Dickmeiss Date: Fri, 2 Aug 2002 10:07:48 +0000 (+0000) Subject: XPATH fixes - leaf attributes part of tag path X-Git-Tag: ZEBRA.1.3.0~14 X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=commitdiff_plain;h=8f7e8952ccd2eca24d2bb91a79d2f17f346c490c XPATH fixes - leaf attributes part of tag path --- diff --git a/index/recindxp.h b/index/recindxp.h index 0f902c8..3c5dae6 100644 --- a/index/recindxp.h +++ b/index/recindxp.h @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: recindxp.h,v $ - * Revision 1.10 2001-10-15 19:53:43 adam + * Revision 1.11 2002-08-02 10:07:48 adam + * XPATH fixes - leaf attributes part of tag path + * + * Revision 1.10 2001/10/15 19:53:43 adam * POSIX thread updates. First work on term sets. * * Revision 1.9 2000/12/05 10:01:44 adam @@ -53,7 +56,7 @@ YAZ_BEGIN_CDECL #define REC_BLOCK_TYPES 2 #define REC_HEAD_MAGIC "recindex" -#define REC_VERSION 3 +#define REC_VERSION 4 struct records_info { int rw; diff --git a/index/zrpn.c b/index/zrpn.c index 9d6b8c6..c801aeb 100644 --- a/index/zrpn.c +++ b/index/zrpn.c @@ -3,7 +3,7 @@ * All rights reserved. * Sebastian Hammer, Adam Dickmeiss * - * $Id: zrpn.c,v 1.118 2002-08-01 08:53:35 adam Exp $ + * $Id: zrpn.c,v 1.119 2002-08-02 10:07:48 adam Exp $ */ #include #include @@ -2081,6 +2081,7 @@ static int parse_xpath(ZebraHandle zh, Z_AttributesPlusTerm *zapt, if (i) memcpy (p->u.relation.value, cp - i, i); p->u.relation.value[i] = 0; + yaz_log (LOG_LOG, "value=%s", p->u.relation.value); cp++; } @@ -2208,28 +2209,6 @@ static RSET rpn_search_xpath (ZebraHandle zh, zh->errString = basenames[base_no]; return rset; } - if (level > 0 && xpath[level-1].part[0] == '@') - { - rset_between_parms parms; - RSET rset_start_attr, rset_end_attr; - --level; - rset_start_attr = xpath_trunc(zh, stream, - '0', xpath[level].part+1, - 3, curAttributeSet); - - rset_end_attr = xpath_trunc(zh, stream, - '0', xpath[level].part+1, - 4, curAttributeSet); - - parms.key_size = sizeof(struct it_key); - parms.cmp = key_compare_it; - parms.rset_l = rset_start_attr; - parms.rset_m = rset; - parms.rset_r = rset_end_attr; - parms.rset_attr = 0; - parms.printer = key_print_it; - rset = rset_create (rset_kind_between, &parms); - } while (--level >= 0) { char xpath_rev[128]; @@ -2250,6 +2229,13 @@ static RSET rpn_search_xpath (ZebraHandle zh, memcpy (xpath_rev + len, "[^/]*", 5); len += 5; } + else if (*cp == ' ') + { + + xpath_rev[len++] = 1; + xpath_rev[len++] = ' '; + } + else xpath_rev[len++] = *cp; xpath_rev[len++] = '/'; diff --git a/recctrl/recgrs.c b/recctrl/recgrs.c index 5546f2d..6ed00bd 100644 --- a/recctrl/recgrs.c +++ b/recctrl/recgrs.c @@ -2,7 +2,7 @@ * Copyright (C) 1994-2002, Index Data * All rights reserved. * - * $Id: recgrs.c,v 1.57 2002-08-01 09:37:44 adam Exp $ + * $Id: recgrs.c,v 1.58 2002-08-02 10:07:48 adam Exp $ */ #include @@ -175,29 +175,13 @@ static void index_xpath (data1_node *n, struct recExtractCtrl *p, else { data1_xattr *xp; - (*p->tokenAdd)(wrd); - -#if 0 - for (xp = n->u.tag.attributes; xp; xp = xp->next) - { - if (use == 1) - { /* attribute (no value) */ - wrd->reg_type = '0'; - wrd->attrUse = 3; - wrd->string = xp->name; - wrd->length = strlen(xp->name); - - wrd->seqno--; - (*p->tokenAdd)(wrd); - } - } -#else - for (xp = n->u.tag.attributes; xp; xp = xp->next) + (*p->tokenAdd)(wrd); /* index element pag (AKA tag path) */ + if (use == 1) { - char comb[512]; - - if (use == 1) - { /* attribute start */ + for (xp = n->u.tag.attributes; xp; xp = xp->next) + { + char comb[512]; + /* attribute (no value) */ wrd->reg_type = '0'; wrd->attrUse = 3; wrd->string = xp->name; @@ -205,46 +189,52 @@ static void index_xpath (data1_node *n, struct recExtractCtrl *p, wrd->seqno--; (*p->tokenAdd)(wrd); - } - - if (use == 1 && xp->value && - strlen(xp->name) + strlen(xp->value) < sizeof(comb)-2) + + 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->attrUse = 3; + wrd->reg_type = '0'; + wrd->string = comb; + wrd->length = strlen(comb); + wrd->seqno--; + + (*p->tokenAdd)(wrd); + } + } + for (xp = n->u.tag.attributes; xp; xp = xp->next) { - /* attribute value exact */ - strcpy (comb, xp->name); - strcat (comb, "="); - strcat (comb, xp->value); + char attr_tag_path_full[1024]; - wrd->attrUse = 3; + sprintf (attr_tag_path_full, "@%s/%.*s", + xp->name, flen, tag_path_full); + wrd->reg_type = '0'; - wrd->string = comb; - wrd->length = strlen(comb); - wrd->seqno--; - + wrd->attrUse = 1; + wrd->string = attr_tag_path_full; + wrd->length = strlen(attr_tag_path_full); (*p->tokenAdd)(wrd); - - /* attribute value phrase */ - + wrd->attrUse = 1015; wrd->reg_type = 'w'; wrd->string = xp->value; wrd->length = strlen(xp->value); - + (*p->tokenAdd)(wrd); - } - if (use == 2) - { - wrd->reg_type = '0'; - wrd->attrUse = 4; - wrd->string = xp->name; - wrd->length = strlen(xp->name); + wrd->reg_type = '0'; + wrd->attrUse = 2; + wrd->string = attr_tag_path_full; + wrd->length = strlen(attr_tag_path_full); (*p->tokenAdd)(wrd); } } -#endif } - break; } }