n->value.numeric = value;
}
+void ccl_set_attr_numeric(struct ccl_rpn_node *p, const char *set,
+ int type, int value)
+{
+ struct ccl_rpn_attr *n;
+ for (n = p->u.t.attr_list; n; n = n->next)
+ if (n->type == type)
+ {
+ xfree(n->set);
+ n->set = set ? xstrdup(set) : 0;
+ if (n->kind == CCL_RPN_ATTR_STRING)
+ xfree(n->value.str);
+ n->kind = CCL_RPN_ATTR_NUMERIC;
+ n->value.numeric = value;
+ return;
+ }
+ ccl_add_attr_numeric(p, set, type, value);
+}
+
void ccl_add_attr_string(struct ccl_rpn_node *p, const char *set,
int type, char *value)
{
}
p = ccl_rpn_node_create(CCL_RPN_AND);
p->u.p[0] = p1;
- ccl_add_attr_numeric(p1, attset, CCL_BIB1_REL, 4);
+ ccl_set_attr_numeric(p1, attset, CCL_BIB1_REL, 4);
p->u.p[1] = p2;
- ccl_add_attr_numeric(p2, attset, CCL_BIB1_REL, 2);
+ ccl_set_attr_numeric(p2, attset, CCL_BIB1_REL, 2);
return p;
}
else /* = term - */
{
- ccl_add_attr_numeric(p1, attset, CCL_BIB1_REL, 4);
+ ccl_set_attr_numeric(p1, attset, CCL_BIB1_REL, 4);
return p1;
}
}
ADVANCE;
if (!(p = search_term(cclp, ap)))
return NULL;
- ccl_add_attr_numeric(p, attset, CCL_BIB1_REL, 2);
+ ccl_set_attr_numeric(p, attset, CCL_BIB1_REL, 2);
return p;
}
else
return NULL;
if (rel != 3 ||
!qual_val_type(ap, CCL_BIB1_REL, CCL_BIB1_REL_OMIT_EQUALS, 0))
- ccl_add_attr_numeric(p, attset, CCL_BIB1_REL, rel);
+ ccl_set_attr_numeric(p, attset, CCL_BIB1_REL, rel);
return p;
}
return NULL;
}
+void tst3(void)
+{
+ CCL_bibset b = ccl_qual_mk();
+
+ YAZ_CHECK(b);
+ if (!b)
+ return;
+
+ ccl_qual_fitem(b, "2=102", "rk");
+ ccl_qual_fitem(b, "1=9903 r=r", "lex");
+ ccl_qual_fitem(b, "4=109 r=o", "st-numeric");
+
+ YAZ_CHECK(tst_ccl_query(b, "rk=(lex=9)", "@attr 2=3 @attr 1=9903 9 "));
+ YAZ_CHECK(tst_ccl_query(b, "rk=(lex>9)", "@attr 2=5 @attr 1=9903 9 "));
+ YAZ_CHECK(tst_ccl_query(b, "rk=(lex,st-numeric=300-600)",
+ "@and "
+ "@attr 2=4 @attr 4=109 @attr 1=9903 300 "
+ "@attr 2=2 @attr 4=109 @attr 1=9903 600 "));
+ YAZ_CHECK(tst_ccl_query(b, "rk=(lex=9) and b",
+ "@and @attr 2=3 @attr 1=9903 9 b "));
+ YAZ_CHECK(tst_ccl_query(b, "rk=(lex=9 and b)",
+ "@and @attr 2=3 @attr 1=9903 9 @attr 2=102 b "));
+ ccl_qual_rm(&b);
+}
+
void tst_addinfo(void)
{
const char *addinfo;
tst1(2);
tst1(3);
tst2();
+ tst3();
tst_addinfo();
YAZ_CHECK_TERM;
}